Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. HTTP POST an CCU in Javascript

    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

    HTTP POST an CCU in Javascript

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

      danke, habich sofort probiert…

      ccu variable ändert sich nicht,

      bei mir kommt folgendes im log:

      <code>[code]
      00:03:12.059	[warn]	javascript.1 script.js.TestSchedule: ERROR: socket hang up
      00:03:30.681	[info]	javascript.1 Stop script script.js.TestSchedule
      00:03:30.681	[info]	javascript.0 Stop script script.js.TestSchedule
      00:03:30.884	[info]	javascript.1 Start javascript script.js.TestSchedule
      00:03:30.885	[info]	javascript.1 script.js.TestSchedule: Data to request body: dom.GetObject ("ZZTEST").State (11)
      00:03:30.885	[info]	javascript.1 script.js.TestSchedule: registered 0 subscriptions and 0 schedules
      00:04:31.209	[warn]	javascript.1 script.js.TestSchedule: ERROR: socket hang up[/code]</code>
      

      Sinn ist natürlich nicht im Endzustand damit Systemvariablem zu setzen, sondern über xmlrpc.PutParamset zugriff auf die MASTER (Konfigeinstellungen der Geräte) und LINK (Direktverknüpfungen der geräte) zu bekommen und diese von IOBRoker aus ändrn zu können

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        @Blackmike:

        danke, habich sofort probiert…

        ccu variable ändert sich nicht, `

        und wenn Du das +1 hinter data.length entfernst?

        1 Reply Last reply Reply Quote 0
        • ruhr70
          ruhr70 last edited by

          Ohne die +1 sieht es bei mir wie folgt aus:

          00:10:40.172	[info]	javascript.2 Start javascript script.js.Test.http_POST
          00:10:40.172	[info]	javascript.2 script.js.Test.http_POST: Data to request body: dom.GetObject ("wz_ip").State (19);
          00:10:40.174	[info]	javascript.2 script.js.Test.http_POST: registered 0 subscriptions and 0 schedules
          00:10:40.187	[info]	javascript.2 script.js.Test.http_POST: http Status: 200
          00:10:40.187	[info]	javascript.2 script.js.Test.http_POST: HEADERS: {"server":"ise GmbH HTTP-Server v2.0","accept-ranges":"bytes","cache-control":"no-store, no-cache","content-type":"text/xml","content-length":"222","date":"Wed, 19 Apr 2017 00:10:40 GMT","connection":"close"}
          

          Und der Wert im hm-rega ändert sich (meine Variable heisst in dem Beispiel: wz_ip).

          1 Reply Last reply Reply Quote 0
          • Blackmike
            Blackmike last edited by

            treffer, muchas gracias, das wars…

            wert ändert sich...

            perfekt.

            javascript.1	2017-04-19 00:12:46.718	info	script.js.TestSchedule: HEADERS: {"server":"ise GmbH HTTP-Server v2.0","accept-ranges":"bytes","cache-control":"no-store, no-cache","content-type":"text/xml","content-length":"222","date":"Wed, 19 Ap
            javascript.1	2017-04-19 00:12:46.718	info	script.js.TestSchedule: http Status: 200
            javascript.1	2017-04-19 00:12:46.685	info	script.js.TestSchedule: registered 0 subscriptions and 0 schedules
            javascript.1	2017-04-19 00:12:46.684	info	script.js.TestSchedule: Data to request body: dom.GetObject ("ZZTEST").State (11)
            

            Wenn interesse daran besteht, poste ich hier dann gerne mal ein paar Zeilen Code, mit dem man dann zum Beispiel in Thermostaten Wochenprogramme umschalten kann, zeiten und temperaturen ändern kann, bei Schaltaktoren die einschaltzeit ändern kann (bei Direktverknüpfungen)

            greetz, Black

            1 Reply Last reply Reply Quote 0
            • Blackmike
              Blackmike last edited by

              das tuts soweit, das verändern von Parametern aus dem Mastersatz tuts auch schon.

              ich brauch aber nochmal ein Denkansatz.

              Nach dem Post gibt der webserver der CCU brav antwort.

              javascript.1 script.js.TestSchedule: HEADERS: {"server":"ise GmbH HTTP-Server v2.0","accept-ranges":"bytes","cache-control":"no-store, no-cache","content-type":"text/xml","content-length":"253","date":"Wed, 19 Apr 2017 11:13:04 GMT","connection":"close"}
              

              in dem Falle eine Antwort von 253 Zeichen.

              wo und wie komme ich an die Antwort von dem Server ? res.resposeText ist es nicht, das ist undefiniert ..

              thnx, Black

              1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer last edited by

                => https://github.com/request/request

                Im einfachsten Fall:

                request( <url und/optionen="">... , function (error, response, body) {
                    // body enthält die Antwort
                });</url>
                

                Verwendet aber das zusätzliche "request"-Modul anstatt "http". Soweit ich weiß, ist das im JS-Adapter bereits geladen.

                –-

                Alternativ kannst du auf das "data"-Event der Response lauschen (https://nodejs.org/api/http.html#http_h ... s_callback😞

                  res.on('data', (chunk) => {
                    console.log(`BODY: ${chunk}`);
                  });
                  res.on('end', () => {
                    console.log('No more data in response.');
                  });
                
                1 Reply Last reply Reply Quote 0
                • Blackmike
                  Blackmike last edited by

                  auch dieser schritt war erfolgreich… danke bisher...

                  nu kommt di enächste Frage, javascritp ist da echt mühsam.

                  folgender code durch die im ersten post genannte python routine gejagt ergibt folgende antwort:

                  Aufruf mit:

                  state= 'dom.GetObject ("ZZTEST").State (22); string s1= "TESTTEST";'
                  
                  q= pushState (state)
                  print (q)
                  

                  antwort der CCU:

                  >>> 
                  b'<xml><exec>blabla.exe</exec><httpuseragent></httpuseragent><s1>TESTTEST</s1></xml>'
                  >>> 
                  

                  wichtig ist das: <s1>TESTTEST</s1>

                  das sagt aus, das die Variable s1 den Inhalt TESTTEST hat.

                  in python wie ichs kenn, tutti.

                  nun Javascript

                  die o.g. routinen sind so eingebaut.

                  function httpPost(data) { // schickt an ein Alexa-Gerät (device) ein Kommando (data) per https-Request / Daten im Body
                   //   log (data.length );
                      var req = http.request(options, function(res) {
                      log("http Status: " + res.statusCode);
                      log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info")); // Header (Rückmeldung vom Webserver)
                      var body='';
                      res.on('data', function(d) {
                          body += d.toString ();
                      });
                  
                      res.on('end', function() {
                          log (body.toString ());
                      });         
                      });
                  
                      req.on('error', function(e) { // Fehler abfangen
                          log('ERROR: ' + e.message,"warn");
                      });
                      log("Data to request body: " + data);
                      // write data to request body
                      (data ? req.write(data) : log("Daten: keine Daten angegeben"));
                  
                      req.end();
                  }
                  
                  httpPost(data);
                  

                  das ergebnis ist:

                  15:30:58.399	[info]	javascript.1 script.js.TestSchedule: /blabla.exeUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36TESTTEST
                  

                  hier sind wohl alle XML Tags weg. wieso ? und wie krieg ich die wieder ?

                  1 Reply Last reply Reply Quote 0
                  • ruhr70
                    ruhr70 last edited by

                    Content-Type steht auf text/plain

                    Eventuell ändern

                    Gesendet von iPad mit Tapatalk

                    1 Reply Last reply Reply Quote 0
                    • ruhr70
                      ruhr70 last edited by

                      Mh… wird wohl Blödsinn sein... es gibt noch eine Einstellung, was man als Antwort erwartet/akzeptiert.

                      Bin nur gerade nicht am Rechner.

                      Gesendet von iPad mit Tapatalk

                      1 Reply Last reply Reply Quote 0
                      • Blackmike
                        Blackmike last edited by

                        hmmm, was irriterend ist:

                        /blabla.exeUser-Agent: Mozilla/5.0TESTTEST
                        

                        das ist die Antwort, die im log dargestellt wird

                        allerdigs passt die länge von 129 zeichen nicht zu diesem text

                        wenn das so aussehen würde, wäre es stimmiger

                        <xml><exec>blabla.exe</exec><httpuseragent>User-Agent: Mozilla/5.0</httpuseragent><s1>TESTTEST</s1></xml>
                        

                        also mal eben das in die Auswertung reinprogrammiert

                            res.on('end', function() {
                                log (body.toString().length);
                                log (body.toString ());
                                var erg= body.substring(body.lastIndexOf("<s1>")+4,body.lastIndexOf("</s1>"));
                                log (erg);
                            });  
                        

                        heisst versuche in dem Ausgabesting den text zwischen <s1>und</s1> zu filtern

                        laut dem log ist der text nicht im string body enthalten.

                        der Filteraufruf ergibt aber TESTTEST

                        würde heissen, es läuft alles richtig, aber die log Ausgabe verschluckt XML Tags ?

                        <<– ratlos

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          gerade mal nachgesehen…

                          ohne am Skript was zu ändern:

                          Im Log wird es ohne XML Tags angezeigt.

                          Wenn man im "großen" Log mit der Maus über den Eintrag steht, stehen die XML Tags drin.

                          1 Reply Last reply Reply Quote 0
                          • ruhr70
                            ruhr70 last edited by

                            @Blackmike:

                            würde heissen, es läuft alles richtig, aber die log Ausgabe verschluckt XML Tags ?

                            <<– ratlos `

                            Tja, da warst Du schneller…

                            Hatte gerade auch das Erlebnis.

                            Die Tags scheinen da zu sein, da sie mit Mouseover sichtbar werden.

                            1 Reply Last reply Reply Quote 0
                            • Blackmike
                              Blackmike last edited by

                              so, und nun ein paar zeilen HM-Script Code… Falls es hier jemand brauchen kann.

                              Dieses beispiel nun: Umschreiben des Wochenprogrammes in dem Wandthermostat.

                              var path = "/blabla.exe";
                              var wochenprog= 1;
                              var sDevice   = 'AI_KUECHE_TH';
                              
                                  data = 'object o1= devices.Get("' + sDevice + '");';
                                  data +='string s2="";';
                                  data +='if (o1) {';
                                  data += 'xmlrpc.PutParamset (o1.Interface(), o1.Address(), "MASTER", "WEEK_PROGRAM_POINTER", '+ wochenprog.toString () +'); s2="SET";';
                                  data += '} else { s2 = "NO DEVICE"; }';
                              

                              AI_KUECHE_TH heisst natürlich mein Teil an der Wand, hier muss der Device Name des WT rein.

                              Wochenprog ist 0, 1, 2 entspricht der Einstellung Wochenprogramm 1,2,3 in der Web UI

                              filtern auf S2 ergibt dann SET wenn der Aufruf erfolgreich war bzw NO DEVICE, wen der Gerätename ungültig war.

                              greetz Black

                              1 Reply Last reply Reply Quote 0
                              • K
                                Kev0 last edited by

                                Hi,

                                ich muss dass hier leider mal aufwärmen, da ich nicht durchsteige.

                                Hintergrund:

                                Ich möchte die Wochenprogramme meiner Heißkörperthermostate via ioBroker durchschalten.

                                Wie? 😄

                                okay hab da jetzt was zusammengepfluckt was zu funktionieren scheint:

                                `// Konstanten für CCU Push
                                var http = require('http'); 
                                var path = "/blabla.exe";
                                
                                function setCCUscript (sDevice,wochenprog) {
                                    var data = 'object o1= devices.Get("' + sDevice + '");';
                                    data +='string s2="";';
                                    data +='if (o1) {';
                                    data += 'xmlrpc.PutParamset (o1.Interface(), o1.Address(), "MASTER", "WEEK_PROGRAM_POINTER", '+ wochenprog.toString () +'); s2="SET";';
                                    data += '} else { s2 = "NO DEVICE"; }';   
                                    return data
                                }
                                
                                function setPushVar (data) {
                                    var options = {
                                    host: getObject('system.adapter.hm-rpc.0').native.homematicAddress,
                                    port: 8181,
                                    path: path,
                                    method: 'POST',
                                    headers: {
                                        'User-Agent' : 'Mozilla/5.0',
                                        'Content-Type': 'text/plain',
                                        'Content-Length': data.length,
                                    }
                                    };
                                    return options;
                                }
                                
                                function httpPost (options,data) {
                                    var req = http.request(options, function(res) {
                                        var body='';
                                        res.on('data', function(d) { body += d.toString (); });
                                        res.on('end', function() {   });      
                                    });
                                    req.on('error', function(e) { log('ERROR: ' + e.message,"warn"); });
                                    (data ? req.write(data) : log("Daten: keine Daten angegeben"));
                                    req.end();
                                }
                                
                                on ({id: "javascript.0.Heizung_Energiesparmodus", change: 'ne'}, function(obj) {
                                    if (getState ("javascript.0.Heizung_Energiesparmodus").val ==1) { 
                                        var array = ["Wohnzimmer Heizung Gruppe", "Schlafzimmer Heizung Gruppe", "Küche Heizung Gruppe", "Büro Heizung Gruppe", "Kinderzimmer Heizung Gruppe", "Hauswirtschaftsraum Heizung Gruppe", "Badezimmer Wanne Heizung Gruppe", "Badezimmer Dusche Heizung Gruppe", "Flur Heizung Gruppe"];
                                        var i;
                                        log ("Heizung_Energiesparmodus ist an");
                                        for (i = 0; i < array.length; i++) {
                                        var script = setCCUscript (array[i], 2);
                                        httpPost (setPushVar (script),script);
                                        }
                                
                                  } else {
                                        var array = ["Wohnzimmer Heizung Gruppe", "Schlafzimmer Heizung Gruppe", "Küche Heizung Gruppe", "Büro Heizung Gruppe", "Kinderzimmer Heizung Gruppe", "Hauswirtschaftsraum Heizung Gruppe", "Badezimmer Wanne Heizung Gruppe", "Badezimmer Dusche Heizung Gruppe", "Flur Heizung Gruppe"];
                                        var i;
                                        log ("Heizung_Energiesparmodus ist aus");
                                        for (i = 0; i < array.length; i++) {
                                        var script = setCCUscript (array[i], 0);
                                        httpPost (setPushVar (script),script);
                                        }
                                  }
                                });` 
                                
                                Grüße
                                
                                Kevin[/i][/i]
                                
                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                888
                                Online

                                31.9k
                                Users

                                80.1k
                                Topics

                                1.3m
                                Posts

                                4
                                16
                                2787
                                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