NEWS
[Javascript] Midas (Aquatemp) Poolheizung
-
Wir wissen jetzt mit Sicherheit, dass bei neuen Accounts das Kennwort nicht mehr als Klartext gespeichert wird.
Jetzt müssen wir nur noch herausfinden, wie das umgewandelt wird...
-
@oxident Super, das erklärt den Fehler beim anmelden. Die Frage ist nur, wie das Passwort umgeschlüsselt werden muss damit es durch den Dienst erkannt werden kann? Gibt es dafür Standards oder kann man das aus der App auslesen? Beim installieren der App gabt es einen Verificationscode den man eingeben musste. Die Mailadresse war goheating@cloud.go-heating.com. Könnte das der Schlüssel sein?
-
Also das Homeassistant-Plugin scheint in Kürze ein Update zu bekommen. Da werden wir spicken können.
Ich bin mit den Daten von @radi71 schon sehr weit gekommen und konnte sehen, dass wir einen Großteil des Codes weiterhin nutzen können.
Dauert aber leider noch... sorry!
-
@oxident ist MD5 verschlüsselt
-
@radi71 Hab mein Passwort mal in MD5 verschlüsselt und ins Script eingetragen aber so leicht funktioniert dann doch nicht
-
@pietnb nein da haben sich auch noch Pfade geändert, URL ist anders und vermutlich auch die eine oder andere Variable
-
@radi71 said in [Javascript] Midas (Aquatemp) Poolheizung:
@pietnb nein da haben sich auch noch Pfade geändert, URL ist anders und vermutlich auch die eine oder andere Variable
Korrekt. Auch die Parameter sind ein wenig verändert worden. Unterstriche weggelassen und so Kleinigkeiten.
Wir werden das schaffen...
-
Okay. MD5 passt und die neuen Parameter sind jetzt auch bekannt.
Wir werden das Skript wohl in Zukunft dreigleisig machen müssen:
- AquaTemp alt (<= v.1.5.8)
- AquaTemp neu
- HiTemp
Der Nutzer muss dann angeben, mit welcher App er sich registriert hat.
Ist eine Menge Arbeit
-
Jetzt hat es mich doch ein wenig in den Fingern gejuckt und ich habe mal etwas versucht. Es wäre toll, wenn speziell die User mit neueren Registrierungen (@PietNB @radi71) mal probieren könnten.
Wichtig ist, dass man nun neben den Benutzerdaten auch den APILevel angeben muss. Hier sollten die neuen User bitte unbedingt eine 3 eintragen. Die Bestandsuser müssen bei 1 bleiben.
// Midas Poolheizung // v0.0.8b // Changelog: // 0.0.8: Testweise Unterstützung von neu registrierten Anlagen // 0.0.7: Kleinigkeiten überarbeitet // weitere Modelle hinzugefügt // 0.0.6: Gültigkeitsprüfung des Zertifikats deaktiviert (Dank an znyde) // Kompatibilität mit Promo Next Modellen durch generische Product-ID (Dank an znyde) // 0.0.5: weitere Abfragewerte hinzugefügt (Kompressor- und Ansaugtemperatur) // 0.0.4: Tokenverfall jetzt 60min nach Skriptstart und nicht zu jeder vollen Stunde (Dank an dering) // 0.0.3: Datenpunkte beim Start automatisch anlegen (Dank an Andy200877) // 0.0.2: Token bei jedem Set-Vorgang prüfen und ggf. neu anfordern (Dank an dering) // ANFANG konfigurierbare Elemente ----- const username = "EMAIL"; var password = "KENNWORT"; const interval = 30; // Abfrageintervall in Sekunden const dpRoot = "0_userdata.0.Poolheizung"; // Stammordner der Datenpunkte var apilevel = 1; // 1: AquaTemp-Accounts, die vor v.1.5.8 erstellt wurden // 2: HiTemp-Accounts // 3: AquaTemp-Accounts, die mit neueren App-Versionen erstellt wurden // ENDE -------------------------------- var cloudURL; var token = ""; var tokenRefreshTimer; var device = ""; var reachable = false; function setupEndpoints() { if(apilevel==1) { cloudURL = "https://cloud.linked-go.com/cloudservice/api"; } else if(apilevel==2) { cloudURL = "https://cloud.linked-go.com/cloudservice/api"; } else if(apilevel==3) { cloudURL = "https://cloud.linked-go.com:449/crmservice/api"; password = require('crypto').createHash('md5').update(password).digest("hex"); } } function clearValues() { saveValue("error", true, "boolean"); saveValue("consumption", 0, "number"); saveValue("state", false, "boolean"); } function saveValue(key, value, sType) { var dp = dpRoot + "." + key; if ( !existsState(dp )) { createState(dp,value,{name: key, type: 'number', role: 'value'}, function () {}); } else { setState(dp,value,true); } } function findCodeVal(result, code) { //log(code); for(var i=0; i<result.length; i++) { //log(result[i].code); if(result[i].code.indexOf(code) >= 0) { return result[i].value; } } return ""; } function createobjects() { log ("erstelle Objekte"); createState(dpRoot + '.ambient', {read: true, write: false, type: "number", unit:"°C", role: "value.temperature", name: "Umgebungstemperatur"}); createState(dpRoot + '.connection', {read: true, write: false, type: "boolean", role: "state", name: "Verbindung", def: false}); createState(dpRoot + '.consumption', {read: true, write: false, type: "number", unit:"W", role: "value.power", name: "Stromverbrauch", def: 0}); createState(dpRoot + '.error', {read: true, write: false, type: "boolean", role: "state", name: "Fehler", def: false}); createState(dpRoot + '.errorCode', {read: true, write: false, type: "string", name: "Fehlercode", def: ""}); createState(dpRoot + '.errorLevel', {read: true, write: false, type: "number", name: "Fehlerlevel"}); createState(dpRoot + '.errorMessage', {read: true, write: false, type: "string", name: "Fehlermeldung", def: ""}); createState(dpRoot + '.mode', {read: true, write: true, type: "string", states: "-1:off;0:cool;1:heat;2:auto", name: "Modus", def: ""}); createState(dpRoot + '.rotor', {read: true, write: false, type: "number", unit:"rpm", def: 0, name: "Lüfterdrehzahl"}); createState(dpRoot + '.silent', {read: true, write: true, type: "boolean", role: "state", name: "Silent", def: false}); createState(dpRoot + '.state', {read: true, write: false, type: "boolean", role: "state", name: "Status", def: false}); createState(dpRoot + '.tempIn', {read: true, write: false, type: "number", unit:"°C", role: "value.temperature", name: "Eingangstemperatur"}); createState(dpRoot + '.tempOut', {read: true, write: false, type: "number", unit:"°C", role: "value.temperature", name: "Ausgangstemperatur"}); createState(dpRoot + '.tempSet', {read: true, write: true, type: "number", unit:"°C", role: "level.temperature", name: "Solltemperatur"}); createState(dpRoot + '.suctionTemp', {read: true, write: false, type: "number", unit:"°C", name: "Luftansaugtemperatur"}); createState(dpRoot + '.coilTemp', {read: true, write: false, type: "number", unit:"°C", role: "value.temperature", name: "Kompressortemperatur"}); createState(dpRoot + '.rawJSON', {read: true, write: false, type: "array", name: "komplette Rückgabe"}); } function updateToken() { if(token=="") { //log("Token Neuanforderung"); var request = require('request'); var options; if(apilevel<3) { options = { url: cloudURL + '/app/user/login.json', method: 'POST', json: { "user_name": username, "password": password, "type": "2" }, rejectUnauthorized: false }; } else { options = { url: cloudURL + '/app/user/login', method: 'POST', json: { "userName": username, "password": password, "type": "2" }, rejectUnauthorized: false }; } //log(JSON.stringify(options)); request(options,function (error, response, body){ //log(JSON.stringify(response)); if(parseInt(body.error_code)==0) { if(apilevel<3) { token = body.object_result["x-token"]; } else { token = body.objectResult["x-token"]; } //log("Login ok! Token " + token); updateDeviceID(); } else { // Login-Fehler //log("Login-Fehler in updateToken(): " + response.body, "error"); token = ""; saveValue("connection", false, "boolean"); } }); } else { updateDeviceID(); } } function updateDeviceID() { if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/deviceList.json', headers: { "x-token": token }, body: {"product_ids": [ "1132174963097280512", "1186904563333062656", "1158905952238313472", "1245226668902080512", "1442284873216843776", "1548963836789501952", ]}, method: 'POST', json: true, rejectUnauthorized: false }; } else { optionsDev = { url: cloudURL + '/app/device/deviceList', headers: { "x-token": token }, body: {"productIds": [ "1132174963097280512", "1186904563333062656", "1158905952238313472", "1245226668902080512", "1442284873216843776", "1548963836789501952", ]}, method: 'POST', json: true, rejectUnauthorized: false }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { //token = body.object_result["x-token"]; //log("Login ok! Token " + token); if(apilevel<3) { device = body.object_result[0].device_code; reachable = (body.object_result[0].device_status=="ONLINE"); } else { device = body.objectResult[0].deviceCode; reachable = (body.objectResult[0].deviceStatus=="ONLINE"); } if(reachable) { saveValue("connection", true, "boolean"); if(device!="") updateDeviceStatus(device); } else { // offline device = ""; saveValue("connection", false, "boolean"); } } else { // Login-Fehler //log("Fehler in updateDeviceID(): " + response.body, "error"); token = ""; device = ""; reachable = false; saveValue("connection", false, "boolean"); } }); } } function updateDeviceStatus(devicecode) { if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/getDeviceStatus.json', headers: { "x-token": token }, json: { "device_code": devicecode }, method: 'POST', rejectUnauthorized: false }; } else { optionsDev = { url: cloudURL + '/app/device/getDeviceStatus', headers: { "x-token": token }, json: { "deviceCode": devicecode }, method: 'POST', rejectUnauthorized: false }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { if(apilevel<3) { if(body.object_result["is_fault"]==true) { // TODO: Fehlerbeschreibung abrufen //clearValues(); saveValue("error", true, "boolean"); updateDeviceDetails(devicecode); updateDeviceErrorMsg(devicecode); } else { // kein Fehler saveValue("error", false, "boolean"); saveValue("errorMessage", "", "string"); saveValue("errorCode", "", "string"); saveValue("errorLevel", 0, "number"); updateDeviceDetails(devicecode); } } else { if(body.objectResult["is_fault"]==true) { // TODO: Fehlerbeschreibung abrufen //clearValues(); saveValue("error", true, "boolean"); updateDeviceDetails(devicecode); updateDeviceErrorMsg(devicecode); } else { // kein Fehler saveValue("error", false, "boolean"); saveValue("errorMessage", "", "string"); saveValue("errorCode", "", "string"); saveValue("errorLevel", 0, "number"); updateDeviceDetails(devicecode); } } //token = body.object_result["x-token"]; //log("Login ok! Token " + token); } else { // Login-Fehler //log("Fehler in updateDeviceStatus(): " + response.body, "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); } }); } } function updateDeviceErrorMsg(devicecode) { if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/getFaultDataByDeviceCode.json', headers: { "x-token": token }, json: { "device_code": devicecode }, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } else { optionsDev = { url: cloudURL + '/app/device/getFaultDataByDeviceCode', headers: { "x-token": token }, json: { "deviceCode": devicecode }, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { saveValue("error", true, "boolean"); if(apilevel<3) { saveValue("errorMessage", body.object_result[0].description, "string"); saveValue("errorCode", body.object_result[0].fault_code, "string"); saveValue("errorLevel", body.object_result[0].error_level, "string"); } else { saveValue("errorMessage", body.objectResult[0].description, "string"); saveValue("errorCode", body.objectResult[0].fault_code, "string"); saveValue("errorLevel", body.objectResult[0].error_level, "string"); } } else { // Login-Fehler //log("Fehler in updateDeviceErrorMsg(): " + response.body, "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); } }); } } function updateDeviceDetails(devicecode) { if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/getDataByCode.json', headers: { "x-token": token }, json: { "device_code": devicecode, "protocal_codes":["Power","Mode","Manual-mute","T01","T02","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T04","T05","T07","T14","T17"] }, // "protocal_codes":["Power","Mode","Manual-mute","T01","T02","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T04","T05"] method: 'POST', rejectUnauthorized: false }; } else { optionsDev = { url: cloudURL + '/app/device/getDataByCode', headers: { "x-token": token }, json: { "deviceCode": devicecode, "protocalCodes":["Power","Mode","Manual-mute","T01","T02","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T04","T05","T07","T14","T17"] }, // "protocal_codes":["Power","Mode","Manual-mute","T01","T02","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T04","T05"] method: 'POST', rejectUnauthorized: false }; } var request = require('request'); request(optionsDev,function (error, response, body){ if(parseInt(body.error_code)==0) { if(apilevel<3) { saveValue("rawJSON", body.object_result, "string"); if(findCodeVal(body.object_result, "Power")=="1") { // Stromverbrauch T07 x T14 in Watt saveValue("consumption", parseFloat(findCodeVal(body.object_result, "T07")) * parseFloat(findCodeVal(body.object_result, "T14")), "number"); // Lüfter-Drehzahl T17 saveValue("rotor", parseInt(findCodeVal(body.object_result, "T17")), "number"); // Luftansaug-Temperatur T01 saveValue("suctionTemp", parseFloat(findCodeVal(body.object_result, "T01")), "number"); // Inlet-Temperatur T02 saveValue("tempIn", parseFloat(findCodeVal(body.object_result, "T02")), "number"); // outlet-Temperatur T03 saveValue("tempOut", parseFloat(findCodeVal(body.object_result, "T03")), "number"); // Coil-Temperatur T04 saveValue("coilTemp", parseFloat(findCodeVal(body.object_result, "T04")), "number"); } else { saveValue("consumption", 0, "number"); saveValue("rotor", 0, "number"); } // Ziel-Temperatur Set_Temp saveValue("tempSet", parseFloat(findCodeVal(body.object_result, "Set_Temp")), "number"); // Umgebungs-Temperatur T05 saveValue("ambient", parseFloat(findCodeVal(body.object_result, "T05")), "number"); // Flüstermodus Manual-mute if(findCodeVal(body.object_result, "Manual-mute")=="1") { saveValue("silent", true, "boolean"); } else { saveValue("silent", false, "boolean"); } // Zustand Power if(findCodeVal(body.object_result, "Power")=="1") { saveValue("state", true, "boolean"); saveValue("mode", findCodeVal(body.object_result,"Mode"), "string"); } else { saveValue("state", false, "boolean"); saveValue("mode", "-1", "string"); } saveValue("connection", true, "boolean"); // Durchlauf ENDE //log(findCodeVal(body.object_result, "T07")); } else { saveValue("rawJSON", body.objectResult, "string"); if(findCodeVal(body.objectResult, "Power")=="1") { // Stromverbrauch T07 x T14 in Watt saveValue("consumption", parseFloat(findCodeVal(body.objectResult, "T07")) * parseFloat(findCodeVal(body.objectResult, "T14")), "number"); // Lüfter-Drehzahl T17 saveValue("rotor", parseInt(findCodeVal(body.objectResult, "T17")), "number"); // Luftansaug-Temperatur T01 saveValue("suctionTemp", parseFloat(findCodeVal(body.objectResult, "T01")), "number"); // Inlet-Temperatur T02 saveValue("tempIn", parseFloat(findCodeVal(body.objectResult, "T02")), "number"); // outlet-Temperatur T03 saveValue("tempOut", parseFloat(findCodeVal(body.objectResult, "T03")), "number"); // Coil-Temperatur T04 saveValue("coilTemp", parseFloat(findCodeVal(body.objectResult, "T04")), "number"); } else { saveValue("consumption", 0, "number"); saveValue("rotor", 0, "number"); } // Ziel-Temperatur Set_Temp saveValue("tempSet", parseFloat(findCodeVal(body.objectResult, "Set_Temp")), "number"); // Umgebungs-Temperatur T05 saveValue("ambient", parseFloat(findCodeVal(body.objectResult, "T05")), "number"); // Flüstermodus Manual-mute if(findCodeVal(body.objectResult, "Manual-mute")=="1") { saveValue("silent", true, "boolean"); } else { saveValue("silent", false, "boolean"); } // Zustand Power if(findCodeVal(body.objectResult, "Power")=="1") { saveValue("state", true, "boolean"); saveValue("mode", findCodeVal(body.objectResult,"Mode"), "string"); } else { saveValue("state", false, "boolean"); saveValue("mode", "-1", "string"); } saveValue("connection", true, "boolean"); // Durchlauf ENDE //log(findCodeVal(body.object_result, "T07")); } } else { // Login-Fehler //log("Fehler in updateDeviceDetails(): " + response.body, "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); } }); } } function updateDevicePower(devicecode, power) { var powerOpt; var powerMode = 2; if(power==-1) { // aus powerOpt = 0; powerMode = -1; } else if(power==0) { // an und kühlen powerOpt = 1; powerMode = 0; } else if(power==1) { // an und heizen powerOpt = 1; powerMode = 1; } else if(power==2) { // an und auto powerOpt = 1; powerMode = 2; } else { log("ungülter Zustand!"); return; } if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/control.json', headers: { "x-token": token }, json: {"param":[{ "device_code": devicecode, "protocol_code": "Power","value": powerOpt }]}, method: 'POST', rejectUnauthorized: false }; } else { optionsDev = { url: cloudURL + '/app/device/control', headers: { "x-token": token }, json: {"param":[{ "deviceCode": devicecode, "protocolCode": "Power","value": powerOpt }]}, method: 'POST', rejectUnauthorized: false }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(devicecode); //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { saveValue("mode", power, "string"); if(power>=0) updateDeviceMode(device, power); } else { log("Zustandsänderung fehlgeschlagen!", "error"); } }); } } function updateDeviceMode(devicecode, mode) { if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/control.json', headers: { "x-token": token }, json: {"param":[{ "device_code": devicecode, "protocol_code": "mode","value": mode }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } else { optionsDev = { url: cloudURL + '/app/device/control', headers: { "x-token": token }, json: {"param":[{ "deviceCode": devicecode, "protocolCode": "mode","value": mode }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(devicecode); //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { saveValue("mode", mode, "string"); } else { log("Zustandsänderung fehlgeschlagen!", "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); } }); } } function updateDeviceSilent(devicecode, silent) { var silentMode; if(silent) { silentMode = "1"; } else { silentMode = "0"; } if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/control.json', headers: { "x-token": token }, json: {"param":[{ "device_code": devicecode, "protocol_code": "Manual-mute","value": silentMode }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } else { optionsDev = { url: cloudURL + '/app/device/control', headers: { "x-token": token }, json: {"param":[{ "deviceCode": devicecode, "protocolCode": "Manual-mute","value": silentMode }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(devicecode); //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { saveValue("silent", silent, "boolean"); } else { log("Zustandsänderung fehlgeschlagen!", "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); } }); } } function updateDeviceSetTemp(devicecode, temperature) { var sTemperature = temperature.toString().replace(",", "."); var sMode = getState(dpRoot + ".mode").val; if(sMode=="-1") { //log("Gerät einschalten um Temperatur zu ändern!", 'warn'); return; } else if(sMode=="0") { sMode = "R01"; // Kühlen } else if(sMode=="1") { sMode = "R02"; // Heizen } else if(sMode=="2") { sMode = "R03"; // Auto } if(token!="") { var optionsDev; if(apilevel<3) { optionsDev = { url: cloudURL + '/app/device/control.json', headers: { "x-token": token }, json: {"param":[{ "device_code": devicecode, "protocol_code": "R01","value": sTemperature },{ "device_code": devicecode, "protocol_code": "R02","value": sTemperature },{ "device_code": devicecode, "protocol_code": "R03","value": sTemperature },{ "device_code": devicecode, "protocol_code": "Set_Temp","value": sTemperature }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } else { optionsDev = { url: cloudURL + '/app/device/control', headers: { "x-token": token }, json: {"param":[{ "deviceCode": devicecode, "protocolCode": "R01","value": sTemperature },{ "deviceCode": devicecode, "protocolCode": "R02","value": sTemperature },{ "deviceCode": devicecode, "protocolCode": "R03","value": sTemperature },{ "deviceCode": devicecode, "protocolCode": "Set_Temp","value": sTemperature }]}, method: 'POST', rejectUnauthorized: false //headers: {"content-type": "application/json"}, //charset: 'utf8', //json: true }; } var request = require('request'); request(optionsDev,function (error, response, body){ //log(devicecode); //log(JSON.stringify(response)); //log(JSON.stringify(body.object_result)); if(parseInt(body.error_code)==0) { saveValue("tempSet", temperature, "number"); } else { log("Zustandsänderung fehlgeschlagen!", "error"); token = ""; device = ""; saveValue("connection", false, "boolean"); //log(JSON.stringify(response)); } }); } } // Beginn des Skripts setupEndpoints(); createobjects(); // DPs anlegen updateToken(); // Zugriffstoken erfragen und aktuelle Werte lesen schedule('*/' + interval + ' * * * * *', function () { // regelmäßig Token und Zustand abfragen updateToken(); // gewünschte Änderungen ausführen if(!getState(dpRoot + ".mode").ack) { updateDevicePower(device, getState(dpRoot + ".mode").val); } if(!getState(dpRoot + ".silent").ack) { updateDevicePower(device, getState(dpRoot + ".silent").val); } }); tokenRefreshTimer = setInterval(function () { // Token verfällt nach 60min token = ""; //log("Token nach Intervall verworfen.") updateToken(); }, 3600000); on({id: dpRoot + ".mode", change: "ne", ack: false}, function (obj) { updateToken(); updateDevicePower(device, getState(dpRoot + ".mode").val); }); on({id: dpRoot + ".silent", change: "ne", ack: false}, function (obj) { updateToken(); updateDeviceSilent(device, getState(dpRoot + ".silent").val); }); on({id: dpRoot + ".tempSet", change: "ne", ack: false}, function (obj) { updateToken(); updateDeviceSetTemp(device, getState(dpRoot + ".tempSet").val); });
-
@oxident Prima das es dir keine Ruhe gelassen hat .
Gute Nachrichten. Ein erster Test zeigt das jetzt schonmal die Verbindung steht. Jetzt muss ich noch ein paar Parameter anpassen die bei meiner Pumpe anders sind. Der Parameter "Mode" wird schonmal aktualisiert von "off" auf "heat". Den Rest probiere ich heute Abend bestimmt noch aus. Ein paar Fehlermeldungen stehen auch noch an.
javascript.0 2023-06-28 19:34:05.796 error at processImmediate (internal/timers.js:464:21) javascript.0 2023-06-28 19:34:05.796 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5708:41) javascript.0 2023-06-28 19:34:05.796 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:596:29) javascript.0 2023-06-28 19:34:05.796 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1214:38) javascript.0 2023-06-28 19:34:05.796 error at Object.<anonymous> (script.js.Poolheizung:825:5) javascript.0 2023-06-28 19:34:05.795 error at updateDeviceSetTemp (script.js.Poolheizung:716:36) javascript.0 2023-06-28 19:34:05.793 error Error in callback: TypeError: Cannot read property 'toString' of null javascript.0 2023-06-28 19:34:05.755 warn Read-only state "0_userdata.0.Poolheizung.rawJSON" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.755 warn Read-only state "0_userdata.0.Poolheizung.coilTemp" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.754 warn Read-only state "0_userdata.0.Poolheizung.suctionTemp" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.750 warn Read-only state "0_userdata.0.Poolheizung.tempOut" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.742 warn Read-only state "0_userdata.0.Poolheizung.tempIn" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.740 warn Read-only state "0_userdata.0.Poolheizung.errorLevel" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.725 warn Read-only state "0_userdata.0.Poolheizung.ambient" has been written without ack-flag with value "null" javascript.0 2023-06-28 19:34:05.575 info script.js.Poolheizung: registered 3 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions javascript.0 2023-06-28 19:34:05.541 info script.js.Poolheizung: erstelle Objekte javascript.0 2023-06-28 19:34:05.514 info Start javascript script.js.Poolheizung javascript.0 2023-06-28 19:34:02.824 info Stop script script.js.Poolheizung
Mir ist aufgefallen das die App jetzt bei Anmeldung jetzt die Meldung "Token ist abgelaufen" meldet. Um die App zu nutzen muss ich mich neu anmelden. Wenn die App dann auf ist kommt immer sporadisch eine Einblendung "IOT irgendwas...?
Danke nochmal..
-
@pietnb Hmm...so stark unterscheiden sich die WP´s nicht. Meine Poolsana Prime hat die gleichen "T-Parameter" wie deine. Es fehlt nur T-17.
Eigentlich müsste die Werte doch dann angezeigt werden?
-
Cool, das ist doch schonmal ein Lichtblick. Ich glaube, die obigen Fehlermeldungen sollten verschwinden, sobald richtige Werte kommen.
Das mit der App könnte etwas mit dem "Keep-Alive" zu tun haben. Das habe ich noch nicht ganz verstanden, aber wir stehen ja noch am Anfang.
Interessant wäre hauptsächlich erstmal der DP "rawJSON". Wird der bei Dir schon befüllt?
Was die Parameterzuordnungen angeht, da müssen wir uns mal etwas überlegen damit es für alle funktioniert
Bis dahin bist Du natürlich herzlich eingeladen, wild "herumzuhacken"
-
@oxident Bei DP "rawJSON" steht bei mir das:
[{"value":"0","code":"Power"},{"value":"1","code":"Mode"},{"value":"0","code":"Manual-mute"},{"value":"0","code":"T01"},{"value":"0","code":"T02"},{"value":"0","code":"2074"},{"value":"0","code":"2075"},{"value":"0","code":"2076"},{"value":"0","code":"2077"},{"value":"0","code":"H03"},{"value":"0","code":"Set_Temp"},{"value":"8.0","code":"R08"},{"value":"35.0","code":"R09"},{"value":"15.0","code":"R10"},{"value":"40.0","code":"R11"},{"value":"27.0","code":"R01"},{"value":"27.0","code":"R02"},{"value":"27.0","code":"R03"},{"value":"0","code":"T03"},{"value":"0","code":"1158"},{"value":"0","code":"1159"},{"value":"114","code":"F17"},{"value":"1","code":"H02"},{"value":"0","code":"T04"},{"value":"0","code":"T05"},{"value":"0","code":"T07"},{"value":"0","code":"T14"},{"value":"0","code":"T17"}]
Ich denke ein paar Werte sind drin (value?) aber einige T03, T04 usw. sind noch leer.
-
@pietnb Komisch. Du könntest auf die Schnelle mal testen, ob sich etwas ändert, wenn Du alle Vorkommnisse von z. B. T01 in T1 änderst. Einfach "stumpf" über Suchen & Ersetzen.
Klingt unlogisch, scheint aber bei manchen Modellen wohl so zu sein.
-
@pietnb Wir könnten es auch auf die "harte Tour" versuchen. Im Github-Repo für das HA-Projekt gibt es diese kurze Anleitung, zumindest für Android-Nutzer: https://github.com/radical-squared/aquatemp#data-from-mobile-app
Traust Du Dir das zu?
-
@oxident Ich werde beide Varianten heute Abend mal testen und berichten. Danke
-
@oxident Variante 1 T01 in T1 zu tauschen, hat wohl funktioniert. Leider werden mir die Werte nur in der "rawJSON" angezeigt:
[{"value":"0","code":"Power"},{"value":"1","code":"Mode"},{"value":"0","code":"Manual-mute"},{"value":"17.0","code":"T1"},{"value":"24.5","code":"T2"},{"value":"0","code":"2074"},{"value":"0","code":"2075"},{"value":"0","code":"2076"},{"value":"0","code":"2077"},{"value":"0","code":"H03"},{"value":"0","code":"Set_Temp"},{"value":"8.0","code":"R08"},{"value":"35.0","code":"R09"},{"value":"15.0","code":"R10"},{"value":"40.0","code":"R11"},{"value":"27.0","code":"R01"},{"value":"27.0","code":"R02"},{"value":"27.0","code":"R03"},{"value":"25.0","code":"T3"},{"value":"0","code":"1158"},{"value":"0","code":"1159"},{"value":"114","code":"F17"},{"value":"1","code":"H02"},{"value":"23.0","code":"T4"},{"value":"23.0","code":"T5"},{"value":"0","code":"T07"},{"value":"0","code":"T14"},{"value":"0","code":"T17"}]
Ich habe zum Test mal alle Werte T01, T02, T03, T04, T05 geändert. Jetzt stehen da überall plausible Werte aber leider noch nicht bei den Objekten. Muss ich da auch noch was anpassen?
-
Korrektur: Jetzt wird der Wert "Umgebungstemperatur" T5 auch bei den Objekten angezeigt. Leider nur der eine Wert
-
@pietnb Könntest Du mal in Zeile 193 die // am Anfang entfernen?
//log(JSON.stringify(response));
Dann müsstest Du im Log u.a. die Rückgabe der device_id sehen. Die bräuchte ich mal, damit wir für die verschiedenen Heizungstypen die Zuordnung unterscheiden können.
Ich denke, Deine Parameternamen sind nämlich diese hier: https://github.com/radical-squared/aquatemp/blob/Custom-component/custom_components/aqua_temp/parameters/1442284873216843776.json
-
Also bei mir funktioniert alles noch einwandfrei ... Ich hätte aber mal ne andere Frage (ich weiß das du gerade ein wenig arbeit hast, somit pressiert das auch nicht ..)
Der Wert "Ansauglufttemperatur" fällt bei mir im Betrieb der WP auf z.B. 4,0°C ab .... das kann doch dann nicht die Ansauglufttemperatur sein ? Ist das evtl. die Temperatur der Luft nach dem Kompressor ??
Wie gesagt, hat keine Eile ....