UDP-Kommunikation mit Keba-Wallbox
UDP-Kommunikation mit Keba-Wallbox
Moin,
hat hier jemand schon mal eine UDP-Kommunikation mit einer Keba-Wallbox (P30 x-Series) realisiert?
Es geht mir im speziellen darum, dass ich nicht genau weiß, in welchem Format ich die Befehle senden muss.
Danke im Voraus & Grüße ... Peter
hat hier jemand schon mal eine UDP-Kommunikation mit einer Keba-Wallbox (P30 x-Series) realisiert?
Es geht mir im speziellen darum, dass ich nicht genau weiß, in welchem Format ich die Befehle senden muss.
Danke im Voraus & Grüße ... Peter
a²+b²=mc²
Re: UDP-Kommunikation mit Keba-Wallbox
Sehr spezielle Frage. Ich vermute die Schnittmenge der PB Benutzer und Keba-Wallbox (P30 x-Series) Besitzer bist genau du
Bei sowas würde ich immer auf die Smart Home Projekte schauen.
Home Assistant z.B. hat eine Keba Integration die mit dem UDP Protokoll arbeitet.
Und weil es ein Open Source Projekt ist gibt es den Quellcode. natürlich dazu.
Dort solltest du alles finden, was du brauchst.

Bei sowas würde ich immer auf die Smart Home Projekte schauen.
Home Assistant z.B. hat eine Keba Integration die mit dem UDP Protokoll arbeitet.
Und weil es ein Open Source Projekt ist gibt es den Quellcode. natürlich dazu.
Dort solltest du alles finden, was du brauchst.

