[Modul] KEBA KeConnect P30

KebaConnect
Es gibt nun ein Modul zum Auslesen/Steuern einer KEBA-Wallbox.
Der Anschluss erfolgt via UDP

  1. Voraussetzungen
  • mindestens IP-Symcon 6.0
  • eine KEBA P30-Wallbox (c- und x-Serie) und daher wohl auch die original BMW-Wallbox.
  1. Enthaltene Module
    KeConnectP30udp

  2. Installation
    Über den Module Store!
    Zur Zeit noch Beta, also direkt nach KEBA KeConnect P30 suchen.

  3. Dokumentation
    IPSymconKebaConnect

Es werden alle relevanten Informationen ausgelesen sowie die erforderlichen Kommandos zur Steuerung umgesetzt.

Das Modul wurde bereits grundsätzlich von @7weazel7 mit 2 installierten Wallboxen getestet (vielen Dank an dieser Stelle).

2 „Gefällt mir“

Changelog

  • 1.0.3 @ 28.11.2021 19:25 (beta)
    Initiale Version

HI,
ich habe das mal versucht, leider kommt da beim Auslesen direkt ein Fehler. Und im Modulstore finde ich es auch nicht, habe es direkt über Module installiert.

socket_recv(): unable to read from socket [10045]: Der Vorgang wird von dem Objekttyp nicht unterstützt, auf den Bezug genommen wurde.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 615

Warning: socket_recv(): unable to read from socket [10045]: Der Vorgang wird von dem Objekttyp nicht unterstützt, auf den Bezug genommen wurde.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 615

Warning: socket_recv(): unable to read from socket [10045]: Der Vorgang wird von dem Objekttyp nicht unterstützt, auf den Bezug genommen wurde.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 615

Ich sehe, das Du das auf einem Windows-System installiert hast?
Damit habe ich das nicht getestet, weil ich kein IPS auf Windows habe und daher keine Erfahrung auf Windows habe.
Ich werde mal versuchen, mich einzulesen, aber kann nicht sagen, wie gut das geht.
Da das Modul über zwei Socket kommunizieren muss und im IPS ein Modul aber nur mit einem IO-Client verbunden sein kann.
Daher mache ich im Modul eine direkte Socket-Kommunikation

private function ExecuteCmd(string $cmd)
    {
        $host = $this->ReadPropertyString('host');
        $port = self::$UnicastPort;

        $fp = stream_socket_client("udp://$host:$port", $errno, $errstr);
        if (!$fp) {
            $this->SendDebug(__FUNCTION__, 'stream_socket_client("udp://' . $host . ':' . $port . '") failed, errno=' . $errno, 0);
            return false;
        }
        stream_set_timeout($fp, 5);
        fwrite($fp, $cmd);
        $info = stream_get_meta_data($fp);
        fclose($fp);
        if ($info['timed_out']) {
            $this->SendDebug(__FUNCTION__, 'send cmd "' . $cmd . '" timeout', 0);
            return false;
        }
        $this->SendDebug(__FUNCTION__, 'send cmd "' . $cmd . '"', 0);

        $socket = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        if (!$socket) {
            $this->SendDebug(__FUNCTION__, 'socket_create() failed', 0);
            return false;
        }
        socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec'=>5, 'usec'=>0]);
        if (!socket_bind($socket, '0.0.0.0', $port)) {
            $this->SendDebug(__FUNCTION__, 'socket_bind() failed', 0);
            return false;
        }
        if (($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL)) == false) {
            $this->SendDebug(__FUNCTION__, 'socket_recv() failed, reason=' . socket_strerror(socket_last_error($socket)), 0);
            $buf = false;
        } else {
            $this->SendDebug(__FUNCTION__, 'socket_recv(): ' . $bytes . ' bytes, buf="' . $buf . '"', 0);
        }
        return $buf;
    }

gruß
demel

super danke. Falls du auf den Server drauf willst um zu testen könnten man das per TeamViewer oder so machen. Wäre echt cool wenn das funktionieren würde.
@mischo22 hätte vermutlich auch interesse daran, oder?

