PLC funguje jako Modbus server, HA z něj čte nějaká čísla. Toto je ta snadná část (doplněk modbus, konfigurace v yaml).
Kód: Vybrat vše
modbus:
- type: tcp
host: 10.0.0.10
port: 502
name: modbus_plc
delay: 100
sensors:
- name: jimka_hladina
address: 3
slave: 1
data_type: int16
input_type: input
unit_of_measurement: mm
- name: teplota_venku_float
address: 21
slave: 1
data_type: float32
input_type: input
device_class: temperature
unit_of_measurement: °C
precision: 1
1) je potřeba použít automatizaci a spouštět funkci modbus.write_register (nebo nějakou další - write_registers, write_coils...)
2) spouštím automatizaci každou sekundu. Pro jiné účely bude stačit třeba i delší doba.
3) pokud chcete posílat reálné číslo (int16 = real = float...), tak v Modbusu je to ve dvou registrech. HA tohle neumí, takže je potřeba to číslo rozložit na dvě 8bitová čísla a ty teprve poslat. Řešení není z mé hlavy, vylovil jsem ho z internetu po pár hodinách googlení. Viz ty řádky na konci kódu:
Kód: Vybrat vše
- id: '1746280324718'
alias: automatizace_modbus_zapsat
description:
triggers:
- trigger: time_pattern
seconds: /1
conditions: []
actions:
- action: modbus.write_register
metadata: {}
data:
hub: modbus_plc
address: 106
slave: 1
value: '{{ states(''sensor.axpert01_inverter0_ac_output_active_power'') | int
}}'
alias: mosbus axpert power out
- action: modbus.write_register
metadata: {}
data:
hub: modbus_plc
address: 102
slave: 1
value:
- '{{ (states(''sensor.esphome_calb_current'') | float | pack(">f") | unpack(">I")) // 2**16 }}'
- '{{ (states(''sensor.esphome_calb_current'') | float | pack(">f") | unpack(">I")) % 2**16 }}'
alias: modbus aku1 proud
mode: single