Systemair SAVECare Ventilation unit

Hi,
I’ve recently via yaml integrated my Save VTR300 using modbus TCP, and hope this will help others as this forum has helped me alot by reading other posts from this forum. Im new to HA so i believe my way of doing this could be improved a lot as im in a steep HA learning phase.
At this point i’m considering trying Node-Red for automations and further integration for the schedule variables when i find time.

VTR300 features for this integration listed below (more or less):

  • Control of all modes like:
    *Manual Off/Manual Lo/Man Normal/Manual Hi
    *Auto Scehdule
    *Boost/Party/Fireplace/Vacation (Time setpoint)
    *HA ppm regulated mode “PPM Auto” by using Netatmo ppm value in automation + recovery to Auto
    if netatmo fails/is offline (a few locally ppm sensors are to be installed later at some time)
  • Persistent notifications for A, B, C alarms + some more
  • Flow chart with relevant sensor and state info.
  • Calculated rotating heater recycling rate (0-100%)
  • Relevant setpoints and states like:
    *Eco mode on/off + setpoint
    • Kitchen Hood/Low/Norma/Hi/Boost Fireplace Etc.
      *Temperature
    • El.Heater output
      *Time setpoint for Party/Boost/Fireplace/Vacation (displayed on mode button)
    • Change between supply and extract air temp. regulation.
    • Energy consumption by using TP link HS110
    • Internal clock, nice to know as the time must be correct for Auto mode to operate as given in the
      time schedule.
      The following is not yet integrated:
  • Detailed schedule integration, will probably try Node-Red as there is a lot of variables to write to and
    because i don’t see any other option (as far as i know) than using automations for each variable to be
    updated if there is a change done on the VTR300 HMI panel.
  • Summer/Winter Fan compensation (only read in UI for now)
  • Automation for changing between supply/Extract temp. regulation and/or temp setpoint from avg.
    outdoor temp. (last 3 days or so).
  • Improve UI in general/cleanup when fully integrated at some point later.

The HA integration has been in operation for a about 2 months and works great, Low speed is set if no one is home and the PPM is low enough according to setpoint when in “PPM Auto”, speed is increased according to automations and it is easy to see overall status from the flow chart.

The modbus documentation has it flaws as most modbus documentation from my experience, not straight forward…

NOTE! The modbus adr. listed below will not be the same for older Systemair ventilation units.
My current Save VTR300 software is:

  • Circuit board: 1.11.0
  • HMI: 1.13.0
  • IAM: 1.6.0

If using modbus TCP, the IAM cloud will not work. You must choose between the IAM cloud or Modbus.
Modbus integration gives a lot of new possibilities.
Far from all yaml config is listed because it was too long and not allowed or/and i’m doing something wrong when posting, sorry about that, but i hope it will give an idea and help out others.

modbus:
  - name: VTR300
    type: tcp
    host: IP Adr
    port: 502
    timeout: 3  #Timeout for slave response in seconds (default=3)
    delay: 3  #Time to sleep in seconds after connecting and before sending messages (defualt=0)
  
    climates:
       - name: Ventilasjon
         slave: 1
         data_type: uint
         data_count: 1
         scale: 0.1
         offset: 0
         precision: 1
         max_temp: 30
         min_temp: 15
         temp_step: 1
         target_temp_register: 2000
         current_temp_register: 12102