habe eine kleiner Änderung in der Leseroutine gemacht in der Hoffnung, das das nun unter Windows funktioniert.
Es muss beobachtet werden, ob die Antworten von der KEBA immer vollständig ankommen.

14.12.2021, 14:00:47 |           ExecuteCmd | socket_recv(): 150 bytes, buf="{<LF>"ID": "3",<LF>"U1": 0,<LF>"U2": 0,<LF>"U3": 0,<LF>"I1": 0,<LF>"I2": 0,<LF>"I3": 0,<LF>"P": 0,<LF>"PF": 0,<LF>"E pres": 0,<LF>"E total": 0,<LF>"Serial": "22893479",<LF>"Sec": 3119922<LF>}<LF>"
14.12.2021, 14:00:47 |         DecodeReport | report 3

wichtig ist, ob nach dem ExecuteCmd immer ein DecocdeReport kommt, egal ob report 13

Hi,
gestern rief mich mischo22 und sagte mir, ich sollte doch mal den DIP Schalter für UDP prüfen. Ich gucke nachher mal in die Anleitung welcher das ist und gucke ob das von Werk aus an ist. evlt. könnte das ja auch ein problem sein.

Vorallem nach deinem Update bekomme ich eine ziemlich Aussagekräftige Fehlermeldung:

socket_recv(): unable to read from socket [10060]: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 615

Das bedeutet, das er keine Daten von der Keba bekommt

Hier ist die Doku zu finden, es geht um DIP-Switch 1.3, der muss „EIN“ sein

1.4
Requirements
The following requirements have to be met in order to use the UDP function- ality:
● KeContact P30 c-series or x-series with firmware version 3.9.24 or higher
● The UDP interface is enabled by switching the DIP switch DSW1.3 to “ON” (for details regarding the DIP switches, see the "installation man- ual").
● A PC or smartphone for sending the UDP commands.
This also requires a suitable UDP client software or UDP app.
● The charging station has to be connected (via LAN cable or WLAN) to the same network as the application.
● The UDP interface must not be used together with the Modbus TCP in- terface and vice versa.

Moin,

ich habe den Schalter 1.3 umgelegt und die ganze Anlage neugestartet.

Leide klappt es nicht. Kommt dieser fehler.

Wenn Du einen telnte auf die IP der BOX (telnet 192.168.1.1 7090) machst, bekommst du da eine Verbindung? Laut Programmer Guide ist das 7090, oder?

socket_recv(): unable to read from socket [10060]: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 616

Warning: socket_recv(): unable to read from socket [10060]: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 616

Warning: socket_recv(): unable to read from socket [10060]: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
 in C:\ProgramData\Symcon\modules\IPSymconKebaConnect\KeConnectP30udp\module.php on line 616

ja, es ist Port 7090 für Abfragen und auf Port 7092 kommen Broadcasts vom der Box.

Telnet geht nicht, das benutzt TCP und hier handelt es sich um UDP.
Ein vergleichbares Programm für UDP fällt mir ehrlicherweise auch nicht direkt ein.Du könntest natürlich testhalber ein UDP-Client einrichten und mit USCK_SendPacket (siehe Symcon-Dolu) das Paket „i“ oder „report 1“ schicken. Dann würdest du im Instanz-Debug des UDP-Client sehen, was passiert.

Siehst du im Debug der IO-Client-Instanz etwas, wenn du zB das Kabel ins Auto steckst!? Wie gesagt, hier schickt die Box Statusänderungen per Broadcast.
Was ist denn mit dem Firewall deines PC’s (egal ob der Windows eigene oder ein Anti-Viren-Programm)?

Und du hast ein anderes Proframm, das mit der Keba rummacht?

Nachtrag:

versuch mal das Script

<?php declare(strict_types=1);

$host = 'die ip der KEBA';
$port = 7090;

$input = "i";

