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