NEWS
Easee Wallbox mit iobroker
-
@newan said in Easee Wallbox mit iobroker:
@knima neuste commit auf git ist das gefixt.
Ist aber noch net releasedIst das über die normale IoBroker Adapter Update Routine erreichbar?
-
Nachdem ich die letzten Tage einige Tests mache konnte, bin ich mit der ersten Versions meines Scripts recht zufrieden. Ausgangslage war das Script von hardy. Da ich aber kein Fan von Blockly bin und mir die Möglichkeit fehlte, das Auto auch mal ohne Sonne vollzuladen, habe ich es in Javascript angepasst. Das Script nutzt den Telegram Adapter, um Nachrichten über den Status zu versenden und um zwischen Überschuss und voller Leistung zu wählen. Würde mich freuen, wenn ihr es ausprobiert und bei Bedarf mit mir zusammen optimiert.
var stateTimer, timerDreiphasig, timerStop, overageList, pvOverage, overageSum, pvOverageKWh, timeout, socLevelLast, maxSocLevel, currentP1, currentP2, currentP3, overageCurrent, chargerOPmode, smartCharge; // ### Wallbox Garage ### timerDreiphasig = 0; // Timer für Start für dreiphasiges Laden timerStop = 0; // Timer für Ladestop, wenn zu wenig Leistung von der PV-Anlage const reservePower = 200; // Leistung die für den Haushalt reserviert bleibt overageList = []; // Array für den gleitenden Mittelwert const scheduleInterval = 12; // Aktualisierungsintervall in Sekunden // ---------------------------------------------------------------------------------------------- // Funktion zum Anlegen und Beschreiben eines Datenpunkts // ---------------------------------------------------------------------------------------------- function ForceSetState(objectname, value, options) { if (!existsState(objectname)) createState(objectname, value, options); else setState(objectname, value); } // ---------------------------------------------------------------------------------------------- // Funktion: Message über Telegram // ---------------------------------------------------------------------------------------------- function Telegram (sText, sValue, blPing, blQuestion) { if (blQuestion) { sendTo('telegram.0', { text: sText + sValue, disable_notification: blPing, reply_markup: { keyboard: [ ['Volle Power', 'Überschuss'], ], resize_keyboard: true, one_time_keyboard: true } }); const Sleep = setInterval(()=> { // Warten auf eine Auswahl des Lademodus on({id: "javascript.0.Wallbox.Garage.Überschussladen", change: "any"}, async function (obj) { clearInterval(Sleep); }); },300000); } else { sendTo('telegram.0', { text: sText + sValue, disable_notification: blPing, }); } }; // ---------------------------------------------------------------------------------------------- // Easee und VW Adapter neustarten falls offline // ---------------------------------------------------------------------------------------------- on({id: "easee.0.info.connection", change: "lt"}, async function (obj) { var value = obj.state.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(function () { if (!value) { setState("system.adapter.easee.0.alive", false); setStateDelayed("system.adapter.easee.0.alive", true, 5000, false); } }, 20000); }); on({id: "system.adapter.easee.0.connected", change: "lt"}, async function (obj) { var value = obj.state.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(function () { if (!value) { setState("system.adapter.easee.0.alive", false); setStateDelayed("system.adapter.easee.0.alive", true, 5000, false); } }, 20000); }); on({id: "vw-connect.0.info.connection", change: "ne"}, async function (obj) { var value = obj.state.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(function () { if (!value) { setState("system.adapter.vw-connect.0.alive", false); setStateDelayed("system.adapter.vw-connect.0.alive", true, 5000, false); } }, 20000); }); on({id: "system.adapter.vw-connect.0.connected", change: "ne"}, async function (obj) { var value = obj.state.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(function () { if (!value) { setState("system.adapter.vw-connect.0.alive", false); setStateDelayed("system.adapter.vw-connect.0.alive", true, 5000, false); } }, 20000); }); // ---------------------------------------------------------------------------------------------- // Führt die Abfrage in regelmäßigen Zeitabständen durch // ---------------------------------------------------------------------------------------------- schedule(`*/${scheduleInterval} * * * * *`, async function () { stateTimer++; // Variablen einlesen socLevelLast = getState("Datenpunkt.AktuellerBatteriestand").val; maxSocLevel = getState("Datenpunkt.ZielBatteriestand").val; currentP1 = getState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP1").val; currentP2 = getState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP2").val; currentP3 = getState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP3").val; chargerOPmode = getState("easee.0.XXXXXXXX.status.chargerOpMode").val; smartCharge = getState("javascript.0.Wallbox.Garage.Überschussladen").val; // ---------------------------------------------------------------------------------------------- // PV Überschuss ermitteln = Import/Export - Offset + aktuelle Leistung Wallbox // ---------------------------------------------------------------------------------------------- pvOverage = Math.round((parseFloat(getState("Datenpunkt.AktuellerÜberschuss").val) - reservePower) + parseFloat(getState("easee.0.XXXXXXXX.status.totalPower").val) * 1000); console.log('PV Überschuss = ' + pvOverage); // Gleitender Mittelwert innerhalb 3 Minuten berechnen, gerundet auf 100er overageList.unshift(pvOverage); if (overageList.length > 180/scheduleInterval) { overageSum = overageList.reduce(function(x, y) {return x + y;}); pvOverageKWh = Math.round(parseFloat(overageSum) / overageList.length); overageCurrent = Math.round(pvOverageKWh / getState("easee.0.XXXXXXXX.status.voltage").val); overageList.pop(); // Logging ForceSetState("javascript.0.Wallbox.Garage.pvOverageKWh", pvOverageKWh, {name: "", unit: "kWh"}); console.log(('Überschuss Leistung gemittelt = ' + String(pvOverageKWh))); console.log(('Überschuss Strom gemittelt = ' + String(overageCurrent))); } // ---------------------------------------------------------------------------------------------- // Timer 3-phasig laden: Erhöhe den Timer sekundengenau, wenn PV-Überschuss >18 Ampere // ---------------------------------------------------------------------------------------------- if (socLevelLast < maxSocLevel && overageCurrent >= 18) { timerDreiphasig = (typeof timerDreiphasig == 'number' ? timerDreiphasig : 0) + scheduleInterval; console.log((['Timer 3-phasig = ',timerDreiphasig,'Sekunden'].join(''))); } // Andernfalls Timer zurücksetzen else timerDreiphasig = 0; // ---------------------------------------------------------------------------------------------- // Timer Ladeabbruch: Erhöhe den Timer sekundengenau, wenn PV-Überschuss <6 Ampere // ---------------------------------------------------------------------------------------------- if (overageCurrent < 6) { timerStop = (typeof timerStop == 'number' ? timerStop : 0) + scheduleInterval; console.log((['Timer Ladeabbruch = ',timerStop,'Sekunden'].join(''))); } // Andernfalls Timer zurücksetzen else timerStop = 0; // ---------------------------------------------------------------------------------------------- // Wenn Überschussladen aktiviert ist // ---------------------------------------------------------------------------------------------- if (smartCharge == true) { console.debug(('Überschussladen ist aktiv' + '')); // 1-phasig laden: Wenn PV Überschuss größer als minimale Ladeleistung für eine Phase und kleiner als minimale Ladeleistung für drei Phases if (socLevelLast < maxSocLevel && overageCurrent >= 6 && (overageCurrent < 18 || timerDreiphasig < 300)) { console.log((['Einphasiges Laden mit ',overageCurrent,' Ampere'].join(''))); setState("easee.0.XXXXXXXX.config.dynamicChargerCurrent", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP1", overageCurrent); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP2", 0); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP3", 0); } // 3-phasig laden: Wenn PV Überschuss 5 Minuten konstant größer als 18 Ampere war if (timerDreiphasig >= 300) { console.log((['Dreiphasiges Laden mit ',Math.round(overageCurrent / 3),' Ampere'].join(''))); setState("easee.0.XXXXXXXX.config.dynamicChargerCurrent", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP1", Math.round(overageCurrent / 3)); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP2", Math.round(overageCurrent / 3)); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP3", Math.round(overageCurrent / 3)); } // Stoppe Laden, wenn nach 5 Minuten nicht genug PV-Überschuss vorhanden ist. Stoppe Timeout wenn während 5 Minuten doch wieder genug PV-Überschuss vorhanden ist if (timerStop >= 60 && currentP1 > 0) { console.warn(('Pausiere Laden, weil kein PV-Überschuss' + '')); setState("easee.0.XXXXXXXX.config.dynamicChargerCurrent", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP1", 0); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP2", 0); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP3", 0); //setState("easee.0.XXXXXXXX.control.pause", true); //setState("easee.0.XXXXXXXX.control.stop", true); } } // ---------------------------------------------------------------------------------------------- // Wenn Laden mit voller Leistung aktiv ist // ---------------------------------------------------------------------------------------------- else { console.debug('Dreiphasiges Laden mit voller Leistung'); setState("easee.0.XXXXXXXX.config.dynamicChargerCurrent", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP1", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP2", 16); setState("easee.0.XXXXXXXX.config.dynamicCircuitCurrentP3", 16); } }); // ---------------------------------------------------------------------------------------------- // Trigger beim Einstecken des Ladekabels // ---------------------------------------------------------------------------------------------- on({id: "easee.0.XXXXXXXX.status.chargerOpMode", change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; stateTimer = 0; // Ladekabel wurde angeschlossen if (oldValue == 1) { console.warn(('Ladekabel wurde an das Fahrzeug angeschlossen' + '')); Telegram("Der Akkustand beträgt: ", socLevelLast, false, true); } // Ladekabel wurde entfernt if (value == 1) { console.warn(('Ladekabel wurde vom Fahrzeug getrennt' + '')); Telegram("Ladekabel wurde vom Fahrzeug getrennt. Der Akkustand beträgt: ", socLevelLast, false, false); } // Auto angeschlossen, aber lädt nicht if (value == 2) { console.log(('Ladevorgang gestoppt. Wallbox bereits zum Laden' + '')); Telegram("Ladevorgang gestoppt. Wallbox bereit zum Laden. Der Akkustand beträgt: ", socLevelLast, false, false); if (currentP1 > 0 && maxSocLevel > socLevelLast) { if (smartCharge == true) console.warn(('PV Überschussladen gestartet' + '')); else console.warn(('Laden mit voller Leistung gestartet' + '')); //setState("easee.0.XXXXXXXX.control.resume", true); setState("easee.0.XXXXXXXX.control.start", true); Telegram("Ladevorgang gestartet.", "", false, false); } else if (maxSocLevel <= socLevelLast) { console.log(('Ladevorgang gestoppt. Ladeziel erreicht' + '')); Telegram("Ladevorgang gestoppt. Ladeziel erreicht. Der Akkustand beträgt: ", socLevelLast, false, false); } } if (value == 4) { console.log(('Ladevorgang gestoppt. Batterie vollgeladen' + '')); Telegram("Ladevorgang gestoppt. Batterie vollgeladen.", "", false, false); } if (value == 5) { console.log(('Ladevorgang gestoppt. Es ist ein Fehler aufgetreten' + '')); Telegram("Ladevorgang gestoppt. Es ist ein Fehler aufgetreten. Der Akkustand beträgt: ", socLevelLast, false, false); } }); // ---------------------------------------------------------------------------------------------- // Wenn Auto bis Sonnenuntergang nicht geladen, fragen ob über Netz vollgeladen werden soll // ---------------------------------------------------------------------------------------------- schedule({astro: "sunset", shift: 0}, async function () { if (maxSocLevel > socLevelLast && chargerOPmode != 1) { Telegram("Der Akkustand beträgt: ", socLevelLast, true, false); } });
-
Hey zusammen,
hat jemand von euch auch schon festgestellt das der "status.chargerOpMode" ein neues Verhalten zeigt?
Mir ist aufgefallen das er nun immer wieder = 6 und auch = 7 einnimmt.
Hat noch jemand das festgestellt und weis jemand was die bedeuten ?
Wenn ich das Laden starte geht er von 2 (Auto angeschlossen) auf 6 (???) und dann 3 (lädt) -
@scotty89 sagte in Easee Wallbox mit iobroker:
chargerOpMode
Doku sagt
https://github.com/Newan/ioBroker.easeechargerOpMode = Offline: 0, Disconnected: 1, AwaitingStart: 2, Charging: 3, Completed: 4, Error: 5, ReadyToCharge: 6
-
Hey,
ja ok das kennt man ja aber Status = 7 ist dann was ???
-
Sieht so aus als hätte easee etwas bei SignalR geändert, bekomme seit heute diese Meldung:
Failed to complete negotiation with the server: Error: The "/hubs" endpoint is moved from api.easee.cloud to streaming.easee.com: Status code '410'
Anschließend startet der Adapter neu, wenn SignalR deaktiviert ist läuft der Adapter. -
@stiwy18 Wartungen sind heute, warte mal bis morgen
-
@newan Danke Newan, so machen wir es, ich probiere es morgen noch einmal
-
Im EVCC Forum wurde eine Antwort von Easee gepostet zu dem Thema
-
Guten Morgen zusammen!
da scheint tatsächlich "gewartet" worden - so dass der Adapter nun nihct mehr läuft. Steht bzw. springt nach neustart auf rot...
easee.0 2023-05-10 08:21:33.146 error DB closed easee.0 2023-05-10 08:21:33.145 warn get state error: Connection is closed. easee.0 2023-05-10 08:21:33.000 info undefined is not a valid state value for id "easee.0.EH7J4CYM.status.latestFirmware" easee.0 2023-05-10 08:21:32.642 warn Terminated (UNCAUGHT_EXCEPTION): Without reason easee.0 2023-05-10 08:21:32.641 info terminating easee.0 2023-05-10 08:21:32.640 info Adaptor easee cleaned up everything... easee.0 2023-05-10 08:21:32.637 error Gone easee.0 2023-05-10 08:21:32.637 error Error: Gone at new HttpError (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/Errors.js:27:24) at FetchHttpClient.<anonymous> (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/FetchHttpClient.js:154:35) at step (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/FetchHttpClient.js:52:23) at Object.next (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/FetchHttpClient.js:33:53) at fulfilled (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/FetchHttpClient.js:24:58) at processTicksAndRejections (node:internal/process/task_queues:96:5) easee.0 2023-05-10 08:21:32.636 error unhandled promise rejection: Gone easee.0 2023-05-10 08:21:32.636 error Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). easee.0 2023-05-10 08:21:32.279 info Starting SignalR easee.0 2023-05-10 08:21:32.022 info Easee Api Login successful easee.0 2023-05-10 08:21:31.693 info starting. Version 1.0.7 in /opt/iobroker/node_modules/iobroker.easee, node: v16.19.1, js-controller: 4.0.24
-
@kaffeschluerfer Als Workaround kannst du SignalR deaktivieren, dann läuft der Adapter wird, oder die URL selbst übergangsweise in deinem iOBroker anpassen, dann läuft er auch wieder.
-
@stiwy18 Danke - hat geholfen. Läuft wieder ohne SignalIR. Meine Wallbox hat übrigens FW v310
-
@stiwy18 Ist das so das die URL angepasst und es geht. Wäre ja nen einfacherer fix.
Bin aber bis zum WE leider unterwegs -
@newan Korrekt, hab nur in Zeile 46 die URL von https://api.easee.cloud/hubs/chargers auf https://streams.easee.com/hubs/chargers geändert, dann lief der Adapter wird mit SignalR
-
@stiwy18 said in Easee Wallbox mit iobroker:
@newan Korrekt, hab nur in Zeile 46 die URL von https://api.easee.cloud/hubs/chargers auf https://streams.easee.com/hubs/chargers geändert, dann lief der Adapter wird mit SignalR
Zeile 46 von was?
-
@warp-it Ist ein neuer commit online.. Mal testen dann mach ich ne Version
-
@newan hab gerade aus Github installiert und getestet - leider immernoch dasselbe Problem. Ohne SignalIR gehts aber.
easee.0 2023-05-10 17:01:03.759 info starting. Version 1.0.7 (non-npm: Newan/ioBroker.easee) in /opt/iobroker/node_modules/iobroker.easee, node: v16.19.1, js-controller: 4.0.24 easee.0 2023-05-10 17:00:39.847 warn get state error: Connection is closed. easee.0 2023-05-10 17:00:39.846 warn Could not perform strict object check of state easee.0.EH7J4CYM.name: DB closed easee.0 2023-05-10 17:00:39.335 warn Terminated (UNCAUGHT_EXCEPTION): Without reason easee.0 2023-05-10 17:00:39.335 info terminating easee.0 2023-05-10 17:00:39.334 info Adaptor easee cleaned up everything... easee.0 2023-05-10 17:00:39.302 error Failed to complete negotiation with the server: TypeError: Cannot read properties of undefined (reading 'secure') easee.0 2023-05-10 17:00:39.302 error Error: Failed to complete negotiation with the server: TypeError: Cannot read properties of undefined (reading 'secure') at HttpConnection._getNegotiationResponse (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/HttpConnection.js:256:35) at async HttpConnection._startInternal (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/HttpConnection.js:172:41) at async HttpConnection.start (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/HttpConnection.js:75:9) at async HubConnection._startInternal (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/HubConnection.js:132:9) at async HubConnection._startWithStateTransitions (/opt/iobroker/node_modules/@microsoft/signalr/dist/cjs/HubConnection.js:109:13) easee.0 2023-05-10 17:00:39.301 error unhandled promise rejection: Failed to complete negotiation with the server: TypeError: Cannot read properties of undefined (reading 'secure') easee.0 2023-05-10 17:00:39.300 error Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). easee.0 2023-05-10 17:00:39.225 info Starting SignalR easee.0 2023-05-10 17:00:38.965 info Easee Api Login successful easee.0 2023-05-10 17:00:38.634 info starting. Version 1.0.7 (non-npm: Newan/ioBroker.easee) in /opt/iobroker/node_modules/iobroker.easee, node: v16.19.1, js-controller: 4.0.24
-
@kaffeschluerfer sagte in Easee Wallbox mit iobroker:
node: v16.19.1
Versuch es mit der aktuellen Empfehlung nodejs@18.
-
@thomas-braun said in Easee Wallbox mit iobroker:
Versuch es mit der aktuellen Empfehlung nodejs@18.
jap, das war's. Funktioniert wieder mit SignalIR. Hatte übersehen dass ich nodejs aktualisieren sollte... Danke!
-
Ich habe leider immer noch ein Problem:
easee.0 2023-05-15 10:03:50.813 error Easee API error on charger session - stop refresh
easee.0 2023-05-15 10:03:50.812 error Error: Request failed with status code 403Da ich mein System ohnehin am WE neu aufsetzen musste, habe ich soweit alles auf dem letzten Stand. Ob SignalIR an oder aus macht keinen Unterschied. Aufgefallen ist mir, dass mein Adapter die Version 1.07 hat. Auf Git sehe ich allerdings nur eine 1.04 als aktuelle.
Noch irgendwelche Ideen?