$fp = @socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if (!$fp) {
    echo 'socket_create() failed, reason=' . socket_strerror(socket_last_error($fp)) . PHP_EOL;
    return false;
}
socket_set_option($fp, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_option($fp, SOL_SOCKET, SO_RCVTIMEO, ['sec'=>5, 'usec'=>0]);

if (!socket_bind($fp, '0.0.0.0', $port)) {
    echo 'socket_bind() failed, reason=' . socket_strerror(socket_last_error($fp)) . PHP_EOL;
    return false;
}

if(socket_sendto($fp, $input , strlen($input) , 0 , $host , $port) == false) {
    echo 'socket_sendto() failed, reason=' . socket_strerror(socket_last_error($fp)) . PHP_EOL;
    return false;
}

if (($bytes = socket_recv($fp, $buf, 2048, 0)) == false) {
    echo 'socket_recv() failed, reason=' . socket_strerror(socket_last_error($fp)) . PHP_EOL;
    $buf = false;
} else {
    echo 'socket_recv(): ' . $bytes . ' bytes, buf="' . $buf . '"'.PHP_EOL;
}
socket_close($fp);

sollte ausgeben

socket_recv(): 42 bytes, buf=""Firmware":"P30 v 3.10.27 (210105-174852)""

wenn das geklappt hat, mit $input = "report 1"; versuchen, sollte liefern

socket_recv(): 211 bytes, buf="{
"ID": "1",
"Product": "KC-P30-ES240022-E00",
"Serial": "xxxxxxxx",
"Firmware":"P30 v 3.10.27 (210105-174852)",
"COM-module": 0,
"Backend": 0,
"timeQ": 3,
"DIP-Sw1": "0x22",
"DIP-Sw2": "0x00",
"Sec": 3451074
}
"
1 „Gefällt mir“

Moin,

dein Skript funktioniert an allen 3 Wallboxen.
Hier die Ausgabe.
Hat es ggf. etwas damit zu tun das ich die Boxen über einen VPN anspreche und somit kein Broadcast nutzen kann?

socket_recv(): 210 bytes, buf="{
"ID": "1",
"Product": "KC-P30-ES2400E2-M0R",
"Serial": "22610077",
"Firmware":"P30 v 3.10.28 (210316-115052)",
"COM-module": 1,
"Backend": 0,
"timeQ": 3,
"DIP-Sw1": "0x25",
"DIP-Sw2": "0x08",
"Sec": 556155
}

jetzt ist es ganz spannen, denn das ist 100% der Code, der im Modul jetzt an dieser verwendet wird.
Ich hatte den Code etwas überarbeitet, ist aber inzwischen im Modulstore/beta.
Der fehlende Broadcst ist natürlich ein Problem, denn damit fehlt ein Teil der Funktionalität, hat aber hiermit ichts zu tun.
Ich gehe ja davon aus, das du beim Script ebenfall via VPN mit den Wallboxen verbunden hast?

Moin,
ich glaube das hängt an dm UDP Socket.

Wenn ich einen neuen UDP Socket Anlage und dort die IP Einstelle, Boardcast und reuse deaktivere kann ich das einmal abfragen.
Danach stellt dein Modul den UDP-Socket um, macht die Schalter grau das ich nichts mehr ändern kann und habe auch wieder Port 7092 drin.

Wenn du die Daten im Socket nicht ändern würdest, wäre das problem vermutlich schon weg?

Zur Umgebung.
IP-Symcon läuft in meinem Windows Netzwerk auf einem Windows Server. Die Wallboxen sind ca. 300m weit weg und haben daher einen anderen IP-Kreis mit UMTS Router.
Also jegliche Abfragen aus dem Modul und aus dem Skript führe ich über den Tunnel aus. Im Netzwerk wo die Keba drin sind gibt es nur Wallboxen, Stromzähler und einen Router.

so hat es geklappt:

die UDP-Socket ist nur für den broadcast (also Port 7092) da, die direkte Kommunikation (via Port 7090) wird im Modul mit dem code durchgeführt, den du auch als Script aufgerufen hast.

Hi,

