Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 18000003: String zerlegen und alle Ausgänge neu belegen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS 18000003: String zerlegen und alle Ausgänge neu belegen

    Hallo KNX Gemeinde,

    ich arbeite derzeit an einer Anwesenheitserkennung mit Edomi und Unifi APs. Nun zerlege ich die Strings aus LBS 19000523 mit dem LBS 18000003. Der LBS 18000003 belegt leider die Ausgänge nicht neu (was er lt. Hilfe auch nicht soll), weshalb bei der nachgelagerten Ausgangsbox die Prüfung auf ungleich "leer" fehlschlägt und das abmelden am Wifi nicht erkannt wird. Habt ihr hier einen Workaround parat und könnt helfen? Ich habe das Forum und die Downloads durchsucht, ohne Erfolg.

    Beste Grüße,

    Sebastian

    #2
    Verstehe ich leider nicht ganz.
    Wenn an E1 ein neuer String einlangt, wird dieser (zumindest lt. code) zerteilt auf die Ausgänge gelegt - außer der String ist leer.
    Wenn du auch einen leeren string auf die Ausgänge bringen willst, muss man halt im code auch auf IsEmpty() reagieren.

    habs nicht getestet - aber so in der Art:
    Code:
    if (isEmpty($E[1]['value']) && $E[1]['refresh']==1)
      for ($t=0;$t<11;$t++)
        logic_setOutput($id, $t+1, "");

    Kommentar


      #3
      Hi WWeber,

      der String, welcher vom LBS für die Anwesenheitserkennung kommt, kann an definierten Positionen leer sein. Hier ein Beispiel

      - Alle Personen anwesend: „Person1|Person2“, der String wir zerlegt in A1=Person1, A2=Person2

      - Person 2 abwesend: „Person1“, der String wird zerlegt in A1=Person1, Erwartet wäre A2=„“ aber es wird aufgrund der vergangenen und nicht mehr aktuellen Anwesenheit A2=Person2 ausgegeben. Dieses Verhalten ist auch so beschrieben.

      Ich hatte gehofft es gibt irgendeinem Workaround. Hatte mir überlegt den String jedesmal mit mind 10 zusätzlichen Elementen (0) zu verbinden und dann wieder zu zerlegen. Aber das klingt irgendwie nicht sonderlich effektiv.

      Deine Variante wäre eine Anpassung des LBS? Ich hab selbst nur rudimentäre Erfahrung mit PHP, könnte es aber mal versuchen. Oder gibt es eine elegantere Variante?

      Beste Grüße

      Kommentar


        #4
        wweber ich denke, dass sebastianruff hier was anderes meint. Wenn die Liste, die der Unify-LBS ausgibt "plötzlich" um einen Eintrag kürzer ist, bleibt der letzte Wert am Ausgang des Listen-LBS bestehen. Daher müsste man prüfen, ob für den jeweiligen Ausgang des String-LBS auch ein Wert im Array vorliegt und dann ggf. einen leeren String ausgeben:

        Ausgangszustand:
        PHP-Code:
        if (!isEmpty($E[1]['value']) && $E[1]['refresh']==&& !isEmpty($E[2]['value'])) {
        $n=explode($E[2]['value'],$E[1]['value'],11);
        for (
        $t=0;$t<count($n);$t++) {
                
        logic_setOutput($id,($t+1),$n[$t]);
            }


        Ungetestete Idee:
        PHP-Code:
        if (!isEmpty($E[1]['value']) && $E[1]['refresh']==&& !isEmpty($E[2]['value']))
        {
            
        $n=explode($E[2]['value'],$E[1]['value'],11);
            for (
        $t=0;$t 11;$t++) {
                if (
        $t count($n))
                    
        logic_setOutput($id,($t+1),$n[$t]);
                else
                    
        logic_setOutput($id,($t+1),"");
            }


        Alternativ könnte wintermute auch eine Liste ausgeben, die die gleiche Länge wie die Eingangsliste hat. Dann hättest du ggf. am Ende einen oder mehrere Einträge. Also so hier: E7 = "Person1|Person2|Person3" --> A5 ="Person1||" (Wenn nur Person 1 anwesend ist)

        Was ich noch nicht verstehe, ist der Use-Case. Es gibt ja darunter die Liste der abwesenden Devices (A6). Vielleicht willst du uns auch mal einen Teil deiner Logik zeigen. Es kommt ja schon einwenig darauf an, was du damit erreichen wilist. Nur weil die alten Daten in dem Listen-LBS stehen, heißt das ja nicht, dass die auch eine Aktion auslösen. Die nachgeschaltete Logik wird ja nur getriggert, wenn der Ausgang besprieben wird.

        Wenn du also deine Anwesenden mit dem Split-LBS aufgeteilt hast und an die Ausgänge jeweils einen Logging-LBS o.ä. hängst, siehst du, dass dieser nur getriggert wird, wenn der Ausgang beschrieben wird. Da kann es gut sein, dass vom letzten mal der Name noch in der Live-View angezeigt wird, aber ausgelöst wird in deinem Beispiel nur A1 und A2 bleibt stumm (obwohl in der Live-View ein Wert zu sehen ist). Edomi und KNX arbeiten "Event-gesteuert". Man kann sich das ganz gut als Impule oder Events vorstellen, dann fällt es meist leichter Logiken zu verstehen.
        Gruß
        Stefan

        Kommentar


          #5
          Hallo Stefan,
          vielen Dank für deine Antwort. Ich hatte gehofft das Ganze ohne PHP lösen zu können. Meine Logik sieht wie folgt aus:
          EDOMI · Administration 2019-05-27 10-48-01.jpg

          Ich würde es dann mal mit einem Logging LBS versuchen. Der SBC Baustein ist damit nicht gemeint, oder?

          Beste Grüße,

          Sebastian
          Angehängte Dateien

          Kommentar


            #6
            Hi,
            hab das Ganze auch schon mal festgestellt und mir so beholfen.
            Häng erst noch ein paar "Seperator" dran vor dass du zerlegst ;o)
            Nicht unbedingt schön, aber einfach und funktioniert 100%ig...

            Gruß
            Seppl

            String zerlegen.png

            Kommentar


              #7
              Zitat von sebastianruff Beitrag anzeigen
              ch würde es dann mal mit einem Logging LBS versuchen. Der SBC Baustein ist damit nicht gemeint, oder?
              Ich meine den Werks-LBS 18000110 "Logging".
              Gruß
              Stefan

              Kommentar

              Lädt...
              X