Ankündigung

Einklappen
Keine Ankündigung bisher.

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