Canbus Ladegerät in Symcon einbinden

Hallo Miteinander,
ich habe mir ein Mean Well Ladegerät mit Canbus zugelegt.
Damit möchte ich LiFePo4 Akku abhängig vom Solarüberschuss laden.
Bei dem Ladegerät kann der Ladestrom per Canbus Befehle geregelt werden.
Da ich die Befehle natürlich über Symcon an das Ladegerät senden möchte,
bin ich auf der Suche nach einer geeigneten Lösung.

Als Gateway möchte ich einen Olimex EVB einsetzen.
Dieser hat Canbus und Wifi und Ethernet an Bord.
Auf Github habe ich dieses Projekt gefunden

Dieses habe ich auf dem Olimex mittels WLAN auch schon zum laufen gebracht.
Sprich ich kann damit von IPS über MQTT Befehle das Ladegerät mit Canbus ansprechen und regeln.
Mein Problem ist, ich würde das ganze gerne per Ethernt / LAN machen.
Dazu muss das github Projekt um einen LAN Treiber erweitert werden.
Der LAN Treiber von Olimex ist hier gut dokumentiert.

Leider kenne ich mich mit der ESP IFD kaum aus.
Alle meine bisherigen Versuche den Olimex per LAN als Cann2mqtt zu flashen sind gescheitert.
Deshalb möchte ich hier mal nachfragen ob es jemanden gibt der sich mit ESP IDF auskennt und mir helfen könnte die LAN Schnittstelle in das Projekt zu bekommen.

Gruß
Giuseppe

Hat sich erledigt, ich habe mir ein Can to Eth Gateway besorgt.
Dann in Symcon einen Client Socket angelegt und nun läuft es wie ich es haben wollte.
Ich kann den Ausgangsseitigen Ladestrom des Ladegerätes in 1 A Schritten regeln.
Falls jemand so etwas sucht und nicht weiter kommt, einfach melden.
Screenshot 2024-03-09 132832

Interessant, ich nutze schon seit langem ein Meanwell Netzteil, bei dem ich die Spannung begrenzt hatte und somit zu den Victron MPII ab einer Grenzschwelle nochmal mit 1400W nachladen kann.
Wenn es sowas in regelbar gibt wäre ja noch feiner.
Um welches Netzteil handelt es sich denn genau?

NPB-1200-48 ???

Ich nutze aktuell ein NPB-750-24 und ein weiteres NPB-1700-24 ist bestellt aber noch nicht geliefert worden. Alle Netzteile der NPB Serie können per Canbus geregelt werden.

Was nutzt du denn für eine Akku-Technologie, das du 24V Ladegeräte nutzt?
Bei 1700W und 24V sind das ja ganz schöne Ströme?

Kannst etwas genauer erklären, wie du das Netzteil über CAN genau ansteuerst?

Danke u. viele Grüße,
Doc

Ich beschreibe alles mal etwas genauer.
Ich habe mir einen kleinen Akku-Speicher selbst gebaut.
Dazu habe ich mir einen LiFePO4 Akku besorgt mit 24V und 100 Ah.
Die Akku Entladung erfolgt über einen Hoymiles HM-600 (Balkon / Micro) Wechselrichter.
Deshalb habe ich mich für 24V entscheiden weil die Microwechselrichter damit besser umgehen können.
Das Entladen wird über OpenDTU geregelt also aus dem Akku wird nur soviel Energie entnommen wie gerade im Haus verbraucht wird mit der Begrenzung natürlich auf die maximal 600 W weil mehr kann der Wechselrichter nicht liefern.
Fürs Grundrauschen über Nacht langt das aber locker.
Zum laden des Akkus hatte ich bisher ein normales Netzteil und dieses wurde nun mit dem Mean Well Netzteil NPB-750-24 ersetzt.
Das hängt bei mir dann ganz normal am Stromnetz und wenn ich PV-Überschuss habe, wird der Akku geladen. Durch das regeln mit Canbus kann ich so das Überschussladen sehr gut regeln.
Das sprechen IPS zu Canbus habe ich über ein Canbus to Ethernet Gateway gelöst.
Die Canbus Befehle sind in der Bedienungsanleitung des Netzteils gut erklärt.
Entweder man stellt eine vorgegebene Ladekennlinie ein oder man deaktiviert diese und entscheidet selbst wie geladen werden soll.
Es ist Spannung und Strom regelbar. Die Spannung habe ich auf 28,8 V eingestellt.
Den Ladestrom regle ich über einen Slider bzw. Scripte.
Wenn der Akku die 28,8 V erreicht geht der Ladestrom automatisch runter und dann wird das laden unterbrochen also abgeschaltet.
Da ich kein Spezialist bin in Module Erstellung, habe ich das sehr rudimentär gelöst.
Wie gesagt Gateway und dann per Client Socket den gewünschten Strom senden.
Ich hänge hier mal mein Actionscript für den Slider an:

SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
IPS_SetProperty(14661, "Open",true);//Client Socket Öffnen 
IPS_ApplyChanges(14661 ); //Änderung client Socket übernehmen
$lstrom = GetValue(26549);//lese aktuell eingestellten Ladestrom aus der Variable
//Setze Ladestrom nach gesetzten Variablen Wert
if ($lstrom == 5) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xC2\x01\x00\x00\x00\x00");}
elseif ($lstrom == 6) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x58\x02\x00\x00\x00\x00");}
elseif ($lstrom == 7) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xBC\x02\x00\x00\x00\x00");}
elseif ($lstrom == 8) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x20\x03\x00\x00\x00\x00");}
elseif ($lstrom == 9) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x84\x03\x00\x00\x00\x00");}
elseif ($lstrom == 10) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xE8\x03\x00\x00\x00\x00");}
elseif ($lstrom == 11) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x4C\x04\x00\x00\x00\x00");}
elseif ($lstrom == 12) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xB0\x04\x00\x00\x00\x00");}
elseif ($lstrom == 13) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x14\x05\x00\x00\x00\x00");}
elseif ($lstrom == 14) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x78\x05\x00\x00\x00\x00");}
elseif ($lstrom == 15) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xDC\x05\x00\x00\x00\x00");}
elseif ($lstrom == 16) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x40\x06\x00\x00\x00\x00");}
elseif ($lstrom == 17) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xA4\x06\x00\x00\x00\x00");}
elseif ($lstrom == 18) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x08\x07\x00\x00\x00\x00");}
elseif ($lstrom == 19) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x6C\x07\x00\x00\x00\x00");}
elseif ($lstrom == 20) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xD0\x07\x00\x00\x00\x00");}
elseif ($lstrom == 21) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\x34\x08\x00\x00\x00\x00");}
elseif ($lstrom == 22) {CSCK_SendText(14661, "\x84\x00\x0C\x01\x03\x30\x00\xCA\x08\x00\x00\x00\x00");}
//Auflistung Canbus HEX für Ladestrom setzen
//3000C201 //4,5A
//30005802 //6A
//3000bc02 //7A
//30002003 //8A
//30008403 //9A
//3000E803 //10A
//3000_4C04 //11A Unterstrich bitte weglassen
//3000B004 //12A
//30001405 //13A
//30007805 //14A
//3000dc05 //15A
//30004006 //16A
//3000a406 //17A
//30000807 //18A
//30006c07 //19A
//3000D007 //20A
//30003408 //21A
//30009808 //22A
//3000CA08 //22,5A

Falls noch Fragen sind oder bei der Umsetzung Probleme auftreten, versuche ich natürlich gerne zu helfen.

Vielen Dank für die Infos.
Ich muss mal schauen, ob ich mir auch mal so ein Ladegerät bestelle.
Aktuelle lade ich mit dem Victron und dem Netzteil.
Das Netzteil lädt mit einem festen Wert und der Victron regelt den variablen Teil.
Mit dem regelbarerem Ladegerät wäre es noch etwas komfortabler.

Viele Grüße,
Doc

Ich habe das Actionscript für den Slider etwas nach optimiert.
Nun wird aus dem aus der Variablen übergebenen Wert der zu sendende Wert errechnet umgewandelt und für das senden an den Client Socket ins richtige Format gebracht.
Dies erspart eine Zeile Code pro gewünschten Schritt Ladestrom Wert.
Also Float Variable Anlegen mit Action Script drunter und dort nachfolgenden Code rein:

<?php
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
IPS_SetProperty(58516, "Open",true);//Client Socket Öffnen 
IPS_ApplyChanges(58516 ); //Änderung client Socket übernehmen
$lstrom = GetValue(15559);//lese aktuell eingestellten Ladestrom aus der Variable

function formatEndian($endian, $format = 'N') {
    $endian = intval($endian, 16);      // convert string to hex
    $endian = pack('L', $endian);       // pack hex to binary sting (unsinged long, machine byte order)
    $endian = unpack($format, $endian); // convert binary sting to specified endian format

    return sprintf("%'.08x", $endian[1]); // return endian as a hex string (with padding zero)
}
$dec = $lstrom / "0.01";//Umrechnung Ladestrom
$endian = dechex($dec);//Ladestrom in HEX umrechnen
$big    = formatEndian($endian, 'N'); // string "00000018" HEX Wert in die richtige Reihenfolge drehen (MSB)
//$little = formatEndian($endian, 'V'); // string "18000000"
$b1= substr($big, 0, -6);//Erstes Byte Extrahieren
$b2= substr($big, 2, -4);//Zweites Byte Extrahieren
$codes = ["84", "00", "0c", "01", "03", "30", "00", "$b1", "$b2", "00", "00", "00", "00"];//Bytes Einsetezen
$st1 = hex2bin(implode('', $codes));//Aufbereiten zum senden an Client Socket
CSCK_SendText(58516, "$st1");//Neuer Wert an Client Socket senden

Moin,
ich habe mir jetzt auch ein Meanwell NPB-450-12 und den Waveshare-Adapter angeschafft. Bekomme die beiden aber nicht dazu miteinander zu reden. Eingestellt ist Baudrate 250.000, Framelength 50, Packet Time 10 und der 120 Ohm Widerstand im ETH to CAN Adapter ist angeschaltet. Wie sehen denn deine Settings aus drdigital? Muss ich noch etwas beachten?
Vielen Dank schon mal…

Hallo wango1,
ich würde empfehlen zuerst mit dem Canbus tool von Waveshare zu testen.
Damit lernst dann die Befehle besser zu verstehen.
Worüber ich ganz zu Beginn gestolpert bin ist, dass Netzteil hat von Haus aus Ladekurve eingestellt. Du musst das aber abschalten und auf Manuelle Ladekurve gehen.
Bit 7 musst auf 0 stellen, erst dann nimmt er Ladestromänderungen per Canbus an.
Die 3 DIP Schalter müssen auf off sein und der Jumper für Remote On/Off sollte dran bleiben.
Wenn das BIT 7 auf 0 gestellt hast nicht vergessen das Netzteil Stromlos zu machen und neu zu starten.