Hallo zusammen,
leider habe ich im Board "Ankündigungen" keine Schreibrechte, daher erstelle ich ersteinmal hier einen neuen Thread.
Ich habe ein Modul erstellt, um die KEBA KeContact P20 Wallbox mit Ethernet-Option auslesen/steuern zu können.
Diese Wallbox dient dazu E-Autos aufzuladen.
Die Box sendet bei Statusänderungen UDP Broadcasts und kann auch über UDP gesteuert werden.
Desweiteren können mit dem Modul fast alle der zur Verfügung stehenden Parameter der Box ausgelesen werden.
Denkbar sind mit diesem Modul z.B. strompreisabhängige Ladevorgänge
oder (sobald Befehl 'curr' implementiert ist) die Steuerung des Ladestroms in Abhängigkeit von der aktuellen Leistung der Photovoltaik-Anlage um den Netzbezug zu minimieren.
Das Modul benötigt die Perl JSON Implementierung. Bitte prüft ob ihr die installiert habt.
Die Definition des Moduls erfolgt z.B. mit:
define wallbox KEBA 192.168.2.43 7090 60
mit 7090 = Port für Verbindung und 60 = Refresh-Intervall in Sekunden
Aktueller Status der Implementierung (27.02.2020):
Die Grundlegende Funktionen sind bereits implementiert
- Empfangen der Broadcasts der Wallbox
- Auslesen der Wallbox mit den GET Befehlen (jeweils ohne weitere Parameter)
info
update
- Steuern der Wallbox mit den SET Befehlen
enableState 1 - Laden ist enabled
enableState 0 - Laden ist disabled
current <value> - Setzen der Stromstaerke in mA (16000 = 16A)
Offene ToDos - wird erledigt wenn ich mal wieder Zeit & Lust habe :-) :
Noch nicht implementierte Befehle: z.B. failsafe
Klartextübersetzung der Statusmeldungen gemäß UDP Programmers Guide von Keba
Hilfetext im Modul vervollständigen ;-)
Details zur Schnittstelle können der angehängten Schnittstellenbeschreibung von Keba entnommen werden.
Vielleicht gibt es ja noch jemanden, der etwas mit dem Modul anfangen kann.
Die jeweils aktuelle Version des Moduls habe ich hier abgelegt:
https://github.com/mschlappa/fhem
VG
Marcus
Hallo, vielen Dank für dieses Modul!! Leider bekomme ich es nicht so recht zum laufen. Habe JSON installiert und die pm-Datei auf den Raspi kopiert. Beim Start kann dann aber das Modul nicht initallisiert werden. Diese Fehlermeldung kommt dann:
2016.07.10 10:13:18 1: reload: Error:Modul 70_KEBA deactivated:
Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 27, <$fh> line 586.
2016.07.10 10:13:18 0: Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 27, <$fh> line 586.
Kann hier jemand helfen?
vg
Stefan
Hallo zusammen,
auch von mir zuerst mal herzlichen Dank für das Moldul! Aber ich habe leider das
gleiche Problem! JSON-Perl ist die aktuellste Version. Bist Du mit dem Problem
schon weiter gekommen?
2016.09.29 08:51:49 4: WEBtablet_192.X.X.X_60404 POST /fhem&fw_id=451&cmd=define+wallbox+KEBA+192.X.X.X+7090; BUFLEN:0
2016.09.29 08:51:49 1: reload: Error:Modul 70_KEBA deactivated:
Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 26.
2016.09.29 08:51:49 0: Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 26.
2016.09.29 08:51:49 4: name: /fhem&fw_id=451&cmd=define+wallbox+KEBA+192.X.X.X+7090 / RL:1633 / text/html; charset=UTF-8 / Content-Encoding: gzip
Viele Grüße,
Heiko
Zitat von: schussi am 10 Juli 2016, 10:23:46
Diese Fehlermeldung kommt dann:
2016.07.10 10:13:18 1: reload: Error:Modul 70_KEBA deactivated:
Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 27, <$fh> line 586.
2016.07.10 10:13:18 0: Unrecognized character \xC2; marked by <-- HERE after appa/fhem <-- HERE near column 56 at ./FHEM/70_KEBA.pm line 27, <$fh> line 586.
Hallo,
hast Du das File mal angeschaut?
Kann es sein, dass es nicht sauber runtergeladen wurde?
In Zeile 27 sollen Zeichen a la "appa/fhem" zu finden sein. Das sieht nach dem Ende der URL vom runterladen aus.
Hast Du mal ein wget https://raw.githubusercontent.com/mschlappa/fhem/master/70_KEBA.pm
versucht?
VG Marcus
Hallo, genau das war das Problem. Nachdem ich die Datei richtig heruntergeladen habe hat es einwandfrei funktioniert. Danke für deine Hilfe!! Ich hatte schon damit begonnen mir eine eigene Software zur Steuerung und Visualisierung der Ladeleistung zu schreiben, aber die Integration in dem FHEM Server finde ich deutlich eleganter. Ist es ev. möglich den Verlauf der Ladeleistung in einem Graphen der letzten 24h darzustellen? Damit könnte man den Ladevorgang noch schöner überwachen.
Gruß
Stefan
Hallo zusammen,
wollte den Adapter auch mal für meine KeContact P30 installieren. Aber unter FHEM 5.8 erhalte ich folgenden Fehler:
Experimental keys on scalar is now forbidden at ./FHEM/70_KEBA.pm line 216.
Type of arg 1 to keys must be hash or array (not private variable) at ./FHEM/70_KEBA.pm line 216, near "$decoded)"
Ist das Module mit der aktuellen FHEM-Version nicht mehr kompatibel? Oder habe ich da was falsch gemacht?
Viele Grüße
Sneak-L8
So, ich glaub ich konnte es selbst fixen.
In Zeile 216 fehlt vor dem $decoded ein %-Zeichen, also
foreach my $key (keys %$decoded){
anstelle von
foreach my $key (keys $decoded){
Hätte auch das GIT-Repository aktualisiert, hab aber leider keinen Zugriff.
@marcus42 könnte ich (User Sneak-L8, auch bei git) Zugriff bekommen?
Viele Grüße
Sneak-L8
Hallo Sneak-L8,
ich war längere Zeit nicht mehr online, daher habe ich Deinen Beitrag irgendwie nicht mitbekommen.
Sorry dafür.
Danke für den Tipp mit dem Fehler!
Möchtest Du noch Zugriff haben? Du bist aber schon auf ioBroker umgestiegen oder?
VG
Marcus
Hallo Marcus,
kein Problem. Ja, ich hab mich jetzt für ioBroker entschieden, weil ich Dir Pearl-Erweiterungen nicht installieren konnte, die für manche Adapter benötigt wurden.
Und zwischenzeitlich klappt das Laden in Abhängigkeit vom PV-Überschuss super damit.
Aber vielleicht kannst Du das Zeichen selbst im git ändern, damit andere nicht auch in die Falle tappen.
Viele Grüße
Sneak-L8
schon passiert: https://github.com/mschlappa/fhem/commit/0978b7ba541643d405b8cba251d19b03510b56aa
Ich schau mir mal das ioBroker Modul an. Vielleicht kann ich mir da ja was abgucken ;)
Ab September haben wir auch endlich eine PV Anlage und ich benötige ebenfalls die PV Überschuss-Steuerung.
VG
Marcus
Super, danke
Hallo zusammen,
seit dem heutigen (manuellen) Update der 70_KEBA.pm kommt immer die Fehlermeldung "Cannot load module KEBA". Habe jetzt lange mit einer älteren Version gearbeitet, jetzt läuft die Verbindung zur Box aber nicht mehr. Kann es vielleicht daran liegen, dass ich 2 Kebas im Netz habe?
Da würde ich auch nicht laufen wollen als Modu
Zitat
+ foreach my $key (keys %$decoded){
Und wenn dann bitte
foreach my $key (keys %{$decoded}){
Zitat von: CoolTux am 19 Juli 2018, 13:32:33
Und wenn dann bitte
foreach my $key (keys %{$decoded}){
Super, so klappt es zumindest wieder mit einer Box. Bei der Definition der 2. Box hängt fhem sich dann allerdings wieder auf.
logausgabe?
wallbox will read from KEBA at 192.XXX.XXX.95:7090
listening for wallbox on 7090 (das ist die funktionierende Box)
wallbax_x will read from KEBA at 192.XXX.XXX.45:7090
socket could not be created (geht dementsprechend nicht)
Damit kann man nix anfangen. Mach mal bitte ein list vom den 2 Device und bei dem wo es nicht geht ein verbose 5 Log.
Sag mal wird dein Modul auch mit der neuen Generation KEBA KeContact P30 gehen?
Hat das schon jemand am laufen?
Vielen Dank Gruß Timo
@TimoD
Ich glaube, das Modul läuft auch mit der P30. Ich habe es hier mit einer BMW Wallbox Plus laufen, welche recht baugleich zur P30 ist.
Keba P30 x läuft!
Hallo zusammen,
ich habe in den letzten Tagen das KEBA-Modul ein ganzes Stück erweitert und fast alle bei Keba verfügbaren Kommandos hinzugefügt, z.B. setenergy und currtime und auch falls nötig die Authentifizierung mit RFID-Karten.
Es ist sicher noch nicht ganz fehlerfrei, läuft bei mir aber ohne Probleme. Es ist allerdings auch nicht mehr 100% kompatibel zu Marcus' Modul, weil ich mich dazu entschieden habe, die Modul-Kommandos 1:1 zu der offiziellen Keba-Dokumentation umzusetzen.
Zusätzlich habe ich in einem at-Timer ein Script erstellt, welches den PV-Überschussstrom unabhängig vom Wechselrichter für das E-Auto über entsprechende Keba-Kommandos nutzt.
Was wäre denn nun der richtige Weg, das Keba-Modul offiziell zu machen?
Hat jemand Interesse, hier zu unterstützen?
Gruß,
Sido
@sido: hi mich würde deine Implementierung interessieren
@sido, bekomme auch ein p30 in den nächsten Tagen. würde dann auch gerne Dein überarbeitetes Modul nutzen. Wie ist denn der Status? Danke, zwehn
Zitat von: zwehn am 15 Mai 2019, 07:53:05
@sido, bekomme auch ein p30 in den nächsten Tagen. würde dann auch gerne Dein überarbeitetes Modul nutzen. Wie ist denn der Status? Danke, zwehn
Ich kann dir zuerst den App UDPCommander empfehlen. Der P30 kann DHCP und bekommt eine IP-Adresse von deinem Router. Im UDPCommander App muss du nur die Adresse und Port angeben (Siehe KEBA Dokumentation).
Die Befehle currtime 32000 5 startet mit 32 A in 5 Sec das Laden oder currtime 0 0 oder Rena 0 stop den Ladevorgang. Mit report 2 oder report 3 kannst du die wichgtisten Zahlen auslesen.
Ich umschreibe sido-s Modul für mich auch, wenn mal die Sonne etwas mehr scheint. Ist der Grundmodul von KEBA in fhem installiert, ist die Erweiterung nicht mehr so schwierig
Wäre nett, wenn ihr Eure Änderungen am Modul auch als Pullrequest in github hinterlegt.
https://github.com/mschlappa/fhem/blob/master/70_KEBA.pm
Weiterentwicklung schadet ja nicht ;-)
Marcus
Hallo,
erst mal vielen dank an Marcus42 für die Entwicklung des Moduls für die KEBA!!!
@sido
Auch dir vielen Dank für deine Arbeit.
Dazu hätte ich aber noch ein paar Fragen:
wie komme ich an dein Modul? Hast Du es irgendwo hoch geladen? Sind die Erweiterungen eventuell schon in das Modul von Marcus eingeflossen?
Fragen über Fragen ;)
LG
hasenhirn
Hallo,
ich schon wieder ;D
Das Keba Modul aus dem Git habe ich installiert und meine KEBA P30 wurde wohl auch erkannt ( Firmwareversion wird richtig angezeigt )
Wenn ich jetzt einen Befehl eingebe z.B. "get KEBA info report 3" bekomme ich als Antwort "get KEBA" has no parameter. :o
Kann mir jemand sagen was ich da falsch mache?
Im Log kommt die Meldung :
2019.06.08 17:12:24.831 4: WEB_192.168.1.33_35834 POST /fhem?detail=KEBA&dev.getKEBA=KEBA&cmd.getKEBA=get&arg.getKEBA=info&val.getKEBA=report%203&XHR=1&addLinks=1&fwcsrf=csrf_206522790748670&fw_id=1107; BUFLEN:0
2019.06.08 17:12:24.833 5: Cmd: >get KEBA info report 3<
2019.06.08 17:12:24.835 4: WEB: /fhem?detail=KEBA&dev.getKEBA=KEBA&cmd.getKEBA=get&arg.getKEBA=info&val.getKEBA=report%203&XHR=1&addLinks=1&fwcsrf=csrf_206522790748670&fw_id=1107 / RL:77 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate
Leider kann ich damit nichts anfangen :-\
LG
hasenhirn
Hallo Sido,
Hatte bisher die elvi box mit 22 kw.
Diese kann leider kein Lastmanagement und daher liegt jetzt die keba p30 x series mit rfid in der garage und soll naechste woche angeschlossen werden.
Grund fuer den austausch war auch die angestrebte loesung mit PV-Überschussstrom zu laden und nicht aus dem netz zuviel zu beziehen.
Wuerde daher gerne deine version testen. Kannst du diese zur verfueging stellen ? Danke zwehn
Zitat von: hasenhirn am 08 Juni 2019, 17:29:49
Hallo,
ich schon wieder ;D
Das Keba Modul aus dem Git habe ich installiert und meine KEBA P30 wurde wohl auch erkannt ( Firmwareversion wird richtig angezeigt )
Wenn ich jetzt einen Befehl eingebe z.B. "get KEBA info report 3" bekomme ich als Antwort "get KEBA" has no parameter. :o
Kann mir jemand sagen was ich da falsch mache?
Im Log kommt die Meldung :
2019.06.08 17:12:24.831 4: WEB_192.168.1.33_35834 POST /fhem?detail=KEBA&dev.getKEBA=KEBA&cmd.getKEBA=get&arg.getKEBA=info&val.getKEBA=report%203&XHR=1&addLinks=1&fwcsrf=csrf_206522790748670&fw_id=1107; BUFLEN:0
2019.06.08 17:12:24.833 5: Cmd: >get KEBA info report 3<
2019.06.08 17:12:24.835 4: WEB: /fhem?detail=KEBA&dev.getKEBA=KEBA&cmd.getKEBA=get&arg.getKEBA=info&val.getKEBA=report%203&XHR=1&addLinks=1&fwcsrf=csrf_206522790748670&fw_id=1107 / RL:77 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/ Cache-Control: no-cache, no-store, must-revalidate
Leider kann ich damit nichts anfangen :-\
LG
hasenhirn
.
Hallo Hasenhirn,
bei mir hat die keba P30 x series installation etwas gedauert, jetzt ist es soweit, sie läuft.
Das Keba modul habe ich auch installiert. Bei current befehl auf 6000 kommt auch etwas inkl der softwareversion der keba box. aber die info abfragen enden wie bei Dir:"get keba has no parameter"
Bist Du schon weiter gekommen?
danke und Gruss,
zwehn
Hallo Zwen,
leider noch nicht :(
Im Moment habe ich auch keine Elektroauto mehr, erst ab 19.08. wieder und dann werde ich da noch mal weiter machen.
Bin aber immer noch für jeden Tipp dankbar ;)
Gruß
hasenhirn
Hallo,
habe jetzt seit einige Wochen das Modul im Einsatz mit der x-series.
Läuft jetzt auch soweit, auch die Events kommen an.
Leider habe ich beim Laden mit dem Smart EQ fourfour schon zweimal ein Problem gehabt und musste in die Werkstatt, um die Fehlermeldung zurücksetzten zu lassen. Ob es sich dabei um Probleme auf der Smart-Seite oder aber auf der Wallboxseite handelt, wissen wir noch nicht, da die Werkstatt intelligenterweise, die logs nicht gezogen hat, beim Zurücksetzen der Fehlermeldung.
Was mir bei der Modulumsetzung aufgefallen ist, ist dass "curr" zum sofortigen Setzen der Amperzahl verwendet wird.
Im Keba P30 UDP programmer guide wird auf Seite 33 oben gesagt, dass "curr" nicht recommended ist und man lieber currtime verwenden soll, der neben der Amperzahl auch die Sekunden bis zum Umstellen beinhaltet. zudem setzt curr dauerhaft. currtime stellt nur die Amperzahl fuer die jetzige Session.
@marcus, könntest Du den currtime Befehl mit integrieren unter die set commands?
Zudem noch eine Bitte. Kann jemand sein lastorientiertes Laden script mit uns/mir teilen?
Vielen Dank,
zwehn
Hallo zwehn,
ich habe jetzt endlich meinen Wagen und konnte auch schon einen Erfolg verbuchen.
Nachdem ich die Anleitung der Keba zur UDP-Schnittstelle gelesen habe, ist mir klar geworden dass das Freischalten
mit "start" zwei Parameter benötigt.
Ich habe die Wallbox per RFID verriegelt und mit "set KEBA start 8dc5cede00000000 00000000000000000000"
übergebe die Werte einer angelernten RFID-Karte und die Wallbox wird freigeschaltet.
Jetzt muss ich daraus nur noch einen Button machen damit es vom Handy freischalten kann ;D
Gruß
hasenhirn
Hallo Hasenhirn,
Klingt sehr gut. Sollte man dann nur noch im Modul ergänzen.
Ich habe übrigens gestern per private mail auch das um weitere commands ergänzte Modul bekommen.
Ich vermute das es das einige Beiträge vorher erwähnte Modul von Sido ist.
Ich wuerde es gerne hier mit Euch teilen und habe um seine Freigabe gebeten, aber noch kein Feedback.
@sido ist das Teilen deines angepassten Moduls ok?
Danke,
Zwehn
Moin zwehn,
das ist ja schon im Modul eingebaut.
Ich wusste nur leider nicht wie ich es anwenden muss. ::)
In der Hilfe hatte ich nichts gefunden.
Gruß
Hasenhirn
Hi zusammen
Ab wann wird ein Modul wie dieses eigentlich in den FHEM Standard aufgenommen?
Es scheint doch ganz tauglich wie nützlich zu sein und sonstige Module gibt es viele.
Ich war ganz erstaunt, dass es nach vier Jahren noch manuell geladen und installiert werden muss. 😉
Gruß
Matthias
Hallo Matthias,
so weit ich das weiß muss sich der Modulersteller darum bemühen und auch Support für das Modul leisten.
Das Modul muss auch gewisse Standards wie Dokumentation usw. erfüllen.
Wie gesagt, alles mein Wissensstand.
Der Entwickler wird daran wohl kein Interesse haben.
Ist aber toll dass jemand der etwas für sich entwickelt, dies mit uns teilt :)
Wenn sich jemand findet der den Support und die Weiterentwicklung leisten will, kann man ja mit dem Entwickler sprechen und wenn es für ihn ok ist das Modul übernehmen.
Gruß
Hasenhirn
Hallo Jungs,
ich komme im Moment nicht weiter und vielleicht kann mir jemand von euch auf die Sprünge helfen oder hat das eventuell schon eingerichtet ::)
Meine Box ist ja mit dem RFID-Leser ausgestattet und über diesen gesichert.
Wenn ich jetzt eine angelernte Karte davor halte wird die Wallbox für ca 1min freigeschaltet und ich kann Laden.
Jetzt wollte ich das ganze noch per Button über FHEM machen aber stelle mich zu doof an >:(
Gebe ich einfach in der Befehlsleiste =>> set KEBA start 8dc5cede00000000 00000000000000000000 <<= ein wird die Wallbox freigeschaltet und das Reading Authreq wechselt von 1 -> verriegelt auf 0 -> freigeschaltet.
Folgende Attribute habe ich eingerichtet:
Attributes
devStateIcon 1:ios_off_fill@red:Wb_freischalten 0:ios_on_fill deleteattr
icon measure_battery_75 deleteattr
room Wallbox deleteattr
stateFormat Authreq deleteattr
dazu habe ich einen cmdalias angelegt mit " Wb_freischalten AS set Wallbox start 8dc5cdde00000000 00000000000000000000"
was auch nicht funktioniert hat. ich hatte auch schon probiert direkt im devStateIcon 1:ios_off_fill@red:start\s8dc5cede00000000\s00000000000000000000
oder 1:ios_off_fill@red:start.8dc5cede00000000.00000000000000000000 was aber alles nicht funktioniert.
Zum freischalten muss ich aber start die Parameter 8dc5cede00000000 und 00000000000000000000 übergeben.
An dem Problem habe ich jetzt schon Stunden verbraten und komme einfach nicht weiter :-[
Ich bin für jeden Tipp dankbar.
Gruß
hasenhirn
nach dem ich mich lange dämlich genug angestellt habe, bin ich dann doch noch dahinter gekommen ;D
Attributes
devStateIcon 1:ios_off_fill@red:freischalten 0:ios_on_fill deleteattr
eventMap /start 8dc5cede00000000 00000000000000000000:freischalten/ deleteattr
so hat es dann doch funktioniert.
Gruß
hasenhirn
Hallo Zwehn,
gibt es da schon was neues?
Hast Du eine Antwort von sido bekommen?
Gruß
hasenhirn
Zitat von: zwehn am 15 Oktober 2019, 23:49:32
Hallo Hasenhirn,
Klingt sehr gut. Sollte man dann nur noch im Modul ergänzen.
Ich habe übrigens gestern per private mail auch das um weitere commands ergänzte Modul bekommen.
Ich vermute das es das einige Beiträge vorher erwähnte Modul von Sido ist.
Ich wuerde es gerne hier mit Euch teilen und habe um seine Freigabe gebeten, aber noch kein Feedback.
@sido ist das Teilen deines angepassten Moduls ok?
Danke,
Zwehn
Da habe ich gerade etwas für dich / uns gefunden bzgl. Ladescript.
Im Jan / Feb bekommen wird unsere Solaranlage montiert und dann brauchen wir auch so was ::)
https://core.ac.uk/download/pdf/158611605.pdf (https://core.ac.uk/download/pdf/158611605.pdf)
Gruß
Hasenhirn
Zitat von: zwehn am 13 Oktober 2019, 20:32:39
Hallo,
habe jetzt seit einige Wochen das Modul im Einsatz mit der x-series.
Läuft jetzt auch soweit, auch die Events kommen an.
Leider habe ich beim Laden mit dem Smart EQ fourfour schon zweimal ein Problem gehabt und musste in die Werkstatt, um die Fehlermeldung zurücksetzten zu lassen. Ob es sich dabei um Probleme auf der Smart-Seite oder aber auf der Wallboxseite handelt, wissen wir noch nicht, da die Werkstatt intelligenterweise, die logs nicht gezogen hat, beim Zurücksetzen der Fehlermeldung.
Was mir bei der Modulumsetzung aufgefallen ist, ist dass "curr" zum sofortigen Setzen der Amperzahl verwendet wird.
Im Keba P30 UDP programmer guide wird auf Seite 33 oben gesagt, dass "curr" nicht recommended ist und man lieber currtime verwenden soll, der neben der Amperzahl auch die Sekunden bis zum Umstellen beinhaltet. zudem setzt curr dauerhaft. currtime stellt nur die Amperzahl fuer die jetzige Session.
@marcus, könntest Du den currtime Befehl mit integrieren unter die set commands?
Zudem noch eine Bitte. Kann jemand sein lastorientiertes Laden script mit uns/mir teilen?
Vielen Dank,
zwehn
Hallo zusammen
Hallo @sido
Wie sähe denn Dein Unterstützungswunsch aus? Etwas testen, berichten und weitertratschen kann ich. 😃
Naja, noch nicht ganz. Die Keba P30 ist in Betrieb und im Netz, aber noch auf 11kW limitiert und außerdem noch im Leerlauf, da erstens der Netzbetreiber nach 6 Wochen immer noch nichts zu meiner Zustimmungsanfrage ,,22kW-Betriebserlaubnis bitte" gesagt oder geschrieben hat und zweitens, die eigentlich Anfang Oktober gekaufte Zoe beim Händler festgehalten wird - die französischen Programmierer bei Renault scheinen etwas langsamer und schlechter zu sein, als die richtigen Cracks hier in dieser Community. 😏😃
Softwarefehler über Softwarefehler, oder sollte ich schreiben, Fehler in der Firmware von Modul A wurden gepatcht, dafür versagte dann B und C, nach deren Patches folgten noch mehr?!?
So ähnlich hat es mir Renault D berichtet.
Jedenfalls wollte ich mich mal mit dem Keba-Modul vertraut machen.
Wo gibt es die aktuellste Version zum Download?
Danke im Voraus und danke generell, für die Modulentwicklung.
P.S.: Ist es das bei Github (Link eine Seite vorher)?
Wenn ja, was ist denn das für ein Zeichen am Ende?
=cut
(daraus wird im joe-editor dann) =cuto??
Anscheinend scheint dieser letzte Parameter mit merkwürdigen Zeichen nichts zu machen.
Ansonsten ist es auf Seite 2 / Github noch die originale Version ohne Sido´s Erweiterungen und mit den Fehlern (""get KEBA" has no parameter").
Sido, könnte ich auch mal die überarbeitete Version bekommen? ;)
Zitat von: Matthias76
Ansonsten ist es auf Seite 2 / Github noch die originale Version ohne Sido´s Erweiterungen und mit den Fehlern (""get KEBA" has no parameter").
/quote]
Hallo @Matthias76, was liefert ein
,,get <DeinKebaDeviceName> info"
,,get <DeinKebaDeviceName> update"
wenn Du keine Parameter angibst?
Marcus
get KebaWallboxC info
get KebaWallboxC update
Beides per Knopfdruck führt tatsächlich zu einer aktualisierten Info / Liste.
Als Befehl eingegeben, folgt noch ein leeres Fenster mit OK Knopf zum Bestätigen.
Also die beiden Abfragen sehen gut aus.
set KebaWallboxC curr 15000 scheint sie auch zu schlucken,
obwohl ich nun nicht weiß, wie ich dieses Softsetting wieder weg bekomme und wir ja wissen, dass wir lieber currtime verwenden sollen. 😉
Das Softsetting ist immer gesetzt. Der Wert kann auf bis zu 63000 gesetzt werden. In dem Fall übersteuert dann das Hardwaresetting das gesetzt wurde zB mit 32000.
currtime gibt es bei meiner P20 noch nicht.
In der Doku von Keba steht zu dem neuen Befehl folgendes:
,, The commands "currtime", "setenergy", "start" and "stop" are designed specifically for the use with apps when there is no permanent network connection."
Und:
,,With the command "currtime" it is possible to set a time delayed "curr" and / or "ena" command. This command will be disabled automatically after unplugging your vehicle. You can additionally define the immediate start value using the known commands "ena" and "curr".
This means you can start immediately with 16 amps by sending "curr 16000" and reduce the current to 10A in 2 hours by sending "currtime 10000 7200".
It is also possible to send "ena 0" followed by "currtime 32000 7200" to start charging with 32 amps in 2 hours."
currtime macht also m.E. nichts anderes als ein fhem ,,at" Kommando kombiniert mit dem Keba Befehl.
Ich verstehe noch nicht so ganz den Sinn von currtime in unserem Usecase. Es sei denn fhem ist mobil unterwegs ;-)
VG Marcus
Ich habe die Modul Syntax, die im allerersten Post beschrieben ist, auf den aktuellen Stand gebracht. Da war noch die Syntax aus der allerersten Version drin. Die Doku aus dem Modul korrigiere ich auch noch. Das führte wohl ( verständlicherweise ) zu Irritationen.
War mir bisher nicht aufgefallen.
Marcus
Vielen Dank Marcus, für Dein Refresh und Deine Info.
Zu den weiteren Befehlen und möglichen Notwendigkeiten:
Es gab mal eine Zeit, da musste man programmiertechnisch zwei for-next-Schleifen mit Funktionen cos() und sin() kombinieren, um einen Kreis zu zeichen,
dann aber irgendwann später reichte auch mal ein circle(x,y,z).
;) ;D
Naja, Du hast recht, es ist in FHEM überhaupt nicht notwendig und es gibt bereits genügend andere Mechanismen.
Es wäre vielleicht nur eine winzig kleine Abkürzung im Handling, falls überhaupt benötigt.
Jedenfalls danke für das Modul. Dieses wird bestimmt in Zukunft in der Bedeutung und Nachfrage steigen. ;-)
Weiß jemand, wie KEBA die Strom-Einstellungen behandelt?
Mir schrieb mal jemand aus einem Elektroautoforum, dass man die Autos nicht beliebig laden kann.
Wenn man dreiphasig (3* 230V * xA ) lädt, dann ist die kleinst-mögliche Stromeinstellung 6A.
Übliche andere sind dann 16A, 20A, 25A und 32A.
6A - das ergäben dann 4.14kW.
Wenn man mit weniger als 4kW laden wollte, müsste laut Beschreibung die Box auf 1-Phasen-Betrieb umschalten, weil die Autos nicht weniger als 6A bei 3 Phasen kennen.
Aber was müsste man z.B. für 2kW angeben? Bei einer Phase wären das ja mehr als 6A.
Und wie ist es überhaupt mit Zwischengrößen, falls jemand einer PV-Anlage genau folgen möchte.
Kann ich curr 4580 setzen und das läuft dann auch so, in der Box, im Auto?
"curr" setzt ja den Strom und keine Leistung, korrekt?
Ja, minimal ist 6A. Abhängig von der Anzahl der Phasen ergibt sich dann die minimale Leistung. Von 6A bis 32A kann man Wert beliebige Werte angeben. Das kaputt prima, um z.B. meinen E-Golf mit PV-Überschuss zu laden.
Hab mich damals für ioBroker anstelle FHEM entschieden, das sollte aber keinen Unterschied machen
Bei 6A mit einer Phase (230V) kommst Du auf 1380W (6A x 230V). Bei dieser niedrigen Leistung fängt meine Zoe aber nicht an zu laden.
Ich starte daher eher bei 7A - 10A für meine PV Überschussladung. Die Regelung mit 'curr' ist quasi stufenlos nutzbar.
Für die Umschaltung von 1 auf 3 Phasen habe ich bei mir ein Relais vorgeschaltet,
welche ggf. die Phasen 2 und 3 VOR(!!) dem Einstöpseln des Autos zu oder abschaltet.
Ich wundere mich, wozu man OutputX2 setzen sollte. X2 ist eigentlich kein Setting, sondern ein Monitoring.
Was man (wenigstens @P30) setzen kann, ist X1.
X1 kann je nach DIP-Schalterposition zwischen AND und OR zur RFID-Auth umgeschaltet werden. Im OR -Modus ist das Gerät ,,erlaubt" bzw. bereit zu laden, wenn X1 geschlossen ist ODER eine RFID Authorisierung erfolgreich war. Damit könnte ich was anfangen.
Und wozu ist enableState?
Es scheint standardmäßig auf 1 zu sein, denn vor dem ersten setzen war die Box auf blau, gesperrt,
und bei gültigen rfid/nfc-Tag dann grün, ladebereit.
Ist ena=0 bleibt sie gesperrt, hilft also auch ein Tag nicht.
ENA=1, dann ist's wieder wie vorher mit Tag möglich (nur mit Tag für die paar Sekunden).
Wie ist das gedacht?
Hallo Matthias,
vielleicht sind die Funktionen unserer Wallboxen hier unterschiedlich.
Ich habe im ersten Beitrag dieses Thread die Doku von Keba angehängt. Daraus stammt der folgende Text:
UDP command 'output'
[n] is output state of the relay terminal X2 under the connector panel cover of the wallbox (binary value).
0 = open 1 = closed
>=10 = Pulse output with the specified number of pulses (pulses / kWh) and is stored in the EEPROM; reasonably usable up to 150.
Wie das bei der P30 in Verbindung mit dem NFC-Tag funktioniert, weiss ich nicht.
>>Und wozu ist enableState?
enableState ist ein Alias für das command 'ena'. ena ist der Befehl von Keba, ich fand enableState sprechender.
Bei meiner P20 wird mit "ena 0" bzw. "enableState 0" die Wallbox gesperrt und damit die Laden dauerhaft unterbrochen.
Erst wenn ich wieder den Befehl "ena 1" bzw. genauer "set enableState 1" setze, wird das Laden fortgesetzt. Damit realisiere ich im Sommer die PV Überschussladung in Verbindung mit "curr" und im Winter die Nachtladung bei günstigeren Preisen.
Meine Optimierungen für das Laden im Winter habe ich hier mal zusammengeschrieben:
https://elektromobilitaet-duelmen.de/2019/11/22/winter-is-coming/ (https://elektromobilitaet-duelmen.de/2019/11/22/winter-is-coming/)
Hier noch ein Link (nicht von mir) zu der Umschaltung der Phasen mit Hilfe von outputX2.
Die dort beschriebene Schaltung habe ich bei mir so umgesetzt. Bisher aber erfolgt die Umschaltung der Phasen bei mir jedoch noch manuell und nicht softwaregesteuert über outputX2.
http://www.eb-systeme.de/?page_id=1265 (http://www.eb-systeme.de/?page_id=1265)
Marcus
Hallo zusammen,
ich bin neu im KEBA Game und würde meine P30c gerne in FHEM integrieren. Ich hab den Thread hier gelesen und würde mich freuen wenn die P30 user mir einmal sagen können, welches Modul (das von Marcus oder ein anderes von Sido) ihr nutzt. Wäre sehr hilfreich für mich, da ich leider nich so der FHEM Super-User bin.
Freue mich auf eine Rückmeldung.
Danke Jan
Hallo Jan,
ich steuere die Keba nicht mehr über FHEM sondern über OpenWB auf dem selben Raspberry. Finde ich deutlich komfortabler. Sorry, dass ich nicht weiterhelfen kann...
Hallo Jan,
ich hatte die ganze Zeit das Modul von Sido und habe vor 10min mal auf das Update von ( Version 1.3 ) von Marcus aus dem Github gewechselt.
Bei mir sieht das in FHEM so aus wie auf dem angehängten Bild.
Der Schalter mit "Ueberschussladen" hat noch keine Funktion.
Bei mir wurde gerade eine E3/DC ( Solaranlage mit Speicher ) eingebaut und da möchte ich das noch einbinden.
Gruß
Thomas
Hallo,
vielen Dank euch für die schnellen Rückmeldungen. Ich hab auch das Modul von Marcus vom Github installiert, bekomme auch schon diverse Readings angezeigt, u.a. Firmware etc.
Hab grad aus Spaß mal ena0 gesendet passiert nix. Ist aber auch noch keine Rfid Karte konfiguriert und noch kein W über das Kabel geflossen.
Das sollte ich vllt alles erstmal machen, dann kann ich mir vllt auch sowas schickes basteln wie du hast Thomas. Gibts noch Startertipps? Muss ich noch was an der KEBA einstellen oder so? oder ist es ,,richtig" dass ich noch nichts ,,einstellen" kann?!
Danke euch!
Gruß Jan
Hallo Jan,
Hardwaremäßig müssen halt die DIP-Schalter nach deinen Bedingungen eingestellt werden.
Der Rest ist alles Software.
Gruß
Thomas
Hallo Marcus,
könntest Du das Modul noch um "Max curr = 0" ergänzen?
Im Moment geht nur 6000 - 32000 aber laut Doku ist:
Max curr uint16 Possible values: 0; 6000 - 32000 Current value in mA offered to the vehicle via
control pilot signalization. (Signal type: PWM)
So könnte ich das Laden unterbrechen ohne immer komplett abbrechen zu müssen ( wenn beim Überschussladen kein Überschuss da ist ;) ;D )
Das Ganze müsste doch im Modul hier angepasst werden oder?
if ($opt eq "curr" && ($value < 6000 || $value > 63000)){
return "The value for current must be between 6000 and 63000";
Gruß
Thomas
@Jan
ich habe im Handbuch noch etwas gefunden das für dich interresant sein könnte:
unter Punkt 7.4 ist der Freigabe-Eingang X1 beschrieben.
Da steht dass der Freigabe-Eingang X1 zur Verwendung mit einem potentialfreien Kontakt vorgesehen ist.
Mit dem Freigabe-Eingang ist es möglich, den Betrieb der Ladestation durch externe Komponenten zu steuern
(z.B. externer Schlüsselschalter, Haussteuerung, Photovoltaik-Anlage, Rundsteuerempfänger, ...).
Ist das nichts für dich?
Das ganze könnte man mit einem kleinen Relais vom RasPi steuern.
Ich gehe einfach mal davon aus dass Du FHEM auf einem RasPi laufen hast ::)
Gruß
Thomas
Hallöchen,
nachdem ich den DIP Schalter für die UDP Kommunikation gem. Anleitung auch auf "on" gesetzt habe (sollten die Elektriker bei der Installation eigentlich machen), funktionert das locken mit dem cmd "ena" wunderbar. Ich mach mich jetzt mal selbst auf die Suche wie ich so ein schönes Dashboard bauen kann inkl. plugged Status und Überschussladung.
Finds super dass ihr bei dem Thema hier so schnell antwortet - vielen Dank!
Gruß Jan
Vielleicht kannst Du das als Inspiration oder so gebrauchen ;)
defmod n_Ladeleistung notify Ladeleistung:LL:.* set KEBA current $EVTPART1;; get KEBA update
attr n_Ladeleistung userReadings Ladeleistung {ReadingsVal("Ladeleistung","LL", 0)}
setstate n_Ladeleistung 2020-04-29 11:14:43
setstate n_Ladeleistung 2020-04-25 06:25:53 Ladelei 7000
setstate n_Ladeleistung 2020-04-25 06:25:53 state active
defmod Ladeleistung dummy
attr Ladeleistung group KEBA
attr Ladeleistung room Wallbox
attr Ladeleistung setList state:6,7,8,9,10,11,12,13,14,15,16
attr Ladeleistung sortby 03
attr Ladeleistung stateFormat state A
attr Ladeleistung userReadings LL {ReadingsVal("Ladeleistung","state",0) *1000}
attr Ladeleistung webCmd state
setstate Ladeleistung 7 A
setstate Ladeleistung 2020-04-29 11:14:43 LL 7000
setstate Ladeleistung 2020-04-29 11:14:43 state 7
"plugged_on_wallbox_and_locked" habe ich im Modul angepasst da "plugged on wallbox and locked" durch die Leerzeichen Stress gemacht hat ( die anderen Meldungen natürlich ebenso ).
Ich habe jetzt aber gar nicht mehr überprüft ob es so auch geht ???
defmod n_Verbindungsstatus notify KEBA:Enablesys:.*|KEBA:Plug:.* {if (ReadingsVal("KEBA","Plug","") eq "plugged_on_wallbox_and_locked") {fhem ("set Verbindungsstatus 0")} elsif (ReadingsVal("KEBA","Plug","") eq "plugged_on_wallbox_ev_and_locked" && ReadingsVal("KEBA","Enablesys","") eq "disabled" ) {fhem ("set Verbindungsstatus 1")} elsif (ReadingsVal("KEBA","Plug","") eq "plugged_on_wallbox_ev_and_locked" && ReadingsVal("KEBA","Enablesys","") eq "enabled" ) {fhem ("set Verbindungsstatus 2")}}
setstate n_Verbindungsstatus 2020-04-29 11:14:43
setstate n_Verbindungsstatus 2020-04-10 00:37:08 state active
defmod Verbindungsstatus dummy
attr Verbindungsstatus devStateIcon 0:Typ_2_Stecker@red 1:Typ_2_Stecker@blue 2:Typ_2_Stecker@green
attr Verbindungsstatus group KEBA
attr Verbindungsstatus room Wallbox
attr Verbindungsstatus sortby 01
attr Verbindungsstatus userReadings ReadingsVal("KEBA","state","")
attr Verbindungsstatus webCmd :
setstate Verbindungsstatus 0
setstate Verbindungsstatus 2020-04-29 11:14:43 state 0
Gruß
Thomas
Hallo zusammen,
Zuerst einmal besten Dank für das Modul, genau das was ich gesucht habe :)
Leider habe ich jedoch ein Problem wenn zwei Wallboxen definiert sind.
define Wallbox_Garage KEBA 172.16.9.21 7090 180
setuuid Wallbox_Garage 5eb54895-f33f-21ca-e4ea-xxxx
attr Wallbox_Garage DbLogExclude A.*,B.*,DIP.*,F.*,I.*,P,PF,Product,Serial,Sec,T.*,U.*
attr Wallbox_Garage event-on-change-reading .*
attr Wallbox_Garage room Wallbox
define Wallbox_Aussen KEBA 172.16.9.22 7090 200
setuuid Wallbox_Aussen 5ebd6b3f-f33f-21ca-fe96-xxxx
attr Wallbox_Aussen DbLogExclude A.*,B.*,DIP.*,F.*,I.*,P,PF,Product,Serial,Sec,T.*,U.*
attr Wallbox_Aussen event-on-change-reading .*
attr Wallbox_Aussen room Wallbox
Wenn beide definiert sind, auf einer ein update ausgeführt wird, beendet sich FHEM.
(FHEM beendet sich auch, nach dem Automatischen refresh Intervall)
Jede für sich ist kein Problem, funktioniert ohne Probleme, nur zusammen definiert geht nicht.
Letzer Eintrag im fhemlog
2020.05.14 18:18:37 3: Wallbox_Aussen Sending command: report 1
Can't use an undefined value as a symbol reference at ./FHEM/70_KEBA.pm line 194.
Hat jemand eine Idee was ich versuchen könnte?
Gruss Romano
Hi!
Ich bin dabei, mir zwei KEBA P30 Wallboxen an die Wand zu schrauben und war begeistert, zu sehen dass es bereits eine FHEM Anbindung gibt. Leider ist das Thema hier seit ein paar Monaten inaktiv, könnte mir jemand ein Update geben, ob an dem Modul noch aktiv gearbeitet wird?
Danke und viele Grüße,
Heiko
Moin Heiko,
die letzte Änderung im Git Repo ist 9 Monate alt wenn ich es richtig gesehen habe.
Ich habe mir das Modul wie oben beschrieben etwas angepasst.
Im Moment bin ich auch am überlegen mir noch eine 2te Box zu zulegen.
Mit der Integration in FHEM bin ich eigentlich zufrieden und es läuft sehr stabil.
Gruß
Thomas
@glitschi
Hallo Romano,
ich habe deinen Beitrag gerade erst gelesen ( die Benachrichtigung hatte ich wohl übersehen )
Bist du schon weiter gekommen? Ich bin am überlegen mir auch eine 2te Keba zu gönnen :D
Gruß
Thomas
Zitat von: hasenhirn am 24 November 2020, 05:48:19
Moin Heiko,
die letzte Änderung im Git Repo ist 9 Monate alt wenn ich es richtig gesehen habe.
Ich habe mir das Modul wie oben beschrieben etwas angepasst.
Im Moment bin ich auch am überlegen mir noch eine 2te Box zu zulegen.
Mit der Integration in FHEM bin ich eigentlich zufrieden und es läuft sehr stabil.
Gruß
Thomas
Super, werde dann berichten wenn ich die Boxen habe und erste Versuche starte, sie einzubinden!
Viele Grüße,
Heiko,
Na da bin ich mal gespannt :)
Sind die Boxen schon bestellt?
Ich bin auch gerade am über legen mir eine 2te zu kaufen da meine Frau im Februar ihren i3 bekommt und der X3 verkauft wird.
Auf der anderen Seite sollte eine Wallbox eigentlich reichen da das Model3 LR ja nicht so oft geladen werden muss ::)
Bin mal gespannt wie es bei dir läuft. Ich habe ja noch etwas Zeit.
Gruß
Thomas
Boxen sind (noch) nicht bestellt, habe gerade eben erst den Antrag auf Förderung bei der KfW gestellt und muss jetzt warten, bis ich die Förderzusage habe. Da die Jungs bei der KfW heute etwas überlastet sind (Förderung von Wallboxen für Privatpersonen ist heute gestartet worden), kann das sicher noch ein paar Tage dauern ;-) ..
Falls Du sowieso planst, eine zusätzliche WB zu installlieren, ist jetzt die Zeit! Es gibt ein paar Sachen zu beachten (nicht alle WB sind erlaubt, nur am Erstwohnsitz, nur für Privat, WB muss per Konfiguration auf 11kW gedrosselt sein falls sie mehr kann), aber dann sind 900 Euro / Ladepunkt ganz nett!
Der Link für mehr Infos: 8)
https://www.kfw.de/inlandsfoerderung/Privatpersonen/Bestehende-Immobilie/Zuschussportal/Online-Antrag-Ladestationen-f%C3%BCr-Elektroautos/ (https://www.kfw.de/inlandsfoerderung/Privatpersonen/Bestehende-Immobilie/Zuschussportal/Online-Antrag-Ladestationen-f%C3%BCr-Elektroautos/)
Viele Grüße,
Heiko
OK, nach langer Wartezeit sind die beiden Boxen jetzt am Start. Eine x-series als Master, eine c-series als Slave.
Leider habe ich das gleiche Problem wie glitschi, wenn ich die zweite Box definiere, dann beendet sich FHEM...
Wenn ich Perl könnte, würde ich mich darum kümmern ... Gibt es eigentlich irgendwo eine aktuellere Version? Bin gar nicht sicher, wo ich meine herhabe (wahrscheinlich von github), aber es hat ja anscheinend schon ein paar Fixes/Erweiterungen gegeben?
Viele Grüße,
Heiko
OK, habe mich doch mal ein wenig mit Perl auseinandergesetzt und gesehen, dass beim Define der 2. Wallbox ein "socket not created" kam. Sobald er dann das erste Mal mit der Wallbox kommunizieren wollte, steigt FHEM wegen dem oben genannten Fehler aus.
Ich habe dann gesehen, dass der Socket für jede Wallbox gleich aufgesetzt wird und dass als Port immer der Port verwendet wird, der im Define angegeben wurde (bei mir 7090). Allerdings wird beim Erstellen des Socket der Quellport angegeben, so dass hier versucht wurde, die Kommunikation der 2. Wallbox mit dem gleichen Quellport aufzusetzen wie bei der 1. Wallbox. Daher kann der UDP Socket nicht aufgesetzt werden.
Es gibt hier also mindestens zwei Probleme:
a) es wird versucht, den UDP Socket wird bei jeder Wallbox mit dem gleichen Quellport zu erzeugen. Da jeder Port nur einmal verwendet werden kann, schlägt das bei der 2. Wallbox fehl
b) es wird anscheinend nicht geprüft, ob eine Wallbox korrekt angelegt werden konnte und wenn dann versucht wird, über den nicht vorhandenen socket zu senden, crasht FHEM
Ich konnte a) immerhin dadurch beheben, dass ich in der Zeile 139 den Code von
my $socket = IO::Socket::INET->new(Proto => 'udp', Localport => $port);
auf
my $socket = IO::Socket::INET->new(Proto => 'udp', ReusePort = 1, Localport => $port);
geändert habe. Jetzt crasht FHEM nicht mehr beim Versuch, auf die 2. Wallbox zuzugreifen und ich bekomme auch Werte angezeigt.
Schonmal gut, aber b) ist noch nicht gelöst und ob mein "Fix" auch zuverlässig funktioniert, weiß ich nicht. Die Kommunikation ist asynchron und ich kann mit meinen bescheidenen Kenntnissen nicht sehen, was die Read Routine antriggert und wie sie z.B. erkennt, von welcher wallbox die Daten gerade sind.
Da muss noch einiges an Arbeit reingesteckt werden, damit das robust funktioniert.
Zitatob mein "Fix" auch zuverlässig funktioniert, weiß ich nicht.
Wenn ich als Aussenstehender, nach 15 Minuten .pm und .pdf studieren was nicht uebersehen habe, dann kann das nicht richtig funktionieren.
Das Modul wertet nicht den Sender aus, und wenn mehrere Instanzen den gleichen UDP-Port verwenden, dann ist es Zufall, bei welcher FHEM-Instanz die Daten landen. Oder kein Zufall, aber dann landen alle Daten beim Letzten, was nicht wesentlich besser ist.
Um das Porblem "richtig" (im Sinne einer FHEM-Architektur) zu loesen, muesste man das Modul in zwei aufspalten (IO-Modul und "logisches" Modul).
Wenn man diese Arbeit sparen will (d.h. Pfusch ist auch ok), dann muss man beim Empfang der Daten anhand der Sender-IP erst die richtige FHEM-Instanz finden (z.Bsp. ueber eine Schleife aller FHEM-Geraete), und dann die readings*Update Funktionen mit dessen $hash aufrufen.
Wenn man fuer nachfolgende Programmierer Kopfschmerzen ersparen will, dann oeffnet nur der erste "define" ein Port, alle Nachfolgenden verwenden diese Instanz zum Schreiben. Dieser Schritt ist, wie erwaehnt, optional :)
Hi Rudolf und danke fürs Reinschauen!
Ja, habe ich auch so festgestellt. Habe etwas Debug eingebaut und tatsächlich wird immer der Hash einer der beiden Wallboxen übergeben, egal von welcher IP die Antwort per UDP ankommt. Leider sind die Wallboxen auch nicht so schlau, bei einem eingehenden Request die Antwort an den Source Port des Requests zurück zu schicken, sondern sie nehmen immer den Port 7090. Ich habe bisher auch noch keine Möglichkeit gefunden, diesen Port auf den Wallboxen umzustellen, damit sie jeweils andere Ports verwenden - dann würde es wieder klappen. Allerdings ist dann trotzdem nicht der Fall abgedeckt, dass jemand zwei oder mehr Wallboxen mit gleichem Port verwendet.
Wenn das tatsächlich nicht geht (ich werde auf jeden Fall trotzdem beim Hersteller anfragen), dann bleibt nur die von Dir vorgeschlagene Vorgehensweise, d.h. die Read Funktion bekommt zwar einen Hash übergeben, den muss sie aber ignorieren und selbst ermitteln, für welches der definierten Wallbox Objekte die Antwort ist, eben über die IP Adresse des Absenders der Antwort.
Ich habe mal versucht, in anderen Modulen zu spicken, finde aber keins bei dem ich durchsteige, wie das gehen soll.
Gibt es eine "foreach" Schleife mit der ich durch alle Hashes gehen kann, die zu diesem Modul gehören? Oder muss ich durch *alle* Hashes aller Module gehen (wow, das wären bei mir ein paar)?
Nur einen Socket aufzumachen wäre sicher machbar, aber mit dem Reuse Port und individuellen Sockets ist das Senden meiner Meinung nach einfacher und vor allem wird damit der Fall abgedeckt, dass es tatsächlich mal unterschiedliche Ports geben kann. Dann braucht man nicht bei jedem Define checken, ob es für den angegebenen Port bereits einen Empfangs-Socket gibt oder nicht.
Eine Trennung in Kommunikation und Logik hört sich gut an, allerdings übersteigt das bei weitem meine Fähigkeiten und ich halte es für wahrscheinlicher, dass ich das mit dem "Auswerten der Antwort und herausfinden, zu welchem Objekt es gehört" hinbekomme.
Nochmals Danke!
Viele Grüße,
Heiko
OK, ich glaube ich habs erstmal so hinbekommen.
Gehe doch durch alle Objekte/Hashes, machen die meisten anderen Module auch so, und checke dann als erstes auf den TYPE.
Jetzt werden die responses meiner beiden Wallboxen anscheinend korrekt zugeordnet.
Code:
$socket->recv($response,512);
my $peeraddress = $socket->peerhost();
my $foundhash = 0;
Log 3, "Message received from $peeraddress";
Log 3, "Data: $response";
my $ch = $hash;
foreach my $d(keys %defs) {
$ch = $defs{$d};
next if (!exists($ch->{TYPE}));
next if ($ch->{TYPE} ne 'KEBA');
Log 3," checking $ch->{Host} $ch->{NAME} ";
$foundhash = 1;
$hash = $ch;
last if ($ch->{Host} eq $peeraddress);
$foundhash = 0;
}
if ($foundhash eq '1') {
Log 3," OK, message received from $hash->{Host} ";
} else {
Log 3," Unknown sender/could not find a matching object";
return;
}
Es gibt dann solche Log Einträge:
2021.02.16 13:24:34 3: wallbox1 Sending command: report 3
2021.02.16 13:24:34 3: wallbox1 Command was sent
2021.02.16 13:24:34 3: Message received from 192.168.0.111
2021.02.16 13:24:34 3: Data: {
"ID": "3",
"U1": 0,
"U2": 0,
"U3": 0,
"I1": 0,
"I2": 0,
"I3": 0,
"P": 0,
"PF": 0,
"E pres": 103263,
"E total": 1408408,
"Serial": "21328205",
"Sec": 936592
}
2021.02.16 13:24:34 3: checking 192.168.0.111 wallbox1
2021.02.16 13:24:34 3: OK, message received from 192.168.0.111
...
2021.02.16 13:24:53 3: wallbox2 Sending command: report 3
2021.02.16 13:24:53 3: wallbox2 Command was sent
2021.02.16 13:24:53 3: Message received from 192.168.0.112
2021.02.16 13:24:53 3: Data: {
"ID": "3",
"U1": 0,
"U2": 0,
"U3": 0,
"I1": 0,
"I2": 0,
"I3": 0,
"P": 0,
"PF": 0,
"E pres": 0,
"E total": 10804,
"Serial": "yyyyyyyy",
"Sec": 363890
}
2021.02.16 13:24:53 3: checking 192.168.0.112 wallbox2
2021.02.16 13:24:53 3: OK, message received from 192.168.0.112
Lasse das mal ne Weile laufen und hoffe, dass es hält.
Viele Grüße,
Heiko
ZitatLeider sind die Wallboxen auch nicht so schlau, bei einem eingehenden Request die Antwort an den Source Port des Requests zurück zu schicken, sondern sie nehmen immer den Port 7090.
Das ist noch nicht sicher: Du setzt ja den Source Port (aka Localport) immer auf 7090, selbst dein Betriebsystem hielt diese Idee vor ReusePort=>1 fuer nicht so toll (Port already in use).
Laut KEBA-Doku gibt es Broadcasts, die an 7090 gehen, ich weiss nicht, ob diese in deinem Fall relevant sind. Wenn ja, dann ist 7090 Pflicht. Muss aber nicht mehr als einmal geoffnet werden.
ZitatLasse das mal ne Weile laufen und hoffe, dass es hält.
Deine Loesung sollte funktionieren.
Fuer den Fall, dass viele Nachrichten kommen und dein Rechner zu schwach fuer die staendigen Schleifen ist, kann man die IP->$hash Zuordnung in einem Modul-Eigenen hash merken. Erst wenn die IP nicht in diesem Hash ist, muss man die Schleife durchfuehren (und die IP merken).
Hi,
danke für die Hinweise, die Idee mit dem moduleigenen Hash hört sich gut an. Auf meinem FHEM Server ist das zwar kein Problem (Xeon CPU), aber für die Raspi-Fraktion etc. eventuell dann doch.
Ich schaue mal, ob ich einen einzigen "Sende-Socket" anlegen kann, der dann einen x-beliebigen (freien) UDP Port als Sourceport nutzt. Beim Empfangen kann ich nicht nur eine Socket nehmen, wenn man die Ports entweder auf den Wallboxen umkonfigurieren kann oder in Zukunft mal andere Modelle mit anderen Ports auf den Markt kommen (die aber ansonsten die gleiche Kommunikation per JSON ermöglichen).
Ich versuche mal, einen Socket pro vom Benutzer für die Wallboxen definierten Port aufzumachen.
Viele Grüße,
Heiko
OK, bin gescheitert beim Versuch zu prüfen, ob es schon einen socket für den angegebenen Port gibt, am Ende der Änderungen hing FHEM wenn er aus der read Funktion zurückkam.
Allerdings gibt das reuseport keinen "socket already exist" Fehler aus und es scheint erstmal zu klappen.
Ich habe auch mal spaßeshalber den "display" Befehl eingebaut, mit dem man etwas auf dem Display der Wallbox anzeigen lassen kann. Ich bekomme zumindest eine Bestätigung von der Wallbox, bin aber noch nicht rausgelaufen und habe es überprüft ;) ..
Noch zwei Kleinigkeiten: Es gab einen Fehler weil eins der Readings von der Box ein Prozentzeichen enthält, lasse das jetzt mit einem tr Befehl in ein großes P umwandeln. Außerdem habe ich bei allen Log Meldungen jetzt ein KEBA: vorangestellt, so dass man im Log auch weiß, von welchem Modul die Meldung kommt und habe die Log Einträge generell etwas aufgeräumt. Auch den "STATE" einer Wallbox setze ich jetzt auf den Statuswert, immer wenn er von der Box empfangen wurde. Also steht da jetzt nicht ewig "Listening" sondern z.B. "not ready for charging" etc...
Das Modul ist noch weit davon entfernt, dass man es guten Gewissens offiziell aufnehmen kann, würde ich mal sagen. Wenn sich jemand erbarmt, kann ich gern mit Tests und Infos weiterhelfen bzw. zuarbeiten. Ansonsten benutze ich es erstmal und wenn es jemand anderen gibt, der zwei KEBA Wallboxen betreibt und das ausprobieren möchte, kann ich gern meine angepasste Version per PM oder so verschicken.
Viele Grüße,
Heiko
Nur der Vollständigkeit halber, hier die Antwort vom KEBA Support auf meine Frage, ob man den UDP Port für die "Smarthome-Schnittstelle" der Wallboxen irgendwie verändern kann:
Zitat
der Port 7090 für die UDP Kommunikation kann nicht umgeändert werden, da dieser hardcoded ist.
Ich empfehle dem Hersteller die Implementierung einer MQTT Schnittstelle, aber bei dieser Antwort sehe ich wenig Chancen, dass es umgesetzt wird.
Jupp, sehe ich auch so. Zucke generell bei "hardcoded" zusammen, vor allem wenn es um sowas geht. Auch das Verhalten, dass beim Senden einer Antwort nicht der Source Port der Anfrage als Destination Port verwendet wird, ist fragwürdig. Ist zwar laut RFC768 kein Muss, dass man eine Antwort an den Source Port der Anfrage schickt, aber naja ...
Zitat von: heiko73 am 17 Februar 2021, 12:31:04
...Zucke generell bei "hardcoded" zusammen ...
Mag ich auch nicht, aber ich kenne schon viele Dinge die hardcoded sind.
Ich habe bei meiner Keba P30c das Problem, dass sie sich immer mit einer Standard IP meldet, obwohl DHCP eingeschaltet wäre.
Meine Box hat immer die IP 192.168.25.25
Bekomme sie nicht weg davon.
Weiß jemand einen Rat?
Hallo zusammen,
auch ich habe eine KEBA P30 in Betrieb genommen.
Leider scheint es so als würde die Kommunikation zwischen FHEM und der Wallbox nur einseitig funktionieren.
Ich bekomme alle Daten aus der Wallbox, aber weder das Setzen des enableState, noch von current wird von der Wallbox angenommen.
Ich habe eben noch einmal in die Anleitung geschaut. Möglicherweise liegt es daran, dass ich den DIP 1.3 nicht auf ON gestellt habe.
Das scheint für die Steuerung über das LAN Interface aber nötig zu sein.
Ich melde mich wieder, wenn ich erneut gestet habe.
Gruß, Matthias
Hallo Matthias,
so sieht meine Einstellung aus.
In der KEBA-Anleitung unter Punkt 1.4 Requirements steht auch : The UDP interface is enabled by switching the DIP switch DSW1.3 to "ON"
Gruß
Thomas
Hallo zusammen,
ich kann bestätigen, dass es an dem DIP Switch lag. Nachdem ich 1.3 auf on gesetzt habe, lässt sich die Wallbox wie erwartet steuern.
Gruß, Matthias
Hallo an alle,
Die DipSwitch Einstellungen werde ich bei mir auch noch kontrollieren. Danke für den Hinweis.
Weiters habe ich etwas entdeckt, was eigentlich störend ist.
Wobei sich das wahrscheinlich im FHEM Modul nicht ändern lässt
1) Das Userreading Epres liefert ja die aktuelle Leistungsaufnahme der Wallbox. Wenn ich aber das Laden abbreche bleibt der Wert stehen obwohl keine Leistung mehr aufgenommen wird.
2) Die Readings I1 bis I3 geben ja über die Stromaufnahme Auskunft. Doch diese Werte passen nicht, denn beim Laden wird bei mir 15.xx A bei I1 ausgegeben, bei I2 und I3 so Werte wie 0.01 usw.
Das glaube ich schon mal gar nicht. Meine Wallbox ist auf 16A eingestellt.
Das Problem das ich am 9. April geschildert habe, ist gelöst. Es lag an den DipSwitches. Diese waren nicht richtig gesetzt.
Hallo maci,
ich habe hinter dem Befehl zum Beenden der Ladung einfach ein "get KEBA report 3" eingefügt damit die Werte aktualisiert werden.
Gruß
Thomas
Hallo zusammen,
zunächst vielen Dank für das Modul.
Funktioniert mit einer Wallbox auch super.
So bald ich 2 Boxen definiere, hakelts bei einer also:
define Wallbox_Garage1 KEBA 192.168.10.26 7090 120
define Wallbox_Garage2 KEBA 192.168.10.27 7090 120
klappt leider nicht.
Habt ihr Ideen dazu?
Hallo Humbs,
wie äußert sich denn das "hakeln" ?
Ich habe vor einem Monat auch eine zweite KEBA bestellt.
Leider ist aus der Lieferzeit von 7-15Tagen die KW 29 geworden :-/
Würde mich freuen wenn wir das Problem bis dahin lösen könnten ;-)
LG
Thomas
Meine Vermutung ist, dass eine Box nicht die richtige IP hat.
Wenn sie keine Daten sendet, ist sie nicht im (richtigen) Netz
Keba Steuern:
Wie kann ich die Box steuern? Switch 1.3 ist auf on.
vielleicht kann ich die Anleitung dazu nicht richtig lesen oder ich sende die Befehle falsch ab.
Könnt ihr mir ein Beispiel geben?
Wie kann ich zB das Laden beenden, weil die PV zu wenig und gar keinen Strom liefert?
moin maci,
hat deine Box einen RFID-Leser?
Ich steuere es darüber. So kann ich Extern die Karte ran halten oder über FHEM die Box ein- / ausschalten.
set KEBA start 8dc5ceee00000000 00000000000000000000 und set KEBA stop 8dc5ceee00000000 wobei 8dc5ceee00000000 eine von mir angelernte RFID-Karte ist.
Gruß
Thomas
Hallo,
mein Box hat keine RFID Leser.
Wenn ich sie so nicht steuern kann, dann baue ich mir einen Wemos hin, der über X1 die Box ein und ausschalten kann.
Neee, das bekommen wir bestimmt hin ;-)
Funktioniert die Kommunikation grundsätzlich ?
wie ist den der Status / was steht im Reading von:
AuthON
Authreq
Enablesys
Enableuser
Plug
State
Die Kommunikation funktioniert.
In den Readings von:
AuthON: 0
Authreq: 0
Enablesys: enabled
Enableuser: enabled
Plug: plugged on wallbox, locked
State: not ready for charging
Derzeit ist die das Kabel nicht am Fahrzeug angeschlossen.
Den Stecker muss man auf jeden Fall einstecken, da bin ich mir ganz sicher ;D ;D ;D
So sieht es bei mir aus wenn die Box auf 6A eingestellt ist, eingesteckt und über das stop-Kommando unterbrochen ist:
Zitat
AuthON 1 2021-05-24 16:27:01
Authreq 1 2021-05-24 16:27:01
Backend 0 2021-05-24 16:27:12
COM-module 0 2021-05-24 16:27:12
CurrFS 0 2021-05-24 16:27:01
CurrHW 32000 2021-05-24 16:27:01
Currtimer 0 2021-05-24 16:27:01
Curruser 6000 2021-05-24 16:27:01
DIP-Sw1 0x25 2021-05-24 16:27:12
DIP-Sw2 0x00 2021-05-24 16:27:12
Enablesys disabled 2021-05-24 16:27:01
Enableuser enabled 2021-05-24 16:27:01
Epres 106150 2021-05-24 16:27:01
Error1 0 2021-05-24 16:27:01
Error2 0 2021-05-24 16:27:01
Etotal 46307403 2021-05-24 16:27:01
Firmware P30 v 3.10.27 (210105-174852) 2021-05-24 16:27:12
I1 0 2021-05-24 16:27:01
I2 0 2021-05-24 16:27:01
I3 0 2021-05-24 16:27:01
ID 1 2021-05-24 16:27:12
Input 0 2021-05-24 16:27:01
Maxcurr 0 2021-05-24 16:27:01
Maxcurr-Percent 1000 2021-05-24 16:27:01
Output open 2021-05-24 16:27:01
P 0 2021-05-24 16:27:01
PF 0 2021-05-24 16:27:01
Plug plugged_on_wallbox_ev_and_locked 2021-05-24 16:27:01
Product KC-P30-EC240422-M0R 2021-05-24 16:27:12
Sec 4078138 2021-05-24 16:27:12
Serial 19257922 2021-05-24 16:27:12
Setenergy 0 2021-05-24 16:27:01
State charging process temporarily interrupted 2021-05-24 16:27:01
TmoCT 0 2021-05-24 16:27:01
TmoFS 0 2021-05-24 16:27:01
U1 0 2021-05-24 16:27:01
U2 0 2021-05-24 16:27:01
U3 0 2021-05-24 16:27:01
timeQ 2 2021-05-24 16:27:12
So sieht es bei mir aus wenn die Box auf 6A eingestellt ist, eingesteckt und über das start-Kommando am laden ist:
Zitat
AuthON 1 2021-05-24 16:35:43
Authreq 0 2021-05-24 16:35:43
Backend 0 2021-05-24 16:35:53
COM-module 0 2021-05-24 16:35:53
CurrFS 0 2021-05-24 16:35:43
CurrHW 32000 2021-05-24 16:35:43
Currtimer 0 2021-05-24 16:35:43
Curruser 6000 2021-05-24 16:35:43
DIP-Sw1 0x25 2021-05-24 16:35:53
DIP-Sw2 0x00 2021-05-24 16:35:53
Enablesys enabled 2021-05-24 16:35:43
Enableuser enabled 2021-05-24 16:35:43
Epres 106548 2021-05-24 16:36:22
Error1 0 2021-05-24 16:35:43
Error2 0 2021-05-24 16:35:43
Etotal 46307438 2021-05-24 16:35:48
Firmware P30 v 3.10.27 (210105-174852) 2021-05-24 16:35:53
I1 4017 2021-05-24 16:35:48
I2 3959 2021-05-24 16:35:48
I3 5580 2021-05-24 16:35:48
ID 1 2021-05-24 16:35:53
Input 0 2021-05-24 16:35:43
Maxcurr 6000 2021-05-24 16:35:43
Maxcurr-Percent 100 2021-05-24 16:35:43
Output open 2021-05-24 16:35:43
P 3179132 2021-05-24 16:35:48
PF 986 2021-05-24 16:35:48
Plug plugged_on_wallbox_ev_and_locked 2021-05-24 16:35:43
Product KC-P30-EC240422-M0R 2021-05-24 16:35:53
Sec 4078658 2021-05-24 16:35:53
Serial 19257922 2021-05-24 16:35:53
Setenergy 0 2021-05-24 16:35:43
State charging 2021-05-24 16:35:43
TmoCT 0 2021-05-24 16:35:43
TmoFS 0 2021-05-24 16:35:43
U1 235 2021-05-24 16:35:48
U2 234 2021-05-24 16:35:48
U3 234 2021-05-24 16:35:48
timeQ 2 2021-05-24 16:35:53
sorry dass die Werte hier etwas durcheinander angezeigt werden.
Ich habe hier 10min. in der Vorschau alles in eine Reihe gebracht und dann ist im Post doch alles zerschossen >:( >:(
Ich hoffe mit den Werten kommst Du einen Schritt weiter.
Wenn nicht einfach noch mal melden ;-=
Gruß
Thomas
Hallo Thomas,
Jep funktioniert- Danke :)
Gerne ;)
Zitat von: hasenhirn am 16 Mai 2021, 20:00:24
Hallo Humbs,
wie äußert sich denn das "hakeln" ?
Ich habe vor einem Monat auch eine zweite KEBA bestellt.
Leider ist aus der Lieferzeit von 7-15Tagen die KW 29 geworden :-/
Würde mich freuen wenn wir das Problem bis dahin lösen könnten ;-)
LG
Thomas
Hallo Thomas,
bist Du schon klüger in Sachen 2 KEBAs im Netzwerk?
An den IPs liegts sicher nicht, denn die Web GUIs funktionieren einwandfrei.
Wie äußert sich das Problem bei mir:
Der STATE der zweiten Wallbox bleibt auf drei Fragezeichen
Grüße
Danke für die Info.
Meine 2te Wallbox liegt noch im Keller und wartet auf ihren Anschluss :-)
Bin mal gespannt wie es läuft. :o
Moin,
die 2te Wallbox ist jetzt auch installiert und läuft bis auf die Anbindung an FHEM.
Hier habe ich natürlich das gleiche Problem wie alle mit dem Standartmodul für die Keba von Marcus42/sido.
Hat schon jemand das Modul von heiko73 oder ein selbst getuntes im Einsatz welches funktioniert?
Für eine Zusendung oder am besten Veröffentlichung wäre ich sehr dankbar.
Mit meinen bescheidenen Programmierkenntnissen würde ich vermutlich Wochen oder Monate für eine Anpassung benötigen :(
LG
Thomas
Auch bei den Nachbarn ist das Thema mit mehreren Wallboxen bislang nicht gelöst:
https://github.com/iobroker-community-adapters/ioBroker.kecontact
Moin,
ich habe mal auf der Basis von marcus42 den Anpassungen von sido und der Erweiterung von heiko73 was zusammen genagelt.
Als Info vorab, ich bin gelernter Schlosser und kein Programmierer :o
Also alles ohne Gewähr und auf eigene Gefahr.
Die meiste Arbeit ist von den 3 Jungs, ich habe da nur etwas daran rumgemurkst ::)
Seit ein paar Tagen habe ich das Modul im Einsatz und bis jetzt noch nicht alles getestet, aber das was ich so täglich brauche funktioniert schon mal :D
Zur Zeit ist bei mir viel los und ich komme nicht so richtig dazu alles zu Testen.
Vor allem bei der Read/Write Funktion die von heiko73 angepasst wurde blicke ich noch nicht so ganz durch wie das funktioniert.
Vielleicht kann es ja so schon jemand gebrauchen oder es hat einer ein paar gute Tipps für mich und kann mir das erklären.
Im Moment lese ich mir die Developerseiten von FHEM durch und versuche das alles zu verstehen - schau ma mal was daraus wird ;)
LG
Thomas
ich habe jetzt nur einmal ein wenig recherchiert und gelesen. Das hier sind die aktuellen Dokumentationen:
https://www.keba.com/download/x/4a925c4c61/kecontactp30udp_pgen.pdf
https://www.keba.com/download/x/dea7ae6b84/kecontactp30modbustcp_pgen.pdf
Dementsprechend kann eine Kommunikation mit einer KEBA entweder über UDP oder über Modbus TCP erfolgen. In der UDP-Dokumentation steht mehr oder weniger klar drin, dass eine Kommunikation über UDP nicht die präferierte Methode darstellt. Zusammen mit dem Broadcast-Thema, dem fest verdrahteten Port für das von Keba aus gesehene Ziel, sollte m.E. eine solche Wallbox eher über Modbus TCP angesprochen werden - vor allem dann, wenn man mehrere Wallboxen integrieren möchte.
Sollte es etwas geben, was nur über UDP und nicht über Modbus TCP abgefragt oder gesteuert werden kann, so wäre tatsächlich m.E. wie an anderer Stelle hier im Thread schon einmal geschrieben in ein IO-Device und die Wallbox(en) als Client-Device zu splitten, um eine saubere Auftrennung bei Nutzung mehrerer Wallboxen zu erreichen.
Hallo Ralli,
als meine zweite Wallbox kam hatte ich auch versucht die Probleme mit Modbus zu umschiffen.
Positiv ist bei Modbus dass man die Werte ganz einfach Formatieren kann.
Direkt im Device können die angezeigten Daten z.B. von mA ( so genau braucht es wohl keiner ) in A umformatiert und dem Ergebniss auch gleich die Einheit hinzugefügt werden.
Leider konnte ich die Box nicht zum Laden bewegen :o
Ich hatte hier https://forum.fhem.de/index.php/topic,75638.msg1182211.html#msg1182211 (https://forum.fhem.de/index.php/topic,75638.msg1182211.html#msg1182211) mit dem Entwickler des Modbus-Moduls geschrieben der sehr hilfsbereit war aber auch keinen Fehler bei dem Modul feststellen konnte.
Eine Mail an den KEBA-Support blieb bis heute ohne Antwort ???
Des weiteren kommen über Modbus auch viel weniger Daten als über UDP.
Daher habe ich das KEBA-UDP-Modul mit viel Arbeit ( da wenig Ahnung ) soweit angepasst dass es für meine Ansprüche im Moment funktioniert.
Vor allem die Möglichkeit einzustellen dass er z.B. nur 10kW zum Auto schickt und sich dann abschaltet gefällt mir richtig gut.
Der BMW kann das Ladelimit nicht einstellen und der Tesla geht erst bei 50% los.
So lade ich immer nur was ich brauche und wenn es mal Strom für umme gibt ist noch Platz im Akku ;D ;D ;D ;D
LG
Thomas
@Ralli
ich habe gerade mein Laptop aufgeräumt und noch etwas zu dem Thema Modbus gefunden.
Vielleicht kannst du ja etwas davon gebrauchen.
LG Thomas
defmod Keba_Stellplatz ModbusAttr 255 10 192.168.1.22:502 TCP
attr Keba_Stellplatz dev-h-defPoll 1
attr Keba_Stellplatz event-min-interval .*:60
attr Keba_Stellplatz event-on-change-reading .*
attr Keba_Stellplatz obj-h01000-len 2
attr Keba_Stellplatz obj-h01000-map 0:booting, 1:not ready for charging, 2:ready for chargin, 3:charging, 4:error, 5:charging process interrupted
attr Keba_Stellplatz obj-h01000-reading Chargingstate
attr Keba_Stellplatz obj-h01000-unpack N
attr Keba_Stellplatz obj-h01004-len 2
attr Keba_Stellplatz obj-h01004-map 0:no cable is plugged, 1:Cable is connected to charging station, 3:Cabel is connected to the charging station and locked, 5:Cable is connected to the charging station and the EV, 7:Cable is connected to the charging station and the EV an locked
attr Keba_Stellplatz obj-h01004-reading Cablestate
attr Keba_Stellplatz obj-h01004-unpack N
attr Keba_Stellplatz obj-h01006-len 2
attr Keba_Stellplatz obj-h01006-map 0:No error
attr Keba_Stellplatz obj-h01006-reading Error_code
attr Keba_Stellplatz obj-h01006-unpack N
attr Keba_Stellplatz obj-h01008-expr $val / 1000
attr Keba_Stellplatz obj-h01008-format %.3f A
attr Keba_Stellplatz obj-h01008-len 2
attr Keba_Stellplatz obj-h01008-reading Charging_current_phase_1
attr Keba_Stellplatz obj-h01008-unpack N
attr Keba_Stellplatz obj-h01010-expr $val / 1000
attr Keba_Stellplatz obj-h01010-format %.3f A
attr Keba_Stellplatz obj-h01010-len 2
attr Keba_Stellplatz obj-h01010-reading Charging_current_phase_2
attr Keba_Stellplatz obj-h01010-unpack N
attr Keba_Stellplatz obj-h01012-expr $val / 1000
attr Keba_Stellplatz obj-h01012-format %.3f A
attr Keba_Stellplatz obj-h01012-len 2
attr Keba_Stellplatz obj-h01012-reading Charging_current_phase_3
attr Keba_Stellplatz obj-h01012-unpack N
attr Keba_Stellplatz obj-h01014-len 2
attr Keba_Stellplatz obj-h01014-reading Serialnumber
attr Keba_Stellplatz obj-h01014-unpack N
attr Keba_Stellplatz obj-h01016-len 2
attr Keba_Stellplatz obj-h01016-reading Producttype
attr Keba_Stellplatz obj-h01016-unpack N
attr Keba_Stellplatz obj-h01018-len 2
attr Keba_Stellplatz obj-h01018-reading Firmwareversion
attr Keba_Stellplatz obj-h01018-unpack N
attr Keba_Stellplatz obj-h01020-expr $val / 1000000
attr Keba_Stellplatz obj-h01020-format %.3f kWh
attr Keba_Stellplatz obj-h01020-len 2
attr Keba_Stellplatz obj-h01020-reading Active_power
attr Keba_Stellplatz obj-h01020-unpack N
attr Keba_Stellplatz obj-h01036-expr $val / 10000
attr Keba_Stellplatz obj-h01036-format %.3f kWh
attr Keba_Stellplatz obj-h01036-len 2
attr Keba_Stellplatz obj-h01036-reading Total_energy
attr Keba_Stellplatz obj-h01036-unpack N
attr Keba_Stellplatz obj-h01040-format %.1f V
attr Keba_Stellplatz obj-h01040-len 2
attr Keba_Stellplatz obj-h01040-reading Voltage_phase_1
attr Keba_Stellplatz obj-h01040-unpack N
attr Keba_Stellplatz obj-h01042-format %.1f V
attr Keba_Stellplatz obj-h01042-len 2
attr Keba_Stellplatz obj-h01042-reading Voltage_phase_2
attr Keba_Stellplatz obj-h01042-unpack N
attr Keba_Stellplatz obj-h01044-format %.1f V
attr Keba_Stellplatz obj-h01044-len 2
attr Keba_Stellplatz obj-h01044-reading Voltage_phase_3
attr Keba_Stellplatz obj-h01044-unpack N
attr Keba_Stellplatz obj-h01046-expr $val / 10
attr Keba_Stellplatz obj-h01046-format %.1f %
attr Keba_Stellplatz obj-h01046-len 2
attr Keba_Stellplatz obj-h01046-reading Powerfactor
attr Keba_Stellplatz obj-h01046-unpack N
attr Keba_Stellplatz obj-h01100-expr $val / 1000
attr Keba_Stellplatz obj-h01100-format %d A
attr Keba_Stellplatz obj-h01100-len 2
attr Keba_Stellplatz obj-h01100-reading Max_charging_current
attr Keba_Stellplatz obj-h01100-unpack N
attr Keba_Stellplatz obj-h01110-expr $val / 1000
attr Keba_Stellplatz obj-h01110-format %d A
attr Keba_Stellplatz obj-h01110-len 2
attr Keba_Stellplatz obj-h01110-reading Max_supported_current
attr Keba_Stellplatz obj-h01110-unpack N
attr Keba_Stellplatz obj-h05004-expr $val / 1000
attr Keba_Stellplatz obj-h05004-format %d A
attr Keba_Stellplatz obj-h05004-max 63
attr Keba_Stellplatz obj-h05004-min 6
attr Keba_Stellplatz obj-h05004-reading Set_charging_current
attr Keba_Stellplatz obj-h05004-set 1
attr Keba_Stellplatz obj-h05004-setexpr $val * 1000
attr Keba_Stellplatz obj-h05010-reading Set_energy
attr Keba_Stellplatz obj-h05010-set 1
attr Keba_Stellplatz obj-h05010-unpack N
attr Keba_Stellplatz obj-h05012-reading Unlock_plug
attr Keba_Stellplatz obj-h05012-set 1
attr Keba_Stellplatz obj-h05014-reading Enable/Disable_charging_station
attr Keba_Stellplatz obj-h05014-set 1
attr Keba_Stellplatz verbose 5
setstate Keba_Stellplatz opened
setstate Keba_Stellplatz 2021-10-24 16:57:18 Active_power 4.242 kWh
setstate Keba_Stellplatz 2021-10-24 16:57:28 Cablestate Cable is connected to the charging station and the EV an locked
setstate Keba_Stellplatz 2021-10-24 16:57:28 Charging_current_phase_1 6.106 A
setstate Keba_Stellplatz 2021-10-24 16:57:28 Charging_current_phase_2 6.101 A
setstate Keba_Stellplatz 2021-10-24 16:57:18 Charging_current_phase_3 6.097 A
setstate Keba_Stellplatz 2021-10-24 16:57:28 Chargingstate charging
setstate Keba_Stellplatz 2021-10-24 15:52:50 Enable/Disable_charging_station 0
setstate Keba_Stellplatz 2021-10-24 16:57:28 Error_code No error
setstate Keba_Stellplatz 2021-10-24 16:57:18 Firmwareversion 50993920
setstate Keba_Stellplatz 2021-10-24 16:57:19 Max_charging_current 6 A
setstate Keba_Stellplatz 2021-10-24 16:57:19 Max_supported_current 16 A
setstate Keba_Stellplatz 2021-10-24 16:57:19 Powerfactor 99.7 %
setstate Keba_Stellplatz 2021-10-24 16:57:18 Producttype 314121
setstate Keba_Stellplatz 2021-10-24 16:57:18 Serialnumber 22218033
setstate Keba_Stellplatz 2021-10-24 16:56:48 Set_charging_current 6 A
setstate Keba_Stellplatz 2021-10-24 16:57:18 Total_energy 138.070 kWh
setstate Keba_Stellplatz 2021-10-24 16:57:18 Voltage_phase_1 231.0 V
setstate Keba_Stellplatz 2021-10-24 16:57:19 Voltage_phase_2 232.0 V
setstate Keba_Stellplatz 2021-10-24 16:57:19 Voltage_phase_3 232.0 V
setstate Keba_Stellplatz 2021-10-24 15:50:51 state opened
Hallo, wird das Modul noch aktiv bewirtschaftet? Laut Github gab es in den letzten drei Jahren keine Anpassung mehr.
Da ich die Tage eine Keba P30 DE 440 installieren werde, schaue ich mir gerne dein Modul an und werde es eventuell überarbeiten/weiterführen.
Moin,
das Modul hat soweit mit einer Box funktioniert und lief problemlos.
Bei 2 Boxen gab es aber etwas Ärger - das sollte aber dann im Moment kein Problem bei dir sein.
Gruß
Tom
Hallo hasenhirn,
habe beide Module (UDP und Modbus) in fhem integriert.
Verbindung steht, Werte auslesen geht, Stromstärke setzen geht.
Aber stop und start geht nicht.
Ich habe mehrere RFID eingelernt.
Beim UDP, also dem 70_Keba.pm muss ich wohl die RFID mitgeben. Das probiere ich morgen.
Bei dem Modbus Modul kann man aber keine Werte mitgeben bei set Keba_Wallbox_Name start
Muss ich da vorher noch was anderes freischalten.
Gruß
Thorsten
Hallo Thorsten,
hier hatte ich das Starten mal beschrieben. Du musst halt den Code deiner angelernten Karte einsetzen.
Gruß
Tom
Zitat von: hasenhirn am 22 Mai 2021, 10:49:59
moin maci,
hat deine Box einen RFID-Leser?
Ich steuere es darüber. So kann ich Extern die Karte ran halten oder über FHEM die Box ein- / ausschalten.
set KEBA start 8dc5ceee00000000 00000000000000000000 und set KEBA stop 8dc5ceee00000000 wobei 8dc5ceee00000000 eine von mir angelernte RFID-Karte ist.
Gruß
Thomas
Hallo Thomas,
danke für den Hinweis. Meine Frau hat heute leider mein Test EV mitgenommen :-( Ich probiere daher erst morgen.
Ich glaube aber, dass der Befehl, den du maci genannt hattest für das UDP Modul ist.
Ich suche den start stop Befehl für das ModBus Modul. Da habe ich gesehen, gibt es enable und disable in den set Befehlen.
Damit probiere ich morgen mal.
Und ja, habe mehrere RFID hinterlegt.
Hab parallel noch eine Go-E am laufen. Die läuft automatisiert über eine Routine, die je nachHausbedarf, PV Leistung, Speicher-SoC, Auto-SoC selber bestimmt, wie und wie lange geladen wird. Klappt schon super. Sogar mit Phasensteuerung.
Was mich extrem an der KeBa stört, ist die fehlende Phasenumschaltung. Bei dem Preis, hätte man das schon einbauen können. Schade. So muss ich auf manuell auf eine Phase reduzieren.
Gruß
Thorsten
Hallo Thorsten,
nur mal so zur Info, ich bin zwischenzeitlich auf IoBroker umgestiegen da es für mich viel einfacher und übersichtlicher ist.
Vom Modbus bin ich damals nach einem Test gleich wieder zurück zu UDP da dort viel mehr Daten ankommen.
Bzgl: "Was mich extrem an der KeBa stört, ist die fehlende Phasenumschaltung."
Meine Meinung dazu ist, dass mein Wagen wenn er lädt aus den Standby aufwacht und dann ca.300W verbraucht.
Wenn ich also mit so wenig Leistung am Start bin ist für mich die Verlustleistung einfach zu hoch und es macht wenig Sinn.
Aber wie gesagt, ist nur meine Meinung ;-)
LG
Tom
Hallo Thomas,
mit ioBroker hab ich mich noch nicht beschäftigt.
Habe fhem mit homematic Komponenten (nicht Homematic IP).
Außerdem zapfe ich mit json den Speicher und mit Modus den WR und die Wallbox an.
Das läuft seit Jahren ganz gut.
Allerdings hab ich mich auch schon mal mit dem Thema auseinandergesetzt, mal auf was moderneres umzusteigen.
Ich hab nen Twinge Z.E. Den lade ich fast ausschließlich mit PV Überschuss und daher ist das mit der Phasenumschaltung gut geeignet (im Sommer ;-)
Du hast einen i3, wenn ich das richtig irgendwo gelesen habe. Der Twingo kennt auch gar keinen Tiefschlaf ;-)
Unsere Erfahrung und Meinungsaustausche sind sehr gut. Wir sind hier im Ort ein paar PV / EV / Speicher / Optimierungsliebhaber und da sind wir froh über andere Meinungen und Ideen.
VG
Thorsten
Hey Tom,
start mit RFID Tag (aber ohne class) klappt.
stoppen geht allerdings nicht mit dieser Syntax. Wenn ich aber enablestate auf off mache, pausiert er.
Ich probiere mal weiter...
Moin,
super, freut mich wenn ich Dir wenigstens ein bisschen helfen konnte.
Aber wie gesagt, bei UDP hast du mehr Daten und das ist doch das was wir alle wollen ;-)
LG
Tom
Mir ist es erst dieser Tage aufgefallen als ich stacktrace auf 1 gesetzt habe.
Ich bekomme bei diesem Modul laufend diese Perl Warnung.
Zitat2023.01.08 11:37:40.170 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2023.01.08 11:37:40.170 1: stacktrace:
2023.01.08 11:37:40.171 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2023.01.08 11:37:40.171 1: main::KEBA_GetUpdate called by fhem.pl (3497)
2023.01.08 11:37:40.171 1: main::HandleTimeout called by fhem.pl (703)
Habe ich da etwas falsch konfiguriert?
hier das List meiner Definition:
ZitatInternals:
CONNECTS 1
Command
DEF 192.168.25.20 7090 60
FD 31
FUUID 634410fe-f33f-0d7f-c30f-15b48a12f1bd16a4
Host 192.168.25.20
Interval 60
LAST_CONNECT 2023-01-08 20:26:52
LAST_MESSAGE TCH-OK :done
NAME wallbox
NR 593
Port 7090
STATE Status: not ready for charging <br>Spannung/Stromstärke Phase1: 0 Volt | 0.000 A || Phase2: 0 Volt | 0.000 A || Phase3: 0 Volt | 0.000 A <br>aktuelle LadeSession: 0.000 kWh | Ladekosten: 0.00 € <br>Gesamte Ladeleistung: 0.000 kWh | Gesamte Ladekosten: 1522.35 € <br>Uptime: 42 Tage - 6 Std : 47 Min. || Letzte_Aktualisierung: 2023-01-08 20:26:52
TYPE KEBA
eventCount 95627
Helper:
DBLOG:
Epres:
DBLogging:
TIME 1673206012.28765
VALUE 58867
Etotal:
DBLogging:
TIME 1673206012.28765
VALUE 25414880
Etotal_alt:
DBLogging:
TIME 1673132460.10793
VALUE 25414880
READINGS:
2023-01-08 20:26:52 Ausgangsleistung 0
2023-01-08 20:26:52 AuthON 0
2023-01-08 20:26:52 Authreq 0
2023-01-08 20:26:52 Backend 0
2023-01-08 20:26:52 COM-module 0
2023-01-08 20:26:52 CurrFS 0
2023-01-08 20:26:52 CurrHW 16000
2023-01-08 20:26:52 Currtimer 0
2023-01-08 20:26:52 Curruser 63000
2023-01-08 20:26:52 DIP-Sw1 0x22
2023-01-08 20:26:52 DIP-Sw2 0x50
2023-01-08 20:26:52 Enablesys disabled
2023-01-08 20:26:52 Enableuser disabled
2023-01-08 20:26:52 Epres 58867
2023-01-08 20:26:52 Error1 0
2023-01-08 20:26:52 Error2 0
2023-01-08 20:26:52 Etotal 25414880
2023-01-08 00:01:00 Etotal_alt 25414880
2023-01-08 20:26:52 Firmware P30 v 3.10.36 (211117-093932)
2023-01-08 20:26:52 I1 0
2023-01-08 20:26:52 I2 0
2023-01-08 20:26:52 I3 0
2023-01-08 20:26:52 ID 3
2023-01-08 20:26:52 Input 0
2023-01-08 00:01:00 Kosten_Tageswert 0
2023-01-08 00:01:00 LadeKosten_Gesamt 1522.351312
2023-01-06 12:01:53 LadeKosten_aktuell 0
2023-01-06 12:01:53 LadeKosten_letzte_LadeSession 3.5206225
2023-01-08 00:01:00 Leistung_Tageswert 0
2023-01-06 12:01:53 Leistung_aktuell 0
2023-01-06 12:01:53 Leistung_letzte_LadeSession 5.8775
2023-01-08 20:26:52 Maxcurr 0
2023-01-08 20:26:52 Maxcurr% 1000
2023-01-08 20:26:52 Output open
2023-01-08 20:26:52 P 0
2023-01-08 20:26:52 PF 0
2023-01-08 20:26:52 Plug plugged on wallbox, locked
2023-01-08 20:26:52 Product KC-P30-EC240122-E00
2023-01-08 20:26:52 Sec 3653271
2023-01-08 20:26:52 Serial 21293219
2023-01-08 20:26:52 Setenergy 0
2023-01-08 20:26:52 State not ready for charging
2023-01-08 20:26:52 Stromstaerke_1 0
2023-01-08 20:26:52 Stromstaerke_2 0
2023-01-08 20:26:52 Stromstaerke_3 0
2023-01-08 20:26:52 TmoCT 0
2023-01-08 20:26:52 TmoFS 0
2023-01-08 20:26:52 U1 0
2023-01-08 20:26:52 U2 0
2023-01-08 20:26:52 U3 0
2023-01-08 20:26:52 Uptime 42 Tage - 6 Std : 47 Min.
2023-01-08 20:26:52 timeQ 3
Attributes:
DbLogExclude .*
DbLogInclude Epres,Etotal,Etotal_alt
icon electric_car_icon@green
room 4.10_Garage
stateFormat {sprintf("Status: %s <br>Spannung/Stromstärke Phase1: %.0f Volt | %.3f A || Phase2: %.0f Volt | %.3f A || Phase3: %.0f Volt | %.3f A <br>aktuelle LadeSession: %.3f kWh | Ladekosten: %.2f € <br>Gesamte Ladeleistung: %.3f kWh | Gesamte Ladekosten: %.2f € <br>Uptime: %s || Letzte_Aktualisierung: %s ",ReadingsVal($name,"State",0),ReadingsVal($name,"U1",0),ReadingsVal($name,"Stromstaerke_1",0),ReadingsVal($name,"U2",0),ReadingsVal($name,"Stromstaerke_2",0),ReadingsVal($name,"U3",0),ReadingsVal($name,"Stromstaerke_3",0),ReadingsVal($name,"Leistung_Aktuelle_LadeSession",0),ReadingsVal($name,"LadeKosten_Aktuelle_LadeSession",0),ReadingsVal($name,"Leistungsaufname_Gesamt",0),ReadingsVal($name,"LadeKosten_Gesamt",0),ReadingsVal($name,"Uptime",0),ReadingsTimestamp($name,"Sec",""))}
userReadings Uptime:Sec.* {my $days=ReadingsVal($name,"Sec",0) / 86400; my $d=int($days); my $hours=($days - $d) * 24; my $h=int($hours); my $im=($hours - $h) * 60; my $m=int($im); "$d Tage - $h Std : $m Min.";}, Stromstaerke_1 { ReadingsVal($name,"I1",0) /1000 }, Stromstaerke_2 { ReadingsVal($name,"I2",0) /1000 }, Stromstaerke_3 { ReadingsVal($name,"I3",0) /1000 }, Ausgangsleistung { ReadingsVal($name,"P",0) /1000000 }
@maci: Habe mir gerade deine Konfiguration angeschaut. Wie funktioniert das mit den Ladekosten? Wo hast du den kWh Preis hinterlegt und wie holt sich das KEBA Moidul den?
Das KEBA Modul hat nichts mit den Ladekosten zu tun.
Diese hole ich mir aus dem Dummy, wo ich diese Werte aktuell halte.
Ladekosten ist ja nichts anderes als Ladestrom x Strompreis (KWh x €/KWh)
Hallo zusammen,
ich nutze das Modul auch für meine KEBA wallbox.
Leider stört mich eine Sache und ich habe keine Idee, wie ich sie lösen kann.
Das Modul müllt mein Logfile zu (also das fhem.log)
Es werden reports (1-3) geschickt, die ich aber nicht benötigt.
Wie kann ich diese Reports deaktivieren?
Ich versuche es nochmals, vieleicht meldet sich der Entwickler mal.
Fehler im Log:
2025.03.27 17:18:43.689 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:18:43.689 1: stacktrace:
2025.03.27 17:18:43.689 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:18:43.689 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:18:43.690 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:19:43.691 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:19:43.691 1: stacktrace:
2025.03.27 17:19:43.691 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:19:43.691 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:19:43.691 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:20:43.692 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:20:43.693 1: stacktrace:
2025.03.27 17:20:43.693 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:20:43.693 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:20:43.693 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:21:43.693 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:21:43.693 1: stacktrace:
2025.03.27 17:21:43.693 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:21:43.693 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:21:43.693 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:22:43.694 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:22:43.694 1: stacktrace:
2025.03.27 17:22:43.694 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:22:43.694 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:22:43.694 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:23:43.695 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:23:43.695 1: stacktrace:
2025.03.27 17:23:43.695 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:23:43.695 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:23:43.695 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:24:43.697 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:24:43.697 1: stacktrace:
2025.03.27 17:24:43.697 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:24:43.697 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:24:43.697 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:25:43.697 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:25:43.698 1: stacktrace:
2025.03.27 17:25:43.698 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:25:43.698 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:25:43.698 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:26:43.698 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:26:43.698 1: stacktrace:
2025.03.27 17:26:43.698 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:26:43.698 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:26:43.698 1: main::HandleTimeout called by fhem.pl (710)
2025.03.27 17:27:43.699 1: PERL WARNING: Use of uninitialized value $commandStack in concatenation (.) or string at ./FHEM/70_KEBA.pm line 393.
2025.03.27 17:27:43.699 1: stacktrace:
2025.03.27 17:27:43.700 1: main::__ANON__ called by ./FHEM/70_KEBA.pm (393)
2025.03.27 17:27:43.700 1: main::KEBA_GetUpdate called by fhem.pl (3511)
2025.03.27 17:27:43.700 1: main::HandleTimeout called by fhem.pl (710)
Das Log wird regelrecht zugemüllt.
@maci: Welche Version des Moduls verwendet Du?
Die aus Beitrag #100 ist es wohl nicht, und die von dem im ersten Beitrag erwaehnten github Link kann ich nicht herunterladen: "@mschlappa's activity is private".
Kannst Du bitte deine Version hier anhaengen?
Hallo zusammen,
ich bin ebenfalls auf Suche nach der letzten Version des Moduls und da der Github Link wie erwähnt nicht mehr funktioniert, wäre es super, wenn mir jemand die letzte Version zur Verfügung stellen könnte?
Vielen Dank und viele Grüße!
Hallo zusammen,
ich nutze ebenfalls das Modul 70_KEBA.pm für meine KEBA KC-P30 Wallbox.
Auch mich stört, dass das Modul das Logfile (fhem.log) übermäßig füllt.
Wie können die Reports (1-3) deaktiviert, auf Report 1 beschränkt oder die Häufigkeit (aktuell jede Minute) auf ein größeres Intervall verändert werden?
Schon mal vielen Dank für hilfreiche Antworten.
Herzliche Grüße, Mario
Hallo zusammen,
die Häufigkeit der Reports wird bei der Definition der KEBA festgelegt.
define KEBA KEBA 192.168.xxx.xxx 7090 600
Der letzte Wert ist das Abfrageintervall.
Beste Grüße, Mario
Hallo,
ich bin kurz vor dem Kauf einer Keba P30 c serie.
Diese sollte auch mit diesem Modul steuerbar sein? Hat hier jemand zufällig die P30 im Einsatz?
Danke,
Tobi
Ich habe mir von der KI (https://claude.ai) ein Modul generieren lassen.
##############################################################################
# $Id: 98_KebaP30.pm $
#
# 98_KebaP30.pm
#
# FHEM module to control a Keba KeContact P30 wallbox via Modbus TCP
#
# Prerequisites:
# - FHEM ModbusTCP / ModbusAttr support (98_Modbus.pm, 98_ModbusAttr.pm)
# - Keba P30 with Modbus TCP enabled (DIP switch DSW1.3 = ON)
# - Network connectivity to the wallbox on TCP port 502
#
# Usage in FHEM:
# define myKeba KebaP30 <IP-Address> [<Interval>]
# Example: define myKeba KebaP30 192.168.1.50 30
#
# set myKeba chargingCurrent 10000 (in mA, e.g. 10000 = 10A)
# set myKeba enable 1 (1=enable, 0=disable)
# set myKeba unlock 0 (0=unlock plug)
# set myKeba setEnergy 5000 (in 0.1 Wh)
# set myKeba failsafeCurrent 6000 (in mA)
# set myKeba failsafeTimeout 60 (in seconds)
# set myKeba failsafePersist 0 (0 or 1)
#
##############################################################################
package main;
use strict;
use warnings;
use IO::Socket::INET;
use DevIo;
# Modbus Function Codes
use constant FC_READ_HOLDING => 0x03;
use constant FC_WRITE_SINGLE => 0x06;
# Keba P30 Modbus Unit ID (must be 255)
use constant KEBA_UNIT_ID => 255;
# Modbus TCP Port
use constant KEBA_PORT => 502;
# Default polling interval in seconds
use constant DEFAULT_INTERVAL => 30;
# ============================================================================
# Register-Definitionen (Keba P30 Modbus TCP Programmers Guide V1.04)
# ============================================================================
# Lesbare Register (Holding Registers, FC3, UINT32 = 2 Words)
my %readRegisters = (
'chargingState' => { addr => 1000, len => 2, type => 'uint32', unit => '', desc => 'Ladezustand (0=Startup,1=NotReady,2=Ready,3=Charging,4=Error,5=Suspended)' },
'cableState' => { addr => 1004, len => 2, type => 'uint32', unit => '', desc => 'Kabelzustand' },
'errorCode' => { addr => 1006, len => 2, type => 'uint32', unit => '', desc => 'Fehlercode' },
'currentL1' => { addr => 1008, len => 2, type => 'uint32', unit => 'mA', desc => 'Ladestrom Phase 1', factor => 1 },
'currentL2' => { addr => 1010, len => 2, type => 'uint32', unit => 'mA', desc => 'Ladestrom Phase 2', factor => 1 },
'currentL3' => { addr => 1012, len => 2, type => 'uint32', unit => 'mA', desc => 'Ladestrom Phase 3', factor => 1 },
'serialNumber' => { addr => 1014, len => 2, type => 'uint32', unit => '', desc => 'Seriennummer' },
'productType' => { addr => 1016, len => 2, type => 'uint32', unit => '', desc => 'Produkttyp und Features' },
'firmwareVersion' => { addr => 1018, len => 2, type => 'uint32', unit => '', desc => 'Firmware-Version' },
'activePower' => { addr => 1020, len => 2, type => 'uint32', unit => 'mW', desc => 'Aktive Leistung', factor => 1 },
'totalEnergy' => { addr => 1036, len => 2, type => 'uint32', unit => '0.1Wh', desc => 'Gesamtenergie', factor => 0.1 },
'voltageL1' => { addr => 1040, len => 2, type => 'uint32', unit => 'V', desc => 'Spannung Phase 1', factor => 1 },
'voltageL2' => { addr => 1042, len => 2, type => 'uint32', unit => 'V', desc => 'Spannung Phase 2', factor => 1 },
'voltageL3' => { addr => 1044, len => 2, type => 'uint32', unit => 'V', desc => 'Spannung Phase 3', factor => 1 },
'powerFactor' => { addr => 1046, len => 2, type => 'uint32', unit => '0.1%', desc => 'Leistungsfaktor (cos phi)', factor => 0.1 },
'maxChargingCurrent'=> { addr => 1100, len => 2, type => 'uint32', unit => 'mA', desc => 'Max. Ladestrom der Station', factor => 1 },
'maxSupportedCurr' => { addr => 1110, len => 2, type => 'uint32', unit => 'mA', desc => 'Max. unterstuetzter Ladestrom', factor => 1 },
'rfidCard' => { addr => 1500, len => 2, type => 'uint32', unit => '', desc => 'RFID Karten UID' },
'sessionEnergy' => { addr => 1502, len => 2, type => 'uint32', unit => '0.1Wh', desc => 'Energie aktuelle Session', factor => 0.1 },
);
# Schreibbare Register (FC6, UINT16 = 1 Word)
my %writeRegisters = (
'chargingCurrent' => { addr => 5004, len => 1, type => 'uint16', unit => 'mA', desc => 'Ladestrom setzen (0 oder 6000-63000 mA)', min => 0, max => 63000 },
'setEnergy' => { addr => 5010, len => 1, type => 'uint16', unit => '0.1Wh', desc => 'Energielimit setzen (0=kein Limit)', min => 0, max => 65535 },
'unlock' => { addr => 5012, len => 1, type => 'uint16', unit => '', desc => 'Stecker entriegeln (0=unlock)', min => 0, max => 0 },
'enable' => { addr => 5014, len => 1, type => 'uint16', unit => '', desc => 'Station ein/ausschalten (0=aus, 1=ein)', min => 0, max => 1 },
'failsafeCurrent' => { addr => 5016, len => 1, type => 'uint16', unit => 'mA', desc => 'Failsafe Ladestrom (6000-32000 mA)', min => 6000, max => 32000 },
'failsafeTimeout' => { addr => 5018, len => 1, type => 'uint16', unit => 's', desc => 'Failsafe Timeout (0=deaktiviert, 10-600 s)', min => 0, max => 600 },
'failsafePersist' => { addr => 5020, len => 1, type => 'uint16', unit => '', desc => 'Failsafe persistent speichern (0 oder 1)', min => 0, max => 1 },
);
# ============================================================================
# FHEM Interface Functions
# ============================================================================
sub KebaP30_Initialize($) {
my ($hash) = @_;
$hash->{DefFn} = "KebaP30_Define";
$hash->{UndefFn} = "KebaP30_Undef";
$hash->{SetFn} = "KebaP30_Set";
$hash->{GetFn} = "KebaP30_Get";
$hash->{AttrFn} = "KebaP30_Attr";
$hash->{NotifyFn} = "KebaP30_Notify";
$hash->{AttrList} = "disable:0,1 "
. "interval "
. "timeout "
. $readingFnAttributes;
return undef;
}
# ----------------------------------------------------------------------------
# Define: define myKeba KebaP30 <IP> [<Interval>]
# ----------------------------------------------------------------------------
sub KebaP30_Define($$) {
my ($hash, $def) = @_;
my @args = split("[ \t]+", $def);
return "Usage: define <name> KebaP30 <IP-Address> [<Interval>]"
if (@args < 3 || @args > 4);
my $name = $args[0];
my $ip = $args[2];
my $interval = (@args > 3) ? int($args[3]) : DEFAULT_INTERVAL;
$hash->{HOST} = $ip;
$hash->{PORT} = KEBA_PORT;
$hash->{UNIT_ID} = KEBA_UNIT_ID;
$hash->{INTERVAL} = $interval;
$hash->{TRANSID} = 0;
$hash->{STATE} = "initialized";
# Readings initialisieren
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "state", "initialized");
readingsEndUpdate($hash, 1);
# Timer fuer zyklisches Polling starten
RemoveInternalTimer($hash);
InternalTimer(gettimeofday() + 5, "KebaP30_Poll", $hash, 0);
Log3 $name, 3, "KebaP30 ($name): defined with host=$ip interval=${interval}s";
return undef;
}
# ----------------------------------------------------------------------------
# Undef
# ----------------------------------------------------------------------------
sub KebaP30_Undef($$) {
my ($hash, $name) = @_;
RemoveInternalTimer($hash);
KebaP30_Disconnect($hash);
return undef;
}
# ----------------------------------------------------------------------------
# Notify (z.B. bei INITIALIZED)
# ----------------------------------------------------------------------------
sub KebaP30_Notify($$) {
my ($hash, $devHash) = @_;
my $name = $hash->{NAME};
return if (IsDisabled($name));
my $events = deviceEvents($devHash, 1);
return if (!$events);
foreach my $event (@{$events}) {
if ($event =~ /^INITIALIZED$/ || $event =~ /^REREADCFG$/) {
KebaP30_Poll($hash);
}
}
return undef;
}
# ----------------------------------------------------------------------------
# Attr
# ----------------------------------------------------------------------------
sub KebaP30_Attr(@) {
my ($cmd, $name, $attrName, $attrVal) = @_;
my $hash = $defs{$name};
if ($attrName eq "interval") {
if ($cmd eq "set") {
return "interval must be a positive integer" unless ($attrVal =~ /^\d+$/ && $attrVal > 0);
$hash->{INTERVAL} = $attrVal;
} else {
$hash->{INTERVAL} = DEFAULT_INTERVAL;
}
RemoveInternalTimer($hash);
InternalTimer(gettimeofday() + $hash->{INTERVAL}, "KebaP30_Poll", $hash, 0);
}
if ($attrName eq "disable") {
if ($cmd eq "set" && $attrVal) {
RemoveInternalTimer($hash);
readingsSingleUpdate($hash, "state", "disabled", 1);
} else {
readingsSingleUpdate($hash, "state", "initialized", 1);
InternalTimer(gettimeofday() + 2, "KebaP30_Poll", $hash, 0);
}
}
return undef;
}
# ============================================================================
# Set-Befehle
# ============================================================================
sub KebaP30_Set($@) {
my ($hash, @a) = @_;
my $name = shift @a;
my $cmd = shift @a;
my $val = shift @a;
# Hilfe / Liste der Set-Befehle
my @cmds = sort keys %writeRegisters;
return "Unknown argument $cmd, choose one of " . join(" ", @cmds)
if (!defined($writeRegisters{$cmd}));
return "$cmd requires a numeric value" unless (defined($val) && $val =~ /^\d+$/);
my $reg = $writeRegisters{$cmd};
# Wertbereich pruefen (spezielle Behandlung fuer chargingCurrent: 0 oder 6000-63000)
if ($cmd eq 'chargingCurrent') {
return "$cmd: value must be 0 or between 6000 and 63000 mA"
unless ($val == 0 || ($val >= 6000 && $val <= 63000));
} elsif ($cmd eq 'failsafeTimeout') {
return "$cmd: value must be 0 or between 10 and 600"
unless ($val == 0 || ($val >= 10 && $val <= 600));
} else {
return "$cmd: value must be between $reg->{min} and $reg->{max}"
if ($val < $reg->{min} || $val > $reg->{max});
}
# Modbus Write
my $result = KebaP30_ModbusWrite($hash, $reg->{addr}, $val);
if (defined($result)) {
readingsSingleUpdate($hash, "last_set_$cmd", $val, 1);
Log3 $name, 4, "KebaP30 ($name): set $cmd = $val";
return undef;
} else {
return "KebaP30 ($name): Error writing register $reg->{addr} for $cmd";
}
}
# ============================================================================
# Get-Befehle
# ============================================================================
sub KebaP30_Get($@) {
my ($hash, @a) = @_;
my $name = shift @a;
my $cmd = shift @a;
my @cmds = sort keys %readRegisters;
push @cmds, "update";
return "Unknown argument $cmd, choose one of " . join(" ", @cmds)
if (!grep { $_ eq $cmd } @cmds);
if ($cmd eq "update") {
KebaP30_Poll($hash);
return "Polling all registers...";
}
my $reg = $readRegisters{$cmd};
my $val = KebaP30_ModbusRead($hash, $reg->{addr}, $reg->{len});
if (defined($val)) {
my $factor = $reg->{factor} // 1;
my $display = ($factor != 1) ? sprintf("%.1f", $val * $factor) : $val;
my $unit = $reg->{unit} || '';
return "$cmd: $display $unit";
} else {
return "Error reading $cmd from register $reg->{addr}";
}
}
# ============================================================================
# Polling (Timer-basiert)
# ============================================================================
sub KebaP30_Poll($) {
my ($hash) = @_;
my $name = $hash->{NAME};
RemoveInternalTimer($hash);
return if (IsDisabled($name));
Log3 $name, 5, "KebaP30 ($name): polling registers...";
readingsBeginUpdate($hash);
my $errorCount = 0;
foreach my $reading (sort keys %readRegisters) {
my $reg = $readRegisters{$reading};
my $val = KebaP30_ModbusRead($hash, $reg->{addr}, $reg->{len});
if (defined($val)) {
my $factor = $reg->{factor} // 1;
my $display = ($factor != 1) ? sprintf("%.1f", $val * $factor) : $val;
readingsBulkUpdate($hash, $reading, $display);
} else {
$errorCount++;
Log3 $name, 4, "KebaP30 ($name): Error reading $reading (register $reg->{addr})";
}
}
# Abgeleitete Readings
my $chargingState = ReadingsVal($name, "chargingState", "");
my %stateMap = (
0 => "startup",
1 => "not_ready",
2 => "ready",
3 => "charging",
4 => "error",
5 => "suspended",
);
my $stateText = $stateMap{$chargingState} // "unknown ($chargingState)";
readingsBulkUpdate($hash, "chargingStateText", $stateText);
# Leistung in kW
my $powerMw = ReadingsVal($name, "activePower", 0);
if ($powerMw =~ /^\d+$/) {
readingsBulkUpdate($hash, "activePower_kW", sprintf("%.3f", $powerMw / 1000000));
}
# Gesamtenergie in kWh
my $totalE = ReadingsVal($name, "totalEnergy", 0);
if ($totalE =~ /^[\d.]+$/) {
readingsBulkUpdate($hash, "totalEnergy_kWh", sprintf("%.3f", $totalE / 1000));
}
# Session-Energie in kWh
my $sessE = ReadingsVal($name, "sessionEnergy", 0);
if ($sessE =~ /^[\d.]+$/) {
readingsBulkUpdate($hash, "sessionEnergy_kWh", sprintf("%.3f", $sessE / 1000));
}
if ($errorCount == 0) {
readingsBulkUpdate($hash, "state", "connected");
} else {
readingsBulkUpdate($hash, "state", "polling_errors: $errorCount");
}
readingsEndUpdate($hash, 1);
# Naechsten Poll-Zyklus einplanen
my $interval = $hash->{INTERVAL} || DEFAULT_INTERVAL;
InternalTimer(gettimeofday() + $interval, "KebaP30_Poll", $hash, 0);
return undef;
}
# ============================================================================
# Modbus TCP Kommunikation
# ============================================================================
sub KebaP30_Connect($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $host = $hash->{HOST};
my $port = $hash->{PORT};
my $timeout = AttrVal($name, "timeout", 3);
my $sock = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => $timeout,
);
if (!$sock) {
Log3 $name, 2, "KebaP30 ($name): Cannot connect to $host:$port - $!";
return undef;
}
$sock->autoflush(1);
Log3 $name, 4, "KebaP30 ($name): Connected to $host:$port";
return $sock;
}
sub KebaP30_Disconnect($) {
my ($hash) = @_;
if ($hash->{SOCKET}) {
close($hash->{SOCKET});
delete $hash->{SOCKET};
}
}
# Naechste Transaction-ID
sub KebaP30_NextTransId($) {
my ($hash) = @_;
$hash->{TRANSID} = ($hash->{TRANSID} + 1) & 0xFFFF;
return $hash->{TRANSID};
}
# ----------------------------------------------------------------------------
# Modbus Read (FC3) - Liest ein UINT32 (2 Register) oder UINT16 (1 Register)
# ----------------------------------------------------------------------------
sub KebaP30_ModbusRead($$$) {
my ($hash, $addr, $len) = @_;
my $name = $hash->{NAME};
my $sock = KebaP30_Connect($hash);
return undef unless $sock;
my $transId = KebaP30_NextTransId($hash);
my $unitId = KEBA_UNIT_ID;
# Modbus TCP ADU: TransID(2) + ProtocolID(2) + Length(2) + UnitID(1) + FC(1) + Addr(2) + Qty(2)
my $request = pack("nnnCCnn",
$transId, # Transaction ID
0, # Protocol ID (Modbus)
6, # Length (UnitID + FC + Addr + Qty = 6 bytes)
$unitId, # Unit ID
FC_READ_HOLDING, # Function Code 3
$addr, # Starting Register Address
$len # Quantity of Registers
);
my $written = $sock->send($request);
if (!$written) {
Log3 $name, 2, "KebaP30 ($name): Send error for register $addr";
close($sock);
return undef;
}
# Antwort lesen (max. 256 Bytes, Timeout beachten)
my $timeout = AttrVal($name, "timeout", 3);
my $rin = '';
vec($rin, fileno($sock), 1) = 1;
my $nfound = select($rin, undef, undef, $timeout);
if ($nfound <= 0) {
Log3 $name, 2, "KebaP30 ($name): Timeout reading register $addr";
close($sock);
return undef;
}
my $response = '';
$sock->recv($response, 256);
close($sock);
if (length($response) < 9) {
Log3 $name, 2, "KebaP30 ($name): Short response for register $addr (" . length($response) . " bytes)";
return undef;
}
# Antwort parsen
my ($rTransId, $rProtoId, $rLen, $rUnitId, $rFC, $byteCount) = unpack("nnnCCC", $response);
# Fehlercode pruefen (FC + 0x80)
if ($rFC & 0x80) {
my $exCode = unpack("C", substr($response, 8, 1));
Log3 $name, 2, "KebaP30 ($name): Modbus exception $exCode for register $addr";
return undef;
}
# Datenbytes extrahieren
my $data = substr($response, 9);
if ($len == 2 && length($data) >= 4) {
# UINT32: Big-Endian, 2 Register = 4 Bytes
return unpack("N", $data);
} elsif ($len == 1 && length($data) >= 2) {
# UINT16: Big-Endian, 1 Register = 2 Bytes
return unpack("n", $data);
}
Log3 $name, 2, "KebaP30 ($name): Unexpected data length for register $addr";
return undef;
}
# ----------------------------------------------------------------------------
# Modbus Write Single Register (FC6) - Schreibt UINT16
# ----------------------------------------------------------------------------
sub KebaP30_ModbusWrite($$$) {
my ($hash, $addr, $value) = @_;
my $name = $hash->{NAME};
my $sock = KebaP30_Connect($hash);
return undef unless $sock;
my $transId = KebaP30_NextTransId($hash);
my $unitId = KEBA_UNIT_ID;
# Modbus TCP ADU: TransID(2) + ProtocolID(2) + Length(2) + UnitID(1) + FC(1) + Addr(2) + Value(2)
my $request = pack("nnnCCnn",
$transId, # Transaction ID
0, # Protocol ID
6, # Length
$unitId, # Unit ID
FC_WRITE_SINGLE, # Function Code 6
$addr, # Register Address
$value # Value
);
my $written = $sock->send($request);
if (!$written) {
Log3 $name, 2, "KebaP30 ($name): Send error writing register $addr";
close($sock);
return undef;
}
# Antwort lesen
my $timeout = AttrVal($name, "timeout", 3);
my $rin = '';
vec($rin, fileno($sock), 1) = 1;
my $nfound = select($rin, undef, undef, $timeout);
if ($nfound <= 0) {
Log3 $name, 2, "KebaP30 ($name): Timeout writing register $addr";
close($sock);
return undef;
}
my $response = '';
$sock->recv($response, 256);
close($sock);
if (length($response) < 12) {
Log3 $name, 2, "KebaP30 ($name): Short write response for register $addr";
return undef;
}
my ($rTransId, $rProtoId, $rLen, $rUnitId, $rFC) = unpack("nnnCC", $response);
if ($rFC & 0x80) {
my $exCode = unpack("C", substr($response, 8, 1));
Log3 $name, 2, "KebaP30 ($name): Modbus write exception $exCode for register $addr";
return undef;
}
Log3 $name, 4, "KebaP30 ($name): Wrote value $value to register $addr";
return 1;
}
1;
# ============================================================================
# Commandref-Dokumentation (fuer FHEM)
# ============================================================================
=pod
=item device
=item summary Keba KeContact P30 Wallbox via Modbus TCP
=item summary_DE Keba KeContact P30 Wallbox ueber Modbus TCP steuern
=begin html
<a name="KebaP30"></a>
<h3>KebaP30</h3>
<ul>
FHEM module to monitor and control a Keba KeContact P30 wallbox via Modbus TCP.<br>
The wallbox must have Modbus TCP enabled (DIP switch DSW1.3 = ON).<br><br>
<a name="KebaP30define"></a>
<b>Define</b>
<ul>
<code>define <name> KebaP30 <IP-Address> [<Interval>]</code><br><br>
Example: <code>define myKeba KebaP30 192.168.1.50 30</code><br>
Interval is the polling interval in seconds (default: 30).
</ul><br>
<a name="KebaP30set"></a>
<b>Set</b>
<ul>
<li><b>chargingCurrent</b> <mA> - Set charging current (0 or 6000-63000 mA)</li>
<li><b>enable</b> <0|1> - Enable (1) or disable (0) charging station</li>
<li><b>unlock</b> 0 - Unlock the charging plug</li>
<li><b>setEnergy</b> <0.1Wh> - Set energy limit (0 = no limit)</li>
<li><b>failsafeCurrent</b> <mA> - Failsafe current (6000-32000 mA)</li>
<li><b>failsafeTimeout</b> <s> - Failsafe timeout (0=off, 10-600 s)</li>
<li><b>failsafePersist</b> <0|1> - Persist failsafe settings</li>
</ul><br>
<a name="KebaP30get"></a>
<b>Get</b>
<ul>
<li><b>update</b> - Force immediate polling of all registers</li>
<li><b>chargingState</b> - Current charging state</li>
<li><b>cableState</b> - Cable connection state</li>
<li><b>errorCode</b> - Error code</li>
<li><b>currentL1/L2/L3</b> - Charging current per phase (mA)</li>
<li><b>voltageL1/L2/L3</b> - Voltage per phase (V)</li>
<li><b>activePower</b> - Active power (mW)</li>
<li><b>totalEnergy</b> - Total charged energy</li>
<li><b>sessionEnergy</b> - Energy of current session</li>
<li><b>powerFactor</b> - Power factor (cos phi)</li>
<li><b>serialNumber</b> - Serial number</li>
<li><b>firmwareVersion</b> - Firmware version</li>
<li>... and more (see register definitions)</li>
</ul><br>
<a name="KebaP30readings"></a>
<b>Readings</b>
<ul>
All readable registers are available as readings. Additional computed readings:
<li><b>chargingStateText</b> - Human-readable charging state</li>
<li><b>activePower_kW</b> - Active power in kW</li>
<li><b>totalEnergy_kWh</b> - Total energy in kWh</li>
<li><b>sessionEnergy_kWh</b> - Session energy in kWh</li>
</ul><br>
<a name="KebaP30attr"></a>
<b>Attributes</b>
<ul>
<li><b>interval</b> - Polling interval in seconds (default: 30)</li>
<li><b>timeout</b> - Connection timeout in seconds (default: 3)</li>
<li><b>disable</b> - Disable the device (0|1)</li>
</ul>
</ul>
=end html
=cut
Die Doku dazu:
ZitatInstallation & Nutzung:
Die Datei als 98_KebaP30.pm ins FHEM-Modulverzeichnis (üblicherweise /opt/fhem/FHEM/) legen, dann in FHEM:
reload 98_KebaP30.pm
define myKeba KebaP30 192.168.1.50 30
Einige Hinweise zur Keba P30:
Der TCP-Port 502 ist reserviert und die Unit ID muss auf 255 gesetzt sein Wallbox Center – das ist im Modul bereits korrekt konfiguriert.
Modbus TCP wird über den DIP-Schalter DSW1.3 auf der Platine aktiviert TapHome, danach muss die Wallbox neu gestartet werden.
Es ist nicht möglich, mehrere Register gleichzeitig zu lesen – die maximale Leselänge beträgt 2 Words Wallbox Center, weshalb das Modul jedes Register einzeln abfragt.
Das empfohlene Timing-Intervall zum Lesen beträgt mindestens 0,5 Sekunden Wallbox Center – das Modul hält dies durch sequenzielles Lesen automatisch ein.
Mein erster Test damit:
- Es verbindet sich mit meiner Wallbox und liest auch Werte aus.
- Ich konnte den Ladestrom auf 6A setzen.
Bevor ich jetzte weiter teste, kann mal jemand über das Coding schauen, ob das überhaupt Sinn macht?
Ich traue den KI's noch nicht. Zumindest in ABAP (SAP Coding) kommt da z.T. nur Mist raus. Hier scheint es aber funktioniert zu haben.
Ich habe es mal ueberflogen.
Achtung: von dem verwendeten Protokoll habe ich keine Ahnung.
Zusammengefasst: das Modul funkioniert vermutlich im Normalfall.
Wenn das Geraet nicht erreichbar ist, dann wird FHEM fuer 19*3 Sekunden blockiert, nach 30 Sekunden dann wieder, usw.
Im Einzelnen:
- den Sinn der Funktion KebaP30_Notify habe ich nicht verstanden, ich wuerde es entfernen, samt den Hinweis darauf in KebaP30_Initialize
- KebaP30_Disconnect ist sicher sinnlos: $hash->{SOCKET} wird nie gesetzt.
- fuer die Abfrage wird IO::Socket::INET verwendet, was FHEM blockieren kann. Richtig waere DevIO_OpenDev im Define und ein ReadyFn, um bei Abbruch die Verbindung neu aufzumachen.
- die Verbindung wird fuer jeden Lese- oder Schreibvorgang neu aufgemacht, das sollte man cachen, wenn man schon kein DevIO_OpenDev haben will. Dann koennte auch KebaP30_Disconnect was Sinnvolles tun.
- der Hinweis auf "FHEM ModbusTCP" ist sinnlos, genauso wie das "use DevIo", beides wird nicht verwendet
Interessant zu sehen, dass:
- manchmal readingsBeginUpdate+BulkUpdate+EndUpdate verwendet wird, manchmal das einfacher lesbare readingsSingleUpdate.
- Variablen in $hash/%readRegisters gesetzt werden (interval , UNIT_ID, factor), um spaeter im Code doch die Konstanten zu verwenden.
- es dokumentiert jeden einzelnen Register in $readRegisters->desc, um es dann nicht zu verwenden.
Erst einmal VIELEN DANK für das Analysieren. Wie gesagt, ich kenne mich zwar in ABAP, Java aus, aber bei FHEM-Modulen hört es dann auch. Trotzdem brauche ich aber eine Funktion, für die Wallbox.
Das grobe Gerüst habe ich ja nun und werden versuchen, deine Anmerkungen einzupflegen - möglichst ohne die KI.
Einfacher wäre natürlich, wenn der TE oder wer auch immer den Code für das Modul hier aus dem Thread noch hätte.
--
Ich war ja nun hier wirklich Unerfahrener. Auf Kurz oder Lang soll aber die KI Coding übernehmen und die Firmen verzichten schon auf Juniorentwickler. In ABAP kann ich den Mist der KI kontrollieren und wie ich sehen, hat es auch hier nicht 100% geklappt, dass die KI was vernünftiges liefert. Was wird erst, wenn das keine mehr kontrolliert :(.
Da das mit der KI nicht so 100% funktioniert, habe ich mal das Module 98_Pluggit.pm genommen. Dies scheint ja auf den Beispielen https://wiki.fhem.de/wiki/Modbus zu basieren. Damit wäre es einheitlich zu anderen Modulen und nicht irgendwas KI-generiertes.
D.h. wenn ich mein 98_KebaP30.pm auf die Logik gemäß Anleitung umstelle, sollte ich ich die genannten Problem nicht haben?
Das Coding sieht auch deutlich kürzer aus, als das von der KI.
Der Aufbau der Verbindung zur Wallbox läuft dann sicher analog.
--
Entscheidend ist am Ende also das Mapping:
Beispiel
my %XYparseInfo = (
"h256" => { reading => "Temp_Wasser_Ein", # name of the reading for this value
},
"h258" => { reading => "Temp_Wasser_Aus",
},
KI-Code
my %readRegisters = (
'chargingState' => { addr => 1000, len => 2, type => 'uint32', unit => '', desc => 'Ladezustand (0=Startup,1=NotReady,2=Ready,3=Charging,4=Error,5=Suspended)' },
'cableState' => { addr => 1004, len => 2, type => 'uint32', unit => '', desc => 'Kabelzustand' },
Code vom PlugIt-Modul
my %PluggitparseInfo = (
"h472" => { reading => "CurrentUnitMode", # name of the reading for this value
name => "prmCurrentBLState", # internal name of this register in the hardware doc
min => 0, # input validation for set: min value
max => 4, # input validation for set: max value
len => 2,
Wofür ist denn das "h472","h256", "h258"? Das sind noch nicht die Namen von der Hardware?
Bei Pluggit-Modul ist Name = "prmCurrentBLState", Muss ich bei der Keba dafür "1000" bzw. "1004" nehmen? Also ist das die Adresse vom Modbus?
ZitatD.h. wenn ich mein 98_KebaP30.pm auf die Logik gemäß Anleitung umstelle, sollte ich ich die genannten Problem nicht haben?
Ich kenne das Modbus Modul nicht, aber ein erster Blick zeigt, dass es die "richtigen" Funktionen verwendet.
Weiterhin wird das Modbus Modul in FHEM Umfeld haeufig verwendet, das waere auch ein Argument dafuer.
Die Zeile
require "$attr{global}{modpath}/FHEM/DevIo.pm";
ist im 98_Pluggit.pm ueberfluessig.
ZitatDie Zeile...ist im 98_Pluggit.pm ueberfluessig.
Das steht so im Wiki (https://wiki.fhem.de/wiki/Modbus)
Das war nur als Beispiel. Das Modul nutze ich nur...
--
Ich muss zugeben, ich habe mir die neue .pm-Datei auch wieder via KI generieren lassen. Der KI einfach die Anweisung gegeben, das Coding gemäß fhem-Wiki (URL) zu erstellen.
Ergebnis, was bei mir aktuell auch läuft:
(Irgendwie finde ich nicht, wie man Dateien hier im Forum hochladen kann)
##############################################################################
# $Id: 98_KebaP30.pm $
#
# 98_KebaP30.pm
#
# FHEM module to control a Keba KeContact P30 wallbox via Modbus TCP.
# Based on the 98_Modbus.pm library (parseInfo / deviceInfo structure).
#
# Prerequisites:
# - 98_Modbus.pm must be present in the FHEM installation
# - Keba P30 with Modbus TCP enabled (DIP switch DSW1.3 = ON)
# - Network connectivity to the wallbox on TCP port 502
#
# Define (Modbus TCP):
# define <name> KebaP30 <Interval> <IP>:502 TCP
#
# Example:
# define myKeba KebaP30 30 192.168.1.50:502 TCP
#
# Notes:
# - Keba P30 requires Unit ID 255 (set via attr <name> dev-h-defPoll 1)
# - Supported Modbus function codes: FC3 (Read) and FC6 (Write)
# - Registers cannot be read in bulk; combine is set to 1
# - Recommended polling interval >= 0.5s per register
#
# Register reference:
# Keba KeContact P30 Modbus TCP Programmers Guide V1.04
#
##############################################################################
package main;
use strict;
use warnings;
# ============================================================================
# parseInfo: Mapping Modbus-Register -> FHEM Readings
#
# Keba P30 uses Holding Registers (FC3 read, FC6 write)
# - Readable registers: address 1000-1502, UINT32 (len=2)
# - Writable registers: address 5004-5020, UINT16 (len=1)
# - Unit ID must be 255
# - Register address count starts at 0
# ============================================================================
my %KebaP30parseInfo = (
# -----------------------------------------------------------------------
# Lesbare Register (UINT32, 2 Register = 4 Bytes, Big Endian)
# -----------------------------------------------------------------------
# 1000 - Charging state
"h1000" => {
reading => "chargingState",
name => "State",
len => 2,
unpack => "N", # UINT32 Big Endian
poll => 1,
showget => 1,
map => "0:startup, 1:not_ready, 2:ready, 3:charging, 4:error, 5:suspended",
},
# 1004 - Cable state
"h1004" => {
reading => "cableState",
name => "Cable",
len => 2,
unpack => "N",
poll => 1,
showget => 1,
map => "0:no_cable, 1:cable_no_car, 3:cable_locked_no_car, 5:cable_locked_car, 7:cable_locked_car_ok",
},
# 1006 - Error code
"h1006" => {
reading => "errorCode",
name => "Error",
len => 2,
unpack => "N",
poll => 1,
showget => 1,
},
# 1008 - Charging current phase 1 (mA)
"h1008" => {
reading => "currentL1",
name => "CurrL1",
len => 2,
unpack => "N",
expr => '$val / 1000', # mA -> A
format => '%.3f',
poll => 1,
showget => 1,
},
# 1010 - Charging current phase 2 (mA)
"h1010" => {
reading => "currentL2",
name => "CurrL2",
len => 2,
unpack => "N",
expr => '$val / 1000',
format => '%.3f',
poll => 1,
showget => 1,
},
# 1012 - Charging current phase 3 (mA)
"h1012" => {
reading => "currentL3",
name => "CurrL3",
len => 2,
unpack => "N",
expr => '$val / 1000',
format => '%.3f',
poll => 1,
showget => 1,
},
# 1014 - Serial number
"h1014" => {
reading => "serialNumber",
name => "Serial",
len => 2,
unpack => "N",
poll => "once",
showget => 1,
},
# 1016 - Product type and features
"h1016" => {
reading => "productType",
name => "ProdType",
len => 2,
unpack => "N",
poll => "once",
showget => 1,
},
# 1018 - Firmware version (decimal, convert to hex to read)
"h1018" => {
reading => "firmwareVersion",
name => "FWVersion",
len => 2,
unpack => "N",
expr => 'sprintf("%x", $val)', # Dezimal -> Hex-String
poll => "once",
showget => 1,
},
# 1020 - Active power (mW)
"h1020" => {
reading => "activePower",
name => "Power",
len => 2,
unpack => "N",
expr => '$val / 1000000', # mW -> kW
format => '%.3f',
poll => 1,
showget => 1,
},
# 1036 - Total energy (0.1 Wh)
"h1036" => {
reading => "totalEnergy",
name => "TotalEnergy",
len => 2,
unpack => "N",
expr => '$val / 10000', # 0.1Wh -> kWh
format => '%.3f',
poll => 1,
showget => 1,
},
# 1040 - Voltage phase 1 (V)
"h1040" => {
reading => "voltageL1",
name => "VoltL1",
len => 2,
unpack => "N",
poll => 1,
showget => 1,
},
# 1042 - Voltage phase 2 (V)
"h1042" => {
reading => "voltageL2",
name => "VoltL2",
len => 2,
unpack => "N",
poll => 1,
showget => 1,
},
# 1044 - Voltage phase 3 (V)
"h1044" => {
reading => "voltageL3",
name => "VoltL3",
len => 2,
unpack => "N",
poll => 1,
showget => 1,
},
# 1046 - Power factor (cos phi, in 0.1%)
"h1046" => {
reading => "powerFactor",
name => "CosPhi",
len => 2,
unpack => "N",
expr => '$val / 10', # 0.1% -> %
format => '%.1f',
poll => 1,
showget => 1,
},
# 1100 - Max charging current of the station (mA)
"h1100" => {
reading => "maxChargingCurrent",
name => "MaxCurr",
len => 2,
unpack => "N",
expr => '$val / 1000', # mA -> A
format => '%.1f',
poll => "once",
showget => 1,
},
# 1110 - Max supported current (mA)
"h1110" => {
reading => "maxSupportedCurrent",
name => "MaxSupCurr",
len => 2,
unpack => "N",
expr => '$val / 1000',
format => '%.1f',
poll => "once",
showget => 1,
},
# 1500 - RFID card UID
"h1500" => {
reading => "rfidCard",
name => "RFID",
len => 2,
unpack => "N",
expr => 'sprintf("%08X", $val)', # als Hex-String
poll => 1,
showget => 1,
},
# 1502 - Session energy (0.1 Wh)
"h1502" => {
reading => "sessionEnergy",
name => "SessEnergy",
len => 2,
unpack => "N",
expr => '$val / 10000', # 0.1Wh -> kWh
format => '%.3f',
poll => 1,
showget => 1,
},
# -----------------------------------------------------------------------
# Schreibbare Register (UINT16, 1 Register, FC6)
# -----------------------------------------------------------------------
# 5004 - Set charging current (mA, 0 or 6000-63000)
"h5004" => {
reading => "setChargingCurrent",
name => "SetCurr",
len => 1,
unpack => "n", # UINT16 Big Endian
set => 1,
min => 0,
max => 63000,
hint => "0,6000,8000,10000,13000,16000,20000,25000,32000",
poll => 0,
},
# 5010 - Set energy limit (0.1 Wh, 0 = no limit)
"h5010" => {
reading => "setEnergy",
name => "SetEnergy",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 65535,
poll => 0,
},
# 5012 - Unlock plug (0 = unlock)
"h5012" => {
reading => "unlock",
name => "Unlock",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 0,
hint => "0:unlock",
poll => 0,
},
# 5014 - Enable/Disable station (0 = disable, 1 = enable)
"h5014" => {
reading => "enableStation",
name => "Enable",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 1,
map => "0:disable, 1:enable",
poll => 0,
},
# 5016 - Failsafe current (mA, 6000-32000)
"h5016" => {
reading => "failsafeCurrent",
name => "FsCurr",
len => 1,
unpack => "n",
set => 1,
min => 6000,
max => 32000,
poll => 0,
},
# 5018 - Failsafe timeout (s, 0 = off, 10-600)
"h5018" => {
reading => "failsafeTimeout",
name => "FsTimeout",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 600,
poll => 0,
},
# 5020 - Failsafe persist (0 or 1)
"h5020" => {
reading => "failsafePersist",
name => "FsPersist",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 1,
map => "0:no, 1:yes",
poll => 0,
},
# 5050 - Phase switch toggle (0 = 1-phase, 1 = 3-phase)
# Requires external contactor (e.g. Keba S10) on X2 contact.
# Only available on x-series / firmware supporting V1.04+.
"h5050" => {
reading => "phaseSwitchToggle",
name => "PhaseToggle",
len => 1,
unpack => "n",
set => 1,
min => 0,
max => 1,
map => "0:1-phase, 1:3-phase",
poll => 0,
},
# 5052 - Trigger phase switch
# Writing 1 triggers the actual phase switch.
# Charging must be stopped before switching.
# Requires external contactor on X2 contact.
"h5052" => {
reading => "phaseSwitchTrigger",
name => "PhaseTrigger",
len => 1,
unpack => "n",
set => 1,
min => 1,
max => 1,
hint => "1:trigger",
poll => 0,
},
);
# ============================================================================
# deviceInfo: Geraete-Defaults und Timing
#
# Keba P30 Besonderheiten:
# - Unit ID = 255
# - Nur Holding Registers (FC3 lesen, FC6 schreiben)
# - Kein Bulk-Read moeglich (combine = 1)
# - Min. 0.5s zwischen Lesevorgaengen
# ============================================================================
my %KebaP30deviceInfo = (
"timing" => {
timeout => 3, # 3 Sekunden Timeout
commDelay => 0.7, # 0.7s Pause zwischen Kommunikation
sendDelay => 0.7, # 0.7s Pause zwischen Sende-Vorgaengen
},
"h" => { # Holding Registers
read => 3, # FC3 (Read Holding Registers)
write => 6, # FC6 (Write Single Register)
combine => 1, # Kein Bulk-Read, nur einzeln!
defLen => 2, # Default: UINT32 = 2 Register
defUnpack => "N", # Default: UINT32 Big Endian unsigned
defPoll => 1, # Default: alle Register pollen
defShowGet => 1, # Default: Get in FHEMWEB anzeigen
},
);
# ============================================================================
# Initialize: Modul bei FHEM registrieren
# ============================================================================
sub KebaP30_Initialize($) {
my ($modHash) = @_;
# Modbus-Basismodul laden
LoadModule "Modbus";
require "$attr{global}{modpath}/FHEM/DevIo.pm";
# parseInfo und deviceInfo zuweisen
$modHash->{parseInfo} = \%KebaP30parseInfo;
$modHash->{deviceInfo} = \%KebaP30deviceInfo;
# Generische Modbus-Initialisierung (setzt DefFn, SetFn, GetFn, etc.)
ModbusLD_Initialize($modHash);
# Attribute: Standard + ObjAttr (pro Register) + DevAttr (Geraete-Defaults)
$modHash->{AttrList} = $modHash->{AttrList} . " " .
$modHash->{ObjAttrList} . " " .
$modHash->{DevAttrList} . " " .
"disable:0,1 ";
}
1;
# ============================================================================
# Commandref-Dokumentation
# ============================================================================
=pod
=item device
=item summary Keba KeContact P30 Wallbox via Modbus TCP
=item summary_DE Keba KeContact P30 Wallbox ueber Modbus TCP steuern
=begin html
<a id="KebaP30"></a>
<h3>KebaP30</h3>
<ul>
FHEM module to monitor and control a Keba KeContact P30 wallbox
via Modbus TCP. Uses the 98_Modbus.pm base module as a library.<br><br>
The wallbox must have Modbus TCP enabled (DIP switch DSW1.3 = ON).<br>
The Keba P30 requires Modbus Unit ID 255 and uses TCP port 502.<br><br>
<a name="KebaP30define"></a>
<b>Define</b>
<ul>
<code>define <name> KebaP30 255 <Interval> <IP>:502 TCP</code><br><br>
<ul>
<li>255 = Modbus Unit ID (required by Keba P30)</li>
<li>Interval = polling interval in seconds (e.g. 30)</li>
<li>IP:502 = IP address and Modbus TCP port</li>
<li>TCP = Modbus TCP mode</li>
</ul><br>
Example:<br>
<code>define myKeba KebaP30 255 30 192.168.1.50:502 TCP</code><br>
</ul><br>
<a name="KebaP30set"></a>
<b>Set</b>
<ul>
<li><b>setChargingCurrent</b> <mA> - Charging current
(0=stop or 6000-63000 mA)</li>
<li><b>enableStation</b> enable|disable - Enable or disable station</li>
<li><b>unlock</b> unlock - Unlock the charging plug</li>
<li><b>setEnergy</b> <0.1Wh> - Energy limit (0=no limit)</li>
<li><b>failsafeCurrent</b> <mA> - Failsafe current (6000-32000)</li>
<li><b>failsafeTimeout</b> <s> - Failsafe timeout (0=off, 10-600)</li>
<li><b>failsafePersist</b> no|yes - Persist failsafe settings</li>
<li><b>phaseSwitchToggle</b> 1-phase|3-phase - Select phase mode
(requires external contactor on X2)</li>
<li><b>phaseSwitchTrigger</b> trigger - Execute the phase switch
(charging must be stopped first)</li>
</ul><br>
<a name="KebaP30readings"></a>
<b>Readings (active during polling)</b>
<ul>
<li><b>chargingState</b> - Charging state (startup/not_ready/ready/
charging/error/suspended)</li>
<li><b>cableState</b> - Cable connection state</li>
<li><b>errorCode</b> - Error code (0 = no error)</li>
<li><b>currentL1/L2/L3</b> - Charging current per phase (A)</li>
<li><b>voltageL1/L2/L3</b> - Voltage per phase (V)</li>
<li><b>activePower</b> - Active power (kW)</li>
<li><b>totalEnergy</b> - Total charged energy (kWh)</li>
<li><b>sessionEnergy</b> - Energy of current session (kWh)</li>
<li><b>powerFactor</b> - Power factor / cos phi (%)</li>
<li><b>maxChargingCurrent</b> - Max charging current (A)</li>
<li><b>maxSupportedCurrent</b> - Max supported current (A)</li>
<li><b>serialNumber</b> - Serial number (polled once)</li>
<li><b>productType</b> - Product type (polled once)</li>
<li><b>firmwareVersion</b> - Firmware version as hex (polled once)</li>
<li><b>rfidCard</b> - Last RFID card UID</li>
</ul><br>
<a name="KebaP30attr"></a>
<b>Attributes</b>
<ul>
Standard attributes from the Modbus base module are available.<br>
Per-register overrides are possible via obj-hXXXX-* attributes.<br>
Device defaults can be modified via dev-* attributes.<br><br>
<li><b>disable</b> 0|1 - Disable the device</li>
</ul><br>
<b>Notes</b>
<ul>
<li>The Keba P30 does not support reading multiple registers at once
(combine is set to 1).</li>
<li>Static values (serial, firmware, product type, max currents) are
polled only once to reduce bus load.</li>
<li>Voltages may read 0 when no vehicle is connected/charging.</li>
<li>The minimum charging current is 6A (6000 mA). Below 6A the Keba
automatically switches from 3-phase to 1-phase.</li>
<li>To stop charging, set setChargingCurrent to 0.</li>
</ul>
</ul>
=end html
=begin html_DE
<a id="KebaP30"></a>
<h3>KebaP30</h3>
<ul>
FHEM-Modul zur Ueberwachung und Steuerung einer Keba KeContact P30
Wallbox ueber Modbus TCP. Nutzt das 98_Modbus.pm Basismodul.<br><br>
Voraussetzungen:<br>
<ul>
<li>Modbus TCP an der Wallbox aktiviert (DIP-Schalter DSW1.3 = ON)</li>
<li>Netzwerkverbindung zur Wallbox auf TCP Port 502</li>
</ul><br>
<a name="KebaP30define"></a>
<b>Define</b>
<ul>
<code>define <name> KebaP30 255 <Interval> <IP>:502 TCP</code><br><br>
Beispiel:<br>
<code>define myKeba KebaP30 255 30 192.168.1.50:502 TCP</code><br>
</ul><br>
<a name="KebaP30set"></a>
<b>Set-Befehle</b>
<ul>
<li><b>setChargingCurrent</b> - Ladestrom in mA (0 oder 6000-63000)</li>
<li><b>enableStation</b> - Ladestation ein-/ausschalten</li>
<li><b>unlock</b> - Ladestecker entriegeln</li>
<li><b>setEnergy</b> - Energielimit in 0.1 Wh (0 = kein Limit)</li>
<li><b>failsafeCurrent</b> - Failsafe-Strom in mA</li>
<li><b>failsafeTimeout</b> - Failsafe-Timeout in Sekunden</li>
<li><b>failsafePersist</b> - Failsafe-Einstellungen persistent speichern</li>
<li><b>phaseSwitchToggle</b> - Phasenmodus waehlen: 1-phasig oder 3-phasig
(benoetigt externen Schuetz am X2-Kontakt)</li>
<li><b>phaseSwitchTrigger</b> - Phasenumschaltung ausfuehren
(Ladevorgang muss vorher gestoppt sein)</li>
</ul><br>
<b>Readings</b>
<ul>
<li>chargingState - Ladezustand</li>
<li>cableState - Kabelzustand</li>
<li>errorCode - Fehlercode</li>
<li>currentL1/L2/L3 - Ladestrom pro Phase (A)</li>
<li>voltageL1/L2/L3 - Spannung pro Phase (V)</li>
<li>activePower - Aktive Leistung (kW)</li>
<li>totalEnergy - Gesamtenergie (kWh)</li>
<li>sessionEnergy - Session-Energie (kWh)</li>
<li>powerFactor - Leistungsfaktor cos phi (%)</li>
<li>maxChargingCurrent - Max. Ladestrom (A)</li>
<li>serialNumber - Seriennummer</li>
<li>firmwareVersion - Firmware-Version (hex)</li>
<li>rfidCard - Letzte RFID-Karten-UID</li>
</ul>
</ul>
=end html_DE
=cut
Infos dazu:
- Die Register 5050 und 5052 sind nur nutzbar, wenn man einen Schütz verwendet (Steht auch in der CommandRef.)
- Leider wird die "Device specific help" bei mir nicht angezeigt: "No help found for module: kebap30"
- Die Zeile
require "$attr{global}{modpath}/FHEM/DevIo.pm";hat die KI auch mit generiert. Warum wird diese nicht benötigt? Macht das
LoadModule "Modbus"; schon mit?
- Bei der Pluggit.pm gibt es noch ein Methode, wo ich nicht weiß, wofür die ist.:
sub
Pluggit_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t]+", $def);
my ($name, $module, $interval, $dest) = @a;
my $ret = "";
return "wrong syntax: define <name> $module [interval] [host]"
if(@a < 2);
return ModbusLD_Define ($hash, $name . " " . $module . " " . $id . " " . $interval . " " . $dest . ":" . $port . " " . $proto);
}
welche dann vermutlich hier dynamisch gerufen wird:
Pluggit_Initialize($)
{
[...]
ModbusLD_Initialize($modHash); # Generic function of the Modbus module does the rest
$modHash->{DefFn} = "Pluggit_Define"; #<----HIER-----
$modHash->{AttrList} = $modHash->{AttrList} . " " . # Standard Attributes like IODEv etc
[...]
...da fehlen mir etwas die Kenntnisse in der Perl-Syntax :).
Zitatrequire "$attr{global}{modpath}/FHEM/DevIo.pm";
hat die KI auch mit generiert. Warum wird diese nicht benötigt? Macht das
Wenn man keine DevIo Funktionen in diesem Modul aufruft, dann braucht man auch nicht die Definition dieser Funktionen.
98_Modbus.pm verwendet DevIo, das Modul bindet es auch ein. Ueber "use DevIo", weil require manchmal problematisch ist.
Zitat- Bei der Pluggit.pm gibt es noch ein Methode, wo ich nicht weiß, wofür die ist.:
Die Pluggit_Define Funktion wird bei define (oder defmod) aufgerufen, prueft Parameter und initialisiert die Verbindung, indem sie ModbusLD_Define mit dem richtigen Parameter aufruft.
Pluggit_Initialize wird beim Laden des Moduls aufgerufen, der Name ist fest vorgegeben (<ModulName>_Initialize).
Apropos Syntax:
return ModbusLD_Define ($hash, $name . " " . $module . " " . $id . " " . $interval . " " . $dest . ":" . $port . " " . $proto);
wuerde ich als
return ModbusLD_Define ($hash, "$name $module $id $interval $dest:$port $proto");
schreiben, ich finde es besser lesbar.
Hallo Zusammen,
könnte mir bitte jemand das Modul 70_Keba.pm zur Verfügung stellen?
Schöne Grüße
Matthias
Zitat von: jackyno.71986 am 08 April 2026, 10:14:18könnte mir bitte jemand das Modul 70_Keba.pm zur Verfügung stellen?
Das hatte ich auch schon angefragt, aber leider keine Datei bekommen.
Darum habe ich das Modul 98_KebaP30.pm von der KI generieren lassen.
Für die KEBA P30 läuft dieses auch.
Ich habe die Anfrage leider nicht mitbekommen, sonst hätte ich sie schon früher gepostet. Anbei eine 70_KEBA.pm
Sie läuft bei mir mit einer "Keba KeContact P30 DE440 Deutschland Edition". Leider kann die Wallbox selbst nicht viel, daher nutze ich nur ein/aus und das Einstellen des Ladestromes.
Zitat von: PeterLustig am 09 April 2026, 11:10:38Leider kann die Wallbox selbst nicht viel, daher nutze ich nur ein/aus und das Einstellen des Ladestromes.
Ich habe das Coding mal kurz überflogen. Aber wie stellst du da den Ladstrom ein.
Vermutlich irgendwie mit "KEBA_sets"...
--
Die P30 kann schon etwas mehr. KEBA ist also nicht gleich "KEBA".
Wer das Module verwendet - 70_KEBA.pm oder 98_KebaP30.pm sollte also Coding, mit den API-Spec für Modbus zu seiner Wallbox vergleichen. Die API-Spec gibt es bei Keba selbst.
ZitatIch habe das Coding mal kurz überflogen. Aber wie stellst du da den Ladstrom ein.
Vermutlich irgendwie mit "KEBA_sets"...
Mit set <device> current 6000 setze ich die Ladeleistung auf etwa 4kW, mit set <device> current 16000
auf 11kW. Pausieren oder Starten der Ladung geht mit set <device> enableState 0 bzw. 1.
Mehr weiß ich auch nicht, da die Wallbox ja sonst (fast) nichts kann.
btw: Es gibt ja inzwischen einen Bereich "Wallboxen und E-Fahrzeuge". Ist dieses Thema dort nicht besser aufgehoben?
Ich bin aktuell noch am optimieren.
Allgemeine Frage in Verbindung mit dem Module oder ModBus_Modulen an sich in FHEM:
Durch die Verwendung des ModBus-Moduls kommen auch GET/SET von diesem selbst mit.
Macht es Sinn, dass speziell für das Gerät einen Präfix oder Suffix nutzen, um die Funktionen des Gerätes von den des ModBus zu unterscheiden?
Was wäre als Präfix sinnvoll/was ist üblich?:
- Einfach ein Unterstrich
- _P30, _KEBA, P30_, KEBA_
- Bei Pluggit-Modul sind die Namen einfach groß geschrieben. Damit stehen sie gleich am Anfang.