Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. [Frage] Realisierung Adapter UDP Keba Wallbox

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Frage] Realisierung Adapter UDP Keba Wallbox

    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      chrissh last edited by

      Hallo Uncle Sam,

      danke für deinen Adapter. Ist gerade installiert. Auto wird erstmals am Freitag geladen.

      Hier der Log

      ! kecontact.0 2018-02-12 13:58:39.513 debug Sent "report 3" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:58:39.213 debug Sent "report 2" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:58:09.512 debug Sent "report 3" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:58:09.213 debug Sent "report 2" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:57:39.514 debug Sent "report 3" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:57:39.212 debug Sent "report 2" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:57:09.511 debug Sent "report 3" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:57:09.211 debug Sent "report 2" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:56:40.112 debug Sent "report 3" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:56:39.812 debug Sent "report 2" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:56:39.518 debug Unknown value received: COM-module=0 kecontact.0 2018-02-12 13:56:39.513 debug " kecontact.0 2018-02-12 13:56:39.513 debug } kecontact.0 2018-02-12 13:56:39.513 debug "Sec": 4492 kecontact.0 2018-02-12 13:56:39.513 debug "COM-module": 0, kecontact.0 2018-02-12 13:56:39.513 debug "Firmware":"P30 v 3.08.7 (170404-153240)", kecontact.0 2018-02-12 13:56:39.513 debug "Serial": "18115191", kecontact.0 2018-02-12 13:56:39.513 debug "Product": "KC-P30-ES240022-E00", kecontact.0 2018-02-12 13:56:39.513 debug "ID": "1", kecontact.0 2018-02-12 13:56:39.513 debug UDP datagram from 192.168.1.58:7090: "{ kecontact.0 2018-02-12 13:56:39.511 debug Sent "report 1" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:56:39.216 warn Error handling message: SyntaxError: Unexpected token } in JSON at position 45 kecontact.0 2018-02-12 13:56:39.215 debug " kecontact.0 2018-02-12 13:56:39.215 debug UDP datagram from 192.168.1.58:7090: ""Firmware":"P30 v 3.08.7 (170404-153240)", kecontact.0 2018-02-12 13:56:39.213 debug Sent "i" to 192.168.1.58:7090 kecontact.0 2018-02-12 13:56:39.110 debug UDP broadcast server listening on 0.0.0.0:7092 kecontact.0 2018-02-12 13:56:39.108 debug UDP server listening on 0.0.0.0:7090 kecontact.0 2018-02-12 13:56:39.078 info starting. Version 0.0.3 in /opt/iobroker/node_modules/iobroker.kecontact, node: v6.12.2 kecontact.0 2018-02-12 13:56:38.998 debug statesDB connected kecontact.0 2018-02-12 13:56:38.881 debug objectDB connected kecontact.0 2018-02-12 13:56:35.027 info terminating !

      Gruß

      Chriss

      1 Reply Last reply Reply Quote 0
      • S
        Sneak-L8 last edited by

        Hallo zusammen,

        bin gerade dabei, die KeContact mir meiner PV-Anlage (SMA Sunny Home Manager) zu koppeln um überschüssigen Strom ins Auto zu bringen.

        Sieht als Skript schon ganz gut aus. Weil es dann zu eben Adapter erweitern uns hier zur Verfügung stellen.

        Das nur vorab als Info falls jemand auch Keba/SMA hat (wobei das grundsätzlich auch mit anderen Energy Metern klappen sollte).

        Viele Grüße

        Sneak-L8

        1 Reply Last reply Reply Quote 0
        • C
          chrissh last edited by

          So hab jetzt ein paar mal das neue Auto geladen aber ich bekomme noch keine Werte rein.

          Muss ich noch irgendwas konfigurieren ausser die IP-Adresse?

          In meinen ersten post habe ich ja noch meinen Log angegeben. Vielleich

          gibt der ja noch Aufschluss. 😐
          5713_bildschirmfoto_2018-02-18_um_16.42.04.png
          5713_bildschirmfoto_2018-02-18_um_16.40.54.png
          5713_bildschirmfoto_2018-02-18_um_16.40.33.png

          1 Reply Last reply Reply Quote 0
          • S
            Sneak-L8 last edited by

            Hast Du in der Wallbox die UDP-Funktion aktiviert? Das ist ein Dip-Schaller in der Box. Sonst liefert sie keine Werte…

            1 Reply Last reply Reply Quote 0
            • S
              Sneak-L8 last edited by

              Hallo zusammen,

              bevor ich mich daran mache, meine Ladesteuerung in den Keba-Adapter zu intergrieren, möchte ich das Skript zur Ladesteuerung schonmal zeigen. Ich hatte zuerst die States der Einspeisung/Netzbezug vom SunnyhomeManager abonniert und immer sofort auf eine Veränderung reagiert. Das war dann aber fast ein wenig schnell, da wird die Wallbox jede Sekunde mit einer anderen Leistung (mA-genau) geregelt. Daher hab ich eine Abstufung in 500mA-Schritten vorgenommen.

              Wenn die PV-Anlage aber gerade so die Leistung für die minimale Ladung bringt, dann wird die Wallbox bei einem Watt Hausverbrauch mehr oder weniger jedes mal aktiviert und deaktiviert. Das hat mein E-Golf dann doch nicht gerne und hat beim Start erstmal ne Elekronik-Warnung von sich gegeben (Zündung aus, Zündung an hat aber geholfen).

              Daher bin ich dazu übergegangen, die Regelung zeitgesteuert (jede Minute) anzupassen. Außerdem gibt es eine Wattzahl, die nach Ladebeginn unterschritten werden muss, um mit dem Laden wieder zu stoppen, um eine gewisse Träge zu gewährleisten. Zudem gibt es einen Timer der sagt, dass noch mind. fünf Minuten geladen wird, bevor wieder abgebrochen wird. Den Timer könnte man auch mit Start der Ladung setzen.

              Da es derzeit noch Probleme mit der Leistungsfähigkeit des Hausanschlusses gibt und ich nachts während der Nachtspeicherheizung nicht laden darf, habe ich noch einen zeitgesteuerten Ladestopp eingebaut.

              Die Variablen am Anfang (nDelta, nNetzbezug und nMinLfz) würden später als Parameter in die Adapterkonfiguration wandern.

              Hier das Skript:

              ! ````
              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 oLadeVerz = null; // Timerbeginn, wenn Lademinimum unterschritten wird
              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 */
              // 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) {
              if (doLog) {
              log(text, "info");
              }
              }
              ! function switchWallbox(enabled) {
              schreibeInfo("schalte wallbox: " + enabled);
              if (getState(cStateWallboxAnAus).val != enabled) {
              setState(cStateWallboxAnAus, enabled);
              schreibeInfo("Schalt-Kommando abgesetzt");
              if (! enabled) {
              oLadeVerz = null;
              }
              }
              }
              function regulateWallbox(milliAmpere) {
              schreibeInfo("regle wallbox: " + milliAmpere);
              if (getState(cStateWallboxLadung).val != milliAmpere) {
              setState(cStateWallboxLadung, milliAmpere);
              schreibeInfo("Regler-Kommando abgesetzt");
              }
              }
              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 checkAutoLadung() {
              var nCurr = 0; // in mA
              var oAutoState = getState(cStateLadeautomatik);
              // Wenn Wallbox lädt, dann die Anzahl der Phasen ermitteln
              var nAktPhasen = nAnzPhasen;
              if (getState(cStateAktLadung).val > 1000) {
              // 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 (oLadeVerz === null) {
              oLadeVerz = new Date();
              schreibeInfo("Auto beginnt zu laden");
              setState(cStateLadebeginn, oLadeVerz, 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");
              }
              }
              // 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);
              }
              if (getState(cStateLadestopp).val) {
              // 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) && oLadeVerz !== 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");
              oLadeVerz = null;
              nCurr = nMinCurr;
              } else {
              if (nMinLfz > 0) {
              oAktZeit = new Date();
              if ((oAktZeit.getTime() - oLadeVerz.getTime()) / 1000 < nMinLfz) {
              // Mindestladedauer unterschritten? Dann mit minimaler Stärke weiter laden
              nCurr = nMinCurr;
              schreibeInfo("Minimale Ladezeit noch nicht erreicht, Laden wird fortgesetzt");
              }
              }
              }
              }
              schreibeInfo("dynamische Anpassung mit " + nCurr + " mA");
              } else {
              nCurr = nMaxCurr; // 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 > nMaxCurr) {
              nCurr = nMaxCurr;
              }
              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;
              if (lAutoVerb) {
              schreibeInfo("Auto wurde mit Wallbox verbunden");
              oLadeVerz = null;
              setState(cStateLadebeginn, oLadeVerz, true);
              } else {
              schreibeInfo("Auto wurde von Wallbox getrennt");
              }
              checkAutoLadung();
              }
              if (lAutoVerb) {
              if (oSchedule === null) {
              oSchedule = schedule("
              /1 * * * *", checkAutoLadung);
              setState(cStateLadeverbindung, new Date(), true);
              schreibeInfo("Schedule für Ladeautomatik aktiviert");
              }
              } else {
              if(oSchedule) {
              clearSchedule(oSchedule);
              oSchedule = null;
              schreibeInfo("Schedule für Ladeautomatik beendet");
              }
              }

              }
              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 alles einmal ausführen
              checkSchedule();
              checkAutoLadung();

              
              Frage 1: kann ich in einem Adapter in der Konfiguration einen State auswählen lassen? Dann wäre die Steuerung eigentlich für alle EnergyMeter nutzbar und nicht nur für den von SMA (ja, momentan läuft das Skript nur mit meinem, da die Serien-Nr hartcodiert ist). Oder lasse ich einfach den Namen des Adapters ins Textfeld eintragen?
              
              Frage 2: ich würde gerne auf dem bestehen Adapter von UncleSam aufsetzen. Mache ich da einen Branch in git auf und lege ich meinen "eigenen" Bereich in git an? Aktuell ist da ja ein privater Bereich von UncleSam..
              
              Ich bin auf Eure Meinungen gespannt.
              
              Viele Grüße
              
              Sneak-L8
              
              P.S. KeBa hat kürzlich eine neue Firmware V3.9.10 für die KeContact P30 veröffentlicht
              
              Edit: Skript aktualisiert
              1 Reply Last reply Reply Quote 0
              • F
                fuchs1978 last edited by

                Wir haben uns nun auch ein E-Auto bestellt. Habt ihr Erfahrungen mit Ladestationen und Förderungen dazu?

                1 Reply Last reply Reply Quote 0
                • S
                  Sneak-L8 last edited by

                  Ich hab mir einige Ladestationen (im Netz, nicht live) angeschaut und bin bei der Keba KeContact P30 c-Serie hängen geblieben, weil sie alles hat was ich wollte (Zähler, Netzanbindung, FI), sehr flexibel (ein-/dreiphasig, 3,7, 11, 22 kW) und vom Preis-/Leistungsverhältnis gut ist.

                  Bisher funktioniert sie auch einwandfrei und lässt sich auch PV-abhängig regeln…

                  Förderung hab ich allerdings keine bekommen. Aber im Vergleich zur Mennekes kostet sie in etwa nur die Häfte, was sich auch wie eine Förderung anfühlt...

                  1 Reply Last reply Reply Quote 0
                  • E
                    ehome last edited by

                    @Sneak-L8

                    möchte bei mir das gleiche realisieren - mache es mir momentan einfach und lade das Auto bei Sonnenschein mit "Handregelung"

                    was natürlich nicht Zweck einer Hausautomatisation ist 😉

                    Würde das Skript zum Testen gerne mal bei mir laufen lassen (habe ein PV Anlage mit SolarEdge).

                    Sind die Werte

                    var cStateEinspeisung    = "sma-em.0.1901706890.psurplus"; /*Aktuelle Einspeisung, negative Werte sind */
                    var cStateNetzbezug      = "sma-em.0.1901706890.pregard";  /*Aktueller Netzbezug (Stromverbrauch)*/
                    
                    

                    In kWh oder Wh ??

                    was meinst du mit "Aktuelle Einspeisung, negative Werte sind"

                    Gruß

                    ehome

                    1 Reply Last reply Reply Quote 0
                    • S
                      Sneak-L8 last edited by

                      Hallo ehome,

                      > In kWh oder Wh ??

                      Weder noch 🙂 Sie sind in Watt. Es ist der aktuelle Wert der Einspeisung ins Netz bzw. Netzbezug den der EnergyMeter liefert.

                      Ich hab zwei getrennte Werte vom SMA-EM. Wenn Dein EnergyMeter (von einem anderen Hersteller) nur einen Wert hat (positiv: Netzbezug, negativ: Einspeisung - oder umgekehrt), dann musst Du nur bei einer Variablen einen State eintragen. Welchen, das kommt darauf an ob die Einspeisung oder der Netzbezug positiv ist.

                      Viele Grüße

                      Sneak-L8

                      P.S. Ich aktualisiere mal mein Skript oben kurz, hatte noch ein paar Kleinigkeiten korrigiert.

                      1 Reply Last reply Reply Quote 0
                      • E
                        ehome last edited by

                        :oops: also noch mal für Doofe ….

                        cStateEinspeisung -> hier nur Werte bei Überschuss also Einspeisung - also nur positive Werte

                        cStateNetzbezug -> hier nur Werte bei Netzbezug - also nur negative Werte

                        Find ich nicht selbsterklärend, wenn beide Werte gleich sind warum dann 2 Werte :? ?

                        1 Reply Last reply Reply Quote 0
                        • S
                          Sneak-L8 last edited by

                          Ne, so meine ich es nicht. 🙂

                          Es gibt folgende Fälle:

                          • Du hast nur einen State, in dem Einspeisung positiv und Netzbezug negativ angezeigt werden => Du füllst nur cStateEinspeisung aus

                          • Du hast nur einen State, in dem Netzbezug positiv und Einspeisung negativ angezeigt werden => Du füllst nur cStateNetzbezug aus

                          • Du hast zwei States, einer mit Netzbezug und einer mit Einspeisung (jeweils nur positive Werte) => Du füllte beide Variablen aus.

                          • Der vierte Fall (getrennte Zähler mit negativen Werten) dürfte wohl nicht vorkommen…

                          Ist es so verständlicher?

                          Viele Grüße

                          Sneak-L8

                          1 Reply Last reply Reply Quote 0
                          • E
                            ehome last edited by

                            yep - danke

                            1 Reply Last reply Reply Quote 0
                            • R
                              RandyAndy last edited by

                              Hi,

                              ich plane für meine Ferienwohnung eine Wallbox zu installieren. Auf der Suche nach einer Lösung bin ich im Forum auf diesen Post gestossen.

                              Da ich auf Dauer schon ein bischen was verlangen muss für das Laden (zumindest die Energiekosten) müsste ich zwischen Personen unterscheiden die gerade laden. Dazu würde ich jeder Person eine RFID-Karte geben, die Wallbox kann das ja prinzipiell. Danach möchte ich dann die Energie auswerten die die jeweilige Person verbraucht hat.

                              Was der Adapter kann ist die Energiemenge auszugeben. Aber kann er auch unterscheiden welcher User gerade lädt ?

                              Kann der Adapter evt. auch schon eine Gesamtverbrauchsenergie pro user erstellen, das wäre natürlich das non plus ultra.

                              Andreas

                              1 Reply Last reply Reply Quote 0
                              • S
                                Sneak-L8 last edited by

                                Hallo Andreas,

                                dass kann der Adapter leider nicht. Aber ich glaube das gibt die Box auch nicht her. Du kannst sie zwar mit der RFID-Karte freischalten, aber Du kannst nirgends eine Karten-Nr. auslesen.

                                Höchstens in der Logdatei die der Adapter anlegt. Dann müsstest Du diese auslesen.

                                Dann müsstest Du noch die Werte in einer Datenbank verwalten, wo sie je Karte (und Datum) abgelegt werden.

                                Das dürfte noch etwas Arbeit sein.

                                Viele Grüße

                                Sneak-L8

                                P.S. Aber toll, dass Du so einen Service für Deine Ferienwohnungen anbieten willst. Ich würde mich als Mieter sehr drüber freuen.

                                1 Reply Last reply Reply Quote 0
                                • S
                                  Sneak-L8 last edited by

                                  Hallo zusammen,

                                  so, nachdem mein Skript nun ganz stabil läuft, würde ich gerne den bestehenden Adapter von UncleSam erweitern. Hab auch schonmal damit begonnen die Admin-Seite mit den neuen Einstellmöglichkeiten zu erweitern. Meines Erachten muss ich jetzt "nur" noch die kecontact.js um meine zusätzliche Skriptfunktionalität erweitern.

                                  Hab jetzt gesehen, dass die Sachen wohl auch nicht nur bei git, sondern auch npm, … gehostet und verwaltet werden und da z.B. die Versionsnummern stehen.

                                  Mag mich da jemand bei unterstüzen? Oder besteht überhaupt Bedarf, das als Adapter zur Verfügung zustellen? Das Skript reicht mir ja erstmal, auch wenn ein eigener Adapter besser aussieht. Aber wenn's keiner braucht ...

                                  Viele Grüße

                                  Sneak-L8

                                  1 Reply Last reply Reply Quote 0
                                  • R
                                    RandyAndy last edited by

                                    Hi,

                                    Danke für die Antwort. Dann verstehe ich aber die Objekte nicht. Da gibt es einen Current User (siehe Screenshot, eines früheren Posts) 2213_2018-06-12_09_30_06-bildschirmfoto_2018-02-18_um_16.42.04.png__png-grafik__1897___1043_pixel__-_skal.png .

                                    Irgendwas muss der Wert doch aussagen ?

                                    Andreas

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      Sneak-L8 last edited by

                                      Ja, das klingt danach.

                                      Aber mit current user ist die benutzter-definierte Leistung in mA gemeint.

                                      Mit dem Wert wird festgelegt, mit welcher Leistung die Wallbox das Auto laden darf…

                                      Aber ich hab in der Beschreibung der Keba entdeckt, dass man beim „report 100“ die RFID Token ID erhält, mit der der Ladevorgang gestartet wurde.

                                      Da er auch eine Session ID hat, kannst Du auch periodisch den Report abfragen und somit den vollständigen Ladevorgang erfassen.

                                      Viele Grüße

                                      Sneak-L8

                                      1 Reply Last reply Reply Quote 0
                                      • G
                                        gto last edited by

                                        Hi

                                        Danke Sneak für das tolle Script.

                                        Ich habe eine Fronius Wechselrichter mit Batterie und die Keba P30c.

                                        Vom Froniusadapter erhalte ich die PV-Produktion als positiven Wert, die Nutzung P_Load ist aber negativ. Ich hab in deinem Script die Berechnung des Ladestrom korrigiert (Vorzeichenwechsel).

                                        Muss ich sonst noch etwas umstellen oder kann ich den neg. Wert im Adapter schon korrigieren, sodass die Grafik stimmt?

                                        Ich würde auch gerne die Automatik Ein/Aus Schaltung automatisieren. Dabei denke ich an das Abschalten der Automatik wenn die produzierte Energie (PV) eine Zeit x unter einem Wert y liegt, als ein Wolkentag oder auch durch Abfrage von Wetterdaten.

                                        Kannst du mir hierbei helfen, kenne mich mit java leider nicht wirklich gut aus.

                                        Danke

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          Sneak-L8 last edited by

                                          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();

                                          1 Reply Last reply Reply Quote 0
                                          • G
                                            gto last edited by

                                            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??

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            483
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            68
                                            1252
                                            334106
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo