Benachrichtigungen
Alles löschen

HA ESPHome DMP8624 Kommunikationsproblem

7 Beiträge
3 Benutzer
0 Likes
655 Ansichten
(@feli_k91)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 3
Themenstarter  

Hallo Forum,

ich habe aktuell folgendes Projekt: Es soll ein Buck Converter DPM 8624 benutzt werden, um einem Laderegler für eine LiFePo4 Batterie eine gewisse Leistung zur Verfügung zu stellen. Konkret soll die Batterie geladen werden, wenn meine PV Anlage Energie ins Netz einspeist. Vor dem DPM8624 ist natürlich noch ein Netzteil geschalten.

 

Nun möchte ich mit einem ESP32 den DPM8624 mittels Modbus RTU und ESPHome innerhalb Home Assistant einen Stromwert vorgeben. Dazu müsste ich den Stromwert mittels MQTT übertragen, der ESP32 müsste ihn lesen und auf den DPM schreiben.

Ich habe es geschafft, die Register des DPM8624 mittels ESPHome auszulesen, jedoch bekomme ich es nicht hin dem DPM8624 einen Stromwert vorzugeben. Im DPM ist das "MODBUS Communication Protocol" aktiviert.

 

HA Version: 10.1
ESPHome Version: 2023.4.3
Communication Protocol DPM8624: Link entfernt

uart:
  id: mod_bus
  tx_pin: 17
  rx_pin: 16
  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 Set Voltage"
    id: dpm_set_voltage
    register_type: holding
    address: 0x0000
    unit_of_measurement: "V"
    accuracy_decimals: 2
    filters:
      - multiply: 0.01
  - platform: modbus_controller
    modbus_controller_id: epever
    name: "DPM Set Current"
    id: dpm_set_current
    register_type: holding
    address: 0x0001
    unit_of_measurement: "A"
    accuracy_decimals: 2
    filters:
      - multiply: 0.001
  - 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
  - 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
  - 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
  - platform: modbus_controller
    modbus_controller_id: epever
    name: "DPM Out Switch"
    id: dpm_out_switch
    register_type: holding
    address: 0x0002

number:
  - platform: modbus_controller
    modbus_controller_id: epever
    id: dpm_set_output_voltage
    name: "DPM Set Output Voltage"
    address: 0x0000
    lambda: "return  ???; "
 

Laut meinem Verständnis muss ich eine "number" erstellen, die dem Register einen Wert schreibt. Function Code sollte 6 sein. Allerdings komme ich absolut nicht weiter, wie ich die MQTT Nachricht lesen und dann zum DPM übertragen soll...

Ich hoffe es kann mir jemand einen Schubser in die richtige Richtung geben. ich bin nicht besonders erfahren und wäre über jede Hilfe dankbar.
Falls noch weiter Infos zur Analyse notwendig sind, werde ich diese gerne nachliefern.

 

Beste Grüße und schonmal Danke im Voraus

Felix


   
Zitat
STE2k
(@ste2k)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 47
 

Willkommen im Club. Muss es ein ESP32 sein, oder geht auch ein ESP8266? Dann könntest du das hier testen: https://github.com/d4rken/jt-dpm8600-psu-mqtt

Ich hab es nie zum laufen gebracht und auch keine Lösung gefunden das Gerät via MQTT zu bedienen.. daher bin ich gespannt was hier noch so kommt.

 

gibt auch schon ein Thema zu den Thema : https://www.akkudoktor.net/forum/panels-wechselrichter-laderegler/dpm8624-485-software-anleitungen-gesucht/paged/


   
AntwortZitat
(@und-mehr)
Heroischer Stromgenerator
Beigetreten: Vor 2 Jahren
Beiträge: 1123
 

Geht das nicht einfach über on_raw_value eines es mqtt subscripion sensors?

Da kann man lamdacode anhängen, der dann irgendwie was an modbusregister schickt.

 

 

..,-


   
AntwortZitat
(@feli_k91)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 3
Themenstarter  

Danke für die ersten Antworten.

@ste2k Ich habe leider keinen ESP8266 rumliegen. Und bezüglich deines links zum anderen Foreneintrages: Ich habe leider keine Hilfe darin finden können.

@und-mehr Danke, ich werde mich darin mal versuchen. Dass ich etwas im lambdacode schreiben muss, dachte ich mir schon.

Falls ich einen Fortschritt erzielen werde, melde ich mich nochmals.

 

Bis dahin, hat sonst jemand Vorschläge? Evtl. auch schon einen Schnipsel lambdacode bzw. einen Hinweis, wie ich ihn schreiben muss?

Beste Grüße

Felix


   
AntwortZitat
(@und-mehr)
Heroischer Stromgenerator
Beigetreten: Vor 2 Jahren
Beiträge: 1123
 

Man kann das bei on_boot aus der epever config abmalen.
https://devices.esphome.io/devices/epever_mptt_tracer_an

Oder vielleicht damit: https://esphome.io/components/output/modbus_controller.html

Es gibt immer mehrere Wege, welches der beste ist lernt man nur durch Erfahrung.

 

..,-


   
AntwortZitat
(@feli_k91)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 3
Themenstarter  

Hallo,

ich habe nun folgendes ausprobiert:

globals:
  - id: set_v
type: int
restore_value: yes
initial_value: "555"

sensor:
  - platform: mqtt_subscribe
name: "set output voltage command"
id: mqtt_dpm_set_output_voltage
topic: dpm-8624/number/dpm_set_output_voltage
on_value:
then:
        - globals.set:
id: set_v
value: !lambda'return x;'

  - platform: modbus_controller
modbus_controller_id: epever
name: "DPM Set Voltage"
id: dpm_set_voltage
register_type: holding
address: 0x0000
unit_of_measurement: "V"
accuracy_decimals: 2
filters:
      - multiply: 0.01
on_value:
then:
        - lambda: |-
            ESP_LOGI("main", "Set voltage ,mode %d", set_v);
            esphome::modbus_controller::ModbusCommandItem set_payload_command = esphome::modbus_controller::ModbusCommandItem::create_write_single_command(epever, 0x0000, set_v);
            epever->queue_command(set_payload_command);
 
 
Nun kommt leider folgende Fehlermeldung:
Link entfernt : In lambda function: Link entfernt :90:166: error: invalid conversion from 'esphome::globals::RestoringGlobalsComponent<short unsigned int>*' to 'uint16_t' {aka 'short unsigned int'} [-fpermissive] esphome::modbus_controller::ModbusCommandItem set_payload_command = esphome::modbus_controller::ModbusCommandItem::create_write_single_command(epever, 0x0000, set_v); ^~~~~ In file included from src Link entfernt , from src Link entfernt : src Link entfernt : note: initializing argument 3 of 'static esphome::modbus_controller::ModbusCommandItem esphome::modbus_controller::ModbusCommandItem::create_write_single_command(esphome::modbus_controller::ModbusController*, uint16_t, uint16_t)' uint16_t value);
 
Hat wohl etwas mit den Datentypen zu tun... Ich komme leider seit Stunden nicht weiter. Hat jemand einen Rat?
 
P.S.: Wenn ich die Variable "set_v" auf einen festen Wert festlege, ändert der DPM seinen Wert...
 

   
AntwortZitat
(@und-mehr)
Heroischer Stromgenerator
Beigetreten: Vor 2 Jahren
Beiträge: 1123
 
versuch mal
id(set_v).state
oder .value

..,-


   
AntwortZitat
Teilen: