Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zur LBS Erstellung

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

    #76
    PHP-Code:
    $cache=json_decode(file_get_contents($file),true); 
    Dekodierst du hier nicht eine JSON (String) in eine Variable (array) ?
    Die Fehlermeldung sagt, dass ein String erwartet wurde und ein Array gegeben wird ...
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    Kommentar


      #77
      Hallo coliflower ,

      der Fehler lag an einer andere Stelle.
      Hatte Gestern Nacht noch eine kleine Änderung gemacht wodurch ein String zum Array wurde und heute nicht mehr daran gedacht...

      Entschuldigung für den übereilten Post

      Kommentar


        #78
        Weiterhin gutes Gelingen !
        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #79
          Zitat von coliflower Beitrag anzeigen
          Weiterhin gutes Gelingen !
          Danke kann ich brauchen

          Kommentar


            #80
            So ich beiße mir schon zwei Tage die Zähne an folgendem Phänomen aus:
            (Kurze Erklärung: ich möchte von einem PHP Script (das nich in einem LBS läuft) aus diverse LBS Ausgänge aktualisieren.)

            Habe meine Software auf Basis von diesem Prinzip gemacht:

            Zitat von murelli146 Beitrag anzeigen
            Hab gerade folgende Zeilen in einem php Script auf der Konsole gestartet:
            PHP-Code:
            include '/usr/local/edomi/main/include/php/incl_lbsexec.php';
            $id=14;
            sql_connect();
            setLogicLinkAusgang($id,3,'Hallo Welt');
            sql_disconnect(); 
            und siehe da.
            Hallo EDOMI Welt.PNG

            Funktioniert !!!!!!
            Was ich zu diesem zeitpunkt nicht bemerkte ist dass bei jedem Aufruf des Skriptes folgender Fehler erzeugt wird:

            Error ext zugriff auf LBS.PNG

            Mein XML-RPC Server würde soweit zuverlässig funktionieren. Doch leider wird der Errorlog zugemüllt.

            Wie kann ich den Fehler unterbinden. Hab schon vieles versucht.
            der Fehler tritt auf sobald ich
            PHP-Code:
            include '/usr/local/edomi/main/include/php/incl_lbsexec.php'
            einbinde. Also nur diese Zeile und dann das Script ausführe.

            Weiß jemand was der Logikprozessor erwartet?
            Zuletzt geändert von murelli146; 17.08.2017, 22:51. Grund: kurze Erklärung

            Kommentar


              #81
              Das include erwartet, dass du das Skript mit der ID aufrufst, welche den LBS identifiziert, den du darin ansteuern willst.

              Wenn du beispielsweise einen LBS 1900xxxx mit der ID 1234 hast und du dein EXEC PHP Skript von extern aufrufen willst, welches Ausgänge dieses LBS setzen soll, dann muss der Aufruf wie folgt sein:

              Code:
              /usr/bin/php  /usr/local/edomi/www/data/liveproject/lbs/EXE19000xxx.php 1234

              Du kannst also den EXEC Bereich eines LBS nutzen, um ein PHP Skript zu erzeugen, welches du auch von extern aufrufen kannst.

              Wichtig ist hier, dass du im LBS Teil ein auskommentiertes

              PHP-Code:
              //logic_callExec(LBSID, $id); 

              drin hast, da ansonsten der EDOMI Parser den EXEC Bereich nicht berücksichtigt.

              Hilfreich kann es dann noch sein, die LBS ID im LBS Bereich in eine Datei zu schreiben (z.B. /tmp/19000xxx.id), damit diese für den o.g. Aufruf verwendet werden kann.

              Der Aufruf könnte dann in einer bash so aussehen:

              Code:
              /usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19000xxx.php `cat /tmp/19000xxx.id`

              Kommentar


                #82
                Guten Abend Zusammen,

                mein Problem mit den Exec-Instanzen habe ich noch nicht ganz in den Griff bekommen. Habe den Status nun in ein File geschrieben auf das alle Instanzen des LBS zugreifen:
                PHP-Code:
                $lbsNo='19001125';
                $file='/var/tmp/EDOMI_LBSID_'.$lbsNo.'.json';
                $maxquery=1;
                $cache=json_decode(file_get_contents($file),true);                                                // Daten aus Datei holen
                if (!array_key_exists('dbquery',$cache)) {$cache['dbquery']=0;}
                while (
                $cache['dbquery']>=$maxquery) {
                usleep(1000*100);
                $cache=json_decode(file_get_contents($file),true);                          
                }
                $cache['dbquery']++;
                file_put_contents($filejson_encode($cache));
                // Werte aus Datenarchiv lesen
                $cache['dbquery']--;
                file_put_contents($filejson_encode($cache)); 

                Das funktionierte zunächst auch, nur bekomme ich in der Praxis sporadisch die Fehlermeldung:
                Code:
                2017-08-16 03:09:02    039211    ?    24987    Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001125.php | Fehlercode: 8 | Zeile: 14 | Undefined index: dbquery
                Ich denke das sich hier die zwei Exec- und LBS- Instanzen beim lesen und beschreiben der gemeinsamen Datei in die Quere kommen.

                Deshalb habe ich mir mal einen Test-Massage-LBS gebaut:
                PHP-Code:
                ###[LBS]###
                <?
                function LB_LBSID($id) {
                    if ($E=logic_getInputs($id)) {
                        if ($E[1]['refresh']==1) {
                            $msg=$E[1]['value'];
                            $msg_queue_id = 123;
                            $msg_queue = msg_get_queue($msg_queue_id);
                            msg_send($msg_queue, 1, $msg);
                            logic_callExec(LBSID, $id);
                        }
                    }
                }
                ?>
                ###[/LBS]###
                ###[EXEC]###
                <?
                require (dirname(__FILE__) . "/../../../../main/include/php/incl_lbsexec.php");
                set_time_limit(0);
                sql_connect();
                $E=logic_getInputs($id);
                $msg_queue_id = 123;
                $msg_queue = msg_get_queue($msg_queue_id);
                while (!isempty($E[1]['value'])) {
                    $result = msg_receive($msg_queue, 0, $msgtype, 4096, $msg, true, MSG_IPC_NOWAIT, $msg_error);
                    if ($result) logic_setoutput($id,1,$msg);
                    usleep(10000);
                }
                sql_disconnect();
                ?>
                ###[/EXEC]###

                Mehre Instanzen können nun auf den Ausgang des ersten aktiven LBS schreiben. Ich hätte aber gerne das bei jedem senden alle alle den Status empfangen. Geht das so überhaupt?
                Zuletzt geändert von hx5; 18.08.2017, 23:47.

                Kommentar


                  #83
                  Oder gibt es evtl. eine bessere Lösung?
                  Kann man evtl. Variablen definieren auf die alles Exec-Instanzen zugreifen können?

                  Kommentar


                    #84
                    Globale Variablen solten doch auch zu definieren gehen.

                    Kommentar


                      #85
                      Vielen Dank für deine Hilfe ! Bin wieder ein Stück weiter.

                      Nur das Logging macht mir enorme Probleme. Ich gehe schon die ganze Zeit im Kreis.
                      Folgende Fehler werde ich nicht los. Außer ich deaktiviere das logging.
                      Error ext zugriff auf LBS 2.PNG




                      Zitat von jonofe Beitrag anzeigen
                      Das include erwartet, dass du das Skript mit der ID aufrufst, welche den LBS identifiziert, den du darin ansteuern willst.

                      Wenn du beispielsweise einen LBS 1900xxxx mit der ID 1234 hast und du dein EXEC PHP Skript von extern aufrufen willst, welches Ausgänge dieses LBS setzen soll, dann muss der Aufruf wie folgt sein:

                      Code:
                      /usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19000xxx.php 1234

                      Du kannst also den EXEC Bereich eines LBS nutzen, um ein PHP Skript zu erzeugen, welches du auch von extern aufrufen kannst.
                      Ich habe das so umgesetzt und siehe es funktionierte. Habe es 12h ohne einen einzigen Fehler laufen lassen.
                      Dann wollte ich mein Script noch kommentieren. Dann hatte ich wieder Fehler.
                      Zurück auf vorherigen Stand, doch die Fehler traten trotzdem auf.

                      Wichtig ist hier, dass du im LBS Teil ein auskommentiertes

                      PHP-Code:
                      //logic_callExec(LBSID, $id); 

                      drin hast, da ansonsten der EDOMI Parser den EXEC Bereich nicht berücksichtigt.
                      Eigendlich möchte ich beim Start von EDOMI den LBS einmal aufrufen darum habe ich es nicht auskommentiert.
                      Oben genannte Fehler treten aber auch auf wenn es auskommentiert ist.

                      Hilfreich kann es dann noch sein, die LBS ID im LBS Bereich in eine Datei zu schreiben (z.B. /tmp/19000xxx.id), damit diese für den o.g. Aufruf verwendet werden kann.

                      Der Aufruf könnte dann in einer bash so aussehen:

                      Code:
                      /usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19000xxx.php `cat /tmp/19000xxx.id`
                      Danke für diese Code-Schnipsel, damit schupfst du mich noch ins Ziel.

                      Zwischenzeitlich hat sich der Fehler verflüchtigt. Ich kann ihn auch im Moment nicht reproduzieren.

                      Hat jemand einen Lösungsansatz?

                      Wie aktiviert ihr die LBS nach dem bearbeiten?

                      Ich arbeite mit notepad++ direkt mit ftp plugin am Edomi

                      Muss man die LBSen neu einlesen oder genügt es das Projekt zu aktivieren?

                      Meine gelesen zu haben zuerst einlesen dann aktivieren.

                      Habe ich ehrlich gesagt nicht immer gemacht. Doch seit diesem Fehler mache ich es lieber.


                      Kommentar


                        #86
                        Neu aktivieren reicht

                        Kommentar


                          #87
                          So hab nun das Problem gefunden.

                          Von Zeit zu Zeit lösche ich den Customlog.

                          Dann wird er neu angelegt mit der Dateiberechtigung 644 und Besitzer 0 und Gruppe 0
                          Wenn ich chmod auf 666 stelle ist der Fehler weg.


                          Wenn ich ein "chown -cR 48:48 /usr/local/edomi/www/data/log/CUSTOMLOG_19000925-Edomi-XML-RPC-Server.htm" auf die Datei mache funktioniert es auch.

                          Kann ich die Dateiberechtigungen oder Benutzer / Gruppe beim Customlog mit geben ?

                          Das Problem tritt nur auf wenn
                          "exec('/usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19000925.php '.$lbs_register['Master'].' > /dev/null &');"
                          vom Serverscript aufgerufen wird.

                          Wenn ich als root
                          "php /usr/local/edomi/www/data/liveproject/lbs/EXE19000925.php 14"
                          ausführe funktioniert es auch.

                          Welchen Lösungsansatz soll ich verfolgen?

                          Kommentar


                            #88
                            Zitat von vento66 Beitrag anzeigen
                            Globale Variablen solten doch auch zu definieren gehen.
                            Ich habe es mit
                            PHP-Code:
                            global $var 
                            und
                            PHP-Code:
                            $GLOBALS['var']=xy 
                            nicht hinbekommen.

                            Habe nun die Id der ersten Instanz in einer Datei gespeichert um diese dann für alle Instanzen durch die Edomi-internen Variable zu nutzen:

                            PHP-Code:
                            ###[LBS]###
                            <?
                            function LB_LBSID($id) {
                                if ($E=logic_getInputs($id)) {
                                    if ($E[1]['refresh']==1) {
                                        $lbsNo=1999996;
                                        $file='/var/tmp/EDOMI_LBSID_'.$lbsNo.'.id';                                                        // Speicherort
                                        if (!file_exists($file)) file_put_contents($file,$id);
                                        $idg=file_get_contents($file);
                                        logic_setVar($id,2,$idg);
                                        logic_setVar($idg,3,$E[1]['value']);
                                        if (logic_getVar($id,1)==0) logic_callExec(LBSID,$id);
                                    }
                                }
                            }
                            ?>
                            ###[/LBS]###
                            ###[EXEC]###
                            <?
                            require (dirname(__FILE__) . "/../../../../main/include/php/incl_lbsexec.php");
                            set_time_limit(0);
                            sql_connect();
                            $E=logic_getInputs($id);
                            logic_setVar($id,1,1);
                            $idg=logic_getVar($id,2);
                            while (!isempty($E[1]['value'])) {
                                logic_setOutput($id,1,logic_getVar($idg,3));
                                usleep(100000);
                            }
                            logic_setVar($id,1,0);
                            sql_disconnect();
                            ?>
                            ###[/EXEC]###

                            Das funktioniert erstmal prima, nur wenn ich die erste Instanz lösche ist die Variable auch nicht mehr nutzbar.
                            Am einfachsten wäre es wenn die Datei (mit der Id) bei jedem neuen Projektart gelöscht werden würde und damit die Id der ersten aktiven Instanz gespeichert wird.

                            Meine Frage deshalb:
                            Gibt es einen Ordner der nach jeder Projektaktivierung geleert wird?
                            Oder kann man prüfen ob der LBS mit der Id=xy noch existiert?
                            Oder kann ich Edomi dazu bringen eine Variable mit einer Id zu verarbeiten zu der kein LBS existiert? (logic_setVar(xy,1,5) funktioniert nicht)

                            Danke schon mal .

                            Kommentar


                              #89
                              Kannst du in deinem LBS noch einen Eingang konfigurieren "Primary" oder so und wenn der auf 1 ist dann setzt der LBS in der Datei beim starten die ID neu?
                              Gruß
                              Michael

                              Kommentar


                                #90
                                Zitat von gulp2k Beitrag anzeigen
                                Kannst du in deinem LBS noch einen Eingang konfigurieren "Primary" oder so und wenn der auf 1 ist dann setzt der LBS in der Datei beim starten die ID neu?
                                Natürlich könnte ich das, würde es aber gerne vermeiden da es nicht wirklich "smart" ist

                                Kommentar

                                Lädt...
                                X