sensor:
  - platform: modbus
    scan_interval: 10
    registers:      
      - name: vtr300_inntaks_temperatur
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 12101
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: int
      - name: vtr300_avtrekks_temperatur
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 12543 #2050   #NB!EAT/RAT used for extract air controller
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
      - name: vtr300_avkast_temperatur
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 12106
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint    
      - name: vtr300_overhetingstemperatur_tilluft
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 12107
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint        
      - name: vtr300_relativ_fukt_avtrekk
        hub: VTR300
        device_class: humidity
        slave: 1
        register: 12135
        register_type: holding
        unit_of_measurement: '%RF'
        count: 1
        data_type: uint
      - name: vtr300_kalkulert_fukt_avtrekk
        hub: VTR300
        device_class: humidity
        slave: 1
        register: 2210
        register_type: holding
        unit_of_measurement: '%RF'
        count: 1
        data_type: uint
      - name: vtr300_kalkulert_fukt_inntak
        hub: VTR300
        device_class: humidity
        slave: 1
        register: 2211
        register_type: holding
        unit_of_measurement: '%RF'
        count: 1
        data_type: uint
      - name: vtr300_tilluftsvifte 
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 14000
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: uint
      - name: vtr300_avtrekksvifte 
        hub: VTR300
        device_class: power_factor        
        slave: 1
        register: 14001
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: uint
      - name: vtr300_sommerdrift_vinterdrift #0=sommerdrift, 1=Vinterdrift (status basert på fukt i inntak)
        hub: VTR300
        slave: 1
        register: 1038
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_komfyravtrekk_trykkvakt_av_pa 
        hub: VTR300
        slave: 1
        register: 12020
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_el_kolbe_padrag #TRIAC pådrag
        hub: VTR300
        device_class: power_factor        
        slave: 1
        register: 2148
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: uint
      - name: vtr300_el_kolbe_av_pa  #TRIAC
        hub: VTR300
        slave: 1
        register: 14380
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_varmegjenvinner
        hub: VTR300
        device_class: power_factor        
        slave: 1
        register: 14102
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: uint
      - name: vtr300_filterbytte_alm
        hub: VTR300
        slave: 1
        register: 7006
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_filterbytte_md_intervall
        hub: VTR300
        slave: 1
        register: 7000
        register_type: holding
        unit_of_measurement: 'md'
        count: 1
        data_type: int
      - name: vtr300_tid_til_filter_bytte_s
        hub: VTR300
        slave: 1
        register: 7005
        register_type: holding
        unit_of_measurement: 's'
        count: 2
        data_type: uint
      - name: vtr300_modus_status_register
        hub: VTR300
        slave: 1
        register: 1160 #0=Auto,1=Man,2=Crowded,3=Refresh,4=Fireplace,5=Away,6=Holiday,7-12 not applicable
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_manuell_modus_kommando_register
        hub: VTR300
        slave: 1
        register: 1130 #0=Man Stopp,1=Man ???,2=Man Lav,3=Man Normal,4=Man Høy
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_tilluft_sp
        hub: VTR300
        device_class: temperature       
        slave: 1
        register: 2000
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
      - name: vtr300_avtrekksluft_sp
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 2012
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
      - name: vtr300_avtrekksluft_min_sp
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 2020
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
      - name: vtr300_avtrekksluft_max_sp
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 2021
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
# 0 = Tillufts reg., 1 = Rom reg.(krever rom temp sensor, derfor NA), 2 = Avtrekks reg.
      - name: vtr300_tilluft_rom_avtrekk_reg
        hub: VTR300
        slave: 1
        register: 2030
        register_type: holding
        count: 1
        data_type: uint
      - name: vtr300_eco_varme_offset
        hub: VTR300
        device_class: temperature
        slave: 1
        register: 2503 #Temp. offset før varme element starter i Eco modus
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: uint
      - name: vtr300_nedtelling_modus_tid_s
        hub: VTR300
        slave: 1
        register: 1110
        register_type: holding
        unit_of_measurement: s
        count: 1
        data_type: uint           
      - name: vtr300_ferie_modus_varighet
        hub: VTR300
        slave: 1
        register: 1100
        register_type: holding
        unit_of_measurement: d
        count: 1
        data_type: uint   
      - name: vtr300_borte_modus_varighet
        hub: VTR300
        slave: 1
        register: 1101
        register_type: holding
        unit_of_measurement: t
        count: 1
        data_type: uint   
      - name: vtr300_ildsted_modus_varighet
        hub: VTR300
        slave: 1
        register: 1102
        register_type: holding
        unit_of_measurement: min
        count: 1
        data_type: uint   
      - name: vtr300_boost_modus_varighet
        hub: VTR300
        slave: 1
        register: 1103
        register_type: holding
        unit_of_measurement: min
        count: 1
        data_type: uint    
      - name: vtr300_party_modus_varighet
        hub: VTR300
        slave: 1
        register: 1104
        register_type: holding
        unit_of_measurement: t
        count: 1
        data_type: uint    
      - name: vtr300_fukt_avtrekk_sp
        hub: VTR300
        device_class: humidity
        slave: 1
        register: 2202
        register_type: holding
        unit_of_measurement: '%RF'
        count: 1
        data_type: uint          
      - name: vtr300_vifte_hast_komp_avlest
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1254
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: int 
      - name: vtr300_vifte_hast_komp_vinter
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1251
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: int  
      - name: vtr300_vifte_hast_komp_vinter_start_temp
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1255
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1  
        data_type: int 
      - name: vtr300_vifte_hast_komp_vinter_max_temp
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1253
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1  
        data_type: int 
      - name: vtr300_vifte_hast_komp_sjekkes
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1252
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1  
        data_type: int 
      - name: vtr300_vifte_hast_komp_sommer
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1258
        register_type: holding
        unit_of_measurement: '%'
        count: 1
        data_type: int 
      - name: vtr300_vifte_hast_komp_sommer_start_temp
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1256
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1  
        data_type: int 
      - name: vtr300_vifte_hast_komp_sommer_max_temp
        hub: VTR300
        device_class: power_factor
        slave: 1
        register: 1257
        register_type: holding
        unit_of_measurement: °C
        count: 1
        scale: 0.1
        offset: 0
        precision: 1  
        data_type: int 
      - name: vtr300_a_alm
        hub: VTR300
        slave: 1
        register: 15900
        register_type: holding
        count: 1
        data_type: uint      
      - name: vtr300_b_alm
        hub: VTR300
        slave: 1
        register: 15901
        register_type: holding
        count: 1
        data_type: uint    
      - name: vtr300_c_alm
        hub: VTR300
        slave: 1
        register: 15902
        register_type: holding
        count: 1
        data_type: uint   
      - name: vtr300_filter_wrn_alm
        hub: VTR300
        slave: 1
        register: 15543
        register_type: holding
        count: 1
        data_type: uint   
      - name: vtr300_filter_alm
        hub: VTR300
        slave: 1
        register: 15141
        register_type: holding
        count: 1
        data_type: uint 
      - name: vtr300_tilluftstemp_lav_alm
        hub: VTR300
        slave: 1
        register: 15176
        register_type: holding
        count: 1
        data_type: uint        
      - name: vtr300_filter_wrn_cnt_alm
        hub: VTR300
        slave: 1
        register: 15548
        register_type: holding
        count: 1
        data_type: uint   
  - platform: template
    sensors:
      vtr300_tilluft_rf:
        value_template: '{{((states.sensor.vtr300_tilluftsvifte.state | int) * 3) | round(0) }}'
        friendly_name: "Tilluftsmengde"
        unit_of_measurement: 'm³/t'
  - platform: template
    sensors:
      vtr300_avtrekk_rf:
        value_template: '{{((states.sensor.vtr300_avtrekksvifte.state | int) * 3) | round(0) }}'
        friendly_name: "Avtrekksmengde"
        unit_of_measurement: 'm³/t'
  - platform: template
    sensors:
      vtr300_gjenvinningsgrad:
        value_template: '{{((((states.sensor.vtr300_tillufts_temperatur.state | float ) - (states.sensor.vtr300_inntaks_temperatur.state | float)) / ((states.sensor.vtr300_avtrekks_temperatur.state | float ) - (states.sensor.vtr300_inntaks_temperatur.state | float))) * 100) | round(1) }}'
        unit_of_measurement: '%'
        friendly_name: "Gjenvinningsgrad"
     
      vtr300_tid_til_filterbytte:
        friendly_name: 'Neste filter bytte'
        value_template: >- 
          {% if states('sensor.vtr300_tid_til_filter_bytte_s')|int > 1 %}
            {% set time = states.sensor.vtr300_tid_til_filter_bytte_s.state | int %}
            {% set minutes = ((time % 3600) / 60) | int %}
            {% set hours = ((time % 86400) / 3600) | int %}
            {% set days = (time / 86400) | int %}
            {%- if days > 548 -%}
              Mer en 1.5 år
              {%- else -%}
              {%- if days > 0 -%}
                {{ days }}d
              {%- endif -%}
              {%- if hours > 0 -%}
                {%- if days > 0 -%}
                  {{ ' ' }}
                {%- endif -%}
                {{ hours }}t
              {%- endif -%}
              {%- if minutes > 0 -%}
                {%- if days > 0 or hours > 0 -%}
                  {{ ' ' }}
                {%- endif -%}
                {{ minutes }}m
              {%- endif -%}
            {%- endif -%}    
          {% else %}
            Bytt Filter!
          {% endif %}     

      vtr300_borte_nedtelling_tid_t:
        friendly_name: 'Gjenstående tid når aktiv'
        value_template: >- 
          {% if states('sensor.vtr300_modus_status_register')|int == 5 %}
            {% set time = states.sensor.vtr300_nedtelling_modus_tid_s.state | int %}
            {% set minutes = ((time % 3600) / 60) | int %}
            {% set hours = ((time % 86400) / 3600) | int %}

            {%- if time < 60 -%}
              Mindre en 1 minutt
              {%- else -%}
              {%- if hours > 0 -%}
                  {{ hours }}t
                {%- endif -%}
              {%- if minutes > 0 -%}
                {%- if hours > 0 -%}
                  {{ ' ' }}
                {%- endif -%}
                {{ minutes }}m
              {%- endif -%}
            {%- endif -%}
          {% else %}
            Inaktiv
          {% endif %}             

      vtr300_sommer_vinterd_driftstatus:
        friendly_name: "Aktiv sesong"
        value_template: >-
          {% if states('sensor.vtr300_sommerdrift_vinterdrift')|int == 0 %}
            Sommerdrift
          {% elif states('sensor.vtr300_sommerdrift_vinterdrift')|int == 1 %}
            Vinterdrift
          {% else %}
             Stein dau
          {% endif %}

      vtr300_reg_mode:
        friendly_name: "Regulering"
        value_template: >-
          {% if states('sensor.vtr300_tilluft_rom_avtrekk_reg')|int == 0 %}
            Tilluftsregulering
          {% elif states('sensor.vtr300_tilluft_rom_avtrekk_reg')|int == 1 %}
            Rom reg.
          {% elif states('sensor.vtr300_tilluft_rom_avtrekk_reg')|int == 2 %}
            Avtrekksregulering
          {% else %}
            Stein dau
          {% endif %}

      vtr300_modus_status:
        friendly_name: "Modus"
        value_template: >-
          {% if states('sensor.vtr300_modus_status_register')|int == 0 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 2 %}
            Auto schedule - Lav
          {% elif states('sensor.vtr300_modus_status_register')|int == 0 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 3 %}
            Auto schedule - Normal           
          {% elif states('sensor.vtr300_modus_status_register')|int == 0 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 4 %}
            Auto schedule - Høy                       
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 0 %}
            Manuell STOPP 
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 1 %}
            Manuell Shitstorm? 
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 2 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'off') %}
            Manuell Lav  
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 3 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'off') %}
            Manuell Normal
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 4 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'off') %}
            Manuell Høy                     
          {% elif states('sensor.vtr300_modus_status_register')|int == 3  %}
            Boost
          {% elif states('sensor.vtr300_modus_status_register')|int == 2  %}
            Party
          {% elif states('sensor.vtr300_modus_status_register')|int == 4  %}
            Ildsted
          {% elif states('sensor.vtr300_modus_status_register')|int == 5  %}
            Borte
          {% elif states('sensor.vtr300_modus_status_register')|int == 6  %}
            ferie
          {% elif states('sensor.vtr300_modus_status_register')|int == 7 %}
            Cooker
          {% elif states('sensor.vtr300_modus_status_register')|int == 8 %}
            Hood
          {% elif states('sensor.vtr300_modus_status_register')|int == 9 %}
            Støvsuger
          {% elif states('sensor.vtr300_modus_status_register')|int == 10 %}
            CDI1
          {% elif states('sensor.vtr300_modus_status_register')|int == 11 %}
            CDI2
          {% elif states('sensor.vtr300_modus_status_register')|int == 12 %}
            Komfyravtrekk          
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 2 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'on') %}
            PPM Auto - Lav  
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 3 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'on') %}
            PPM Auto - Normal
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int == 4 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'on') %}
            PPM Auto - Høy   
          {% elif states('sensor.vtr300_modus_status_register')|int == 3 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'on') %}
            PPM Auto - BOOST            
          {% else %}
            WTF
          {% endif %}    

      vtr300_manuell_button_modus_status:
        friendly_name: "Manuell button modus status"
        value_template: >-
          {% if states('sensor.vtr300_modus_status_register')|int == 0 and states('sensor.vtr300_manuell_modus_kommando_register')|int > 0 %}
            Auto schedule
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int > 0 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'off') %}
            Manuell
          {% elif states('sensor.vtr300_modus_status_register')|int == 1 and states('sensor.vtr300_manuell_modus_kommando_register')|int > 0 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'on') %}
            PPM Auto         
          {% elif states('sensor.vtr300_modus_status_register')|int > 0 and states('sensor.vtr300_manuell_modus_kommando_register')|int > 0 and is_state('input_boolean.vtr300_ppm_mode_auto_enable_modus_status_dummy', 'off') %}
            Standby            
          {% else %}
            Av
          {% endif %}     

