Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zur LBS Erstellung

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

    #31
    Zitat von gaert Beitrag anzeigen

    Was die Ausgänge betrifft verhält es sich im Prinzip genauso, jedoch wird der LBS natürlich zunächst komplett abgearbeitet bevor der nächste LBS getriggert wird. Wenn Du also diverse Ausgänge innerhalb eines "Durchlaufs" (Aufruf) des LBS setzt, passiert zunächst nichts - erst wenn der LBS abgearbeitet ist werden die Ausgänge auch tatsächlich gesetzt. Intern funktioniert das etwas anders als ich jetzt beschrieben habe, denn Ausgänge gibt es eigentlich gar nicht (vielmehr werden direkt die verknüpften Eingänge(!) der anderen LBS gesetzt).
    Das bedeutet also, wenn ich in EINEM-Ausgang-LBS z.B. 5 Eingänge eines anderen Bausteins verändere, dann wird dieser Baustein nur einmal aufgerufen und hat schon alle 5 Werte gesetzt, d.h. alle haben E[$i]['refresh']==1. Damit ist es also völlig egal, in welcher Reihenfolge in einem Ausgang die Werte gesetzt werden, da diese Werte ohnehin zuerst alle gesetzt werden, bevor die Logik-Engine den nächsten LBS ausführt. Richtig?

    Kommentar


      #32
      Zitat von gaert Beitrag anzeigen

      EDIT:
      Wenn Du erreichen willst, dass Dein LBS quasi erstmal irgendwelche Parameter "sammelt" und dann eine Aktion ausführt, muss der LBS einen Trigger-Eingang haben - dieser Eingang löst dann die Aktion aus. Denn ansonsten würde es quasi vom Zufall abhängen, ob schon alle Parameter anliegen oder nicht.
      Anders verhält es sich allerdings beim Start von EDOMI: Wenn die Parameter als Initialwerte angegeben sind, liegen diese garantiert schon an bevor irgendein KO/LBS diesen LBS triggern wird.
      Das gilt dann aber nur, wenn der LBS seine Eingänge von unterschiedlichen Quellen sammelt, richtig? Wenn alles aus einem Ausgangs-LBS kommt, dann sollten doch auch alle Werte anliegen, die dieser Ausgang gesetzt hat, bevor der LBS ausgeführt wird.

      Kommentar


        #33
        Absolut korrekt

        Bitte beachte auch mein EDIT in #30...

        EDIT:
        Überschnitten...

        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #34
          zu #31 und #32: Beides absolut richtig!
          EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

          Kommentar


            #35
            Okay, cool, so hatte ich gehofft, dass es funktioniert

            Kommentar


              #36
              Ich muss dann doch noch mal weiter fragen:

              gleiches Szenario wie vorher: mehrere Konfigurationseingänge, ein Triggereingang. Ausführung des Befehls im EXEC Teil des LBS. Wie kann ich im EXEC zuverlässig feststellen, welche Eingänge geändert wurde? Habe nämlich einige Eingänge die sich ggf. wiedersprechen, z.B. ein Eingang mit RGB Farbwert und einen anderen mit HSV Farbwert. Es ist natürlich nur der relevant, der geändert wurde. Um auf Nummer sicher zu gehen würde ich jetzt meine bevorzugte Message-Queue nehmen. Oder sollte ich es über eine v#-Variable machen?

              EDIT: würde es wohl jetzt mal so machen ...

              PHP-Code:
              // Eingänge 5 bis 14 auf Änderung prüfen und in #v2 speichern
              $changed = array();
              for (
              $i=5;$i<=14;$i++) if ($E[$i]['refresh']==1$changed[$i]=$E[$i]['value'];
              setLogicElementVar($id,2,serialize($changed));
              callLogicFunctionExec(LBSID,$id); 
              Ist das okay?

              Ist vermutlich nur das Risiko, dass ein mehrfaches Triggern des LBS ggf. den Wert von v#2 überschreibt, bevor der EXEC Baustein es ausgeführt hat, oder? Wobei das vermutlich im Falle eines normalen EXEC Bausteins wie in diesem Beispiel recht unwahrscheinlich ist, da der EXEC Teil unmittelbar aufgerufen wird und nicht als Daemon läuft.
              Zuletzt geändert von jonofe; 18.04.2016, 20:04.

              Kommentar


                #37
                Das bleibt Dir überlassen... Der EXEC-Teil ist ja nur ein unabhängig laufendes Script und kann daher nur per DB/msg-Queue/shared-mem/etc. mit dem Logik-Prozess (also in diesem Fall der LBS-Funktion) kommunizieren. Ich würde es (im Normalfall) per v# machen - kommt halt drauf an (Performance)
                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                Kommentar


                  #38
                  Verstehe. Habe gerade festgestellt, wenn die Eingänge einzeln gesetzt werden, dann geht ja auch das "refresh" flag verloren wenn der Trigger erst danach kommt. Dann bringt mir das ja nichts. Hmmmm ...

                  Kommentar


                    #39
                    Wollte keinen neuen Thread aufmachen, deshalb hier, die Überschrift kommt ja auch hin...
                    Ich bin am verzweifeln. Hab einen LBS entwickelt der schonmal einigermassen funktioniert hat. Jetzt kommt aber am Ausgang nichts mehr raus, obwohl getriggert wird, was im LOG ja erkennbar ist

                    i
                    Code:
                    f ($debug==1) writeToCustomLog('LBS19000341 Reminder Liste',1,'Länge: '.strlen($liste));
                    setLogicLinkAusgang($id,1,$liste);
                    setLogicLinkAusgang($id,2,date('d.m.Y H:i',time()));
                    if ($debug==1) writeToCustomLog('LBS19000341 Reminder Liste',1,'ENDE'.$liste);
                    Ich bekomme eine Ausgabe der Länge und auch die ENDE-Info, aber weder auf Ausgang 1 noch auf Ausgang 2 ist etwas vorhanden

                    Projekt ist aktualisiert und auch auch alle LBS neu eingelesen.



                    Kommentar


                      #40
                      Vergesst es wieder, hab einen Programmteil woanders her kopiert und dort wurde $id verändert
                      Hab' das ewig nicht gefunden.....
                      Klar dass dann die Ergebnisse im Nirwana landen

                      Kommentar


                        #41
                        Ihr Lieben,
                        wie kann ich ein im LBS definiertes Array ($v= array()) mit Hilfe von
                        PHP-Code:
                        logic_setVar($id,1,$v); 
                        speichern und mit Hilfe von
                        PHP-Code:
                        $v logic_getVar($id,1); 
                        restaurieren?

                        Nach einem
                        PHP-Code:
                        $v logic_getVar($id,1); 
                        ist
                        PHP-Code:
                        is_array($v
                        stets false auch wenn ich im Vorfeld ein Array abgespeichert habe.

                        Außerdem sorgt mein LBS dafür, dass folgendes in den Error-Logs steht:
                        Datei: /var/edomi-backups/_public/www/shared/php/base.php | Fehlercode: 2 | Zeile: 284 | utf8_decode() expects parameter 1 to be string, array given

                        Kommentar


                          #42
                          Zitat von phili Beitrag anzeigen
                          wie kann ich ein im LBS definiertes Array ($v= array()) mit Hilfe von
                          PHP-Code:
                          logic_setVar($id,1,$v); 
                          speichern und mit Hilfe von
                          PHP-Code:
                          $v logic_getVar($id,1); 
                          restaurieren?
                          Du musst die Variable "serialisieren", das geht so.

                          Zitat von phili Beitrag anzeigen
                          utf8_decode() expects parameter 1 to be string, array given
                          Da steht die Antwort schon drin
                          Keine Ahnung was genau Du machen musst, ich kenn den Source-Code nicht... Glaskugel runtergefallen und so
                          Jedenfalls kein Array sondern einen String uebergeben, $v[0] oder so.

                          Kommentar


                            #43
                            Versuch das Array per serialize und deserialize bzw. json_encode und json_decode in die Variable zu schreiben und wieder auszulesen.
                            Im Grunde wie wintermute schon schrieb, speicherst Du dann nur noch einen String in der Variable.

                            Edit: Ah, den Link von wintermute hatte ich übersehen. Da stehts ja schon beschrieben. Sorry.

                            Kommentar


                              #44
                              Danke ihr beiden,
                              klappt direkt! Hammer!

                              Löst auch gleich den Fehler
                              Code:
                              utf8_decode() expects parameter 1 to be string, array given

                              Kommentar


                                #45
                                Benötige auch etwas Hilfe bei der LBS Entwicklung.

                                Ich habe einen LBS der über XML-RPC mit meiner Homematic CCU2 kommuniziert am Laufen. Befehl senden und Werte abfragen funktioniert.

                                Ich habe in meiner Entwicklungsumgebung einen PHP XML-RPC Server am laufen.

                                Ich melde den Server an der CCU2 an. Die CCU2 schickt nun alle Änderungen (Events) an den XML-RPC Server,
                                wo ich nun die frisch angekommenen Events in einem array vorliegen habe. (Bis dahin hab ich es schon mal geschafft)

                                Bevor ich frustriert aufgebe und ich in einer Sackgasse lande frage ich lieber um Rat.

                                Problemstellung:
                                Ich möchte die aktualisierten Werte an die LBS-Ausgänge senden.

                                1.) Wie bekomme ich Daten vom LBS ins Serverscript? (LBS_ID / LBS_Ausgang_Nr/ HM_Addresse /HM_Value_Key)

                                2.) Wie schreibe ich die Daten zurück in den LBS? (LBS_Ausgang / HM_Value)
                                hätte mir sowas gedacht:
                                PHP-Code:
                                include '/usr/local/edomi/main/include/php/incl_lbsexec.php';
                                setLogicLinkAusgang(14,3,18); 
                                Habe mir vom LBS die ID ausgeben lassen (14) und wollte auf diese aus einem PHP Script schreiben.
                                Funktioniert so leider nicht.

                                Schöne Grüße
                                Gernot

                                Kommentar

                                Lädt...
                                X