NEWS
[Javascript] Midas (Aquatemp) Poolheizung
-
@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 ....
-
@oxident Die device_id ist 1640588423515365376. Kann man aus der AquaTemp App auslesen.
Ich hatte die device_id bereits in der Liste im Script ergänzt, habe diese aber jetzt gelöscht und auf einmal waren die meisten Werte auch da
Hier aber trotzdem der Log.
5:24:17.895 info javascript.0 (1373) Stop script script.js.Poolheizung 15:24:17.908 info javascript.0 (1373) Start javascript script.js.Poolheizung 15:24:17.936 info javascript.0 (1373) script.js.Poolheizung: erstelle Objekte 15:24:17.945 info javascript.0 (1373) script.js.Poolheizung: registered 3 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions 15:24:18.251 info javascript.0 (1373) script.js.Poolheizung: {"statusCode":200,"body":{"sessionid":null,"error_code":"0","error_msg":"Success","error_msg_code":"","totalSize":null,"totalPage":null,"nextPage":null,"objectResult":[{"deviceType":"","device_status":"ONLINE","is_fault":false,"device_id":"1640588423515365376","productId":"1442284873216843776","deviceNickName":"Poolheizung","device_type":"","deviceCode":"0C7FEDC2A9F5","isFault":false,"deviceName":"0C7FEDC2A9F5","deviceId":"1640588423515365376","deviceStatus":"ONLINE","device_name":"0C7FEDC2A9F5","device_code":"0C7FEDC2A9F5","product_id":"1442284873216843776","model":null,"sn":null,"device_nick_name":"Poolheizung","projectId":null}],"isReusltSuc":true},"headers":{"date":"Fri, 30 Jun 2023 13:24:21 GMT","content-type":"application/json;charset=UTF-8","transfer-encoding":"chunked","connection":"close","vary":"Origin, Access-Control-Request-Method, Access-Control-Request-Headers","x-content-type-options":"nosniff","x-xss-protection":"1; mode=block","x-frame-options":"DENY"},"request":{"uri":{"protocol":"https:","slashes":true,"auth":null,"host":"cloud.linked-go.com:449","port":"449","hostname":"cloud.linked-go.com","hash":null,"search":null,"query":null,"pathname":"/crmservice/api/app/device/deviceList","path":"/crmservice/api/app/device/deviceList","href":"https://cloud.linked-go.com:449/crmservice/api/app/device/deviceList"},"method":"POST","headers":{"x-token":"EX9zSegfqmZAif9ekGLQXqPdgbhFN/BGYjgfyDU2bi6RfQUEUn0Pf63OFN9yQgXRqOxLXNUeG8QdwxEcodA41Q==","accept":"application/json","content-type":"application/json","content-length":148}}} 15:24:30.103 info javascript.0 (1373) script.js.Poolheizung: {"statusCode":200,"body":{"sessionid":null,"error_code":"0","error_msg":"Success","error_msg_code":"","totalSize":null,"totalPage":null,"nextPage":null,"objectResult":[{"deviceType":"","device_status":"ONLINE","is_fault":false,"device_id":"1640588423515365376","productId":"1442284873216843776","deviceNickName":"Poolheizung","device_type":"","deviceCode":"0C7FEDC2A9F5","isFault":false,"deviceName":"0C7FEDC2A9F5","deviceId":"1640588423515365376","deviceStatus":"ONLINE","device_name":"0C7FEDC2A9F5","device_code":"0C7FEDC2A9F5","product_id":"1442284873216843776","model":null,"sn":null,"device_nick_name":"Poolheizung","projectId":null}],"isReusltSuc":true},"headers":{"date":"Fri, 30 Jun 2023 13:24:33 GMT","content-type":"application/json;charset=UTF-8","transfer-encoding":"chunked","connection":"close","vary":"Origin, Access-Control-Request-Method, Access-Control-Request-Headers","x-content-type-options":"nosniff","x-xss-protection":"1; mode=block","x-frame-options":"DENY"},"request":{"uri":{"protocol":"https:","slashes":true,"auth":null,"host":"cloud.linked-go.com:449","port":"449","hostname":"cloud.linked-go.com","hash":null,"search":null,"query":null,"pathname":"/crmservice/api/app/device/deviceList","path":"/crmservice/api/app/device/deviceList","href":"https://cloud.linked-go.com:449/crmservice/api/app/device/deviceList"},"method":"POST","headers":{"x-token":"EX9zSegfqmZAif9ekGLQXqPdgbhFN/BGYjgfyDU2bi6RfQUEUn0Pf63OFN9yQgXRqOxLXNUeG8QdwxEcodA41Q==","accept":"application/json","content-type":"application/json","content-length":148}}}
Hätte gedacht das meine ID auch in die Auflistung gehört?
-
@flyer99 Mir kam der Wert auch immer etwas komisch vor. In der App ist er als in der Tat als "Suction Temp" bezeichnet...
Die Umgebungstemperatur ist ja aber andererseits such vorhanden (und stimmig).
Hmm, bin kein Klinatechniker aber Deine Vermutung klingt logisch!
-
@pietnb Ich glaube, die Entwickler beim Hersteller haben selber Device- und ProductID verwechselt. Letztere ist richtig und gehört auch in die Auflistung.
Darauf bezieht sich auch zufälligerweise der obige GitHub-Link!
Werde am WE leider zu nichts kommen, aber wir schaffen das schon noch
-
@oxident Ich bekomme im "rawJSON" jetzt viele Werte angezeigt. Leider erscheinen die Werte nicht unter den Objekten? Gersten wurden T1-T4 und der Mode angezeigt. weil ich nach dem ganzen gefummel nicht mehr genau wusste was jetzt genau ich gemacht habe, habe ich nochmal alles neu gemacht. Nun sind die Werte in der Objekten bis auf Mode und Ambient Temp wieder weg???
[{"value":"0","code":"Power"},{"value":"1","code":"Mode"},{"value":"0","code":"Manual-mute"},{"value":"17.0","code":"T1"},{"value":"21.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":"23.5","code":"T3"},{"value":"0","code":"1158"},{"value":"0","code":"1159"},{"value":"114","code":"F17"},{"value":"1","code":"H02"},{"value":"16.0","code":"T4"},{"value":"19.0","code":"T5"},{"value":"0","code":"T7"},{"value":"0","code":"T14"},{"value":"0","code":"T17"}]
Warum werden die Daten nicht unter den Objekten angezeigt? Ich weis nicht weiter?
-
@pietnb Im Code wird ja (weiter unten) dann auch die Zuordnung vorgenommen. Ich denke, da ist der Hund begraben...
Hoffe aber, das in den nächsten Tagen auch selber angehen zu können.
-
@oxident Moin. Habe gestern noch etwas mit den Werten rumprobiert, kann aber nicht sagen was genau jetzt anders ist. Inzwischen werden fast alle unterstützten Werte angezeigt. Aktuell fehlt nur noch die "setTemp" (Solltemperatur).
Hier stehen im Code ja auch die Solltemperaturen für die einzelnen Modi (R01-R03) im rawJASON. Evtl. kann man damit was anfangen?
-
@pietnb Ich habe jetzt mal angefangen, das ein wenig "in Form" zu gießen.
Vielleicht machst Du Dir lieber vorher eine Kopie Deines aktuellen Skripts// Midas Poolheizung // v0.0.8c // 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 = ""; // ProductIDs: // Gruppe 1: // 1132174963097280512: Midas/Poolsana InverPro const AQUATEMP_POOLSANA="1132174963097280512"; // Gruppe 2: // 1442284873216843776: const AQUATEMP_OTHER1="1442284873216843776"; var product = ""; 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; product = body.object_result[0].product_id; reachable = (body.object_result[0].device_status=="ONLINE"); } else { device = body.objectResult[0].deviceCode; product = body.object_result[0].productId; reachable = (body.objectResult[0].deviceStatus=="ONLINE"); } //log(product); 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) { if(product==AQUATEMP_POOLSANA) { 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 if(product==AQUATEMP_OTHER1) { optionsDev = { url: cloudURL + '/app/device/getDataByCode.json', headers: { "x-token": token }, json: { "device_code": devicecode, "protocal_codes":["Power","Mode","Manual-mute","T1","T2","T3","T4","T5","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T4","T5","T7","T14","T17"] }, method: 'POST', rejectUnauthorized: false }; } } else { if(product==AQUATEMP_POOLSANA) { 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"] }, method: 'POST', rejectUnauthorized: false }; } else if (product==AQUATEMP_OTHER1) { optionsDev = { url: cloudURL + '/app/device/getDataByCode', headers: { "x-token": token }, json: { "deviceCode": devicecode, "protocalCodes":["Power","Mode","Manual-mute","T1","T2","T3","T4","T5","2074","2075","2076","2077","H03","Set_Temp","R08","R09","R10","R11","R01","R02","R03","T03","1158","1159","F17","H02","T4","T5","T7","T14","T17"] }, 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") { if(product==AQUATEMP_POOLSANA) { // Stromverbrauch T07 x T14 in Watt saveValue("consumption", parseFloat(findCodeVal(body.object_result, "T07")) * parseFloat(findCodeVal(body.object_result, "T14")), "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"); // Umgebungs-Temperatur T05 saveValue("ambient", parseFloat(findCodeVal(body.object_result, "T05")), "number"); } else if (product==AQUATEMP_OTHER1) { // Stromverbrauch T7 x T14 in Watt saveValue("consumption", parseFloat(findCodeVal(body.object_result, "T7")) * parseFloat(findCodeVal(body.object_result, "T14")), "number"); // Luftansaug-Temperatur T1 saveValue("suctionTemp", parseFloat(findCodeVal(body.object_result, "T1")), "number"); // Inlet-Temperatur T2 saveValue("tempIn", parseFloat(findCodeVal(body.object_result, "T2")), "number"); // outlet-Temperatur T3 saveValue("tempOut", parseFloat(findCodeVal(body.object_result, "T3")), "number"); // Coil-Temperatur T4 saveValue("coilTemp", parseFloat(findCodeVal(body.object_result, "T4")), "number"); // Umgebungs-Temperatur T5 saveValue("ambient", parseFloat(findCodeVal(body.object_result, "T5")), "number"); } // Lüfter-Drehzahl T17 saveValue("rotor", parseInt(findCodeVal(body.object_result, "T17")), "number"); } else { saveValue("consumption", 0, "number"); saveValue("rotor", 0, "number"); } // Ziel-Temperatur Set_Temp saveValue("tempSet", parseFloat(findCodeVal(body.object_result, "Set_Temp")), "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 hi, ist das die aktuellste version des scriptes?
-
@oxident Hab das Script gleich mal ausprobiert. Zeigt eigentlich die gleichen Werte wie das optimierte vorher. Mir sind aber 2 Sachen aufgefallen:
-tempOut t3 stimmt nicht mit dem Wert in der rawJSON überein Bsp. t3 soll 22,5°C ->Objekt Anzeige 25°C
-tempSet Solltemperatur wird noch immer mit "0" angezeigt->die R01-R03 Werte zeige die richtige Temperatur anWeiterhin bekomme ich eine Fehlermeldung:
javascript.0 2023-07-03 17:38:00.113 error Error in request callback: TypeError: Cannot read property '0' of undefined
-
@tklein Jein, ist eigentlich eher die Entwicklungsversion für diejenigen, bei denen folgendes zutrifft:
- Registrierung wurde erst vor kurzem (?) mit der neuen AquaTemp-App gemacht
- Wärmepumpe ist nicht baugleich mit meiner Poolsana InverPro