# ===================================================================== # HOFMAN-ENERGY AVARMA 190 – Home Assistant Package (komplett) # Anbindung ueber Elfin EW11 (RS485 -> TCP), Modbus # Datenformat lt. Datenblatt: 9600 / 8 / N / 1, Slave-Adresse #1 # # Ablage: /root/config/integrations/modbus_avarma.yaml # in configuration.yaml: # homeassistant: # packages: !include_dir_named integrations # # Enthaelt: modbus, template (inkl. BWWP-Zielprofil), Helfer, Automationen. # ===================================================================== # --------------------------------------------------------------------- # Modbus-Hub + Lese-Sensoren + Power-Switch # --------------------------------------------------------------------- modbus: - name: avarma type: tcp # EW11 im Modbus-TCP-Modus host: # IP des EW11 192.168.1.11 port: 502 # an EW11-Einstellung anpassen delay: 2 # Anlaufzeit fuer das Gateway timeout: 5 message_wait_milliseconds: 500 # Pause zwischen Frames (EW11) sensors: # ---- Temperaturen (int16, 0.1 C) ---- - name: "AVARMA Tank unten (T1)" slave: 1 address: 2004 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 20 - name: "AVARMA Tank oben (T2)" slave: 1 address: 2005 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 20 - name: "AVARMA Verdampfer (T3)" slave: 1 address: 2006 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 20 - name: "AVARMA Abluft (T4)" slave: 1 address: 2007 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 20 - name: "AVARMA Umgebung (T5)" slave: 1 address: 2008 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 20 - name: "AVARMA Berechnete Wassertemperatur" slave: 1 address: 2013 input_type: holding data_type: int16 scale: 0.1 precision: 1 unit_of_measurement: "°C" device_class: temperature state_class: measurement scan_interval: 30 # ---- Aktorik / Status (uint16, roh) ---- - name: "AVARMA EEV Schritte" slave: 1 address: 2002 input_type: holding data_type: uint16 unit_of_measurement: "P" state_class: measurement scan_interval: 30 - name: "AVARMA Betriebsstatus Raw" slave: 1 address: 2000 input_type: holding data_type: uint16 scan_interval: 15 - name: "AVARMA Ausgangsstatus Raw" slave: 1 address: 2001 input_type: holding data_type: uint16 scan_interval: 15 - name: "AVARMA Digitaleingaenge Raw" slave: 1 address: 2003 input_type: holding data_type: uint16 scan_interval: 30 - name: "AVARMA Fehlerstatus Raw" slave: 1 address: 2010 input_type: holding data_type: uint16 scan_interval: 15 # ---- Statistik (uint16) ---- - name: "AVARMA Verdichter Starts" slave: 1 address: 2017 input_type: holding data_type: uint16 state_class: total_increasing scan_interval: 120 - name: "AVARMA Verdichter Betriebszeit" slave: 1 address: 2018 input_type: holding data_type: uint16 unit_of_measurement: "min" state_class: total_increasing scan_interval: 120 - name: "AVARMA E-Heizung Starts" slave: 1 address: 2019 input_type: holding data_type: uint16 state_class: total_increasing scan_interval: 120 - name: "AVARMA E-Heizung Betriebszeit" slave: 1 address: 2020 input_type: holding data_type: uint16 unit_of_measurement: "min" state_class: total_increasing scan_interval: 120 - name: "AVARMA Abtauungen" slave: 1 address: 2021 input_type: holding data_type: uint16 state_class: total_increasing scan_interval: 120 - name: "AVARMA Software Version Raw" slave: 1 address: 2014 input_type: holding data_type: uint16 scan_interval: 600 # ---- Ruecklesen der Steuer-Register (Block 900) ---- - name: "AVARMA Modus Raw" slave: 1 address: 900 input_type: holding data_type: uint16 scan_interval: 30 - name: "AVARMA Solltemperatur Geraet" slave: 1 address: 901 input_type: holding data_type: uint16 unit_of_measurement: "°C" scan_interval: 30 switches: - name: "AVARMA Power" slave: 1 address: 902 write_type: holding command_on: 1 command_off: 0 verify: input_type: holding address: 902 state_on: 1 state_off: 0 scan_interval: 15 # --------------------------------------------------------------------- # Template: BWWP-Zielprofil + AVARMA-Klartext + bit-dekodierte Sensoren # --------------------------------------------------------------------- template: - sensor: - name: "BWWP Zielprofil" unique_id: bwwp_zielprofil icon: mdi:state-machine state: > {% set akku = states('sensor.battery_level') | float(0) %} {% set solar = states('sensor.total_dc_power') | float(0) %} {% set above = is_state('sun.sun', 'above_horizon') %} {{ 'night' if not above else 'auto' if akku >= 99.9 and solar > 3000 else 'eco_high' if akku >= 99.9 and solar > 1000 else 'eco' }} # ===== AVARMA Klartext ===== - name: "AVARMA Betriebsmodus" state: > {% set m = states('sensor.avarma_modus_raw') | int(0) %} {{ {1:'Automatik', 2:'Eco / Energiesparen', 3:'Hybrid', 4:'Elektro-Heizung', 5:'Lueftung'}.get(m, 'Unbekannt') }} icon: mdi:tune-variant - name: "AVARMA Status Text" state: > {% set s = states('sensor.avarma_betriebsstatus_raw') | int(0) %} {% set ns = namespace(l=[]) %} {% set names = {1:'Standby/Aus', 2:'Ein', 4:'Fehler-Abschaltung', 8:'Alarm im Betrieb', 16:'Abtauen', 32:'Desinfektion'} %} {% for bit, label in names.items() %} {% if s | bitwise_and(bit) > 0 %}{% set ns.l = ns.l + [label] %}{% endif %} {% endfor %} {{ ns.l | join(', ') if ns.l | length > 0 else 'Unbekannt' }} icon: mdi:heat-pump - name: "AVARMA Software Version" state: "V{{ (states('sensor.avarma_software_version_raw') | int(0) / 100) | round(2) }}" icon: mdi:chip - name: "AVARMA Aktive Fehler" state: > {% set f = states('sensor.avarma_fehlerstatus_raw') | int(0) %} {% set ns = namespace(l=[]) %} {% set names = { 2:'Sensor oberer Tank', 4:'Sensor Verdampfer', 8:'Sensor Abluft', 16:'Sensor Umgebung', 32:'Frostschutz', 64:'Fernschalter getrennt', 128:'Wasser-Ueberhitzung', 256:'Hochdruck', 512:'Niederdruck', 1024:'Ueberhitzung', 2048:'Verdichter-Betriebsgrenze', 4096:'Wasserdurchfluss', 8192:'Anode', 16384:'E-Unit', 32768:'Kommunikation'} %} {% for bit, label in names.items() %} {% if f | bitwise_and(bit) > 0 %}{% set ns.l = ns.l + [label] %}{% endif %} {% endfor %} {{ ns.l | join(', ') if ns.l | length > 0 else 'keine' }} icon: mdi:alert-circle-outline - name: "AVARMA Tank Mittelwert" unit_of_measurement: "°C" device_class: temperature state_class: measurement state: > {{ ((states('sensor.avarma_tank_oben_t2') | float(0) + states('sensor.avarma_tank_unten_t1') | float(0)) / 2) | round(1) }} availability: > {{ has_value('sensor.avarma_tank_oben_t2') and has_value('sensor.avarma_tank_unten_t1') }} - binary_sensor: # ---- Ausgangsstatus (2001) ---- - name: "AVARMA Verdichter" state: "{{ states('sensor.avarma_ausgangsstatus_raw') | int(0) | bitwise_and(1) > 0 }}" icon: mdi:gauge - name: "AVARMA E-Zusatzheizung" state: "{{ states('sensor.avarma_ausgangsstatus_raw') | int(0) | bitwise_and(2) > 0 }}" icon: mdi:radiator - name: "AVARMA Luefter" state: "{{ states('sensor.avarma_ausgangsstatus_raw') | int(0) | bitwise_and(4) > 0 }}" icon: mdi:fan - name: "AVARMA 4-Wege-Ventil" state: "{{ states('sensor.avarma_ausgangsstatus_raw') | int(0) | bitwise_and(8) > 0 }}" icon: mdi:valve - name: "AVARMA Umwaelzpumpe" state: "{{ states('sensor.avarma_ausgangsstatus_raw') | int(0) | bitwise_and(16) > 0 }}" icon: mdi:pump # ---- Betriebsstatus (2000) ---- - name: "AVARMA Eingeschaltet" state: "{{ states('sensor.avarma_betriebsstatus_raw') | int(0) | bitwise_and(2) > 0 }}" icon: mdi:power - name: "AVARMA Abtauen aktiv" state: "{{ states('sensor.avarma_betriebsstatus_raw') | int(0) | bitwise_and(16) > 0 }}" icon: mdi:snowflake-melt - name: "AVARMA Desinfektion aktiv" state: "{{ states('sensor.avarma_betriebsstatus_raw') | int(0) | bitwise_and(32) > 0 }}" icon: mdi:bacteria-outline # ---- Sammel-Fehler (2010) ---- - name: "AVARMA Fehler aktiv" device_class: problem state: "{{ states('sensor.avarma_fehlerstatus_raw') | int(0) > 0 }}" # --------------------------------------------------------------------- # Bedien-Helfer # --------------------------------------------------------------------- input_number: avarma_solltemperatur: name: AVARMA Solltemperatur min: 38 max: 70 step: 1 mode: slider unit_of_measurement: "°C" icon: mdi:thermometer input_select: avarma_betriebsmodus_select: name: AVARMA Betriebsmodus input options: - Automatik - Eco / Energiesparen - Hybrid - Elektro-Heizung - Lueftung icon: mdi:tune-variant input_button: avarma_abtauen_erzwingen: name: AVARMA Abtauen erzwingen icon: mdi:snowflake-melt avarma_fehler_reset: name: AVARMA Fehler-Reset icon: mdi:restart-alert # --------------------------------------------------------------------- # Automationen # --------------------------------------------------------------------- automation: # ===== Helfer -> Geraet: Solltemperatur schreiben ===== - id: avarma_write_setpoint alias: "AVARMA: Solltemperatur schreiben" mode: queued trigger: - platform: state entity_id: input_number.avarma_solltemperatur condition: - condition: template value_template: > {{ states('sensor.avarma_solltemperatur_geraet') not in ['unknown','unavailable'] and states('input_number.avarma_solltemperatur') | int(-1) != states('sensor.avarma_solltemperatur_geraet') | int(-2) }} action: - service: modbus.write_register data: hub: avarma slave: 1 address: 901 value: "{{ states('input_number.avarma_solltemperatur') | int }}" # ===== Helfer -> Geraet: Betriebsmodus schreiben ===== - id: avarma_write_mode alias: "AVARMA: Betriebsmodus schreiben" mode: queued trigger: - platform: state entity_id: input_select.avarma_betriebsmodus_select variables: mode_map: Automatik: 1 "Eco / Energiesparen": 2 Hybrid: 3 "Elektro-Heizung": 4 Lueftung: 5 condition: - condition: template value_template: > {{ states('sensor.avarma_modus_raw') not in ['unknown','unavailable'] and mode_map.get(states('input_select.avarma_betriebsmodus_select'), -9) != states('sensor.avarma_modus_raw') | int(-1) }} action: - service: modbus.write_register data: hub: avarma slave: 1 address: 900 value: "{{ mode_map.get(states('input_select.avarma_betriebsmodus_select'), 1) | int }}" # ===== Taster: Abtauen erzwingen (906) ===== - id: avarma_force_defrost alias: "AVARMA: Abtauen erzwingen" trigger: - platform: state entity_id: input_button.avarma_abtauen_erzwingen action: - service: modbus.write_register data: hub: avarma slave: 1 address: 906 value: 1 # ===== Taster: Fehler-Reset (907) ===== - id: avarma_fault_reset alias: "AVARMA: Fehler-Reset" trigger: - platform: state entity_id: input_button.avarma_fehler_reset action: - service: modbus.write_register data: hub: avarma slave: 1 address: 907 value: 1 # ===== Geraet -> Helfer: Rueck-Sync (auch nach Profil-Automation) ===== - id: avarma_sync_helpers alias: "AVARMA: Helfer mit Geraet synchronisieren" mode: restart trigger: - platform: state entity_id: - sensor.avarma_solltemperatur_geraet - sensor.avarma_modus_raw condition: - condition: template value_template: > {{ states('sensor.avarma_solltemperatur_geraet') not in ['unknown','unavailable'] and states('sensor.avarma_modus_raw') not in ['unknown','unavailable'] }} action: - service: input_number.set_value target: entity_id: input_number.avarma_solltemperatur data: value: "{{ states('sensor.avarma_solltemperatur_geraet') | int(45) }}" - service: input_select.select_option target: entity_id: input_select.avarma_betriebsmodus_select data: option: > {% set m = states('sensor.avarma_modus_raw') | int(1) %} {{ {1:'Automatik', 2:'Eco / Energiesparen', 3:'Hybrid', 4:'Elektro-Heizung', 5:'Lueftung'}.get(m, 'Automatik') }} climate: - platform: climate_template name: BWWP Avarma icon_template: mdi:water-boiler min_temp: 38 max_temp: 65 temp_step: 1 precision: 0.1 hvac_modes: - "off" - "heat" # Ist = Tank-Mittelwert current_temperature_template: "{{ states('sensor.avarma_tank_mittelwert') | float(0) }}" # Soll = Geraete-Sollwert (Register 901, ganze °C) target_temperature_template: "{{ states('sensor.avarma_solltemperatur_geraet') | int(45) }}" hvac_mode_template: "{{ 'heat' if is_state('switch.avarma_power','on') else 'off' }}" hvac_action_template: > {% if is_state('switch.avarma_power','off') %}off {% elif is_state('binary_sensor.avarma_verdichter','on') or is_state('binary_sensor.avarma_e_zusatzheizung','on') %}heating {% else %}idle{% endif %} # Soll setzen -> Register 901 set_temperature: - service: modbus.write_register data: hub: avarma slave: 1 address: 901 value: "{{ temperature | int }}" # An/Aus ueber den Power-Switch set_hvac_mode: - choose: - conditions: "{{ hvac_mode == 'heat' }}" sequence: - service: switch.turn_on target: entity_id: switch.avarma_power - conditions: "{{ hvac_mode == 'off' }}" sequence: - service: switch.turn_off target: entity_id: switch.avarma_power