NEWS
Shelly 1 via JavaScript Ansteuern
-
Hallo Zusammen, ich möchte gerne meinen Shelly 1 (der als Fussbodenheizungsregler dient) per ioBroker ansteuern, leider sind die benoetigten Variablen nicht einfach im Shelly CoAP erreichbar..
habe nun ueber den Shelly Technical Support herausbekommen das man dies ueber einen HTTP Post machen soll:
Email vom Technical Service:
Temperature automation values can be set only via POST requests.
They don't support GET requests.You have to send a POST request to http://DEVICEIP/settings/ext_temperature/0 with FormData as a payload that contained the following values:
- relay0_overtemp_threshold_tC: OVERTEMP_VALUE
- relay0_undertemp_threshold_tC: UNDERTEMP_VALUE
- relay0_overtemp_act: relay_on
- relay0_undertemp_act: disabled
Nun habe ich vor das ueber dieses Skript laufen zu lassen, leider Klappt das mit dem POST Request
noch nicht so wie ich gerne moechte...Welchen Fehler habe ich hier noch drin?
var idOvertemp = '0_userdata.0.ShellyFBH.RelayOvertemp'; var idUndertemp = '0_userdata.0.ShellyFBH.RelayUndertemp'; var idActOvertemp = '0_userdata.0.ShellyFBH.RelaySettedOvertemp'; var idActUndertemp = '0_userdata.0.ShellyFBH.RelaySettedUndertemp'; on({id: idOvertemp, change: "ne"}, async function (obj) { var nOvertemp = parseFloat(idOvertemp); var nUndertemp = parseFloat(idUndertemp); var request = require('request'); request.post({ url: 'http://192.168.178.29/settings/ext_temperature/0', form: { relay0_overtemp_threshold_tC: nOvertemp } }, function(error, response, body) { if (error) log(error, 'error'); }); });
Danke und Gruss
-
@neueklasse
Zeilen 8,9:var nOvertemp = parseFloat(obj.state.val); var nUndertemp = parseFloat(getState(idUndertemp).val);
Zeile 11 kann entfallen.
-
@paul53
Danke fuer die Optimierung,im Protokoll:
18:02:24.129 info javascript.0 (235) script.js.User_Scripts.ShellyFBHControl: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 18:02:29.405 info javascript.0 (235) script.js.User_Scripts.ShellyFBHControl: getState(id=0_userdata.0.ShellyFBH.RelayUndertemp, timerId=undefined) => {"val":0,"ack":true,"ts":1680101118307,"q":32,"from":"system.adapter.admin.0","user":"system.user.admin","lc":1680101118307}
an den Werten der Shelly Page ändert sich leider noch nichts...
-
anbei sieht man die Ausgabe des Shellys wenn ich auf SAVE gehe, Addresse, Payload Daten...
bisher hatte ich noch keinen erfolg..auch nicht wenn beim Payload das vom Shelly Support geschriebene 'relay0' wegfaellt...
-
@neueklasse habe jetzt herausgefunden das das Skript soweit funktioniert! (via Insomnia funktioniert der Post request und die Temperaturen aendern sich..)
Nun zum eigentlichen Problem:
ich konnte noch nicht herausfinden wie ich die authentifizierung im Javascript durchfuehre, mir fehlt schlichtweg die Zeile in der ich passwort und username eintragen kann, wie hat das auszusehen?erledigt, Loesung: http://user:pw@LINK......
-
zu diesem Post, nun ist request.post veraltet und wurde durch httpPost ersetzt...
das sieht dann im Script so aus:
httpPost('http://admin:passwort@ip/settings/ext_temperature/0', { "overtemp_threshold_tC": nOvertemp , "undertemp_threshold_tC": nUndertemp }, (error, response) => { if (!error) { console.log(response.statusCode); console.log(response.data); console.log(response.headers); } else { console.error(error); } });
leider klappt es mit der Übertragung nicht mehr, ich habe ein paar verschiedene Varianten getestet, ohne Erfolg..
folgendes zeigt die Konsole:
script.js.User_Scripts.ShellyFBHControl: httpPost(config={"method":"post","url":"http://ip/settings/ext_temperature/0","responseType":"text","responseEncoding":"utf8","timeout":2000,"auth":{"username":"admin","password":"passwort"},"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"},"data":{"overtemp_threshold_tC":22,"undertemp_threshold_tC":21}}, data=[object Object])
vorher waren die Variablen unter form: , laut der Konsole ist es nun unter data: