Ankündigung

Einklappen
Keine Ankündigung bisher.

EXEC | while | variablen | PHP

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

    EXEC | while | variablen | PHP

    Hallo zusammen,

    Wenn ich in dem EXEC-Teil des LBS eine while Schleife habe (Dämon), dann läuft diese bis sie durch einen "Neustart/Beenden" verlassen/beendet wird ...

    Soweit so gut ... Wenn ich diese Schleife im laufenden Betrieb verlassen möchte, dann müsste ich am Ende der Schleife eine Bedingung einbauen, die wenn diese erfüllt wird, die Schleife sich selbst beendet und der restlich EXEC-Teil wird abgearbeitet.

    Ist es auch möglich, von außen, in die Schleife als eine Art "RESET" einzugreifen ? Quasi wenn eine Variable, zB: v#300 von 0 auf 1 sich durch manuellen Eingriff ändern würde ?

    Ich habe das Problemchen, dass sich eine while Schleife immer wieder "verabschiedet" und nichts mehr vernünftiges liefert und ich jedes Mal das LIVE-Projekt neu starten muss :-(

    Könnte mir auch jemand zeigen, wie so ein manueller RESET und eine automatische Bedingung im Code aussehen würde ?

    PHP-Code:
                while (getSysInfo(1)>=1) {

                    
    $line stream_get_line($fp4096);
                    
    writeToCustomLog("Logname LBSLBSID"'6'"LBSLBSID (ID$id) line: ".$line); 

                    ...

                    unset(
    $line);
                    
    usleep(250*1000);
                } 
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    #2
    Würde ein "einfaches" BREAK ausreichen ?

    PHP-Code:
    while (getSysInfo(1)>=1) {

        
    $line stream_get_line($fp4096);
        
    writeToCustomLog("Logname LBSLBSID"'6'"LBSLBSID (ID$id) line: ".$line); 

        ...

        if (
    logic_getVar($id300) == 1);
        break;

        unset(
    $line);
        
    usleep(250*1000);

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

    Kommentar


      #3
      Ja, break würde ausreichen. Allerdings würde ich eher die Ursache beheben, als einen Workaround bauen, denn wenn die Schleife verlassen wird, dann nur, wenn ein Fehler auftritt, denn getSysInfo() ist ja nur größer <1 wenn EDOMI beendet wird.

      Das mit dem Reset verstehe ich nicht, denn mit der Abfrage baust du ja nur noch eine weitere Möglichkeit die While Schleife vorzeitig zu beenden. Du solltest vielleicht eher irgendwie prüfen, ob der EXEC daemon noch läuft und wenn das nicht der Fall ist, ihn neu starten. Das müsste allerdings im LBS Teil passieren.

      Kommentar


        #4
        Zitat von jonofe Beitrag anzeigen
        Allerdings würde ich eher die Ursache beheben, als einen Workaround bauen ...
        Ich bin mir noch nicht sicher, mittlerweile vermute ich dass der API-Server (SSE) um ca. 1:15 die Verbindung kappt - dass muss ich aber noch prüfen.


        Zitat von jonofe Beitrag anzeigen
        Du solltest vielleicht eher irgendwie prüfen, ob der EXEC daemon noch läuft und wenn das nicht der Fall ist, ihn neu starten. Das müsste allerdings im LBS Teil passieren.
        Der Dämon läuft, leider, wie oben kurz erwähnt, kommen keine Daten mehr, weil der API-Server - anscheinend - die Verbindung kappt ...
        Ich müsste irgendwie das in der Schleife erkennen und den Dämon RE-starten ?

        In dem Fall, wäre der RESET nur der Notnagel ...
        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #5
          Man sieht im Log, dass jeweils um die "gleiche" Zeit nichts mehr kommt ... Im Sekundentakt:
          Code:
          2017-12-29 01:14:55    671823    19392    6    LBS19000071 (ID766) data ist leer ...
          2017-12-[COLOR=#FF0000][B]29[/B][/COLOR] 01:[COLOR=#FF0000][B]15[/B][/COLOR]:06    868320    19392    6    LBS19000071 (ID766) line:
          
          2017-12-30 01:14:25    083141    12846    6    LBS19000071 (ID768) data ist leer ...
          2017-12-[COLOR=#FF0000][B]30[/B][/COLOR] 01:[COLOR=#FF0000][B]15[/B][/COLOR]:06    875094    12846    6    LBS19000071 (ID768) line:
          Danke und LG, Dariusz
          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

          Kommentar


            #6
            Dann könntest du doch einfach in der Schleife ein Reconnect machen, statt den ganzen LBS neu zu starten.

            Kommentar


              #7
              Zitat von jonofe Beitrag anzeigen
              in der Schleife ein Reconnect machen
              Dh. wenn eine Bedingung am "Ende" der Schleife erfüllt wird, dann ein Reconnect, richtig ?


              Unmittelbar vor der while-Schleife (siehe oben) ist folgender Code vorhanden:
              PHP-Code:
              $header = array('Accept: text/event-stream','Cache-Control: no-cache','Authorization: Bearer '.$currentKey);
              $options = array('http' => array('method' => 'GET','header' => $header));
              $context stream_context_create($options);
              $haid logic_getVar($id2);                                                    
              $url 'https://api.home-connect.com/api/homeappliances/'.$haid.'/events';
              $fp fopen($url"rb"false$context); 

              In der Variable $line = stream_get_line($fp, 4096); wird der Wert gespeichert ... Meinst du, dass eine Abfrage isset($line) oder isEmpty($line) oder ... mein Problem abfängt ?
              Danke und LG, Dariusz
              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

              Kommentar


                #8
                Du musst irgendwie identifizieren, dass die Verbindung beendet wurde. Ob das mit diesen Abfragen funktioniert, hängt von der API ab.
                Wenn du ein eindeutiges Kriterium für den Verbindungsabbruch hast, dann musst du das am Ende der Schleife prüfen und entsprechend ein Reconnect machen.

                Kommentar


                  #9
                  OK, ich versuche es zuerst ob nach dem disconnenct die Variable LEER ist oder nicht und wenn nicht, dann muss ich weiter schauen wie man es abfangen kann ...
                  Hättest du noch ein paar gute Hinweise, wie man in weiterer Folge so ein reconnect am besten realisieren kann ?
                  Danke und LG, Dariusz
                  GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                  Kommentar


                    #10
                    Ein Reconnect ist nichts anderes als ein Connect.
                    Es reicht nicht zu prüfen, ob die Variable nach dem Disconnect leer ist. Du musst prüfen, ob die ausschließlich nach einem Disconnect leer ist. Das wäre nur der Fall, wenn bei jedem Schleifendurchlauf immer was empfangen wird. Das kann ich mir gar nicht vorstellen.

                    Kommentar


                      #11
                      Zitat von jonofe Beitrag anzeigen
                      Es reicht nicht zu prüfen, ob die Variable nach dem Disconnect leer ist. Du musst prüfen, ob die ausschließlich nach einem Disconnect leer ist. Das wäre nur der Fall, wenn bei jedem Schleifendurchlauf immer was empfangen wird. Das kann ich mir gar nicht vorstellen.
                      Wenn der zB Geschirrspüler abgeschaltet ist, dann kommt folgendes raus:
                      Code:
                       [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
                      [TR]
                      [TD]LBS19000071 (ID766) line: event:[COLOR=#0000FF][B]KEEP-ALIVE[/B][/COLOR][LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:KEEP-ALIVE[LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF][/TD]
                       		[/TR]
                      [/TABLE]
                      Ob es dazwischen leere LINES gibt, das weiß ich nicht, das könnte man einfach laufen lassen und zuschauen ...

                      Sollte das nicht gehen, dann weiter suchen :-(
                      Und hoffen, dass die HC-Entwickler etwas herausrücken ...
                      Danke und LG, Dariusz
                      GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                      Kommentar


                        #12
                        Du musst einfach loggen was kommt und schauen, ob es eine Besonderheit gibt, wenn du Connection Probleme hast. Ggf. ist das stream_get_line per default blockierend, dann wird die Schleife erst dann durchlaufen, wenn was empfangen wird. In diesem Fall könntest du dir das usleep schenken. Und das Proiblem ist dann, wenn die Verbindung unterbrochen wird, kann es sein, dass die Schleife im blockierenden stream_get_line hängen bleibt.

                        Was du machen könntest:
                        1. Deine Verbindung und damit das strem_get_line() nach dem Verbindungsaufbau auf nicht-blockierend umstellen: stream_set_blocking($fp, 0);
                        2. Den Zeilen Delimiter im stream_get_line() ergänzen: $line = stream_get_line($fp, 4096, "\n");
                        3. Zeit zwischen zwei Keep-Alive Paketen messen.
                        4. Wenn diese Zeit z.B. um 3 Sekunden überschritten wurde, dann Verbindung neu aufbauen. Dazu einen Timestamp (time()) bei jedem Keepalive sichern. Bei jedem Durchlauf den letzten Timestamp mit der aktuellen Zeit vergleichen. Wenn Differenz > Keepalive-Frequenz + x Sekunden, dann Reconnect.

                        Kommentar


                          #13
                          DANKE !

                          Was mir aufgefallen ist:
                          1. Die LINE kommt lt. Logeintrag immer alle 110 Minuten, dazwischen konnte ich (bis jetzt) eine Abweichung von +1 Sekunde beobachten, falls überhaupt.
                            .
                          2. Wenn ich manuell die while-Schleife beende, dann ist der Logeintrag auch erst nach den genannten 110 Minuten sichtbar (und die "restliche" LINE wird vorher auch noch ausgegeben - somit denke ich, dass die while-Schleife "blockierend" ist und das usleep() habe ich als Sicherheit eingebaut - somit habe ich nach dem disconnect nur 4 Logeinträge pro Sekunde ...
                            Ich denke, ich kann das usleep() auf 1 Minute oder länger einstellen ...
                          Code:
                            [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
                          [TR="class: cke_show_border"]
                          [TD]2017-12-30 15:[COLOR=#FF0000]04:13[/COLOR][/TD]
                           			[TD] 481751[/TD]
                           			[TD]17125 [/TD]
                           			[TD] 6[/TD]
                           			[TD] LBS19000071 (ID766) line: event:KEEP-ALIVE[LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:KEEP-ALIVE[LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF][/TD]
                           		[/TR]
                          [TR="class: cke_show_border"]
                          [/TR]
                          [/TABLE]
                          [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
                          [TR="class: cke_show_border"]
                          [TD]2017-12-30 15:[COLOR=#0000FF]04:45[/COLOR][/TD]
                           			[TD] 519996[/TD]
                           			[TD]17038[/TD]
                           			[TD] 6[/TD]
                           			[TD] LBS_nach_variable 300: 1 = [COLOR=#0000FF]ABBRUCH[/COLOR][/TD]
                           		[/TR]
                          [/TABLE]
                          [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
                          [TR="class: cke_show_border"]
                          [TD]2017-12-30 15:[COLOR=#FF0000]06:03[/COLOR][/TD]
                           			[TD] 524347[/TD]
                           			[TD]17125[/TD]
                           			[TD] 6[/TD]
                           			[TD] LBS19000071 (ID766) line: event:KEEP-ALIVE[LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:KEEP- ALIVE[LF]data:[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF][/TD]
                           		[/TR]
                          [/TABLE]
                          [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
                          [TR="class: cke_show_border"]
                          [TD]2017-12-30 15:[COLOR=#FF0000]06:03 [/COLOR][/TD]
                           			[TD]779232[/TD]
                           			[TD]17125[/TD]
                           			[TD] 6[/TD]
                           			[TD] WHILE beendet ....[/TD]
                           		[/TR]
                          [TR="class: cke_show_border"]
                          [TD]2017-12-30 15:[COLOR=#FF0000]06:03[/COLOR][/TD]
                           			[TD]780977[/TD]
                           			[TD]17125[/TD]
                           			[TD] 6[/TD]
                           			[TD] EXEC beendet .....[/TD]
                           		[/TR]
                          [/TABLE]

                          Wenn das (wahrscheinlich) blockierend ist, dann versuche ich im ersten Schritt die erste leere LINE zu erkennen und ein reconnect zu initiieren (brauche ich hierzu eine DO-WHILE Lösung ?
                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar


                            #14
                            Wenn es nicht blockierend wäre, dann hättest du 4 Logeinträge pro Sekunde.
                            Durch dein Log steige ich nicht durch.
                            Und wir sprechen hier von 110 Sekunden und nicht Minuten, richtig?
                            Da es ja offensichtlich blockierend ist, kannst du machen was du willst, nach dem stream_get_line, denn da kommt er nicht hin.
                            Also am besten so machen wie oben beschrieben

                            Kommentar


                              #15
                              Zitat von jonofe Beitrag anzeigen
                              Wenn es nicht blockierend wäre, dann hättest du 4 Logeinträge pro Sekunde.
                              Richtig

                              Zitat von jonofe Beitrag anzeigen
                              Und wir sprechen hier von 110 Sekunden und nicht Minuten, richtig?
                              Laut Log ja, es wäre auch blöd wenn es Minuten wären, weil dann wäre das Geschirr schon fertig ...

                              Zitat von jonofe Beitrag anzeigen
                              Durch dein Log steige ich nicht durch.
                              Und wir sprechen hier von 110 Sekunden und nicht Minuten, richtig?
                              Na ja:
                              Um 15:04:13 Uhr kommt der letzte Datensatz (LINE) bevor ICH abbreche.
                              Um 15:04:45 Uhr initiiere ich den Abbruch der while-Schleife (zwischen 15:04:13 und 15:06:03) ... Man könnte annehmen, dass der Abbruch sofort stattfindet (jedoch nicht) ...
                              Um 15.06:03 Uhr, erst jetzt wird der noch ausstehende Datensatz abgearbeitet und am Ende die Schleife verlassen und der EXEC-Teil beendet.

                              Zitat von jonofe Beitrag anzeigen
                              Da es ja offensichtlich blockierend ist, kannst du machen was du willst, nach dem stream_get_line, denn da kommt er nicht hin.
                              Um ehrlich zu sein, das habe ich jetzt nicht verstanden :-(

                              Heute Nacht werde ich sehen ob meine Logik den disconnect erkennt und abbricht - dann muss ich noch am re-connect arbeiten ... Ansonsten muss werde ich weiter an der Erkennung arbeiten müssen.
                              Danke und LG, Dariusz
                              GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                              Kommentar

                              Lädt...
                              X