Stránka 1 z 1

HA + Modbus TCP

Napsal: ned kvě 04, 2025 8:10 pm
od luky
Poslední dny jsem se trochu trápil se spojením mezi HA a PLC přes Modbus TCP.
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
S opačným tokem informací (HA>PLC) jsem se potrápil, tak zde moje poznatky, třeba se to někomu hodí:
1) je potřeba použít automatizaci a spouštět funkci modbus.write_register (nebo nějakou další - write_registers, write_coils...)
Snímek obrazovky 2025-05-04 200553.png
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