UDP-Kommunikation mit Keba-Wallbox

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

UDP-Kommunikation mit Keba-Wallbox

Beitrag von Kiffi »

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
a²+b²=mc²
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von Macros »

Sehr spezielle Frage. Ich vermute die Schnittmenge der PB Benutzer und Keba-Wallbox (P30 x-Series) Besitzer bist genau du :wink:

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.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von mk-soft »

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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von Kiffi »

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.
"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.
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
a²+b²=mc²
Benutzeravatar
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

Beitrag von TroaX »

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:

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,
}
Unter dem Schlüssel "State" steht dann der aktuelle Charging-State:

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
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.
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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von Kiffi »

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.
ja, stimmt. Danke für den Hinweis! Da habe ich im Eifer des Gefechts die Kommandos verwechselt.

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);
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.
ok, die Grundidee habe ich verstanden, aber es hapert mit der Umsetzung. Kannst Du mir ein Beispiel nennen?

Danke im Voraus & Grüße ... Peter
a²+b²=mc²
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von mk-soft »

Kiffi 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
Kann es sein das du den Local Port auch auf 7090 einstellen must? So steht es auch im Handbuch

Code: Alles auswählen

ConnectionID = OpenNetworkConnection("192.168.178.30", 7090, #PB_Network_UDP, 10000, "", 7090)
Send NetworkString müsste gehen, das dieser auch ohne NullByte in UTF8 sendet.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von Kiffi »

mk-soft hat geschrieben: 29.12.2022 21:27Kann es sein das du den Local Port auch auf 7090 einstellen must?
geilo, jetzt funktioniert es. :D Vielen Dank für diesen Tipp, Michael! :allright:

Grüße ... Peter
a²+b²=mc²
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von mk-soft »

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

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
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: UDP-Kommunikation mit Keba-Wallbox

Beitrag von Benubi »

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).
Antworten