DPM8624-485 Software & Anleitungen gesucht

@aloishockenschlohe Hallo Alois,

ich habe Deine Bash-Scripte auf github zur Ansteuerung eines DPM86xx genau angeschaut und z.T. ausprobiert (bisher "nur" auf einem Linux-Notebook, scheint ganz gut zu funktionieren).

(Mein Plan ist, den DPM86xx zeitabhängig anzusteuern...)

Dazu nun einige Fragen:

  • Was ist der Grund auf Python umzusteigen? Sind die bash-Scripte in der Praxis zu instabil?
  • Im Script dpm86.sh wird am Anfang eine Funktion/Datei ./basic-functions aufgerufen - diese ist nicht dokumentiert und liegt nicht mit ab... :arrow: was steckt dahinter?
'Hoffe Du liest hier mit - dank Dir für eine Antwort :)

Übrigens, ich habe einen DPM8608-485 von Ali bestellt und mich jetzt doch dagegen entschieden. Wenn jemand aus Frankfurt/Wiesbaden/Mainz kommt und Interesse an dem Teil hat könnten wir auch ein wenig zusammen basteln, Software kann ich.

@monokristallin

Hallo, gibt es denn schon eine Option ohne die Adapter-Platine zu empfangen und zu steuern? Oder hab ich vielleicht nicht genau gelesen? Hab momentan den vom DPM8624-485 mit mitgelieferten USB-Anschluss an einen Raspberry 2 angeschlossen. Wird auch soweit erkannt. Weiter komme ich jedoch nicht.

... Update am frühen morgen ...

Die Kommunikation läuft jetzt. Hab doch nicht aufmerksam gelesen. Der gelieferte USB-Anschluss ist schon ein TTL/RS485 Adapter. In deinem Python-Script hast du oben bei "Be aware" gut beschrieben, dass Protokoll auf "0" bleiben soll (The power supply has to be set to "simple protocol"). Das war bei mir das Problem.

Also alles immer genau lesen!!!

{green}:nerd:

... tolles Forum {green}:inlove:

Hallo zusammen,

ich belebe diesen Thread hier wieder um keinen neuen zu eröffnen.
Ich probiere aktuell den DPM8624-485 mit Arduino anzusteuern. Das ganze ist noch ein Trockenversuch ohne angeschlossene PV.

Angeschlossen ist der DPM über einen Seriellen Port am Arduino MEGA. Ich nutze den RS485 Adapter auf TTL und die DPM8600.h Library.Sämtliche write Befehle funktionieren gut und ich kann Problemlos an/aus schalten und spannung/strom vorgeben. Aber read liefert kein Ergebnis. Der Empfang scheint einfach tot.

Hat jemand Vorschläge, was ich probieren kann? Danke

Hallo zusammen,

ich habe die letzten Wochen mal meinen Wemos D1 mit dem Script zum Laufen gebracht und habe auch versucht mit Tasmota einige Erfahrungen zu sammeln.

Dem Script habe ich MQTT-seitig nachgeholfen, indem ich folgendes als >B Sektion eingebaut habe:

>B
smlj=0 ;disable publishing at MQTT teleperiod, on boot
->sensor53 r
if mqtts>0
then
=#publish
endif
#publish
+>Subscribe V, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sVolt, msg
+>Subscribe C, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sCur, msg
+>Subscribe SW, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sSwitch, msg

Dadurch habe ich den Workaround geschaffen, dass ich zumindest per MQTT Explorer z.B. im jeweiligen topic

Topic: tele/tasmota_owndevice/SENSOR/sVolt/
Message: {"msg":"12.00"}
Topic: tele/tasmota_owndevice/SENSOR/sCur/
Message: {"msg":"5.00"}
Topic: tele/tasmota_owndevice/SENSOR/sSwitch/
Message: {"msg":1}

