NEWS
[Gelöst] FoxESS Cloud Javascript Warnmeldungen
-
Ich habe dieses Javascript im Netz gefunden. Soweit läuft es auch. Jedoch verstehe ich nicht warum es im Log Warnungen gibt. Kann man diese ausstellen bzw. was könnte geändert werden? Ich bin mehr der Copy/Paste User und habe von Java und Code nicht viel Ahnung.
/* Dieses Script ruft alle 2 Minuten die FoxESS Cloud über eine RestAPI auf und speichert die aufgerufenen Informationen an die entsprechenden Objekte im IO-Broker. */ const https = require("https") const crypto = require('crypto') const token = "???"; /* Hier muss der API-Key aus der FoxESS Cloud eingefügt werden */ const sn = "???"; /* Hier muss die Seriennummer vom Inverter aus der FoxESS Cloud eingefügt werden */ schedule("*/2 * * * * ", async function () { try { const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower", "generationPower", "SoC", "loadsPower" ] }); const path = "/op/v0/device/real/query"; const milliseconds = new Date().getTime(); const signature = crypto.createHash('md5').update(path + "\\r\\n" + token + "\\r\\n" + milliseconds).digest("hex"); const options = { headers: { "Content-Type": "application/json", "token": token, "timestamp": milliseconds, "signature": signature, "lang": "en" }, hostname: "www.foxesscloud.com", method: "POST", path: path, port: 443 } const request = https.request(options, response => { //console.log('STATUS: ' + response.statusCode); response.setEncoding('utf8'); response.on("data", function (res) { //console.log(res); const json = JSON.parse(res); const pvPower = json.result[0].datas[0].value; setState("0_userdata.0.FoxEss.PVPower", pvPower.toFixed(3)); const soc = json.result[0].datas[2].value; setState("0_userdata.0.FoxEss.SOC", soc.toString()); const load = json.result[0].datas[3].value; setState("0_userdata.0.FoxEss.Load", load.toFixed(3)); }); }); request.write(data); request.end(); } catch (e) { console.error(e); } });Folgende Warnungen erhalte ich bei jeder Ausführung:
javascript.0
2025-05-27 09:34:00.169 info State value to set for "0_userdata.0.FoxEss.PVPower" has to be type "number" but received type "string"
javascript.0
2025-05-27 09:34:00.156 warn at TLSSocket.Readable.push (node:internal/streams/readable:392:5)
javascript.0
2025-05-27 09:34:00.156 warn at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
javascript.0
2025-05-27 09:34:00.156 warn at addChunk (node:internal/streams/readable:561:12)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.emit (node:domain:489:12)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.emit (node:events:524:28)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.socketOnData (node:_http_client:544:22)
javascript.0
2025-05-27 09:34:00.155 warn at HTTPParser.parserOnBody (node:_http_common:130:24)
javascript.0
2025-05-27 09:34:00.155 warn at IncomingMessage.Readable.push (node:internal/streams/readable:392:5)
javascript.0
2025-05-27 09:34:00.155 warn at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
javascript.0
2025-05-27 09:34:00.155 warn at addChunk (node:internal/streams/readable:561:12)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.emit (node:domain:489:12)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.emit (node:events:524:28)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.<anonymous> (script.js.skripte.foxx:44:13)
javascript.0
2025-05-27 09:34:00.154 warn at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:2090:20)
javascript.0
2025-05-27 09:34:00.152 warn You are assigning a string to the state "0_userdata.0.FoxEss.PVPower" which expects a number. Please fix your code to use a number or change the state type to string. This warning might become an error in future versions.Den Datenpunkt PVPower habe ich bereits auf Nummer, dann auf String aber es kommt immer eine Fehlermeldung. Die Werte stimmen in beiden Versionen.
Bei PVPower auf String kommt folgende Meldung:
admin.0
2025-05-27 09:43:47.084 warn Object 0_userdata.0.FoxEss.PVPower is invalid: Default value has to be type "string" but received type "number" This will throw an error up from js-controller version 7.0.0!Vielleicht kann mir wer Licht ans Fahrrad machen :blush: ?
-
@torsten-g sagte in FoxESS Cloud Javascript Warnmeldungen:
State value to set for "0_userdata.0.FoxEss.PVPower" has to be type "number" but received type "string"da sollte deinem Fahrrad ein Licht aufgehen:
der Datenpunkt ist definiert als Zahl (
number). Dein Skript schreibt da einen String rein (string).Um die Warnung loszuwerden musst du die explizite Konvertierung zum String wegnehmen oder den DP als String deklarieren.
. . . setState("0_userdata.0.FoxEss.PVPower", pvPower.toFixed(3)); const soc = json.result[0].datas[2].value; setState("0_userdata.0.FoxEss.SOC", soc.toString()); const load = json.result[0].datas[3].value; setState("0_userdata.0.FoxEss.Load", load.toFixed(3)); . . .A.
-
Ich habe dieses Javascript im Netz gefunden. Soweit läuft es auch. Jedoch verstehe ich nicht warum es im Log Warnungen gibt. Kann man diese ausstellen bzw. was könnte geändert werden? Ich bin mehr der Copy/Paste User und habe von Java und Code nicht viel Ahnung.
/* Dieses Script ruft alle 2 Minuten die FoxESS Cloud über eine RestAPI auf und speichert die aufgerufenen Informationen an die entsprechenden Objekte im IO-Broker. */ const https = require("https") const crypto = require('crypto') const token = "???"; /* Hier muss der API-Key aus der FoxESS Cloud eingefügt werden */ const sn = "???"; /* Hier muss die Seriennummer vom Inverter aus der FoxESS Cloud eingefügt werden */ schedule("*/2 * * * * ", async function () { try { const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower", "generationPower", "SoC", "loadsPower" ] }); const path = "/op/v0/device/real/query"; const milliseconds = new Date().getTime(); const signature = crypto.createHash('md5').update(path + "\\r\\n" + token + "\\r\\n" + milliseconds).digest("hex"); const options = { headers: { "Content-Type": "application/json", "token": token, "timestamp": milliseconds, "signature": signature, "lang": "en" }, hostname: "www.foxesscloud.com", method: "POST", path: path, port: 443 } const request = https.request(options, response => { //console.log('STATUS: ' + response.statusCode); response.setEncoding('utf8'); response.on("data", function (res) { //console.log(res); const json = JSON.parse(res); const pvPower = json.result[0].datas[0].value; setState("0_userdata.0.FoxEss.PVPower", pvPower.toFixed(3)); const soc = json.result[0].datas[2].value; setState("0_userdata.0.FoxEss.SOC", soc.toString()); const load = json.result[0].datas[3].value; setState("0_userdata.0.FoxEss.Load", load.toFixed(3)); }); }); request.write(data); request.end(); } catch (e) { console.error(e); } });Folgende Warnungen erhalte ich bei jeder Ausführung:
javascript.0
2025-05-27 09:34:00.169 info State value to set for "0_userdata.0.FoxEss.PVPower" has to be type "number" but received type "string"
javascript.0
2025-05-27 09:34:00.156 warn at TLSSocket.Readable.push (node:internal/streams/readable:392:5)
javascript.0
2025-05-27 09:34:00.156 warn at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
javascript.0
2025-05-27 09:34:00.156 warn at addChunk (node:internal/streams/readable:561:12)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.emit (node:domain:489:12)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.emit (node:events:524:28)
javascript.0
2025-05-27 09:34:00.155 warn at TLSSocket.socketOnData (node:_http_client:544:22)
javascript.0
2025-05-27 09:34:00.155 warn at HTTPParser.parserOnBody (node:_http_common:130:24)
javascript.0
2025-05-27 09:34:00.155 warn at IncomingMessage.Readable.push (node:internal/streams/readable:392:5)
javascript.0
2025-05-27 09:34:00.155 warn at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
javascript.0
2025-05-27 09:34:00.155 warn at addChunk (node:internal/streams/readable:561:12)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.emit (node:domain:489:12)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.emit (node:events:524:28)
javascript.0
2025-05-27 09:34:00.154 warn at IncomingMessage.<anonymous> (script.js.skripte.foxx:44:13)
javascript.0
2025-05-27 09:34:00.154 warn at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:2090:20)
javascript.0
2025-05-27 09:34:00.152 warn You are assigning a string to the state "0_userdata.0.FoxEss.PVPower" which expects a number. Please fix your code to use a number or change the state type to string. This warning might become an error in future versions.Den Datenpunkt PVPower habe ich bereits auf Nummer, dann auf String aber es kommt immer eine Fehlermeldung. Die Werte stimmen in beiden Versionen.
Bei PVPower auf String kommt folgende Meldung:
admin.0
2025-05-27 09:43:47.084 warn Object 0_userdata.0.FoxEss.PVPower is invalid: Default value has to be type "string" but received type "number" This will throw an error up from js-controller version 7.0.0!Vielleicht kann mir wer Licht ans Fahrrad machen :blush: ?
@torsten-g sagte: Licht ans Fahrrad machen ?
Da es sich um Zahlenwerte handelt, ändere Zeilen 41 bis 47:
const datas = JSON.parse(res).result[0].datas; setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000) / 1000, true); setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true); -
@torsten-g sagte: Licht ans Fahrrad machen ?
Da es sich um Zahlenwerte handelt, ändere Zeilen 41 bis 47:
const datas = JSON.parse(res).result[0].datas; setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000) / 1000, true); setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true);@paul53 Das funktioniert leider nicht. Nur Error Meldungen. Trotzdem Danke für deine Mühe
-
@torsten-g sagte in FoxESS Cloud Javascript Warnmeldungen:
State value to set for "0_userdata.0.FoxEss.PVPower" has to be type "number" but received type "string"da sollte deinem Fahrrad ein Licht aufgehen:
der Datenpunkt ist definiert als Zahl (
number). Dein Skript schreibt da einen String rein (string).Um die Warnung loszuwerden musst du die explizite Konvertierung zum String wegnehmen oder den DP als String deklarieren.
. . . setState("0_userdata.0.FoxEss.PVPower", pvPower.toFixed(3)); const soc = json.result[0].datas[2].value; setState("0_userdata.0.FoxEss.SOC", soc.toString()); const load = json.result[0].datas[3].value; setState("0_userdata.0.FoxEss.Load", load.toFixed(3)); . . .A.
@asgothian Danke nur jetzt kommt folgende Meldung vom Admin.0
Object 0_userdata.0.FoxEss.PVPower is invalid: Default value has to be type "string" but received type "number" This will throw an error up from js-controller version 7.0.0!
-
@paul53 Das funktioniert leider nicht. Nur Error Meldungen. Trotzdem Danke für deine Mühe
@torsten-g sagte: Das funktioniert leider nicht.
Ich hatte die erste Zeile nachträglich korrigiert. Hast du die Korrektur übernommen?
const datas = JSON.parse(res).result[0].datas;Die Datenpunkte müssen vom Typ "number" sein.
@torsten-g sagte in FoxESS Cloud Javascript Warnmeldungen:
Object 0_userdata.0.FoxEss.PVPower is invalid: Default value has to be type "string" but received type "number"
Wenn du Strings verwenden möchtest, musst du auch common.def von 0 (Zahl) in "" (Leerstring) ändern.
-
@torsten-g sagte: Das funktioniert leider nicht.
Ich hatte die erste Zeile nachträglich korrigiert. Hast du die Korrektur übernommen?
const datas = JSON.parse(res).result[0].datas;Die Datenpunkte müssen vom Typ "number" sein.
@torsten-g sagte in FoxESS Cloud Javascript Warnmeldungen:
Object 0_userdata.0.FoxEss.PVPower is invalid: Default value has to be type "string" but received type "number"
Wenn du Strings verwenden möchtest, musst du auch common.def von 0 (Zahl) in "" (Leerstring) ändern.
@paul53 Danke funktioniert nun super. Problem gelöst
-
@paul53 Danke funktioniert nun super. Problem gelöst
-
@paul53 Dein korrigierter Post mit Zahlen. Die Datenpunkte in IOBroker habe ich auch auf Zahlen gemacht.
const datas = JSON.parse(res).result[0].datas; setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000) / 1000, true); setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true); -
Ich habe das Script etwas angepasst - ich habe nur einen Micro-Inverter von FoxEss (Balkonkraftwerk, keine Batterie (deshalb SOC unnötig, und auch keine Lastmessung deshalb Load unnötig)
Da der kleine Wechselrichter auch die Erzeugung in kW ausgibt, habe ich das Round angepasst - es kommen dadurch "glatte" Wattwerte (nicht kW) ohne Komma in den Datenpunkt

/* Dieses Script ruft alle 2 Minuten die FoxESS Cloud über eine RestAPI auf und speichert die aufgerufenen Informationen an die entsprechenden Objekte im IO-Broker. */ const https = require("https") const crypto = require('crypto') const token = "...."; /* Hier muss der API-Key aus der FoxESS Cloud eingefügt werden */ const sn = "...."; /* Hier muss die Seriennummer vom Inverter aus der FoxESS Cloud eingefügt werden */ schedule("*/2 * * * * ", async function () { try { const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower" /*, "generationPower", "SoC", "loadsPower" */ ] }); const path = "/op/v0/device/real/query"; const milliseconds = new Date().getTime(); const signature = crypto.createHash('md5').update(path + "\\r\\n" + token + "\\r\\n" + milliseconds).digest("hex"); const options = { headers: { "Content-Type": "application/json", "token": token, "timestamp": milliseconds, "signature": signature, "lang": "en" }, hostname: "www.foxesscloud.com", method: "POST", path: path, port: 443 } const request = https.request(options, response => { console.log('STATUS: ' + response.statusCode); //response.setEncoding('utf8'); response.on("data", function (res) { // console.log(res); const datas = JSON.parse(res).result[0].datas; console.log(datas[0]); setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000), true); //setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); //setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true); }); }); request.write(data); request.end(); } catch (e) { console.error(e); } });Meine Planungen für weitere Ergänzungen am Script:
- Tagesbudget an Queries sparsamer einsetzen
a) zwischen Dämmerungsende und Dämmerungsbeginn keine Werte über die API abfragen (da kann es keine Erträge geben).
b) bei niedrigen Erträgen ggfs. auch den Leserhythmus abschwächen. - Ertrag Vortag einmalig am Folgetag abfragen
- Ertrag Vormonat einmalig am ersten Tag des Folgemonats abfragen.
- Tagesbudget an Queries sparsamer einsetzen
-
Ich habe das Script etwas angepasst - ich habe nur einen Micro-Inverter von FoxEss (Balkonkraftwerk, keine Batterie (deshalb SOC unnötig, und auch keine Lastmessung deshalb Load unnötig)
Da der kleine Wechselrichter auch die Erzeugung in kW ausgibt, habe ich das Round angepasst - es kommen dadurch "glatte" Wattwerte (nicht kW) ohne Komma in den Datenpunkt

/* Dieses Script ruft alle 2 Minuten die FoxESS Cloud über eine RestAPI auf und speichert die aufgerufenen Informationen an die entsprechenden Objekte im IO-Broker. */ const https = require("https") const crypto = require('crypto') const token = "...."; /* Hier muss der API-Key aus der FoxESS Cloud eingefügt werden */ const sn = "...."; /* Hier muss die Seriennummer vom Inverter aus der FoxESS Cloud eingefügt werden */ schedule("*/2 * * * * ", async function () { try { const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower" /*, "generationPower", "SoC", "loadsPower" */ ] }); const path = "/op/v0/device/real/query"; const milliseconds = new Date().getTime(); const signature = crypto.createHash('md5').update(path + "\\r\\n" + token + "\\r\\n" + milliseconds).digest("hex"); const options = { headers: { "Content-Type": "application/json", "token": token, "timestamp": milliseconds, "signature": signature, "lang": "en" }, hostname: "www.foxesscloud.com", method: "POST", path: path, port: 443 } const request = https.request(options, response => { console.log('STATUS: ' + response.statusCode); //response.setEncoding('utf8'); response.on("data", function (res) { // console.log(res); const datas = JSON.parse(res).result[0].datas; console.log(datas[0]); setState("0_userdata.0.FoxEss.PVPower", Math.round(datas[0].value * 1000), true); //setState("0_userdata.0.FoxEss.SOC", datas[2].value, true); //setState("0_userdata.0.FoxEss.Load", Math.round(datas[3].value * 1000) / 1000, true); }); }); request.write(data); request.end(); } catch (e) { console.error(e); } });Meine Planungen für weitere Ergänzungen am Script:
- Tagesbudget an Queries sparsamer einsetzen
a) zwischen Dämmerungsende und Dämmerungsbeginn keine Werte über die API abfragen (da kann es keine Erträge geben).
b) bei niedrigen Erträgen ggfs. auch den Leserhythmus abschwächen. - Ertrag Vortag einmalig am Folgetag abfragen
- Ertrag Vormonat einmalig am ersten Tag des Folgemonats abfragen.
Ich habe erste Ergänzungen vorgenommen ...
Der kumulierte Tagesertrag ("todayYield") ist hinzugekommen...
const data = JSON.stringify({ "sn": sn, "variables": [ "pvPower", "todayYield" /*, "generationPower", "SoC", "loadsPower" */ ] }); .... setState("0_userdata.0.FoxEss.todayYield", Math.round(datas[1].value * 1000), true);Daneben ein kurzes Blockly, was kurz vor Mitternacht den "todayYield" in einen user-Datenpunkt "yesterdayYield" verschiebt...

Wenn man sich die weiteren API-Möglichkeiten so anschauen will, gibt es hier eine Übersicht, was man sich alles aus der Cloud besorgen kann (Abhängig davon, was man sich so alles von denen gekauft hat) ...
https://www.foxesscloud.com/public/i18n/en/OpenApiDocument.html
Dort diesen Abschnitt suchen
Variable table:
The table presented below offers a comprehensive overview of the variables that can be accessed through the API. It is important to note that the availability of these variables may differ depending on the specific device being utilized. Therefore, the variables listed in the table are subject to change based on the device in use.
- Tagesbudget an Queries sparsamer einsetzen