NEWS
[Frage] Realisierung Adapter UDP Keba Wallbox
-
Hallo gto,
freut mich, wenn dir das Skript gefällt. Eigentlich brauchst Du keine Vorzeichen umdrehen. Es gibt zwei getrennte Felder für Dein Energy Meter. Im einen gibst Du den Namen des States mit dem Netzbezug an, im anderen den mit der Einspeisung. Wenn Dein EnergyMeter beide in einem State liefert (als pos./neg. Werte), dann reicht die Befüllung einer der beiden Felder. Passt das Vorzeichen nicht, dann musst Du das andere Feld nehmen.
Die Funktion, das Laden ganz einzustellen, wenn mind. x Minuten nicht mehr genug PV-Strom zur Verfügung steht, ist schon implementiert. Das ist "nMinLfz". Über nNetzbezug kannst Du angeben, wieviel Watt noch vom Netz gezogen werden dürfen, ohne dass das Laden beendet wird (Bei Erzeugung von 2.200W kann es sich z.B. lohnen die 400W für die minimale Ladeleistung des Autos vom Netz "zuzukaufen").
Und über den State wallboxPVAutomatik kann Du mit "false" auf volle Ladung umschalten, wenn Du mal schnell tanken musst und Dir die Sonne egal ist. Den Schalter kann man das schön im VIS verwalten.
Ich habe zwischenzeitlich noch etwas am Skript geschaubt, weil es oft beim Einstecken für ein paar Minuten geladen hatte, obwohl nicht genug Sonne schien und ich eine Leistungsbegrenzung einbauen musste, weil die Stadtwerke mir sonst kein Laden in der Nacht parallel zur Nachtspeicherheizung erlauben würden.
Hier mal der aktuelle Stand:
! // 01.06.2017 - V1.01 - Ladebeginn wird jetzt bei An- und Abstecken auf null gesetzt
! // - Erkennung Ladebeginn nun von 1 W auf 100 W (100.000 mW) erhöht,
! // da beim anstecken sonst sofort ein Ladebeginn erkennt wird,
! // der zu einer 5 minütigen Ladedauer führt, auch wenn die Sonne
! // nicht scheint.
! var nMinCurr = 6000; // in mA
! var nMaxCurr = getState("kecontact.0.currentHardware"/Maximum Current Hardware/).val; // in mA
! var nDelta = 500; // Regelgröße der Ladung in mA (damit nicht jedes mA geregelt wird)
! var nNetzbezug = 400; // Max. Wattzahl die bei minimaler Ladung auch vom Netz gezogen werden darf.
! var nMinLfz = 300; // Sekunden wie lange Ladung mindestens aufrechterhalten wird, auch wenn zu wenig Strom anliegt
! var nAktGenau = 0; // Aktueller genauer Ladewert
! var nAnzPhasen = 0; // Anzahl der Phasen, mit denen Fahrzeug lädt
! var doLog = true; // Aktivieren, um bei der Fehlersuche zu unterstützen
! var lAutoVerb = false; // Ist ein Auto mit der Ladebox verbunden?
! var oLadeBeginn = null; // Timerbeginn, wenn Laden des Fahrzeugs begonnen wurde
! var oSchedule = null; // Schedule-Object
! var cStateEinspeisung = "sma-em.0.1901706890.psurplus"; /*Aktuelle Einspeisung, negative Werte werden als Verbrauch interpretiert */
! var cStateNetzbezug = "sma-em.0.1901706890.pregard"; /*Aktueller Netzbezug (Stromverbrauch), negative Werte wären Einspeisung */
! var cStateVerbrauch1 = "sma-em.0.1901402148.pregard"; /1. Stromzähler für Leistungsbegrenzung/
! var cStateVerbrauch2 = "sma-em.0.1901706890.pregard"; /2. Stromzähler für Leistungsbegrenzung/
! var cStateVerbrauch3 = ""; /3. Stromzähler für Leistungsbegrenzung/
! var nMaxLeistung = 26000; /Max. Leistung, die über Verbraucher 1-3 abgerufen werden darf/
! var lMaxInklWallbox = true; /Schalter, ob Wallbox ebenfalls in Verbrauch berücksichtigt wird/
! // Konstanten für States
! var cStateWallboxAnAus = "kecontact.0.enableUser"; /Enable User/
! var cStateWallboxLadung = "kecontact.0.currentUser"; /Current User/
! var cStateWallboxP1 = "kecontact.0.i1"; /Current 1/
! var cStateWallboxP2 = "kecontact.0.i2"; /Current 2/
! var cStateWallboxP3 = "kecontact.0.i3"; /Current 3/
! var cStateWallboxVerb = "kecontact.0.plug"; /*Plug, Steckerverbindung */
! var cStateWallboxStatus = "kecontact.0.state"; /*State, Status der Ladung */
! var cStateAktLadung = "kecontact.0.p"; /Power - Aktuelle Ladung E-Auto/
! var cStateLadebeginn = "wallboxStart"; /Zeitpukt, wann mit dem Laden des Autos aktiv begonnen wurde/
! var cStateLadeverbindung = "wallboxVerbindung"; /Zeitpukt, wann das Auto mit der Wallbox zuletzt verbunden wurde/
! var cStateLadestopp = "wallboxSperre"; /grundsätzliches Ladeverbot z.B. wegen Nachtspeicherheizung/
! var cStateLadeautomatik = "wallboxPVAutomatik"; /*Ladung E-Auto abhängig von PV-Leistung, false = max Ladung unabh. von PV /
! createState(cStateLadeautomatik, true, {
! read: true,
! write: true,
! name: "Gibt an, ob die Wallbox abhängig vom PV-Überschuss laden soll (aus = mit voller Leistung laden)",
! type: "boolean",
! def: true
! });
! createState(cStateLadestopp, false, {
! read: true,
! write: false,
! name: "Gibt an, ob die Wallbox derzeit gesperrt ist (z.B. wegen aktiver Nachtspeicherheizung)",
! type: "boolean",
! def: false
! });
! createState(cStateLadebeginn, null, {
! read: true,
! write: false,
! name: "Gibt an, wann die Wallbox begonnen hat, das Auto zu laden",
! type: "string",
! role: "datetime",
! def: null
! });
! createState(cStateLadeverbindung, null, {
! read: true,
! write: false,
! name: "Gibt an, wann das Auto zuletzt mit der Wallbox verbunden wurde",
! type: "string",
! role: "datetime",
! def: null
! });
! function schreibeInfo(text, wichtig) {
! if (doLog) {
! if (wichtig === true) {
! log(text, "info");
! } else {
! log(text, "debug");
! }
! }
! }
! function switchWallbox(enabled) {
! schreibeInfo("schalte wallbox: " + enabled);
! if (getState(cStateWallboxAnAus).val != enabled) {
! setState(cStateWallboxAnAus, enabled);
! schreibeInfo("Schalt-Kommando " + enabled + " abgesetzt", true);
! if (! enabled) {
! oLadeBeginn = null;
! }
! }
! }
! function regulateWallbox(milliAmpere) {
! schreibeInfo("regle wallbox: " + milliAmpere);
! if (getState(cStateWallboxLadung).val != milliAmpere) {
! setState(cStateWallboxLadung, milliAmpere);
! schreibeInfo("Regler-Kommando auf " + milliAmpere + " abgesetzt", true);
! }
! }
! function getUeberschussOhneWallbox() {
! // zunächst ist mal nichts verfügbar
! var nVerfuegbar = 0;
! if (cStateEinspeisung !== '') {
! nVerfuegbar = nVerfuegbar + getState(cStateEinspeisung).val;
! }
! if (cStateNetzbezug !== '') {
! nVerfuegbar = nVerfuegbar - getState(cStateNetzbezug).val;
! }
! nVerfuegbar = nVerfuegbar + (getState(cStateAktLadung).val / 1000);
! return(nVerfuegbar);
! }
! function getAktGesamtVerbrauch() {
! // zunächst mal kein Verbrauch
! var nResult = 0;
! if (cStateVerbrauch1 !== '') {
! nResult = nResult + getState(cStateVerbrauch1).val;
! }
! if (cStateVerbrauch2 !== '') {
! nResult = nResult + getState(cStateVerbrauch2).val;
! }
! if (cStateVerbrauch3 !== '') {
! nResult = nResult + getState(cStateVerbrauch3).val;
! }
! if (lMaxInklWallbox) {
! nResult = nResult - (getState(cStateAktLadung).val / 1000);
! }
! return nResult;
! }
! function getLeistungVerfuegbar() {
! // Wenn keine Leistungsbegrenzung eingestelt ist, dann max. liefern
! if (nMaxLeistung <= 0) {
! return 999999;
! }
! return nMaxLeistung - getAktGesamtVerbrauch();
! }
! function checkAutoLadung() {
! var nCurr = 0; // in mA
! var nTempMax = nMaxCurr;
! var oAutoState = getState(cStateLadeautomatik);
! // Wenn Wallbox lädt, dann die Anzahl der Phasen ermitteln
! var nAktPhasen = nAnzPhasen;
! if (getState(cStateAktLadung).val > 100000) {
! // Wenn Auto wirklich geladen wird, dann merken, wann das begonnen hat,
! // damit man gem. Schalter oben dafür sorgen kann, dass mind. eine
! // eingestellte Zeitpsanne geladen wird.
! if (oLadeBeginn === null) {
! oLadeBeginn = new Date();
! schreibeInfo("Auto beginnt zu laden", true);
! setState(cStateLadebeginn, oLadeBeginn, true);
! }
! var nTempAnz = 0;
! if (getState(cStateWallboxP1).val > 100) {
! nTempAnz ++;
! }
! if (getState(cStateWallboxP2).val > 100) {
! nTempAnz ++;
! }
! if (getState(cStateWallboxP3).val > 100) {
! nTempAnz ++;
! }
! if (nTempAnz > 0) {
! // Jetzt die Anzahl Phasen merken
! nAnzPhasen = nTempAnz;
! nAktPhasen = nTempAnz;
! schreibeInfo("Wallbox lädt mit " + nAnzPhasen + " Phasen");
! } else {
! schreibeInfo("Trotz Ladung keine Phasenanzahl für Wallbox ermittelt", true);
! }
! }
! // Wenn bisher keine Phasenzahl bekannt, dann mit einer Phase rechnen
! if (nAktPhasen <= 0) {
! nAktPhasen = 1;
! }
! // State "reparieren", weil VIS-Control 0/1 anstelle false/true setzt
! if (typeof oAutoState.val != "boolean") {
! setState(cStateLadeautomatik, oAutoState.val == 1, true);
! }
! // Zunächst Leistungsbegrenzung prüfen
! var nMaxAmpere = Math.round(getLeistungVerfuegbar() / 230 / 3 * 1000 / nDelta) * nDelta; // Zur Sicherheit immer mit drei Phasen rechnen
! if (nMaxAmpere < nTempMax) {
! nTempMax = nMaxAmpere;
! }
! // Wallbox sperren, wenn entweder eine Ladestopp vorliegt oder die max. verfügbare Leistung unter dem Mindestwert der Wallbox liegt
! if (getState(cStateLadestopp).val || (nTempMax < nMinCurr)) {
! // Ladung aktuell gesperrt
! schreibeInfo("Wallbox ist aktuell gesperrt");
! } else {
! if (lAutoVerb && getState(cStateLadeautomatik).val) {
! var nVerfuegbar = getUeberschussOhneWallbox();
! // Ladesteuerung in Stufen von 500mA regeln
! nCurr = Math.round(nVerfuegbar / 230 * 1000 / nDelta / nAktPhasen) * nDelta;
! if (nCurr < nMinCurr) {
! if (oLadeBeginn !== null) {
! // Wenn das Auto gerade lädt bzw. laden darf, dann Grenzwerte zum Abschalten berücksichtigen
! nCurr = Math.round((nVerfuegbar + nNetzbezug) / 230 * 1000 / nDelta / nAktPhasen) * nDelta;
! if (nCurr >= nMinCurr) {
! schreibeInfo("Minimale Unterschreitung Ladestrom, Laden wird fortgesetzt", true);
! nCurr = nMinCurr;
! } else {
! if (nMinLfz > 0) {
! oAktZeit = new Date();
! if ((oAktZeit.getTime() - oLadeBeginn.getTime()) / 1000 < nMinLfz) {
! // Mindestladedauer unterschritten? Dann mit minimaler Stärke weiter laden
! nCurr = nMinCurr;
! schreibeInfo("Minimale Ladezeit noch nicht erreicht, Laden wird fortgesetzt", true);
! }
! }
! }
! }
! } else {
! schreibeInfo("dynamische Anpassung mit " + nCurr + " mA");
! }
! } else {
! nCurr = nTempMax; // Automatik aus oder kein Auto verbunden? Dann mit voller Leistung laden
! schreibeInfo("Wallbox wird aktuell mit voller Leistung betrieben");
! }
! }
! if (nCurr < nMinCurr) {
! // Wallbox deaktivieren
! switchWallbox(false);
! regulateWallbox(nMinCurr);
! } else {
! if (nCurr > nTempMax) {
! nCurr = nTempMax;
! }
! schreibeInfo("Wallbox auf " + nCurr + " mA");
! regulateWallbox(nCurr);
! switchWallbox(true);
! }
! }
! function checkSchedule(obj) {
! schreibeInfo("Status ist: " + getState(cStateWallboxVerb).val);
! // 0 unplugged
! // 1 plugged on charging station
! // 3 plugged on charging station plug locked
! // 5 plugged on charging station plugged on EV
! // 7 plugged on charging station plug locked plugged on EV
! // Bei Ladestation mit ist Status immer mind. 3
! var lNewVerb = (getState(cStateWallboxVerb).val >= 5);
! if (lAutoVerb != lNewVerb) {
! // Es hat sich was geändert, Ladung begonnen oder beendet
! // Aber eigentlich uninteressant, Schedule sollte imm geprüft werden
! lAutoVerb = lNewVerb;
! // Egal ob Auto an- oder abgesteckt wird, dann ist der Ladebeginn
! // erstmal zu initialisieren
! oLadeBeginn = null;
! if (lAutoVerb) {
! schreibeInfo("Auto wurde mit Wallbox verbunden", true);
! setState(cStateLadeverbindung, new Date(), true);
! setState(cStateLadebeginn, oLadeBeginn, true);
! } else {
! schreibeInfo("Auto wurde von Wallbox getrennt", true);
! }
! checkAutoLadung();
! }
! // Wenn die Leistungsbegrenzung aktiv ist, dann muss der Schedule immer laufen
! if (lAutoVerb || nMaxLeistung >= 0) {
! if (oSchedule === null) {
! oSchedule = schedule("/30 * * * * ", checkAutoLadung);
! schreibeInfo("Schedule für Ladeautomatik aktiviert", true);
! }
! } else {
! if(oSchedule) {
! clearSchedule(oSchedule);
! oSchedule = null;
! schreibeInfo("Schedule für Ladeautomatik beendet", true);
! }
! }
! }
! subscribe({id: cStateWallboxStatus, change: "ne"}, checkSchedule);
! subscribe({id: cStateLadeautomatik, change: "ne"}, checkAutoLadung);
! subscribe({id: cStateLadestopp, change: "ne"}, checkAutoLadung);
! / schedule({hour: 6, minute: 1}, function () {
! // Nachtspeicherzeit ist vorbei, Wallbox freigeben
! setState(cStateLadestopp, false, true);
! });
! schedule({hour: 21, minute: 39}, function () {
! // Nachtspeicherzeit beginnt, Wallbox sperren
! setState(cStateLadestopp, true, true);
! }); */
! // bei Scriptstart States löschen und alles einmal ausführen
! setState(cStateLadeverbindung, null, true);
! oLadeBeginn = null;
! setState(cStateLadebeginn, oLadeBeginn, true);
! checkSchedule();
! checkAutoLadung(); -
Hallo, danke für die Antwort
Ich werde mir einen state einbauen um Hausverbrauch, Netzbezug und PV-Produktion einzurechnen. Wegen der Batterie kann nämlich nicht vom Netzbetreiberbezug auf den Hausverbrauch umgerechnet werden. Das bringe ich sicher hin.
Beim 2. Punkt hast du mich missverstanden. Ich würde gerne die Ladestromberechnungsautomatik automatisieren (lustiges Wortspiel). Das soll bedeuten, dass an Wolkentagen die Automatik sich selbstständig deaktiviert, also Frauenfreundlich.
Geht das??
-
Klar. Schreib Dir ein Skript, das eine Prognose für heute abfragt. Bei schlechtem Wetter änderst Du den State PVAutomatik auf false, sonst auf true.
Aber man muss sein Auto auch nicht unbedingt täglich laden, wenn die Reichweite noch ausreichend ist. Das kommt auch den Akkus zugute. Da warte ich lieber auf die Sonne und stelle nur im Notfall die Automatik aus.
-
Muss täglich laden, haben Hybrid und da fahren wir den Akku jeden Tag leer.
Danke für deine Hilfe
-
Klar, das ist was anderes, lohnt das Laden immer
-
Hallo zusammen
Zuerst mal ein grosses SORRY, dass ich mich erst jetzt wieder melde :oops:.
Unser Haus ist inzwischen umgebaut, die gesamte Hausautomation mit ioBroker läuft und das erste Kind ist auf dem Weg (Release-Termin im Mai ;-). Das heisst, in den nächsten Monaten sollte ich wieder mehr Zeit für den Adapter haben.
Version 0.1.0 habe ich gestern als "stable" freigegeben, ist aber noch nicht im Repository: https://github.com/ioBroker/ioBroker.re … s/pull/261
Wenn ihr Wünsche oder Vorschläge habt, füllt bitte einen "Issue" bei GitHub aus, dann kann ich das priorisieren, wie das in der richtigen Softwareentwicklung auch läuft :-):
https://github.com/UncleSamSwiss/ioBrok ... act/issues
Für die Softwareentwickler unter euch bin ich natürlich auch um Pull Requests dankbar:
https://github.com/UncleSamSwiss/ioBrok ... tact/pulls
Ich freue mich auf euren Input!
/UncleSam
-
Hallo,
die Realisierung der PV-Ladung war für mich der Anlaß mich endlich mit IO-Broker zu befassen.
Wir haben letztes Jahr unser Haus umgebaut und auch mit KNX ausgerüstet, aber im Moment nutzen wir die Möglichkeiten noch nicht voll aus da es erst einmal nur "dumm" zum Schalten genutzt wird.
In den nächsten 4 Wochen kommen aber sowohl die Wallbox wie auch die PV und dann war das Ziel genau das zu realisieren was,
soweit ich das sehe, ja schon größten Teils in dem Adapter bzw. dem Script steckt.
Wir haben einen Smart mit einer Reichweite von ca. 120km (Sommer) und der wird meist an 2-3 Tagen die Woche für die Fahrt in die benachbarte Großstadt benutzt, so ca. 30km. Meist ist es sogar so, dass es nie zwei Tage hintereinander sind.
Idee für die Steuerung ist die, das immer mindestens 75km Reichweite zur Verfügung stehen sollten.
Die Automatik soll so aussehen das wenn Überschuß der PV da ist, soll geladen werden bis der Akku maximal voll ist.
Nur wenn der Akku droht am Morgen unter der Ladung von ca. 65% (im Winter wahrscheinlich mehr) zu liegen, soll Strom aus dem Netz gezogen werden.
Über einen Taster soll das manuell übersteuert werden können, das er jederzeit sofort maximal geladen werden kann.
Mit dem verbauten Schnelllader und der Wallbox soll das für den Smart in 1h möglich sein. Ich bin mal gespannt ;-).
Ich werde in den nächsten Wochen über den Erfolg oder Mißerfolg berichten.
Gruß
Dietmar
-
Hallo UncleSam,
so die Wallbox ist installiert und das lesen der Werte mit dem Adapter geht einwandfrei (nachdem der Installateur UDP auch wirklich aktiviert hatte ;-)).
Jetzt habe ich noch eine Verständnisfrage:
Die Wallbox hat ja einen Freigabeeingang (X1) über den ich das Laden aktivieren kann.
Denn habe ich aktiviert und das funktioniert sauber und ich sehe auch den Ladevorgang in den Objekten vom IObroker.
Allerdings lädt die Box mit dem maximalen Strom der mit den Dip-Switches eingestellt ist.
Wenn ich jetzt nur mit dem Überschuss der PV laden wollte, über welche Werte/Objekte kann der Strom dann über den iobroker-Adapter eingestellt werden? Oder brauche ich dafür dann auch das Script? Und muss der X1 dann auch aktiviert werden?
Danke und Gruß
Dietmar
PS: Tolle Arbeit mit dem Adapter!
-
Über curruser kann der aktuell gewünschte Ladestrom eingestellt werden. Das passiert mit dem Skript.
Ich habe eher vor, den Adapter von UncleSam um die Funktionalität des Skripts zu erweitern. Bin gerade am Einlesen in die Doku und klonen in git.
-
Ah, vielen Dank!
Das Script das hier im Thread abgelegt ist, ist noch das aktuelle?
Meine PV kommt erst in der nächsten Woche - hoffentlich. Der erste Termin wurde wegen Schneefall leider gecancelt.
Sobald das ganze steht und ich etwas Zeit habe, werde ich mich an den Einbau und Testen begeben.
Macht die Integration in den Adapter der Keba Sinn? Oder wird das gegenüber dem Script dann nicht etwas inflexibler?
Gruß
Dietmar
-
Das Skript habe ich zwischenzeitlich mal aktualisiert, aber ob es dem entspricht, das bei mir läuft...
Genau das wäre z.B. ein Grund,warum ein Adapter besser ist. Der wird zentral verwaltet und ich sehe bei github alle Änderungen und weiß, wann etwas geändert wurde.
Zudem kann ich weniger falsch machen, weil es eine Konfigurationsseite gibt, auf der ich die nötigen Daten eintrage und nicht die Gefahr besteht, versehentlich im Source etwas zu ändern. -
So, ich habe vor einiger Zeit einen Fork des Adapters erstellt und die Erweiterung um Lesitungsbegrenzung (z.B. für parallele Nutzung von Nachtspeicheröfen) und PV-abhängige Ladung ergänzt. Außerdem kann man über einen state beliebige Texte auf der Wallbox anzeigen lassen (max. 23 Zeichen).
Falls jemand nicht auf den PullRequest warten will: unter https://github.com/Sneak-L8/ioBroker.kecontact kann man sich die neueste Version installieren. -
Hallo Sneak-L8,
danke für das Update! (Ich sollte das Thema abonieren ;-))
Ich hab mir den Adapter mal installiert, aber ich hab da so ein paar Anmerkungen/Fragen.
-
Ich kann die Einstellungen nicht speichern. Die Buttons für Speichern bleiben grau. Könnte das damit zusammenhängen das ich das über die 0.1.0 Version installiert habe?
-
Die Hilfetexte für Netzbezug und Netzeinspeisung muss man sehr genau lesen um den Unterschied zu erkennen. Was passiert wenn ich in beide den gleichen eintrage?
-
Ladeunterschreitung: Wäre es nicht sinnvoller den Energiebezug in KWh als Trigger einzubeziehen?
-Statt der (oder zusätzlich zur) Mindestladezeit eine MindestladeEnergie in KWh? Aus meiner Sicht ist die Zeit ja zweitrangig. Was ich bezahlen muss ist die Energiemenge von meinem Versorger und mich interessiert ja auch wieviel Energie ich in den Akku bekommen habe.
- Was passiert wenn alle Felder leer bleiben?
Ich wollte die Tage eigentlich damit beginnen mir das Script näher an zu sehen und zu schauen inwieweit ich das für meine Zwecke nutzen kann.
Meine PV hat einen Speicher.
Das Laden des Autos soll erst erfolgen wenn der Stromspeicher einen gewissen Ladestand erreicht hat, dann könnte das Laden auch ohne Netzbezug fortgesetzt werden wenn mal kurz die Sonne weg bleibt.Ich werde mir das mit Github mal ansehen und wenn ich das hin kriege werde ich versuchen den Adapter zu erweitern, wenn Du nichts dagegen hast.
Danke und Gruß
Dietmar -
-
Hallo Dietmar,
> Ich kann die Einstellungen nicht speichern.
das Problem, dass sich die Einstellungen zunächst nicht speichern liesen hatte ich auch. Ich ging davon aus, dass es an den fehlenden Definitionen in der io-package.json lag. Nachdem ich die nächste Version installiert hatte lief es.
Evtl. ist in einem Feld auch ein ungültiger Wert (z.B. blank anstelle 0). Schau die Werte doch mal durch oder Installiere den Adapter nochmal. Ich habe den alten Adapter auch nicht deinstalliert, sondern einfach über "andere Quelle" drübergebügelt.> Die Hilfetexte für Netzbezug und Netzeinspeisung muss man sehr genau lesen um den Unterschied zu erkennen. Was passiert wenn ich in beide den gleichen eintrage?
Dann hast Du immer genau null Netzbezug bzw. null Einspeisung und keinen Überschuss fürs Auto.
Das Prinzip für beide State ist, dass ich wissen will, wieviel ich gerade ins Netz einspeise. Denn das ist das, was fürs Auto zur Verfügung steht bei optimierter Ladung. Mein SMA SHM gibt Einspeisung und Bezug in getrennten States an. Daher zwei Angaben. Wenn Dein Energymeter nur einen State hat (positive Werte Netzbezug und negative Einspeisung, dan gib den State nur bei Netzbezug ein).
Ich mache intern einfach eine Berechnung: Überschuss = Einspeisung - Netzbezug, wobei ein negativer Überschuss ein Netzbezug bedeutet.>Ladeunterschreitung: Wäre es nicht sinnvoller den Energiebezug in KWh als Trigger einzubeziehen?
Der Wert ist einfach nur dazu gedacht, bei grenzwertigem Überschuss nicht alle 30 Sekunden die Ladung zu stoppen und wieder zu starten. Gleicher Gedanke bei der Mindestladezeit. Ich will nicht permanent ein-/ausschalten. Ich hatte in einem ersten Skript direkt die State für Netzbezug und Einspeisung abonniert und immer sofort umgeschalten. Da hat das Skript dann (wenn der Üerschuss um die 2,4 kW) lag schon mal 10x in der Minute die Ladestation aktiviert und deaktiviert. Das führte dann sogar zu Fehlermeldungen am Auto. Daher dienen die Werte nur der Verstetigung des Ladevorgangs.
Für eine Mindestladung könnte man natürlich weitere Parameter vorsehen. Am besten auch einen state für den SoC des Fahrzeugs, damit man z.B. eine bestimmte Prozentzahl unabhängig vom Überschuss immer erreicht. Aber das ist noch Zukunftsmusik.Vielleicht noch ein Hinweis: die anzugebenden States sind Werte vom EnergyMeter der direkt beim Stromzähler hängt. Erzeugungsleistung des Wechselrichters oder andere Werte interessierne nicht. Nur so hab ich den korrektne Überschuss.
> Was passiert wenn alle Felder leer bleiben?
Dann macht die Box es wie in der alten Version. Sie lädt einfach mit der engestellter Stärke. Ohne irgendeine Intelligenz.>Meine PV hat einen Speicher.
Das macht nichts :-), da der Adapter immer auf die States der EnergyMeter schaut. Lädt Dein Speicher, dann hast Du eine geringere Einspeisung. Und nur dieser verbleibende Überschuss geht dann ins Auto.Ich hoffe, ich konnte damit etwas Licht ins Dunkel bringen.
Viele Grüße
Sneak-L8 -
- Wollte mir den Adapter einrichten, leider bleibt bei den Instanzen der Punkt rot. Im LOG sind folgende Einträge.
Was habe ich falsch???
- Habe einen Akku im Keller, mit den derzeitigen Einstellmöglichkeiten lädt das Auto erst nachdem der Akku voll ist. Das macht nicht Sinn weil dann Strom aus dem Akku in den KFZ-Akku geht.
Kann ich Einstellungen machen um erst den PV-Überschuß ins Auto zu stecken?
-
@Thomas-Geigl muss ich mir in Ruhe anschauen, der Fehler sagt mir auf Anhieb nichts. UDP ist in der Keba aber aktiviert?
Die maximale Leistung scheint derzeit auf Null eingestellt zu sein, ist das Absicht? Wenn keine absolute Leistungsbegrenzung (z.B. wegen NSO) nötig ist, dann die states für die Leistung dort auch nicht füllen.
Wer entscheidet, ob der Akku im Keller laden soll oder nicht? Z.B. ein SMA sunny home manager? Und an was macht er es fest? Wenn es auch der Überschuss ist, der am Haus-Anschluss anliegt, dann müsste man die aktuelle Leistung des Akkus herausrechnen. Also die Leistung des Akkus als zweites energy Meter angeben. -
@Sneak-L8
Hallo
UDP ist aktiviert, ich habe bereits seit längerem mit dem Script von UncleSam erfolgreich gesteuert.
Die Steuerung der Akkuladung übernimmt der Fronius selbst - der Überschuß kommt in den Akku.
Die Instanz bleibt auch wenn ich alles eingebe auf rot -
Hm, also irgendwie müsste der Akku verraten, wieviel Leistung er zieht. Der Adapter sieht aber nur zwei States vor für die Steuerung. Dann müsstest Du einen neuen State anlegen und diesen per Skript füllen mit "Netzbezug minus Einspeisung plus Akku-Leistung". Und diesen State dann unter "Name des States für Netzbezug" eintragen.
Die Felder ab "Maximaler Netzbezug" sollten alle leer bleiben, dann sollte die Warnung verschwinden.
Die Fehlermeldung bzgl. udpKey sind komisch. Evtl. hilft ein Durchstarten des Adapters? Sonst bitte einen etwas größeren Bildausschnitt, damit man die ganze Meldung sieht. -
@Sneak-L8
Mit den states werde ich mich noch spielen, geht aber erst wenn der Adapter läuft.
Neustart, Neuinstallation waren erfolglos. Die Version 0.1.0 des Adapters läuft problemlos.Konfig:
admin 3.6.12
node 10.17Habe zur Fehlerkontrolle noch eine Windows-Iobroker Installation mit node 8.16.2 angelegt.
Problem gleich - Instanz startet nichthost.Laptop 2019-11-14 19:53:21.552 info Restart adapter system.adapter.kecontact.0 because enabled
host.Laptop 2019-11-14 19:53:21.552 error instance system.adapter.kecontact.0 terminated with code 0 (OK)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Decoder.add (C:\iobroker\node_modules\socket.io-parser\index.js:246:12)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Decoder.Emitter.emit (C:\iobroker\node_modules\component-emitter\index.js:134:20)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Decoder.<anonymous> (C:\iobroker\node_modules\component-bind\index.js:21:15)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Manager.ondecoded (C:\iobroker\node_modules\socket.io-client\lib\manager.js:332:8)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Manager.Emitter.emit (C:\iobroker\node_modules\socket.io-client\node_modules\component-emitter\index.js:133:20)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Manager.<anonymous> (C:\iobroker\node_modules\component-bind\index.js:21:15)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Socket.onpacket (C:\iobroker\node_modules\socket.io-client\lib\socket.js:236:12)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Socket.onack (C:\iobroker\node_modules\socket.io-client\lib\socket.js:312:9)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at Socket.<anonymous> (C:\iobroker\node_modules\iobroker.js-controller\lib\adapter.js:2793:46)
Caught 2019-11-14 19:53:21.552 error by controller[0]: at C:\iobroker\node_modules\iobroker.kecontact\kecontact.js:184:32
Caught 2019-11-14 19:53:21.552 error by controller[0]: TypeError: Cannot read property 'udpKey' of undefined
kecontact.0 2019-11-14 19:53:21.541 info terminating
kecontact.0 2019-11-14 19:53:21.535 error at Decoder.add (C:\iobroker\node_modules\socket.io-parser\index.js:246:12)
kecontact.0 2019-11-14 19:53:21.535 error at Decoder.Emitter.emit (C:\iobroker\node_modules\component-emitter\index.js:134:20)
kecontact.0 2019-11-14 19:53:21.535 error at Decoder.<anonymous> (C:\iobroker\node_modules\component-bind\index.js:21:15)
kecontact.0 2019-11-14 19:53:21.535 error at Manager.ondecoded (C:\iobroker\node_modules\socket.io-client\lib\manager.js:332:8)
kecontact.0 2019-11-14 19:53:21.535 error at Manager.Emitter.emit (C:\iobroker\node_modules\socket.io-client\node_modules\component-emitter\index.js:133:20)
kecontact.0 2019-11-14 19:53:21.535 error at Manager.<anonymous> (C:\iobroker\node_modules\component-bind\index.js:21:15)
kecontact.0 2019-11-14 19:53:21.535 error at Socket.onpacket (C:\iobroker\node_modules\socket.io-client\lib\socket.js:236:12)
kecontact.0 2019-11-14 19:53:21.535 error at Socket.onack (C:\iobroker\node_modules\socket.io-client\lib\socket.js:312:9)
kecontact.0 2019-11-14 19:53:21.535 error at Socket.<anonymous> (C:\iobroker\node_modules\iobroker.js-controller\lib\adapter.js:2793:46)
kecontact.0 2019-11-14 19:53:21.535 error at C:\iobroker\node_modules\iobroker.kecontact\kecontact.js:184:32
kecontact.0 2019-11-14 19:53:21.535 error TypeError: Cannot read property 'udpKey' of undefined
kecontact.0 2019-11-14 19:53:21.535 error uncaught exception: Cannot read property 'udpKey' of undefined
kecontact.0 2019-11-14 19:53:21.476 info starting. Version 0.2.0 in C:/iobroker/node_modules/iobroker.kecontact, node: v8.16.2
host.Laptop 2019-11-14 19:53:20.820 info instance system.adapter.kecontact.0 started with pid 10952 -
So, ich habe gerade im git den Adapter aktualisiert, damit er kein Problem mehr hat, wenn States nicht initialisiert sind. Probiere bitte mal diese Version (0.2.1).