input_number:
  vtr300_eco_offset_temp_sp:
    name: Eco offset
    min: 0
    max: 10
    step: 1
    mode: box
    unit_of_measurement: °C
    icon: mdi:temperature

  vtr300_ferie_modus_varighet_sp:
    name: Ferie modus - Ønsket varighet 
    min: 1
    max: 365
    step: 1
    mode: box
    unit_of_measurement: d
    icon: mdi:timelapse   

  vtr300_borte_modus_varighet_sp:
    name: Borte modus - Ønsket varighet
    min: 1
    max: 72
    step: 1
    mode: box
    unit_of_measurement: t
    icon: mdi:timelapse       

  vtr300_ildsted_modus_varighet_sp:
    name: Ildsted modus - Ønsket varighet
    min: 1
    max: 60
    step: 1
    mode: box
    unit_of_measurement: m
    icon: mdi:timelapse  

switch:
    - platform: template
      switches:
        vtr300_auto_modus:
          friendly_name: Auto modus 
          value_template: "{{ is_state('sensor.vtr300_modus_status', 'Auto schedule - Lav') or is_state('sensor.vtr300_modus_status', 'Auto schedule - Normal') or is_state('sensor.vtr300_modus_status', 'Auto schedule - Høy')  }}"
          turn_on:
            - service: script.vtr300_auto_modus
              data:
                action: "on"
          turn_off:
            service: script.vtr300_auto_dummy_av
            data:
              action: "off"

        vtr300_man_stopp_modus:
          friendly_name: Manuell stopp        
          value_template: "{{ is_state('sensor.vtr300_modus_status', 'Manuell STOPP') }}" 
          turn_on:
            - service: script.vtr300_man_stopp_modus
              data:
                action: "on"    
          turn_off:
            service: script.vtr300_man_stopp_dummy_av
            data:
              action: "off"
        vtr300_man_lav_modus:
          friendly_name: Lav hastighet        
          value_template: "{{ is_state('sensor.vtr300_modus_status', 'Manuell Lav') or is_state('sensor.vtr300_modus_status', 'Auto schedule - Lav') or is_state('sensor.vtr300_modus_status', 'PPM Auto - Lav') }}"
          turn_on:
            - service: script.vtr300_man_lav_modus  
              data:
                action: "on"
          turn_off:
            service: script.vtr300_man_lav_dummy_av
            data:
              action: "off"
        vtr300_man_normal_modus:
          friendly_name: Normal hastighet    
          value_template: "{{ is_state('sensor.vtr300_modus_status', 'Manuell Normal') or is_state('sensor.vtr300_modus_status', 'Auto schedule - Normal') or is_state('sensor.vtr300_modus_status', 'PPM Auto - Normal') }}"          
          turn_on:
            - service: script.vtr300_man_normal_modus 
              data:
                action: "on"    
          turn_off:
            service: script.vtr300_man_normal_dummy_av
            data:
              action: "off"              
        vtr300_man_hoy_modus:
          friendly_name: Høy hastighet       
          value_template: "{{ is_state('sensor.vtr300_modus_status', 'Manuell Høy') or is_state('sensor.vtr300_modus_status', 'Auto schedule - Høy') or is_state('sensor.vtr300_modus_status', 'PPM Auto - Høy') }}"           
          turn_on:
            service: script.vtr300_man_hoy_modus
            data:
              action: "on"    
          turn_off:
            service: script.vtr300_man_hoy_dummy_av
            data:
              action: "off"     
 
    - platform: modbus
      scan_interval: 10
      registers:
        - name: vtr300_eco_modus
          hub: VTR300
          slave: 1
          register: 2504
          command_on: 1  #Aktiver Eco drift basert på temp. offset
          command_off: 0  #Deaktiver Eco drift
          verify_state: true
          register_type: holding
          verify_register: 2504
          state_on: 1
          state_off: 0

