NEWS
HTTP POST an CCU in Javascript
-
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
-
=> 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.'); });
-
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 ?
-
Content-Type steht auf text/plain
Eventuell ändern
Gesendet von iPad mit Tapatalk
-
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
-
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
-
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.
-
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.
-
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
-
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]