das neue Update hatte ich gar nicht gesehen.
Jetzt sieht es besser aus. 2 Boxen fragt er Fehlerfrei ab. Bei einer Aktualsiert er zwar einige Variablen, aber kwh nicht. Da war aber auch seit dme letzten neustart kein Auto mehr dran.
Evlt. deswegen nicht?

ich danke Dir schon mal für die Unterstützung, extrem cool. Jetzt weiß ich endlich bevor ich auf den Prakplatz fahre ob da überhaupt noch Platz für mich ist :slight_smile:

wenn du mit kwh die aktuelle ladeleistung meinst, da steht nur was drin, wenn das Kabel mit dem Auto verbunden ist, weil das ja die Kombination der Wallbox, des Kabels und des Autos ist, was vorgibt, wiviel grundsätzlich max. geladen werden könnte.

Es ist narloch gut, wenn du das n7n abrufen kannst, allerdings ist der fehlende Broadcast ein gewisses Provlem, weil Änderungen wie zB die aktuelle Ladung dann nur beim zyklischen Abruf aktualisiert werden.
Um zu vermeiden, das permanent abgerufen werden muss, werte ich den Broadcast aus.
Der Broadcast ist aber meines Wissens nach nur möglich innerhalb eines Netzwerk-Segments.
Das kannst su aber auch einfach prüfen: wenn du zB das Kabel einsteckst, müsste im instanz-Debug direkt was zu sehen sein mit dem Begriff „Broadcast“.

Wenn das nicht geht, müsstest du häufiger abrufen znd damit leben, das best8mmte Informationen nicht sofort zu sehen sind.

demel

1 „Gefällt mir“

HI, da meine ich den Gesamtverbrauch, der bei „Box 2 Mitte“ noch auf 0 steht. Bei denanderen beiden zeigt er die Daten korrekt an. Ich kann es aber erst nach Weihnachten testen, wenn ich wieder zur Arbeit fahre :-), ob die Gesamtverbrauchsdaten nach dem anstecken von einem Auto korrekt angzeigt werden.

Wenn ich die Sachen etwas später sehe ist das nicht so shlimm, ich kann den Intervall in deinem Modul runter stellen, das macht ja kaum traffic.

Dein Modul ist aber echt schon total geil, genau sowas hatte ich mir gewünscht.

Ich kann zwar nicht programmieren, aber ich versuche mal ein Skript zu schreiben welches nach dem Ende vom Ladevorgang die gelandene kwh Menge in eine zur RFID Karte passende Variable schreibt/addiert.
So hätte ich dann für jeden Kollegen den verbrauchten Wert und würde festellen können das ich am meisten Strom verbrauche ;-).
Und ich könnte den Nachbarn erlauben am Wochenende dort zu laden, da ich dann ja weiß wieviel Sie verbraucht haben.

ich weis nicht, wie das Verhalten mit der RFID-Karte genau ist. Man kann das so einstellen (siehe Dokumentation), das ein Laden nur mit einer RFID-Karte geht.
Es wird auch beim Laden die RFID-Karte mit übertragen, da weis ich aber nicht, wie das Timing ist, sprich also, ob am Ende des Ladevorgangs das passende Feld im report noch gesetzt ist … Ja, das muss man mal probieren, wenn Du da Testergebnisse hast, würde mich das interessieren, wenn es nicht geht, bitte auch den ausreichenden Debug (Limitierung aufheben oder ggfs. sogar den Debug in eine Datei umlenken)

1 „Gefällt mir“

HI,
mache ich gerne. Wird aber etwas dauern, ich muss jetzt erst einmal warten bis jemand mit RFID geladen hat und dann erstelle ich das Skript. Ich arbeite erst in KW3 wieder, daher bin ich auf meine Kollege angewiesen :-).

klar, eilt ja nicht
je nachdem, wie es aussieht könnte ich mir auch vorstellen, diese RFID-basierte Speicherung auch in das Modul zu integrieren
mit dem thema hatte ich mich noch gar nicht beschäftigt, weil es ja im Privaten Bereich keine Rolle spielt.
Sind die RFIDs vorher bekannt?