input_boolean:
  vtr300_auto_modus_status_dummy:
    name: VTR300 Auto modus status dummy
    icon: mdi:fan  
  vtr300_party_modus_status_dummy:
    name: VTR300 Party modus status dummy
    icon: mdi:fan
  vtr300_boost_modus_status_dummy:
    name: VTR300 Boost modus status dummy
    icon: mdi:fan
  vtr300_ildsted_modus_status_dummy:
    name: VTR300 Ildsted modus status dummy
    icon: mdi:fan
  vtr300_borte_modus_status_dummy:
    name: VTR300 Borte modus status dummy
    icon: mdi:fan
  vtr300_ferie_modus_status_dummy:
    name: VTR300 ferie modus status dummy
    icon: mdi:fan
  vtr300_man_stopp_modus_status_dummy:
    name: VTR300 Manuell Stopp modus status dummy
    icon: mdi:fan  
  vtr300_man_lav_modus_status_dummy:
    name: VTR300 Manuell Lav modus status dummy
    icon: mdi:fan  
  vtr300_man_normal_modus_status_dummy:
    name: VTR300 Manuell Normal modus status dummy
    icon: mdi:fan  
  vtr300_man_hoy_modus_status_dummy:
    name: VTR300 Manuell Høy modus status dummy
    icon: mdi:fan  
  vtr300_ppm_mode_auto_enable_modus_status_dummy:
    name: VTR300 PPM Auto Enable modus status dummy
    icon: mdi:fan  
