Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. [geloest] Gembird, Energenie Lan-Steckdosen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [geloest] Gembird, Energenie Lan-Steckdosen

    This topic has been deleted. Only users with topic management privileges can see it.
    • AlCalzone
      AlCalzone Developer last edited by

      Ja, ich habe dir nur den Code geschrieben, um die einzelnen Befehle abzusetzen, nicht ihre Reihenfolge einzuhalten.

      Korrekt wäre folgender Ablauf in Pseudo-Code:

      on(Auslöser)
      |-- login() 
      ...
      |-- Callback von login wird aufgerufen (
          |-- wenn kein Fehler (error == undefined)
              |-- port1_on()
              |-- port2_off()
              |-- was auch immer, am besten auch sequentiell
      
      

      Diese ganze Netzwerkkommunikation ist schwer asynchron, hier eine sinnvolle Ablaufsteuerung zu erreichen ist nicht ganz trivial.

      Eine Möglichkeit wäre der Einsatz von https://developers.google.com/web/fundamentals/getting-started/primers/promises, das ist aber schon ein fortgeschrittenes Thema. Kannst dich bei Interesse mal einlesen. Dann könnte der Ablauf etwa so sein (mit Promises definierte Funktionen vorausgesetzt):

      login()
        .then(port1_on)
        .then(port2_off)
        .catch(function(e) {log("Schalten nicht möglich: " + e);})
        ;
      
      

      Du könntest auch in deinem Handler für die State-Änderung ein Array von Funktionen definieren, die nacheinander aufgerufen werden sollen. Der Request-Callback nimmt sich dann jeweils den ersten, und ruft ihn auf. Die Funktionen müssten dann auch entsprechend definiert werden. Das könnte so aussehen:

      on(
          { id: Auslöser_ID, change: 'ne' },
          function () {
              // Hier die Parameter deiner Requests definieren (url, body)
              // Dieser Part unterscheidet sich je nach Funktion
              var requests = [
                  { // Login
                      url: "http://192.168.2.124/login.html",
                      body: "pw=1"
                  },
                  { // Port 4 aus
                      url: "http://192.168.2.124/status.html",
                      body: "cte4=0"
                  },
                  { // Port 1 an
                      url: "http://192.168.2.124/status.html",
                      body: "cte1=1"
                  },
                  { // Logout
                      url: "http://192.168.2.124/login.html"
                  },
              ];
      
              // Dieser part ist immer gleich.
              // Anfrage-Kette starten:
              chainPostRequests(requests);
          }
      );
      
      function doPostRequest(params, successCb, errorCb) {
          request.post(params, function (error, response, body) {
              if (error)
                  errorCb(error); // Ruft Fehler-Callback mit Fehlerbeschreibung auf
              else
                  successCb(body); // Ruft Erfolgs-Callback mit Antwort des Servers auf.
          });
      }
      
      function chainPostRequests(requestParams) {
          var currentRequestParams = requestParams.shift(); // 1\. Element des Arrays entfernen und benutzen
          doPostRequest(
              currentRequestParams,
              function (body) {
                  // Anfrage erfolgreich
                  if (requestParams.length > 0) {
                      // nächste Anfrage starten
                      chainPostRequests(requestParams);
                  }
                  else {
                      // wir sind fertig
                  }
              },
              function (error) {
                  // Es gab ein Problem, abbrechen
                  // Fehler loggen/ausgeben
              }
          );
      }
      
      

      Disclaimer: Code ist ungetestet.

      1 Reply Last reply Reply Quote 0
      • M
        mickyboys last edited by

        Moin,

        Erstmal grosses Danke.

        Dein Skript spuckt soweit keine Fehler aus, aber schalten tut es auch nicht.

        Nur um Sicher zu gehen, ich habe einfach ein neues Objekt erstellt mit Standard Einstellungen.

        filename="Capture.PNG" index="1">~~

        Ist das richtig, muss ich was besonderes beachten? Brauche ich ein bestimmtes Widget was das schalten kann?

        Hier mein Skript was ich mir deinem Code erstellt habe.

        filename="Capture02.PNG" index="0">~~

        Danke fuer euren Support,

        Axel

        1 Reply Last reply Reply Quote 0
        • M
          mickyboys last edited by

          Gibts niemanden der helfen kann oder moechte?

          1 Reply Last reply Reply Quote 0
          • Jey Cee
            Jey Cee Developer last edited by

            Du hast einen Fehler in deinem Skript. Bei 'on' stimmt die ID von deinem Objekt nicht.

            Füg die ID mal mit dem Button oben rechts im Editor ein.

            1 Reply Last reply Reply Quote 0
            • M
              mickyboys last edited by

              @Jey Cee:

              Du hast einen Fehler in deinem Skript. Bei 'on' stimmt die ID von deinem Objekt nicht.

              Füg die ID mal mit dem Button oben rechts im Editor ein. `

              Mhm, das hatte ich schon getan. Meinst du das /Gembird1_Port4_aus/ sollte weg?

              So sieht die ID aus wenn ich sie via dem button einfuege…

              "Gembird1_Port4_aus"/Gembird1_Port4_aus/

              Danke,

              1 Reply Last reply Reply Quote 0
              • Jey Cee
                Jey Cee Developer last edited by

                Ne das passt. Dachte der Pfad ist unvollständig, aber du hast das Objekt einfach global angelegt. Typischerweise legt man solche Objekte in JavaScript.0 an.

                Wie beschreibt du das Objekt?

                Gesendet von meinem m8 mit Tapatalk

                1 Reply Last reply Reply Quote 0
                • M
                  mickyboys last edited by

                  Wie meinst du beschreiben? Steh auf dem Schlauch

                  1 Reply Last reply Reply Quote 0
                  • M
                    mickyboys last edited by

                    Wenn ich das Skript starte mit dem selbsterstellten Objekt bekomme ich diese Fehlermeldung.

                    ReferenceError: request is not defined at doPostRequest (script.js.common.Gembird_Test.Gembird:28:5) at chainPostRequests (script.js.common.Gembird_Test.Gembird:38:5) at Object. (script.js.common.Gembird_Test.Gembird:22:9) at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1325:48) at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:585:48 at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3210:17) at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:581:17) at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:253:17) at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2866:37) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30)

                    Keine Ahnung was das bedeutet :?

                    Ich weiss leider auch nicht wie das Objekt aussehen sollte, sprich mit welchen Einstellungen es erstellt werden sollte.

                    1 Reply Last reply Reply Quote 0
                    • Jey Cee
                      Jey Cee Developer last edited by

                      Hier mal ein Beispiel wie so ein Objekt aussehen sollte:
                      filename="objekt.PNG" index="0">~~

                      @mickyboys:

                      Wie meinst du beschreiben? Steh auf dem Schlauch `
                      Damit meinte ich wie du den Status (Wert/Value) deines Objekts von "false" auf "true" setzt.

                      @mickyboys:

                      Wenn ich das Skript starte mit dem selbsterstellten Objekt bekomme ich diese Fehlermeldung.

                      ReferenceError: request is not defined at doPostRequest (script.js.common.Gembird_Test.Gembird:28:5) at chainPostRequests (script.js.common.Gembird_Test.Gembird:38:5) at Object. (script.js.common.Gembird_Test.Gembird:22:9) at Object.subs.callback (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1325:48) at /opt/iobroker/node_modules/iobroker.javascript/javascript.js:585:48 at getObjectEnums (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:3210:17) at checkPatterns (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:581:17) at Object.utils.adapter.stateChange (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:253:17) at Object.that.states.States.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:2866:37) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:45:30) `

                      Der Fehler sagt dir das du den Befehl request nicht definiert hast. Der kommt von einem Modul das du in deinem Skript aufrufen musst.

                      var request = require('request');
                      

                      Am Anfang deines Scripts einfügen. Dann sollte es gehen.

                      Lies dich hier mal ein: http://www.iobroker.net/?page_id=5385&lang=de

                      1 Reply Last reply Reply Quote 0
                      • M
                        mickyboys last edited by

                        Hi Danke, schau mir das gleich mal an.

                        Dein Anhang wie ein Objekt ausschauen sollte ist leer - magst nochmal schicken?

                        Danke,

                        Axel

                        1 Reply Last reply Reply Quote 0
                        • M
                          mickyboys last edited by

                          Hi,

                          Ich gebe auf.

                          Der Code freezt jetzt wieder die komplette Steckdosenleiste.

                          Schade das es so kompliziert ist eine einfache Steckdosenleiste anzusprechen.

                          1 Reply Last reply Reply Quote 0
                          • M
                            mickyboys last edited by

                            Ich habe die CURL mit Chrome Dev-Inspector ausgelesen und in ein shellskript gepackt. Dieses starte ich nun per skript aus iobroker. Damit funktioniert es super…

                            so sieht der CURL vom Socket01 aus, aufgeteilt in Login, Delay 2 Sekunden, An oder aus, Delay 2 Sekunden, Logout

                            #!/bin/bash
                            
                            curl 'http://192.168.1.9/login.html' -H 'Origin: http://192.168.1.9' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8,de;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://192.168.1.9/' -H 'Connection: keep-alive' --data 'pw=1' --compressed
                            
                            sleep 2
                            
                            curl 'http://192.168.1.9/' -H 'Origin: http://192.168.1.9' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8,de;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://192.168.1.9/login.html' -H 'Connection: keep-alive' --data 'cte1=0&cte2=&cte3=&cte4=' --compressed
                            
                            sleep 2
                            
                            curl 'http://192.168.1.9/login.html' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,de;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://192.168.1.9/' -H 'Connection: keep-alive' --compressed
                            

                            Und so das Script was aus iobroker gestartet wird. Hier werden jeweils der An oder Aus Befehl getriggert in abhaengigkeit zum Status.

                            on({id: "javascript.0.scriptEnabled.common.HardShutdown.LeftSocket-1_Dummy"/*scriptEnabled.common.HardShutdown.LeftSocket-1_Dummy*/, change: "ne"}, function (obj) {
                              var value = obj.state.val;
                              var oldValue = obj.oldState.val;
                              if (getState("javascript.0.scriptEnabled.common.HardShutdown.LeftSocket-1_Dummy").val == true) {
                                exec('bash /home/pi/GembirdPowerSocket/LeftSocket1-on.sh');
                                console.log("exec: " + 'bash /home/pi/GembirdPowerSocket/LeftSocket1-on.sh');
                              } else if (getState("javascript.0.scriptEnabled.common.HardShutdown.LeftSocket-1_Dummy").val == false) {
                                exec('bash /home/pi/GembirdPowerSocket/LeftSocket1-off.sh');
                                console.log("exec: " + 'bash /home/pi/GembirdPowerSocket/LeftSocket1-off.sh');
                              }
                            });
                            
                            Basti97 1 Reply Last reply Reply Quote 0
                            • Basti97
                              Basti97 Most Active last edited by Basti97

                              Hat jemand eine Lösung für die Gembird Steckdose gefunden um sie in iob zu integrieren?

                              1 Reply Last reply Reply Quote 0
                              • Basti97
                                Basti97 Most Active @mickyboys last edited by

                                @mickyboys Hast du das irgendwie hinbekommen die Steckdose in iob zu integrieren bzw zu steuern da dein Post als gelöst markiert wurde. Ich habe es nun mehrmals mit meiner Steckdose probiert und bekomme es einfach nicht hin.

                                1 Reply Last reply Reply Quote 0
                                • Basti97
                                  Basti97 Most Active @mickyboys last edited by

                                  @mickyboys Denkst du da man das Script auch direkt per iobroker auslösen kann. Ich weiß der Beitrag ist schon alt aber vielleicht hast du es ja in der zwischen Zeit laufen?

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  771
                                  Online

                                  31.9k
                                  Users

                                  80.1k
                                  Topics

                                  1.3m
                                  Posts

                                  4
                                  24
                                  5194
                                  Loading More Posts
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                  The ioBroker Community 2014-2023
                                  logo