Re: UDP-Kommunikation mit Keba-Wallbox
Ist das wirklich alles. Nur mit PB ein UDP Server mit dem Port 7090 anlegen
Manual: https://www.keba.com/web/downloads/e-mo ... ide_en.pdf
Dann das command als ASCII senden ohne LF oder CRLF ?!
Den Empfangsbuffer lesen. Ein UDP Paket kommen bis 2048 byte im lokalen Netzwerk immer Vollständig an.
Aber besser immer alle Pakete zusammenfassen und nach Anfang "{" und Ende "}" filtern.
Vielleicht besser ein UDP OpenNetworkConnetion anlegen mit einem LocalPort 7090.
Ich weiss nicht ob ein Senden an Port 7090 der Antwortport eine andere sein kann, oder die Antwort immer an Port 7090 geht.
Vielleicht diese als Basic nehmen, anpassen und ausprobieren: Link https://www.purebasic.fr/english/viewtopic.php?t=74200
Manual: https://www.keba.com/web/downloads/e-mo ... ide_en.pdf
Dann das command als ASCII senden ohne LF oder CRLF ?!
Den Empfangsbuffer lesen. Ein UDP Paket kommen bis 2048 byte im lokalen Netzwerk immer Vollständig an.
Aber besser immer alle Pakete zusammenfassen und nach Anfang "{" und Ende "}" filtern.
Vielleicht besser ein UDP OpenNetworkConnetion anlegen mit einem LocalPort 7090.
Ich weiss nicht ob ein Senden an Port 7090 der Antwortport eine andere sein kann, oder die Antwort immer an Port 7090 geht.
Vielleicht diese als Basic nehmen, anpassen und ausprobieren: Link https://www.purebasic.fr/english/viewtopic.php?t=74200
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: UDP-Kommunikation mit Keba-Wallbox
Hallo Macros und mk-soft,
danke für Eure Antworten! Leider bekomme ich es nicht gebacken. Nachfolgend öffne ich eine Connection zur Wallbox und sende ein "GetChargeStatus" und warte auf eine Antwort.
danke für Eure Antworten! Leider bekomme ich es nicht gebacken. Nachfolgend öffne ich eine Connection zur Wallbox und sende ein "GetChargeStatus" und warte auf eine Antwort.
Aber leider bekomme ich keine Antwort. Nur #PB_NetworkEvent_None. Ich verzweifle hier langsam..."GetChargeStatus": Dieser Befehl liest den aktuellen Ladestatus der Wallbox aus und gibt Informationen wie den aktuellen Ladestrom, die aktuelle Spannung und den aktuellen Ladestatus zurück.
Code: Alles auswählen
EnableExplicit
InitNetwork()
Define ConnectionID
Define Result
ConnectionID = OpenNetworkConnection("192.168.178.30", 7090, #PB_Network_UDP)
If ConnectionID
Debug "Connected!"
Debug "Send command..."
SendNetworkString(ConnectionID, "GetChargeStatus")
Debug "Done"
Debug "Waiting for response..."
Repeat
Result = NetworkClientEvent(ConnectionID)
Select Result
Case #PB_NetworkEvent_None
Debug "#PB_NetworkEvent_None"
Case #PB_NetworkEvent_Data
Debug "#PB_NetworkEvent_Data"
Case #PB_NetworkEvent_Disconnect
Debug "#PB_NetworkEvent_Disconnect"
EndSelect
Delay(100)
ForEver
CloseNetworkConnection(ConnectionID)
Debug "Closed"
Else
Debug "NO"
EndIf
a²+b²=mc²
- TroaX
- Beiträge: 684
- Registriert: 08.03.2013 14:27
- Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
- Wohnort: NRW
- Kontaktdaten:
Re: UDP-Kommunikation mit Keba-Wallbox
Also aus dem Handbuch, das mk-soft verlinkt hat, ist das von dir genutzte Command nicht aufgeführt. Laut diesem wird der ChargeState in der Broadcast-Message nach einem der Report-Comands übertragen. Die Rückgabe ist dann immer ein JSON-String. Die Rückgabe von "report 2" müsste so aussehen:
Unter dem Schlüssel "State" steht dann der aktuelle Charging-State:
Wahrscheinlich sendet die Box auf Grund eines fehlerhaften Requests einfach keine Rückmeldung. Nur eine Vermutung.
Sollte das dann immer noch nicht klappen, würde ich das Command einmal mit Statt als String als Byte-Paket zum Server senden. Mein HTTP-Server habe ich auch nicht zum laufen bekommen, während er auf Strings gewartet hat. Ich musste die puren Rohdaten entgegennehmen. Sonst ging da garnichts.
Code: Alles auswählen
{
"ID": "2",
"State": 2,
"Error1": 99,
"Error2": 99,
"Plug": 1,
"Enable sys": 1,
"Enable user": 1,
"Max curr": 32000,
"Max curr %": 1000,
"Curr HW": 32000,
"Curr user": 63000,
"Curr FS": 63000,
"Tmo FS": 0,
"Output": 0,
"Input": 0,
"Serial": "15017355",
"Sec": 4294967296,
}
Code: Alles auswählen
"State" = Current state of the charging station
0 : starting
1 : not ready for charging; e.g. unplugged, X1 or "ena" not enabled,
RFID not enabled,.....
2 : ready for charging; waiting for EV charging request (S2)
3 : charging
4 : error
5 : authorization rejected
Sollte das dann immer noch nicht klappen, würde ich das Command einmal mit Statt als String als Byte-Paket zum Server senden. Mein HTTP-Server habe ich auch nicht zum laufen bekommen, während er auf Strings gewartet hat. Ich musste die puren Rohdaten entgegennehmen. Sonst ging da garnichts.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Re: UDP-Kommunikation mit Keba-Wallbox
ja, stimmt. Danke für den Hinweis! Da habe ich im Eifer des Gefechts die Kommandos verwechselt.TroaX hat geschrieben: 29.12.2022 00:12 Also aus dem Handbuch, das mk-soft verlinkt hat, ist das von dir genutzte Command nicht aufgeführt.
Aber auch mit "report 2" kommt keine Antwort.
Mit NodeJs hingegen funktioniert es:
Code: Alles auswählen
'use strict';
var udpPort = 7090; // KEBA UDP port
var kebaAddr = "192.168.178.30";
var command = "report 2";
var dgram = require('dgram');
var client = dgram.createSocket('udp4');
client.on('listening', function () {
var listenaddr = client.address();
console.log('\nKEBA-UDP-CLI: listening on ' + listenaddr.address + ":" + listenaddr.port);
client.send(command, 0, command.length, udpPort, kebaAddr);
console.log('KEBA-UDP-CLI: sending command=' +command);
});
client.on('message', function (message, rinfo) {
console.log('KEBA-UDP-CLI: Message from: ' + rinfo.address + ':' + rinfo.port +' - length=' + message.length);
console.log(message.toString());
process.exit(0);
});
client.bind(udpPort);
ok, die Grundidee habe ich verstanden, aber es hapert mit der Umsetzung. Kannst Du mir ein Beispiel nennen?TroaX hat geschrieben: 29.12.2022 00:12Sollte das dann immer noch nicht klappen, würde ich das Command einmal mit Statt als String als Byte-Paket zum Server senden.
Danke im Voraus & Grüße ... Peter
a²+b²=mc²
Re: UDP-Kommunikation mit Keba-Wallbox
Kann es sein das du den Local Port auch auf 7090 einstellen must? So steht es auch im HandbuchKiffi hat geschrieben: 28.12.2022 20:47 Aber leider bekomme ich keine Antwort. Nur #PB_NetworkEvent_None. Ich verzweifle hier langsam...
Code: Alles auswählen
EnableExplicit InitNetwork() Define ConnectionID Define Result ConnectionID = OpenNetworkConnection("192.168.178.30", 7090, #PB_Network_UDP) If ConnectionID Debug "Connected!" Debug "Send command..." SendNetworkString(ConnectionID, "GetChargeStatus") Debug "Done" Debug "Waiting for response..." Repeat Result = NetworkClientEvent(ConnectionID) Select Result Case #PB_NetworkEvent_None Debug "#PB_NetworkEvent_None" Case #PB_NetworkEvent_Data Debug "#PB_NetworkEvent_Data" Case #PB_NetworkEvent_Disconnect Debug "#PB_NetworkEvent_Disconnect" EndSelect Delay(100) ForEver CloseNetworkConnection(ConnectionID) Debug "Closed" Else Debug "NO" EndIf
Code: Alles auswählen
ConnectionID = OpenNetworkConnection("192.168.178.30", 7090, #PB_Network_UDP, 10000, "", 7090)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: UDP-Kommunikation mit Keba-Wallbox
geilo, jetzt funktioniert es.mk-soft hat geschrieben: 29.12.2022 21:27Kann es sein das du den Local Port auch auf 7090 einstellen must?


Grüße ... Peter
a²+b²=mc²
Re: UDP-Kommunikation mit Keba-Wallbox
Für UDP finde ich besser einen Server zu verwenden. Mit OpenNetworkConnection kann man nur ein Gerät verwalten, da man nicht auf dem gleichen lokalen Port eine zweite NetworkConnection erstellen kann.
Leider fehlt für den CreateNetworkServer eine Funktion Daten zu senden ohne eine Eingangsverbindung von Client zu haben.
Diese habe ich mal selber für Window geschrieben. Must mal schauen ob dies mit Mutex geschützt werden muss um nicht mit den Server Funktionen zu kollidieren oder das Senden im Thread von UDP-Server anstossen.
Der Parameter Server ist die PB Nummer von CreateNetworkServer
Update
- Bugfix speicherleck
Leider fehlt für den CreateNetworkServer eine Funktion Daten zu senden ohne eine Eingangsverbindung von Client zu haben.
Diese habe ich mal selber für Window geschrieben. Must mal schauen ob dies mit Mutex geschützt werden muss um nicht mit den Server Funktionen zu kollidieren oder das Senden im Thread von UDP-Server anstossen.
Der Parameter Server ist die PB Nummer von CreateNetworkServer
Update
- Bugfix speicherleck
Code: Alles auswählen
; ----
Procedure IPAddr(IP.s)
Protected r1, *ip
*ip = Ascii(IP)
r1 = inet_addr_(*ip)
FreeMemory(*ip)
ProcedureReturn r1
EndProcedure
Procedure SendStringTo(Server, IP.s, Port, Text.s)
Protected r1, socket, *sendbuf, lenbuf, RecvAddr.sockaddr_in
socket = ServerID(Server)
*sendbuf = UTF8(Text)
lenbuf = StringByteLength(Text, #PB_UTF8)
RecvAddr\sin_family = #AF_INET
RecvAddr\sin_port = htons_(port)
RecvAddr\sin_addr = IPAddr(IP)
r1 = sendto_(socket, *sendbuf, lenbuf, 0, RecvAddr, SizeOf(sockaddr_in))
FreeMemory(*sendbuf)
ProcedureReturn r1
EndProcedure
; ----
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: UDP-Kommunikation mit Keba-Wallbox
Das ist aber "doof", daß man mit dem Ausgangsport so nicht arbeiten kann. Kann es auch sein, daß UDP broadcast Adressen nicht gehen? Ich glaube es ging mal in älteren PB Versionen (4.xx oder älter? habe es nur zwei mal getestet und ich glaube es funkionierte mal).