alles soweit steuern kann. Mein Wissen zu mqtt und tasmota ist noch sehr begrenzt und mir ist bewusst, dass dies nicht die schöne Art ist, aber bislang das Beste, was ich so googeln konnte. Am Liebsten würde ich gerne in tasmota den DPM8624 als Device anlegen und per eigener Firmware als Device im Home Assistant auftreten lassen. Aber ich konnte leider weder so eine tasmota device Konfiguration finden, noch in HA irgendwelche Geräte, wo die Entitäten Inputfelder haben. Den Switch könnte man ja noch vielleicht hinbekommen, aber so schöne Eingabe- / StepUp- / StepDown- Felder wie auf der Weboberfläche?!
Egal. Ich hoffe, dass dies hier irgendjemand nützlich findet.
Da das komplette Script mit Änderungen zu groß ist, habe ich einige Kommentare gelöscht und komplett sieht es dann wie folgt aus (wobei der Name des MQTT-Devices noch angepasst werden muss)

>D
Vmax=60 ;
Cmax=24 ;
v=0 ;store device voltage state (targeted)
V=0 ;store WebUI voltage state (targeted)
c=0 ;store device current state (targeted)
C=0 ;store WebUI current state (targeted)
sw=0 ;store device switch state
SW=0 ;store WebUI switch state
rV="01060000" ;ModBus register (voltage)
vV="" ;store hex value of V to append to rV
rC="01060001" ;ModBus register (current)
vC="" ;store hex value of C to append to rC
rSW="01060002000" ;ModBus register (switch)
vSW="" ;store hex value of SW to append to rSW
>B
tper=60
smlj=0
->sensor53 r
if mqtts>0
then
=#publish
endif
#publish
+>Subscribe V, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sVolt, msg
+>Subscribe C, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sCur, msg
+>Subscribe SW, tele/%Name des eigenen MQTT Gerätes%/SENSOR/sSwitch, msg
>R
smlj=0
>S
if upsecs>3
then
smlj=1 ;re-enable publishing at MQTT teleperiod, after boot
endif
>W
bu(SW "DPM 8624 ON" "DPM 8624 OFF")
nm(0.0 60.0 0.01 V "DPM Ausgang (V)" 200 2)
nm(0.0 24.0 0.01 C "DPM Ausgang (A)" 200 2)
>T
sw=DC#sSwitch ;load switch state from ModBus variable >M
v=DC#sVolt ;load voltage state from ModBus variable >M
c=DC#sCur ;load voltage state from ModBus variable >M
if ((chg[sw]>0) and (SW!=sw)) ;update WebUI based on physical input (switch)
then
SW=sw
endif
if ((chg[v]>0) and (V!=v)) ;update WebUI based on physical input (voltage)
then
V=v
endif
if ((chg[c]>0) and (C!=c)) ;update WebUI based on physical input (current)
then
C=c
endif
if chg[V]>0 ;update ModBus register based on WebUI input (voltage)
then
if V>Vmax ;prevent out of bound value (voltage max)
then
V=Vmax
endif
if V<0 ;prevent out of bound value (voltage min)
then
V=0
endif
vV=rV+sb(hx((V*100)) 4 4)
sml(1 3 vV)
endif
if chg[C]>0 ;update ModBus register based on WebUI input (current)
then
if C>Cmax ;prevent out of bound value (current max)
then
C=Cmax ;prevent out of bound value (current min)
endif
if C<0
then
C=0
endif
vC=rC+sb(hx((C*1000)) 4 4)
sml(1 3 vC)
endif
if ((chg[SW]>0) and (sw!=SW) ;update ModBus register based on WebUI input (switch)
then
vSW=rSW+s(SW)
sml(1 3 vSW)
endif
>M 1
+1,4,m,16,9600,DC,5,2,010300000001,010300010001,010300020001,010310010001,010310020001,010310030001
1,010302SSssxxxx@i0:100,DC Spannung (set),V,sVolt,2
1,010302SSssxxxx@i1:1000,DC Strom (set),A,sCur,2
1,010302SSssxxxx@i2:1,Switch (set),,sSwitch,0
1,010302SSssxxxx@i3:100,DC Spannung (disp),V,dVolt,2
1,010302SSssxxxx@i4:1000,DC Strom (disp),A,dCur,2
1,010302SSssxxxx@i5:1,Temperatur,C,cTemp,1
#
1 „Gefällt mir“

Hallo,

ich nutze den gleichen Arduino, die gleiche lib und auch einen TTL to RS485 Adapter wie du. Hast Du bedacht, das USB die erste serielle Schnittstelle (serial0) belegt? Den RS485 Adapter habe ich auf serial1 laufen, das funktioniert:

//Serielle für die Kommunikation mit dem RPI
Serial.begin(9600);
//Serielle zur Steuerung des DPM8624
Serial1.begin(9600);
charger.begin(Serial1); //DPM Initialisieren
<snip>
void loop() {
u_dpm = charger.read('V');                                    //Werte aus DPM8624 lesen
i_dpm = charger.read('C');
w_aktuell = i_dpm * u_dpm;                                    //Leistung berechnen
cc_cv = charger.read('S');

Viele Grüße,

steve

@stc

Danke dir für deine Antwort.

Probiert habe ich es an Serial1 und Serial2. Ich habe sogar probeweise die Libraray so verändert, dass er die Steuerpins vor dem Senden auf HIGH und nach dem Senden auf LOW setzt. Jeweils mit einem Delay von 500.

Deinen Code werde ich morgen mal mit meinem vergleichen und nochmal testen. Dann schreibe ich auch meine Verkabelung auf, evtl. ist dabei etwas fehlerhaft.

@stc

Wenn es bei dir mit der Config funktioniert und bei mir nicht, vermute ich bei mir einen Fehler. Vllt könen wir das abgleichen um den Fehler zu finden:

Mein Code sieht folgendermaßen als einfaches Testbrett aus:

#include <DPM8600.h>
DPM8600 converter;
float v;
void setup() {
Link entfernt (9600);
Serial2.begin(9600);
// Initating power converter
converter.begin(Serial2);
Serial.begin(9600);
Serial.println("DCDC Test");
}
voidloop(){
converter.power(true);
delay(2000);
converter.write('v',12);
v = converter.read('V');
Serial.print("v = ");
Serial.println(v);
delay(2000);
converter.power(false);
delay(2000);
}
Folgende Verkabelung habe ich:
MEGA -> Adapter
In:
Tx2 -> DI
Rx2 -> RO
DE/RE -> Pin2
Out:
GND -> GND
5V -> VCC
Adapter -> DC/DC
A -> A
B -> B
Ich habe also DI, DE, RE und RO mit dem Arduino verbunden. Dazu VCC und GND vom TTL Ausgang mit angeschlossen. Vom TTL A/B gehe ich dann an den DPM. Weiter ist beim DPM nur ein Input und ein Output zum Test angeschlossen.
power und write funktionieren, aber sobald ich mir die Ausgabe vom write oder read geben lasse, bekomme ich die Felercodes der Library.
Danke dir für die Hilfe.

Hallo,

nachdem du gepostet hast, wie dein RS485 Adapter verdrahtet ist, gibt es einen Unterschied zu deinem und meinem Setup. Du nutzt so was in der Art, oder? :

https://www.makershop.de/module/kommunikation-module/ttl-rs-485/

Und ich nutzte den hier:

https://www.makershop.de/module/kommunikation-module/ttl-rs485-adapter/

Beide nennen sich TTL RS 485 Adapter, nur das meiner direkt mit RX/TX angesprochen werden kann und deiner eine etwas andere Logik zur Ansteuerung braucht. Dazu gibt es eine spezielle Arduino Lib.: https://www.do-it-neat.com/arduino-max485-library/

Leider sind die IC's bei meinem Adapter nicht beschriftet, so dass ich nicht sagen kann wo genau der Unterschied liegt. Vielleicht probierst du mal so einen Adapter.

Viele Grüße,

steve

@stc

Danke dir. Ich probiere es mit dem Adapter mal.

Habe mir zum testen einen bestellt. Wenn mir langweilig ist, bis der da ist, probiere ich nochmal die andere Lib.
Ich melde mich, wenn ich ein Update habe.

PS: Parallel versuche ich noch den Victron MPPT und das Daly BMS auszulesen. Beides noch mit mäßigem Erfolg... -.-

Hallo nochmals,

neben der Variante, die ich vor einiger Zeit gepostet habe, habe ich mich durch diesen Beitrag inspirieren lassen und mich mit dem Thema ESPHome beschäftigt. Herausgekommen ist dann eine ganz nette Übersicht in meinem Home Assistant, die alles beinhaltet, was man zum automatisieren benötigt.

Für die Config habe ich folgendes zur Standardconfig vom ESPHome hinzugefügt:

uart:
id: mod_bus
tx_pin: 5
rx_pin: 4
baud_rate: 9600
stop_bits: 1
parity: none
modbus:
id: modbus1
uart_id: mod_bus
modbus_controller:
- id: epever
address: 0x1
modbus_id: modbus1
command_throttle: 1000ms
update_interval: 10s
sensor:
- platform: modbus_controller
modbus_controller_id: epever
name: "DPM Output Voltage"
id: dpm_output_voltage
register_type: holding
address: 0x1001
unit_of_measurement: "V"
accuracy_decimals: 2
filters:
- multiply: 0.01
icon: "mdi:lightning-bolt"
- platform: modbus_controller
modbus_controller_id: epever
name: "DPM Output Current"
id: dpm_output_current
register_type: holding
address: 0x1002
unit_of_measurement: "A"
accuracy_decimals: 2
filters:
- multiply: 0.001
icon: "mdi:sine-wave"
- platform: modbus_controller
modbus_controller_id: epever
name: "DPM Temperature"
id: dpm_temperature
register_type: holding
address: 0x1003
unit_of_measurement: "°C"
accuracy_decimals: 1
icon: "mdi:thermometer"
switch:
- platform: modbus_controller
modbus_controller_id: epever
name: "DPM Status"
id: dpm_status
address: 0x0002
register_type: holding
bitmask: 1
icon: "mdi:toggle-switch"
number:
- platform: modbus_controller
modbus_controller_id: epever
id: dpm_set_voltage
name: "Set Output Voltage"
min_value: 0
max_value: 60
step: 0.1
mode: box
address: 0x0000
unit_of_measurement: "V"
multiply: 100
icon: "mdi:lightning-bolt-circle"
- platform: modbus_controller
modbus_controller_id: epever
name: "DPM Set Current"
id: dpm_set_output_current
address: 0x0001
unit_of_measurement: "A"
min_value: 0
max_value: 10
step: 0.1
mode: box
multiply: 1000
icon: "mdi:sine-wave"

1 „Gefällt mir“

@stc

so, den adapter habe ich nun, aber ich kann trotzdem nicht über ihn sauber mit dem DPM8624 kommunizieren.

Ich kann ihn starten und abschalten. Sende geht also. Aber nur mit folgender Verkabelung:

Tx -> Tx A->A
Rx -> Rx B->B

Dazu GND am 8624.

Damit schaffe ich das gleiche verhalten, wie wenn ich den 8624 direkt an Tx/Rx anschließe. Es kommt auch über den Adapter keine Antwort zurück.

Wenn ich anders verkabele wie z.b. zustäzlich ein GND am Input vom Adapter, dann ist die Kommunikation so gestört, dass nichtmal write funktioniert. Entferne ich stattdessen GND am DPM, dann leuchtet COM dauerhaft, aber führt nichts aus.

Und als Ausgaben von read('V') nur entweder -10 oder 0.00 raus. Beides falsche Werte, denn die Ausgangsspannung ist definitiv gestellt und liegt auch an. Zum Test betreibe ich am Out einen PC Lüfter.

Kannst du mir deine Verkabelung teilen? Ich werde langsam irre...

@fifadoc

Ich nutze folgende Verdrahtung:

Arduino Mega -> RS485 Adapter

+5V VCC
TX1 TX
RX1 RX
GND GND

(diese TX und RX Beschriftung kann auch je nach Hersteller des Adapters umgekehrt sein. Hab schon beides gehabt)

RS485 Adapter -> DPM-8624

A A
B B
GND GND

Zwei Ideen hab ich noch: Hast du das DPM-8624 auf "simple protocol" eingestellt? Was hast du für eine Spannungsversorgung für das DPM-8624? Es war schon mal von Masseschleifen in Verbindung mit dem DPM irgendwo zu lesen, die die Kommunikation gestört haben.

Sonst fällt mir jetzt auch nichts mehr ein.

Viele Grüße,

steve

@fifadoc

0 ist simple, 1 ist modbus

1 „Gefällt mir“

Danke dir für die Infos.

Deine Verkabelung prüfe ich nochmal ganz exakt. Aus dem Kopf würde ich sagen, dass ich den Aufbau gestern auch hatte, aber das kann trügen.
simple protocol ist eingestellt, also '0'. Als Spannung schließe ich aktuell ein 32V Labornetzteil an, da es ja ein Testaufbau ist.

Hast du bei deinem Aufbau wirklich auch ein GND vom Arduino an den 3. Out vom Adapter angeschlossen? Also an 3 Stellen (IN, OUT und DPM) jeweils den GND(Minus) Port vom MEGA angeschlossen?

@nili76

ja, steht auch so in der Anleitung. Für TTL Kommunikation braucht der DPM aber 0, sonst kommt gar nix an.

@fifadoc

Klar, GND an der richtigen Stelle muss sein, sonst bekommt der Adapter keine vernünftige Spannungsversorgung und die Kommunikation ist Glücksache. Mein Adapter hat auf der einen Seite Vcc, TX, RX und GND. Die gehen zum Arduino. A,B, GND auf der anderen Seite der Platine zum DPM. Eine weitere GND Verbindung vom Arduino zum DPM kann die Kommunikation stören, da die beiden GND Anschlüsse am RS485-Adapter keine Verbindung haben! In der Anleitung zum RS485 Adapter ist von "GND" zum Arduino die Rede und von "Ground" zur RS485 Seite. Das deutet schon darauf hin das die nichts mit einander zu tun haben. Gemessen habe ich gerade 40MOhn, also Isolation.

@fifadoc

Entschuldige, ich hatte gehofft helfen zu können. Denn mindestens 2 Leute hier bekommen eine Verbindung zum DPM hin. Ich hab übrigens eine 3 adrige Verbindung vom Arduino zum Adapter (VCC braucht der Adapter wohl nicht) und auch 3 adrig vom Adapter zum DPM.

Ich bleibe aber bei der Version mit Modbus :slight_smile:

1 „Gefällt mir“

Blos nicht entschuldigen. Nicht dafür. Ich bin für jeden Vorschlag und Codebeispiel dankbar. Denn bei euch funktioniert es und ich drehe mich im Kreis.
Aktuell finde ich, dass die Chaostheorie, der Zusammenhang des Lyapunov-Exponenten mit der Feigenbaumkonstante oder auch sämtliche Beweise der Sprachentheorie in der theoretischen Informatik irgendwie alle mit der Zeit versändlich waren... aber das hier ?

Du betreibst den DPM also per Modbus und kannst schreiben und Lesen über das Signal?

Deine Verkabelung habe ich Probiert. Schreiben klappt damit weiterhin. Er liefert beim Lesen auch keinen Fehler mehr. Aber Trotz eingestellten 12v oder 9v liefert read jetzt immer 27.00. Korrekt ist das auch noch nicht.

Zum Testen habe ich mitlerweile auch einen DPM ohne 485. Der mag die Schaltung über den Adaper natürlich nicht. Den kann ich aber mit dem anderen Modbus Adapter oder direkt über Serial ansprechen. Aber auch da klappt nur write und kein read.

Ich war mal so frei und habe Bilder meiner Verkabelung zum DPM8624-485 gemacht. So funktioniert schreiben (geprüft: an, aus, Setzen von 9v).
Lesen liefert immerhin keinen Fehler mehr, aber V liefert immer 27.00 obwohl 9V eingestellt sind.

Kommentare über mein übersichtliches Testsetup darf übrigens jeder selbst behalten. Solange ich tüftel lohnt es nicht was richtig sauber zu machen.

Du betreibst den DPM also per Modbus und kannst schreiben und Lesen über das Signal?
Jop. In Home Assistant schön eingebunden. Da ich mittlerweile Bilder hinzufügen darf kann ich nun bessere Bilder zeigen:

Ist jetzt allerdings kein Arduino Entwicklungsboard mehr, sondern schon mein kleiner Wemos D1.

Und wo du schon wilde Verkabelung zeigst... hier meine (vielleicht kommt Dir der TTL Adapter bekannt vor...)