script:
  vtr300_man_normal_modus:
    sequence:
      - service: input_boolean.turn_on
        entity_id: input_boolean.vtr300_man_normal_modus_status_dummy
#Aktiver manuell modus før hastighet
      - service: modbus.write_register
        data_template:
          hub: VTR300
          unit: 1
          address: 1161
          value: 2
      - service: switch.turn_off
        entity_id: switch.vtr300_man_stopp_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_man_lav_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_man_hoy_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_auto_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_party_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_boost_modus 
      - service: switch.turn_off
        entity_id: switch.vtr300_ildsted_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_borte_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_ferie_modus
      - delay: '00:00:02'
      - service: modbus.write_register
        data_template:
          hub: VTR300
          unit: 1
          address: 1130
          value: 3
  vtr300_man_normal_dummy_av:
    sequence:
      service: input_boolean.turn_off
      entity_id: input_boolean.vtr300_man_normal_modus_status_dummy
  vtr300_man_hoy_modus:
    sequence: 
      - service: input_boolean.turn_on
        entity_id: input_boolean.vtr300_man_hoy_modus_status_dummy
#Aktiver manuell modus før hastighet
      - service: modbus.write_register
        data_template:
          hub: VTR300
          unit: 1
          address: 1161
          value: 2
      - service: switch.turn_off
        entity_id: switch.vtr300_man_stopp_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_man_lav_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_man_normal_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_auto_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_party_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_boost_modus 
      - service: switch.turn_off
        entity_id: switch.vtr300_ildsted_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_borte_modus
      - service: switch.turn_off
        entity_id: switch.vtr300_ferie_modus
      - delay: '00:00:02'
      - service: modbus.write_register
        data_template:
          hub: VTR300
          unit: 1
          address: 1130
          value: 4
  vtr300_man_hoy_dummy_av:
    sequence:
      service: input_boolean.turn_off
      entity_id: input_boolean.vtr300_man_hoy_modus_status_dummy    
5 Likes