Werte per Modbus senden

Hallo,

ich lese bereits Werte aus meiner Wärmepumpe aus. Nun möchte ich auch die Leistungswerte aus meiner Solaranlage an die Wärmepumpe schicken und weiß nicht wie das funktioniert.

ich habe folgendes Probiert, aber ich denke action ist hier falsch

modbus:
  - name: "idm_wp"
    type: tcp
    host: 192.168.1.69
    port: 502
    delay: 1 # after reconnect
    sensors:
    - name: "idm_gemittelteAussentemperatur"
      unique_id: "idm_gemittelteaussentemperatur"
      slave: 1
      scale: 1
      offset: 0
      unit_of_measurement: °C
      address: 1002
      data_type: float32
      scan_interval: 60
      precision: 1
      swap: word
#schreibe Werte
    action:
    - action: modbus.write_register
      data:
        address: 78
        slave: 1
        hub: idm_wp
        value: "{{ states('sensor.total_pv_power') }}"

    - action: modbus.write_register
      data:
        address: 74
        slave: 1
        hub: idm_wp
        value: "{{ states('sensor.sigen_plant_grid_export_power') }}"

ja, so wie du das versuchst du machen ist das natürlich falsch.

Unter

modbus:

definierst du eine Sensor Entität und keine Aktion.
Eine Aktion ist entweder ein script das du von einer tap_action (eines buttons) aufrufst oder ne Automation oder ein trigger_based template.

Deine Zeilen an sich sind absolut fehlerfrei, das kannst du validieren indem du in

Einstellungen>Entwicklerwerkzeuge>Aktionen in der GUI genau die Werte einträgst die du da benutzen willst. Und dann drückst du den Button “Zum YAML-Modus” und siehst .. alles richtig.
Halt nur an der falschen Stelle versucht. :slight_smile: Nimm die Zeilen und pack sie in ne Automation die z.B. alle 60s ausgeführt wird dann sollte das klappen, oder halt wenn der Wert sich um einen Betrag X ändert oder was auch immer.

Hallo, danke erst mal für die Info: ich habe deinen Rat befolgt und eine entsprechende Automation erstellt und er kommuniziert auch. Es kommt aber nur Schrott an. ich habe daher erst mal eine 0 geschickt und eine 10 als konstante, aber eigentlich kommt immer irgendwas zwischen 12 und 14 an. Die empfangenen Werte ändern sich sogar, selbst wenn ich immer das gleiche sende. Jemand eine Idee?

alias: SendtoIdm
description: “”
triggers:
 - trigger: time_pattern
   seconds: /10
   conditions: [ ]
   actions:
 - action: modbus.write_register
   data:
   address: 82
   slave: 1
   hub: idm_wp
   value: 0
   mode: single

wenn ich den Wert zurücklese, bekomme ich den angezeigten wert aus der Wärmepumpe zurück:


    - name: "idm_PVuerbschuss"
      unique_id: "idm_PVuerbschuss"
      slave: 1
      scale: 1
      offset: 0
      unit_of_measurement: kW
      address: 78
      data_type: float32
      scan_interval: 60
      precision: 1
      swap: word

Hallo, habe es mit KI selbst hinbekommen.

alias: SendtoIdm
description: ""
triggers:
  - trigger: time_pattern
    seconds: /10
conditions: []
actions:
  - action: modbus.write_register
    data:
      address: 82
      slave: 1
      hub: idm_wp
      value: >
        {% set p = pack(states('sensor.sigen_plant_consumed_power') | float(0),
        '>f') %} [ {{ unpack(p, '>H', offset=2) }}, {{ unpack(p, '>H', offset=0)
        }} ]
  - action: modbus.write_register
    data:
      address: 78
      slave: 1
      hub: idm_wp
      value: >
        {% set p = pack(states('sensor.total_pv_power') | float(0), '>f') %} [ {{
        unpack(p, '>H', offset=2) }}, {{ unpack(p, '>H', offset=0) }} ]
  - action: modbus.write_register
    data:
      address: 74
      slave: 1
      hub: idm_wp
      value: >
        {% set p = pack(states('sensor.sigen_plant_grid_export_power') | float(0),
        '>f') %} [ {{ unpack(p, '>H', offset=2) }}, {{ unpack(p, '>H', offset=0) }} ]
mode: single

Ah, stimmt, wer lesen kann ist klar im Vorteil .. da steht ja auch FLOAT im Bild … sorry hatte ich direkt überlesen.

Ich schalte in der Regel (so denn möglich) von float auf int+sf (scalefaktor) wenn das Gerät das bei der modbus Schnittstelle bietet, denn das machts weniger kryptisch weil man anstelle pack und unpack einfach nur Werte mit 10^scalefakor multiplizieren muss.
Dann natürlich jeweils pro Richtung, also hat man 123.456 ist mit SF * 10^3 halt 123456 den man dann schreibt und mit * 10^-3 ists wieder der float.
Ist aber letztendlich auch Geschmacksache, schön das nun läuft.

Was du noch machen könntest ist die aktuellen Werte zu prüfen, damit du nicht so viele modbus.write_register anschubst obwohl sich der Wert vielleicht gar nicht oder nur marginal geändert hat. Und ja ich hätte auch gern einen modbus.read_register wie das in node-red und anderen Lösung durchaus üblich ist, also einen Wert explizit lesen wenn man ihn benötigt anstelle den kontinuierlich je nach scan_intervall Einstellung zu pollen.
Denn dein pv_power dürfte üblicherweise von Sonnenuntergang bis Sonnenaufgang vermutlich im idle pendeln. Oder du erweiterst die Automation um solche Bedingungen.