NEWS
Huawei Sun2000 & ioBroker via JS script funktioniert
-
@bishop
Probier's aus.
Als ich angefangen hab gab es das noch nicht. Das Script habe ich inzwischen um ein paar Sachen erweitert, die nichts mit PV zu tun haben, und ist bei mir nun die "zentrale" HA-Lösung (mache nicht viel, das bisschen Programmieren ist für mich leicht). -
besten Dank euch beiden
-
Hier stand Mist. Sorry!
-
-
@bahnuhr
OMG, sorry. Ich hatte nach dem Login ein 503 fehler und bin daher zum falschen Thread gekommen. Beitrag bitte löschen wenn es geht. -
@dragst3r sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:
Beitrag bitte löschen
geht nicht.
-
ich bin kein Script Experte aber ich benötige manche DP als bestätigt also
ack = truehabe das nun so gelöst
// perform createState() only if variable does not yet exist, and perform the check via existsState() only once for each processing round { if (testCreateState == 0) { if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); } else { setState(objectname, value, true); } } else { setState(objectname, value, true); } }
also nach dem value "wert" mache ich noch ein true.
Ist das so korrekt, kann man das so machen oder ist das falsch? Jetzt sind die ganzen Datenpunkte auch nicht mehr rot -
@bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:
benötige manche DP als bestätigt also
ack = trueBitte mal Rückinfo warum man dies braucht ?
-
z.b. bei dem awtrix-light Adapter werden die Werte an der Uhr nicht aktualisiert wenn sie nicht bestätigt sind.
Und die rote Farbe mag ich nicht -
@bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:
awtrix-light Adapter
kenn ich nicht.
@bishop sagte in Huawei Sun2000 & ioBroker via JS script funktioniert:
Und die Rote Farbe mag ich nicht
Hat mich noch nie gestört.
Und hat bisher auch alles mit "roter Farbe" geklappt.Aber ja, bei Aktoren z.B. Homematic ist es schon wichtig dass der Wert auch bestätigt wird.
Aber bei Daten vom Huawei Wechselrichter ?! -
@bahnuhr
muss ja nicht geändert werden. Finde es halt somit abgeschlossen. -
@Chris_B
ist es evtl. möglich das Script um ein paar Infos zu erweitern?
Ich habe die Datenpunkte bei z.b.{ "common": { "name": "Solarpower.Huawei.Inverter.1.Battery.RunningStatus", "unit": "", "role": "state", "type": "mixed", "states": { "0": "offline", "1": "stand by", "2": "running", "3": "fault", "4": "sleep mode" } },
oder
{ "common": { "name": "Solarpower.Huawei.Meter.Status", "unit": "", "role": "state", "type": "mixed", "states": { "0": "offline", "1": "normal" } },
erweitert da ich nur mit der Zahl nichts anfangen kann.
Ist es möglich das in deinem Script zu integrieren? -
@bahnuhr
hier z.b.awtrix-light.0 2023-10-31 19:25:50.383 info [initCustomApps] State value of custom app "verbrauch" (javascript.0.Solarpower.Derived.HouseConsumption) is not acknowledged (ack: false) - waiting for new value
brauch ich den Wert als bestätigt!
-
@bishop
Is ja nen Ding.
Hab ich noch nicht gesehen sowas.Klappt dein kleines Script wie gewollt ?
-
@bishop Danke für die Frage.
ich habe mich sehr lange nicht gemeldet. Ich habe genau das, und noch etwas mehr umgesetzt. Die Status von Inverter und Battery werden als Text ausgegeben. Zusätzlich werden gewisse Variable, welche im Standby der Battery nicht mehr zur Verfügung stehen entsprechend gesetzt, sodass diese dann in den Status 'standby' wechseln. Ich konnte das erst jetzt gut testen, da meine Anlage erst jetzt regelmässig in diesen Modus wechselt.
Ich werde das so erweiterte Skript am Wochenende zur Verfügung stellen. Ich aknn nicht früher, zu viel zu tun... -
@chris_b
Das hört sich doch super an! Kein Stress ich kann warten -
Hallo Zusammen, ich habe mein Huawai Wechselrichter dank des JS script von @chrisB gut im Griff. Nun ist mir allerdings aufgefallen, dass die Funktion/Methode "readHoldingRegisters" mit einem Callback aufgerufen wird. Der Callback führt zu einem asynchronem Programmablauf. Deshalb muss die Abfrage der Register zeitverzögert erfolgen, da die die Modbus-Schnittstelle nur seriell angsprochen werden kann. Es kann also die nächste Abfrage erst nach dem Modbus-Response erfolgen.
Die Funktion readHoldingRegisters gibt aber auch ein Promise zurück - also ein Versprechen auf einen Wert, der später kommt.
Die Lösung: async/await! Unter der Haube arbeitet ein Promise, aber wir werden von den ganzen Unannehmlichkeiten befreit. Nun habe ich die Funkion "readRegisterSpace" umgebaut. Der Programmablauf ist nun synchron. Der Aufruf "await client.readHoldingRegisters" wartet bis das Ergebnis vorliegt ohne zu blockieren!async function readRegisterSpaceAsync(id, address, length) { try { //console.log('ReadRegisters 1'); await client.setID(ModBusIDs[id-1]); //console.log('ReadRegisters 1'); let data = await client.readHoldingRegisters(address, length); //console.log('ReadRegisters 2'); return data.data; } catch (err) { //console.error("Error received writing adress "+ address + " from id: " + ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err); //return -1; throw err; //Fehler weiterreichen } }
Mein readRegisters kann nun als synchroner Programmablauf - recht schnell - die Register auslesen.
async function ReadRegister(Reg) { for (let id = 1; id <= ModBusIDs.length; id++) { for (let i = 0; i < Reg.length; i++) { let address = Reg[i][0]; let length = Reg[i][1]; try { console.debug("Try to read data from id/address " + ModBusIDs[id-1] + "/" + address); let data = await readRegisterSpaceAsync(id, address, length); console.debug("Read data from id/address " + ModBusIDs[id-1] + "/" + address + "\nData is: " + data); for (var y = 0; y < length; y++) Buffer[id-1][address + y - BufOffset] = data[y]; } catch(err) { // if error, handle them here (it should not) if (err.modbusCode == null) { console.warn("Lost connection to client. "); } else { console.error("Error received writing adress "+ address + " from id: " + ModBusIDs[id-1] + " with error: " + modbusErrorMessages[err.modbusCode], err); } return -1; } } } }
Hier eine gute Erklärung zum Thema asynchroner Code: link text
Lg Stephan
-
@bolliy INteressanter Input. Muss ich mir anschauen. Ich veröffentliche gleich eine neue Version des Skripts (endlich, nach längerer Abwesenheit). Diese Version übersetzt nun Meldungen in verständliche Strings (bspw. den Zustand des Inverters). Deine Überlegungen sind allerdings da noch nicht eingebaut. Schau ich mir noch an und baue das ein - sofern ich es verstehe...
Gruss -
@bishop Hallo zusammen. Nach längerer Abwesenheit endlich eine neue Version des Skripts. Das beinhaltet (endlich) einen Übersetzung von vielen Zuständen in lesbaren Text. So ist bspw. der Inverterzustand jetz nicht mehr eine Zahl, sondern ein lesbarer Text, bspw. "On-grid" oder "Standby: no irradiation". Das gleiche ist für die Batterie- und die Batterystack Zustände umgesetzt.
Der Kommentar von @bolliy habe ich noch nicht umgesetzt, schaue ich mir noch an.
Das Ganze findet sich, inklusive erweiterter Beschreibung auf Github:
Github Sun2000
Gruss, Christian -
vielen Dank hab gleich mal geupdated
auf den ersten blick was ich bräuchte sind die DP als bestätigt.Macht man das in JavaScript generell nicht?
{ if (testCreateState == 0) { if (!existsState(JavaInst + objectname)) { createState(objectname, value, options); } else { setState(objectname, value, true); } } else { setState(objectname, value, true); } }
hab das so hinbekommen.
Aber leider hab ich zu wenig Ahnung wie man das auchjavascript.0.Solarpower.Derived
hier macht.