Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

SSE | Server-Sent-Events

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

    #31
    OK, das werde ich mir anschauen :-)

    Ich habe es kurz angetastet - bin aber heute zu KO dafür - und da erhielt ich eine Fehlermeldung, obwohl der GS ein- und ausgeschaltet wurde:
    Code:
    stream_get_line() expects parameter 1 to be resource, boolean given
    Wie gesagt, ohne nachzudenken kurz angetestet ...

    Puhhh, morgen ist mein erster Arbeitstag ...
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    Kommentar


      #32
      Deutet darauf hin, dass das fopen() schief gelaufen, denn $fp ist dann keine Resource.

      Na dann wünsch ich viel Motivation für morgen ...

      Kommentar


        #33
        Hi André,

        leider habe ich die Ursache noch nicht gefunden … Die Motivation - na ja …
        Dafür habe ich eine Lösung mit cURL gefunden … Diese läuft in der test.php im Terminal ...

        PHP-Code:
        $currentKey 'xxxxxxx';

        $header = array('Accept: text/event-stream','Cache-Control: no-cache','Authorization: Bearer '.$currentKey);
        $url 'https://api.home-connect.com/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/events';
        $ch curl_init();
        curl_setopt($chCURLOPT_CONNECTTIMEOUT 10);
        curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
        curl_setopt($chCURLOPT_HEADER         true);
        curl_setopt($chCURLOPT_TIMEOUT        600);
        curl_setopt($chCURLOPT_USERAGENT      'edomi');
        curl_setopt($chCURLOPT_SSL_VERIFYPEER true);
        curl_setopt($chCURLOPT_HTTPHEADER     $header);
        curl_setopt($chCURLOPT_SSLVERSION0);
        curl_setopt($chCURLOPT_URL      $url);

        echo 
        "Executing...\n";
        curl_exec($ch);
        if(!
        curl_errno($ch)) {
            
        print_r(curl_getinfo($ch));
        }
        else {
            echo 
        "++++ ERROR ++++\n".curl_error($ch)."\n+++++++++++++++";
        }
        curl_close($ch); 

        Code:
        Dariuszs-MBP:Desktop dariusz$ php sse.php
        Executing...
        HTTP/1.1 200 OK
        Server: nginx/1.10.1
        Date: Wed, 11 Jan 2017 19:47:51 GMT
        Content-Type: text/event-stream
        Transfer-Encoding: chunked
        Connection: keep-alive
        Vary: Accept-Encoding
        Access-Control-Allow-Origin: *
        Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
        Access-Control-Allow-Credentials: true
        Access-Control-Allow-Headers: Authorization,Content-Type,Accept
        
        event:NOTIFY
        data:{"items":[{"timestamp":1484164079,"handling":"none","key":"BSH.Common.Option.RemainingProgramTime","unit":"seconds","value":5880,"level":"hint"}]}
        id:SIEMENS-SX578S06TE-68A40E0021F0
        
        event:NOTIFY
        data:{"items":[{"timestamp":1484164079,"handling":"none","key":"BSH.Common.Option.ProgramProgress","unit":"%","value":46,"level":"hint"}]}
        id:SIEMENS-SX578S06TE-68A40E0021F0
        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #34
          jonofe Hallo André, könnte das vielleicht eine Lösung sein ? https://www.pubnub.com/blog/2014-12-...-long-polling/
          Du verwendest es im Telegram-Receiver ...

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

          Kommentar


            #35
            gaert Hallo Christian,

            konntest du ein bisschen darüber nachdenken ob Edomi SSE empfangen und verarbeiten kann oder nicht ?
            Ich würde gerne in die eine oder andere Richtung basteln, besser wäre es in die SSE-Richtung :-)

            Wie schon André gezeigt hat, mit stream_context_create() geht es im Terminal, mit cURL auch, wie ich oben dargestellt habe, leider endet es in Edomi mit einem Timeout.

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

            Kommentar


              #36
              wieso nimmst du nicht die php Variante, die funktionierte?

              Kommentar


                #37
                Ich bin mir nicht sicher ob ich deine Frage verstehe …
                Falls du meinst stream_context_create vs. cURL, dann muss ich sagen, keine funktioniert bis jetzt mit EDOMI, beide funktionieren nur im Terminal …
                Deshalb meine Frage an Christian ob Edomi das überhaupt „verarbeiten“ kann ?
                Danke und LG, Dariusz
                GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                Kommentar


                  #38
                  Wenn ich diesen Header richtig verstehe, dann sagt mir der Server, dass er möchte dass die Verbindung offen bleibt:
                  Transfer-Encoding: chunked

                  Code:
                  HTTP/1.1 200 OK
                  Server: nginx/1.10.1
                  Date: Mon, 16 Jan 2017 08:48:19 GMT
                  Content-Type: text/event-stream
                  Transfer-Encoding: chunked
                  Connection: keep-alive
                  Vary: Accept-Encoding
                  Access-Control-Allow-Origin: *
                  Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
                  Access-Control-Allow-Credentials: true
                  Access-Control-Allow-Headers: Authorization,Content-Type,Accept[COLOR=#0000CD][/COLOR]
                  Danke und LG, Dariusz
                  GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                  Kommentar


                    #39
                    Zitat von coliflower Beitrag anzeigen
                    Ich bin mir nicht sicher ob ich deine Frage verstehe …
                    Falls du meinst stream_context_create vs. cURL, dann muss ich sagen, keine funktioniert bis jetzt mit EDOMI, beide funktionieren nur im Terminal …
                    Deshalb meine Frage an Christian ob Edomi das überhaupt „verarbeiten“ kann ?
                    Aber das hat doch nichts mit Edomi zu tun. Edomi startet es als ganz normales php Skript. Dann hast du einen Fehler reingebaut.

                    Kommentar


                      #40
                      So ist es - wenn's per PHP läuft, funktioniert's auch in einem EXEC-LBS... Viel mehr kann ich dazu nicht sagen, da ich mich mit SSE noch nicht beschäftigt habe.
                      EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                      Kommentar


                        #41
                        Hallo André,

                        danke, ich werde es am Abend in einen eigenen LBS packen und schauen was heraus kommt … Wahrscheinlich liegt es an der Komplexität des LBS das ich es nicht finde woran es liegt.
                        Danke und LG, Dariusz
                        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                        Kommentar


                          #42
                          Auch dir danke Christian, die Aussage dass es in EXEC laufen muss, motiviert mich weiter zu suchen :-)
                          Danke und LG, Dariusz
                          GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                          Kommentar


                            #43
                            Hallo André,

                            ich habe das ganze jetzt in einen eigenen LBS gepackt und es scheint zu funktionieren.

                            Im LOG sieht es so aus:
                            Code:
                            //    LBS19000070 (ID253) line: event:STATUS[LF]data:{"items":[{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Status.RemoteControlStartAllowed","value":false,"level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Status.RemoteControlActive","value":true,"level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Status.DoorState","value":"BSH.Common.EnumType.DoorState.Open","level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Status.OperationState","value":"BSH.Common.EnumType.OperationState.Ready","level":"hint"}]}[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:EVENT[LF]data:{"items":[{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Event.ProgramFinished","value":"BSH.Common.EnumType.EventPresentState.Off","level":"hint"},{"timestamp":1484572873,"handling":"acknowledge","key":"BSH.Common.Event.ProgramAborted","value":"BSH.Common.EnumType.EventPresentState.Off","level":"hint"}]}[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:NOTIFY[LF]data:{"items":[{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Root.ActiveProgram","value":null,"level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Root.SelectedProgram","value":"Dishcare.Dishwasher.Program.Auto2","level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Setting.PowerState","value":"BSH.Common.EnumType.PowerState.On","level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Option.ProgramProgress","unit":"%","value":0,"level":"hint"},{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Option.RemainingProgramTime","unit":"seconds","value":10800,"level":"hint"}]}[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]event:NOTIFY[LF]data:{"items":[{"timestamp":1484572873,"handling":"none","key":"BSH.Common.Option.StartInRelative","unit":"seconds","value":0,"level":"hint"}]}[LF]id:SIEMENS-SX578S06TE-68A40E0021F0[LF][LF]


                            Das einzige unangenehme ist, dass pro $line = stream_get_line ( $fp, 4096 ); ein oder mehrere „Pakete“ bestehend aus "event: / data: / id: „ wiedergegeben werden, zB: event:KEEP-ALIVE usw., event:STATUS usw., event:EVENT usw. und event:NOTIFY
                            Das zu parsen wird aufwendiger :-(


                            Im Terminal kann es so aussehen:
                            Code:
                            HTTP/1.1 200 OK
                            Server: nginx/1.10.1
                            Date: Mon, 16 Jan 2017 17:57:55 GMT
                            Content-Type: text/event-stream
                            Transfer-Encoding: chunked
                            Connection: keep-alive
                            Vary: Accept-Encoding
                            Access-Control-Allow-Origin: *
                            Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE
                            Access-Control-Allow-Credentials: true
                            Access-Control-Allow-Headers: Authorization,Content-Type,Accept
                            
                            event:STATUS
                            data:{"items":[{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Status.RemoteControlStartAllowed","value":false,"level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Status.RemoteControlActive","value":true,"level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Status.DoorState","value":"BSH.Common.EnumType.DoorState.Open","level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Status.OperationState","value":"BSH.Common.EnumType.OperationState.Ready","level":"hint"}]}
                            id:SIEMENS-SX578S06TE-68A40E0021F0
                            
                            event:EVENT
                            data:{"items":[{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Event.ProgramFinished","value":"BSH.Common.EnumType.EventPresentState.Off","level":"hint"},{"timestamp":1484589509,"handling":"acknowledge","key":"BSH.Common.Event.ProgramAborted","value":"BSH.Common.EnumType.EventPresentState.Off","level":"hint"}]}
                            id:SIEMENS-SX578S06TE-68A40E0021F0
                            
                            event:NOTIFY
                            data:{"items":[{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Root.ActiveProgram","value":null,"level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Root.SelectedProgram","value":"Dishcare.Dishwasher.Program.Auto2","level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Setting.PowerState","value":"BSH.Common.EnumType.PowerState.On","level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Option.ProgramProgress","unit":"%","value":0,"level":"hint"},{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Option.RemainingProgramTime","unit":"seconds","value":10800,"level":"hint"}]}
                            id:SIEMENS-SX578S06TE-68A40E0021F0
                            
                            event:NOTIFY
                            data:{"items":[{"timestamp":1484589509,"handling":"none","key":"BSH.Common.Option.StartInRelative","unit":"seconds","value":0,"level":"hint"}]}
                            id:SIEMENS-SX578S06TE-68A40E0021F0
                            
                            event:KEEP-ALIVE
                            data:
                            id:SIEMENS-SX578S06TE-68A40E0021F0

                            Nochmals DANKE für die Unterstützung !
                            Danke und LG, Dariusz
                            GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

                            Kommentar


                              #44
                              jonofe Hallo André,

                              wie oben erwähnt, ich habe deinen Code in einen eigenen LBS kopiert und es funktioniert … nochmals danke.

                              PHP-Code:
                              .
                              require(
                              dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                              set_time_limit(0);
                              sql_connect();


                              //-------------------------------
                              //Dämon wurde gestartet
                              //-------------------------------


                              //eigener Code...
                              $currentKey 'XXXXX';
                              $header = array('Accept: text/event-stream','Cache-Control: no-cache','Authorization: Bearer '.$currentKey);
                              $url 'https://api.home-connect.com/api/homeappliances/SIEMENS-SX578S06TE-68A40E0021F0/events';
                              $opts = array('http' => array('method' => "GET",'header' => $header));
                              $context stream_context_create($opts);
                              $fp fopen($url"rb"false$context);

                              while(
                              getSysInfo(1)>=1) {    //Hauptschleife (wird beim Beenden oder Neustart von EDOMI verlassen)
                                                          //Wichtig: getSysInfo(1) sorgt zudem dafür, dass die Datenbank-Verbindung aufrechterhalten wird!

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

                                                                                      
                              //    \r = carriage return, \n = newline
                                  
                              list($event$data$haid) = explode("\n"$line);    //    "\r\n\r\n" = [CR][LF][CR][LF]

                                      
                              list($links$rechts) = explode(':'$event);
                                          
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) rechts/event: ".$rechts);

                                      list(
                              $links$rechts) = explode(':'$haid);
                                          
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) rechts/id: ".$rechts);

                                      list(
                              $links$rechts) = explode(':'$data);
                                          
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/".$data);
                                          
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/rechts: ".$rechts);

                                          if (!empty(
                              $rechts)) {
                                              
                              $subi substr($data510000);
                                              
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/substr: ".$subi);
                                              
                              $json '{"data":'.$subi.'}';
                                              
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/json: ".$json);
                                              
                              $data json_decode($subitrue);
                                              
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/array: ".serialize($data));
                                          }
                                          else {
                                              
                              writeToCustomLog("LBSLBSID"'6'"LBSLBSID (ID$id) data/substr/leer: ".$rechts);
                                          }

                                  unset(
                              $line);
                                  
                              usleep(250*1000);        //CPU-Last verteilen (die Länge der Pause sollte je nach Bedarf angepasst werden - je länger, desto ressourcenschonender)

                              }

                              //-------------------------------
                              //Dämon wurde beendet (EDOMI wurde beendet oder neugestartet)
                              //Achtung: Nach ca. 3 Sekunden wird der Prozess vom Betriebssystem hart beendet!
                              //-------------------------------
                              //eigener Code, z.B. Aufräumen, Verbindungen trennen, etc.


                              sql_disconnect(); 


                              Ich hoffe die WHILE-Schleife macht so keine Probleme ?

                              Du verwendest im Telegram die Schleife ohne >=1 … Was ist der genaue Unterschied, brauch ich das hier ?

                              Weiß du auswendig wie ich den HTTP-Channel bei Beenden oder Edomi-Neustart schliesse um mir da nichts „einzufangen“, ansonsten werde ich gurgeln ?

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

                              Kommentar


                                #45
                                Zitat von coliflower Beitrag anzeigen
                                jonofe Hallo André,

                                wie oben erwähnt, ich habe deinen Code in einen eigenen LBS kopiert und es funktioniert … nochmals danke.
                                Gerne!

                                Zitat von coliflower Beitrag anzeigen
                                Ich hoffe die WHILE-Schleife macht so keine Probleme ?
                                Nein, die ist genau richtig. Und 250ms im usleep ist auch okay.

                                Zitat von coliflower Beitrag anzeigen
                                Du verwendest im Telegram die Schleife ohne >=1 … Was ist der genaue Unterschied, brauch ich das hier ?
                                Da ist kein Unterschied, egal ob mit oder ohne >=1.

                                Zitat von coliflower Beitrag anzeigen
                                Weiß du auswendig wie ich den HTTP-Channel bei Beenden oder Edomi-Neustart schliesse um mir da nichts „einzufangen“, ansonsten werde ich gurgeln ?
                                Hinter die While-Schleife, also direkt vor dem sql_disconnect(); folgendes einfügen:

                                PHP-Code:
                                fclose($fp); 

                                Kommentar

                                Lädt...
                                X