NEWS
Easee Wallbox mit iobroker
-
Hallo,
blöde Frage, wie bekomme ich die Meldung weg
undefined is not a valid state value for id "easee.0.xxxxxxxx.status.latestFirmware"
Firmware3.09
Latest easee AdapterZeile in enum.js gelöscht, laut github.
Alles neu gestartet
Objekt gelöscht.Danke für die Hilfe.
Gruß
-
@knima Ich denke das kann nur newman in seinem Adapter korrigieren.
-
@knima neuste commit auf git ist das gefixt.
Ist aber noch net released -
@seb2010 said in Easee Wallbox mit iobroker:
ok, also dann fasse ich mal kurz zusammen:
- mit phaseMode = 2 (Auto) kann ich über dynamicCircuitCurrentPX die Ladeleistung steuern
- dynamicCircuitCurrentP1 > 0 und dynamicCircuitCurrentP2 & 3 = 0 resultiert dann in 1-phasigem Laden
- dynamicCircuitCurrentP1 & 2 & 3 > 0 in 3-phasigem Laden
- für das Umschalten ist kein pause/resume/start notwendig. Für den Start/Stop eines Ladevorgangs natürlich schon.
- in der App auf "nur per Key" einstellen, damit man das Laden wirklich selbst steuert, da sonst bei Einstecken einfach losgeladen werden würde.
Bedeutet aber auch, dass man dann immer aktiv werden muss, wenn man außer der Reihe laden will. - mit chargerOpMode wird der Zustand des Chargers abgefragt, uA ob ein Auto angeschlossen ist oder nicht.
- das Schreiben von phaseMode und circuitMaxCurrentPX ist schlecht, da es in den Flash-Speicher gespielt wird und der sich theoretisch abnutzen kann. Daher die Steuerung alleine über dynamicCircuitCurrentPX
Fragen:
- auf was muss dann dynamicChargerCurrent stehen?
- wenn man keine Info darüber hat, ob das Auto voll ist, was muss ich dann in Bezug auf die Ladeleistungen einstellen? Im Grunde ist es ja egal, da dann nur einfach nicht weiter geladen wird, oder?
Das Überschussladen kann man sich ja an den obigen Skripten ansehen, funktioniert aber immer durch Überwachung des PV-Überschusses und dynamischer 1- oder 3-phasiger Anpassung der dynamicCircuitCurrentPX um mindestens 6A pro Phase zu erreichen.
Gibt es sonst noch wichtige Details die man vergessen könnte aber dran denken sollte?
Viele Grüße
SebastianSorry, hab das erst jetzt gelesen.
Hinzuzufügen wäre vielleicht noch Folgendes:- Ich arbeite auch ausschließlich mit dynamicCircuitCurrentPx. Wenn man mehrere Easees hat, wird dieser Wert nur in die primäre Wallbox geschrieben und gilt dann für alle Boxen.
- Start / Stop / Pause / Resume benutze ich alles nicht
- Wenn man eine Zoe lädt benötigt man mindestens 8A egal ob auf einer Phase oder 3 x 8 A
- Wenn man einphasig lädt, scheint die Zoe intern die Phasen zusammenzuschalten. Würde man nun Phasen 2 + 3 dazuschalten, zerreißt es wohl die Leistungselektronik der Zoe. Ich habe daher mein Blockly so erstellt, dass man Phasen 2 + 3 nur > 0 setzen kann, wenn das Kabel physisch gezogen ist. Es wäre schöner, wenn man den Wechsel auf 3-phasig auch einfacher vornehmen könnte, ohne das Kabel physisch zu ziehen. Aber ich weiß eben nicht, was konkret zu tun ist, damit die Zoe die Zusammenschaltung der 3 Phasen wieder auftrennt, wie man das prüfen könnte, und mag das aus offensichtlichen Gründen auch nicht testen.
-
Nur zur Info...
Ich hatte heute Kontakt zum EASEE support weil die Cloud in letzter Zeit mehrfach nicht erreichbar war und mein Hausakku wieder mal ins Auto umgeladen wurde. Das passiert bei mir immer dann, wenn die Überschussladung zwar anspringt, dann aber die Cloud zur Regelung bzw. Abschaltung der Ladung nicht zur Verfügung steht.
Habe also wieder mal nachgehakt ob denn endlich ein local API kommt oder ob man seine Easee box besser weggeben sollte....
Antwort:We are planning to release local API functions this summer. We have not a specific date ready, but we have been working for a while, and still are working on this function😊
Ich glaube das jetzt mal und bin positiv vorgespannt - und zähle dann natürlich auf @Newan für die Implemenitierung . Würde mich dann auch als Sponsor und Tester "opfern"
-
@aiouh Klar wenn die kommt stellen wir um!
-
@newan Sag mal bitte, schreibt dein Adapter zufällig den Datenpunkt "easee.0.XXXXXX.config.dynamicChargerCurrent" bei irgendwelchen Zuständen? Zum Beispiel bei einer Neuverbindung des Adapters? Ich habe das Problem, dass dieser Wert immer mal wieder auf 6 steht, obwohl ich ihn 100% nicht beschreibe. Ich kriege dieses Problem leider nicht aus der Welt. Die Sonne ballert, auf den "dynamicCircuitCurrentPn" liegen 3x10 A an und das Auto wird trotzdem nur mit 6A geladen.
-
@alex-warkentin nicht bewusst. Der Datenpunkt wird nur aus der Cloud geholt.
Mach den Adapter doch aus zum testen.Zu beachten nur:
dynamicCircuitCurrentPX -> All phases must be set within 500ms (script) otherwise the phase will be set to 0. -
@newan
Kannst du schon sagen, ob sich dann im Adapter selbst etwas ändern wird?
An den Datenpunkten etc.? -
@bishop9191 ne hab noch keine Infos gesehen
Könnten dann auch nen 2. Adapter easee-lokal machen. Mal sehen -
@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