├── user interface ├── Default.png ├── Show_Hidden.png └── Controlpanel.txt ├── configuration_main.yaml ├── README.md └── packages └── save_vsr_300.yaml /user interface/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ztaeyn/HomeAssistant-VTR-Modbus/HEAD/user interface/Default.png -------------------------------------------------------------------------------- /user interface/Show_Hidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ztaeyn/HomeAssistant-VTR-Modbus/HEAD/user interface/Show_Hidden.png -------------------------------------------------------------------------------- /configuration_main.yaml: -------------------------------------------------------------------------------- 1 | 2 | #------------------- INCLUDE----------------------------------| 3 | homeassistant: 4 | packages: !include_dir_named packages 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HomeAssistant-VTR-Modbus 2 | Simple control of Systemair VTR(300) via modbus TCP (Wifi) directly to HA. 3 | 4 | Credits to GMTrevis who created the original code for Home Assistant, and then improved it for use via Node-Red. 5 | The Node Red version has full control of the VTR, but I had issues where it overloaded my Node-Red. 6 | I found his incomplete Home Assistant code, and am working on filling it out for my own experiences. 7 | 8 | And a big thanks to cmragnar who branched off and created a package out of this, which I'm now merging in and will continue fixing on that instead. 9 | * https://github.com/cmragnar/HomeAssistant-VSR300-Modbus 10 | 11 | With this you currently can: 12 | - Change operation Modes, Auto, Low/medium/high, Crowded/Party, Refresh/Boost, Away, Vacation. Stop seems to need a look at. 13 | - Set duration setpoint for Away, Vacation, Boost/Refresh and Crowded/Party 14 | - See alarm status and filter replacement countdown, and adjust the filter countdown. 15 | - Etc 16 | - See alarm status and filter replacement countdown. 17 | - Set wanted temperature on the VTR thermostat. 18 | - Create automations your own automations using the above. 19 | 20 | 21 | Known Issues: 22 | See Issues Tab. 23 | 24 | 25 | Sources: 26 | * Modbus codes: https://shop.systemair.com/upload/assets/SAVE_MODBUS_VARIABLE_LIST_20190116__REV__29_.PDF 27 | * VTR Installation manual: https://shop.systemair.com/upload/assets/SAVE_VTR_300B_SERVICE_AND_ACCESSORIES_INSTALLATION_NO_V1_20210616_122140836.PDF?31ae5eca 28 | * Older HA code from GMTrevis: https://community.home-assistant.io/t/systemair-savecare-ventilation-unit/229653/2 29 | * New Node-Red/HA code from GMTrevis: https://github.com/GMTrevis/Homeassistant-NodeRed-Systemair-VTR300 30 | 31 | HACS addons used: 32 | https://github.com/piitaya/lovelace-mushroom 33 | 34 | ![default](https://github.com/user-attachments/assets/aa2a04d6-4e4f-4ca8-87f8-1659b82ea11e) 35 | ![show_hidden](https://github.com/user-attachments/assets/f18d5374-40f2-45e3-ac26-86870fb9ec56) 36 | 37 | 38 | 39 | 40 | Hardware required: (For my setup) 41 | A modbus tcp converter. I use the EW11 from Aliexpress, via Wifi. 42 | https://www.aliexpress.com/item/33036056772.html?spm=a2g0o.order_detail.0.0.2613f19cZlIBKq 43 | 44 | How to install this: 45 | - Copy all my .yaml files to your HA installation folder, and modify the paths in configuration.yaml to match your personal settings if applicable. 46 | - Modify modbus.yaml with your working modbus settings. 47 | - Verify HA configuration is OK and reboot. 48 | - Copy my HA UI card layouts if you'd like. Take note of the dependency of some HACS addons I've used. 49 | 50 | Files explained: 51 | User Interface/* - Copy of my HA card layout 52 | modbus.yaml - Stored in the HA root folder. Contains the system specific settings, and the modbus sensors. NOTE: The addresses has an offset of -1 compared to the VTR user manual linked. 53 | configuration.yaml - Configured paths to the various functions. I have multiple files for various things, therefore I've placed the files under folders in HA as here in github. 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /user interface/Controlpanel.txt: -------------------------------------------------------------------------------- 1 | type: sections 2 | max_columns: 3 3 | title: Ventilasjon 4 | path: ventilation 5 | sections: 6 | - type: grid 7 | cards: 8 | - type: heading 9 | heading: Mode Control 10 | heading_style: title 11 | - type: tile 12 | entity: switch.vsr300_auto_mode 13 | icon: mdi:fan-auto 14 | name: Auto 15 | color: accent 16 | tap_action: 17 | action: toggle 18 | - type: tile 19 | entity: switch.vsr300_man_low_mode 20 | icon: mdi:fan-speed-1 21 | name: Manual Low 22 | color: accent 23 | tap_action: 24 | action: toggle 25 | - type: tile 26 | entity: switch.vsr300_man_normal_mode 27 | icon: mdi:fan-speed-2 28 | name: Manual Normal 29 | color: accent 30 | tap_action: 31 | action: toggle 32 | - type: tile 33 | entity: switch.vsr300_man_high_mode 34 | icon: mdi:fan-speed-3 35 | name: Manual High 36 | color: accent 37 | tap_action: 38 | action: toggle 39 | - type: tile 40 | entity: switch.vsr300_crowded_mode 41 | icon: mdi:fan-chevron-up 42 | name: Crowded 43 | color: accent 44 | tap_action: 45 | action: toggle 46 | - type: tile 47 | entity: switch.vsr300_refresh_mode 48 | icon: mdi:fan-plus 49 | name: Refresh 50 | color: accent 51 | tap_action: 52 | action: toggle 53 | - type: tile 54 | entity: switch.vsr300_away_mode 55 | icon: mdi:fan-minus 56 | name: Away 57 | color: accent 58 | tap_action: 59 | action: toggle 60 | - type: tile 61 | entity: switch.vsr300_holiday_mode 62 | icon: mdi:fan-remove 63 | name: Holiday 64 | color: accent 65 | tap_action: 66 | action: toggle 67 | - type: tile 68 | entity: switch.vsr300_man_stop_mode 69 | icon: mdi:fan-off 70 | name: Manual Stop 71 | color: accent 72 | tap_action: 73 | action: toggle 74 | column_span: 2 75 | - type: grid 76 | cards: 77 | - type: heading 78 | heading: Status 79 | heading_style: title 80 | - type: conditional 81 | conditions: 82 | - condition: or 83 | conditions: 84 | - condition: state 85 | entity: switch.vsr300_away_mode 86 | state: "on" 87 | - condition: state 88 | entity: switch.vsr300_crowded_mode 89 | state: "on" 90 | - condition: state 91 | entity: switch.vsr300_refresh_mode 92 | state: "on" 93 | - condition: state 94 | entity: switch.vsr300_holiday_mode 95 | state: "on" 96 | card: 97 | type: custom:mushroom-template-card 98 | primary: |2- 99 | {% if is_state('switch.vsr300_away_mode', 'on') %} 100 | Away 101 | {% elif 102 | is_state('switch.vsr300_crowded_mode', 'on')%} 103 | Crowded 104 | {% elif 105 | is_state('switch.vsr300_refresh_mode', 'on')%} 106 | Refresh 107 | {% elif 108 | is_state('switch.vsr300_holiday_mode', 'on')%} 109 | Holiday 110 | {% else %} 111 | Normal Operation 112 | {% endif %} 113 | secondary: >2- 114 | {% if is_state('switch.vsr300_away_mode', 'on') %} 115 | Remaining: {{ states('sensor.vsr300_away_countdown_time_t') | 116 | default('Not Set') }} 117 | {% elif 118 | is_state('switch.vsr300_crowded_mode', 'on')%} 119 | Remaining: {{ states('sensor.vsr300_crowded_countdown_time_t') | 120 | default('Not Set') }} 121 | {% elif 122 | is_state('switch.vsr300_refresh_mode', 'on')%} 123 | Remaining: {{ states('sensor.vsr300_refresh_countdown_time_t') | 124 | default('Not Set') }} 125 | {% elif 126 | is_state('switch.vsr300_holiday_mode', 'on')%} 127 | Remaining: {{ states('sensor.vsr300_holiday_countdown_time_t') | 128 | default('Not Set') }} 129 | {% else %} 130 | Normal Operation 131 | {% endif %} 132 | icon: |2- 133 | {% if is_state('switch.vsr300_away_mode', 'on') %} 134 | mdi:fan-minus 135 | {% elif 136 | is_state('switch.vsr300_crowded_mode', 'on')%} 137 | mdi:fan-chevron-up 138 | {% elif 139 | is_state('switch.vsr300_refresh_mode', 'on')%} 140 | mdi:fan-plus 141 | {% elif 142 | is_state('switch.vsr300_holiday_mode', 'on')%} 143 | mdi:fan-remove 144 | {% else %} 145 | mdi:fan 146 | {% endif %} 147 | multiline_secondary: false 148 | fill_container: false 149 | icon_color: orange 150 | badge_icon: "" 151 | card_mod: 152 | style: 153 | mushroom-shape-icon$: | 154 | .shape { 155 | --shape-animation: ping 2s infinite; 156 | } 157 | @keyframes ping { 158 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 159 | 100% { box-shadow: 0 0 5px 15px transparent; } 160 | } 161 | .: | 162 | mushroom-shape-icon { 163 | animation: blink 1s ease-in-out infinite; 164 | } 165 | - type: conditional 166 | conditions: 167 | - condition: state 168 | entity: sensor.vsr300_mode_status 169 | state: Pressure guard 170 | card: 171 | type: custom:mushroom-template-card 172 | primary: Pressure Guard Active 173 | secondary: "" 174 | icon: mdi:car-brake-low-pressure 175 | multiline_secondary: false 176 | fill_container: false 177 | icon_color: orange 178 | badge_icon: "" 179 | card_mod: 180 | style: 181 | mushroom-shape-icon$: | 182 | .shape { 183 | --shape-animation: ping 2s infinite; 184 | } 185 | @keyframes ping { 186 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 187 | 100% { box-shadow: 0 0 5px 15px transparent; } 188 | } 189 | .: | 190 | mushroom-shape-icon { 191 | animation: blink 1s ease-in-out infinite; 192 | } 193 | - type: tile 194 | entity: sensor.vsr300_supply_temperature 195 | name: Inntak Temperatur 196 | vertical: false 197 | show_entity_picture: false 198 | - type: tile 199 | entity: sensor.vsr300_exhaust_temperature 200 | name: Avtrekk Temperatur 201 | vertical: false 202 | show_entity_picture: false 203 | - type: tile 204 | entity: sensor.vsr300_heat_recovery 205 | name: Varmegjenvinning 206 | vertical: false 207 | show_entity_picture: false 208 | - type: tile 209 | entity: sensor.vsr300_time_to_filter_change_months 210 | name: Neste filterbytte 211 | vertical: false 212 | show_entity_picture: false 213 | - type: conditional 214 | conditions: 215 | - condition: state 216 | entity: sensor.vsr300_a_alarm 217 | state: "1" 218 | card: 219 | type: custom:mushroom-template-card 220 | primary: A# Alarm 221 | secondary: "" 222 | icon: mdi:alert 223 | multiline_secondary: false 224 | fill_container: false 225 | icon_color: red 226 | badge_icon: "" 227 | card_mod: 228 | style: 229 | mushroom-shape-icon$: | 230 | .shape { 231 | --shape-animation: ping 2s infinite; 232 | } 233 | @keyframes ping { 234 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 235 | 100% { box-shadow: 0 0 5px 15px transparent; } 236 | } 237 | .: | 238 | mushroom-shape-icon { 239 | animation: blink 1s ease-in-out infinite; 240 | } 241 | @keyframes blink { 242 | 50% {opacity: 0.5;} 243 | } 244 | - type: conditional 245 | conditions: 246 | - condition: state 247 | entity: sensor.vsr300_b_alarm 248 | state: "1" 249 | card: 250 | type: custom:mushroom-template-card 251 | primary: B# Alarm 252 | secondary: "" 253 | icon: mdi:alert 254 | multiline_secondary: false 255 | fill_container: false 256 | icon_color: red 257 | badge_icon: "" 258 | card_mod: 259 | style: 260 | mushroom-shape-icon$: | 261 | .shape { 262 | --shape-animation: ping 2s infinite; 263 | } 264 | @keyframes ping { 265 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 266 | 100% { box-shadow: 0 0 5px 15px transparent; } 267 | } 268 | .: | 269 | mushroom-shape-icon { 270 | animation: blink 1s ease-in-out infinite; 271 | } 272 | @keyframes blink { 273 | 50% {opacity: 0.5;} 274 | } 275 | - type: conditional 276 | conditions: 277 | - condition: state 278 | entity: sensor.vsr300_c_alarm 279 | state: "1" 280 | card: 281 | type: custom:mushroom-template-card 282 | primary: C# Alarm 283 | secondary: "" 284 | icon: mdi:alert 285 | multiline_secondary: false 286 | fill_container: false 287 | icon_color: red 288 | badge_icon: "" 289 | card_mod: 290 | style: 291 | mushroom-shape-icon$: | 292 | .shape { 293 | --shape-animation: ping 2s infinite; 294 | } 295 | @keyframes ping { 296 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 297 | 100% { box-shadow: 0 0 5px 15px transparent; } 298 | } 299 | .: | 300 | mushroom-shape-icon { 301 | animation: blink 1s ease-in-out infinite; 302 | } 303 | @keyframes blink { 304 | 50% {opacity: 0.5;} 305 | } 306 | - type: conditional 307 | conditions: 308 | - condition: state 309 | entity: sensor.vsr300_filter_warning_alarm 310 | state: "1" 311 | card: 312 | type: custom:mushroom-template-card 313 | primary: Filter Alarm 314 | secondary: "" 315 | icon: mdi:air-filter 316 | multiline_secondary: false 317 | fill_container: false 318 | icon_color: red 319 | badge_icon: "" 320 | card_mod: 321 | style: 322 | mushroom-shape-icon$: | 323 | .shape { 324 | --shape-animation: ping 2s infinite; 325 | } 326 | @keyframes ping { 327 | 0% { box-shadow: 0 0 1px 1px rgba(var(--rgb-red), 0.7); } 328 | 100% { box-shadow: 0 0 5px 15px transparent; } 329 | } 330 | .: | 331 | mushroom-shape-icon { 332 | animation: blink 1s ease-in-out infinite; 333 | } 334 | @keyframes blink { 335 | 50% {opacity: 0.5;} 336 | } 337 | - type: grid 338 | cards: 339 | - type: heading 340 | heading: Setpoints 341 | heading_style: title 342 | icon: mdi:clock-end 343 | - features: 344 | - type: numeric-input 345 | style: buttons 346 | type: tile 347 | entity: input_number.vsr300_crowded_mode_duration_sp 348 | name: Crowded 349 | vertical: false 350 | hide_state: true 351 | show_entity_picture: false 352 | - features: 353 | - type: numeric-input 354 | style: buttons 355 | type: tile 356 | entity: input_number.vsr300_refresh_mode_duration_sp 357 | name: Refresh 358 | vertical: false 359 | hide_state: true 360 | show_entity_picture: false 361 | - features: 362 | - type: numeric-input 363 | style: buttons 364 | type: tile 365 | entity: input_number.vsr300_away_mode_duration_sp 366 | name: Away 367 | vertical: false 368 | hide_state: true 369 | show_entity_picture: false 370 | - features: 371 | - type: numeric-input 372 | style: buttons 373 | type: tile 374 | entity: input_number.vsr300_holiday_mode_duration_sp 375 | name: Holiday 376 | vertical: false 377 | hide_state: true 378 | show_entity_picture: false 379 | - features: 380 | - type: numeric-input 381 | style: buttons 382 | type: tile 383 | entity: input_number.vsr300_eco_offset_temp_sp 384 | name: Eco Offset 385 | vertical: false 386 | hide_state: true 387 | show_entity_picture: false 388 | - features: 389 | - type: numeric-input 390 | style: buttons 391 | type: tile 392 | entity: input_number.vsr300_filter_replacement_period_months_sp 393 | name: Filter Change 394 | vertical: false 395 | hide_state: true 396 | show_entity_picture: false 397 | - type: grid 398 | cards: 399 | - type: heading 400 | heading: Temperature 401 | heading_style: title 402 | - type: thermostat 403 | entity: climate.vent_vsr300 404 | name: Ventilation 405 | show_current_as_primary: false 406 | cards: [] 407 | subview: true 408 | icon: mdi:hvac 409 | dense_section_placement: false 410 | -------------------------------------------------------------------------------- /packages/save_vsr_300.yaml: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # Modbus on SYSTEMAIR SAVE_VSR_300 3 | ################################################################################ 4 | modbus: 5 | - name: VSR300 6 | # See https://www.home-assistant.io/integrations/modbus/ 7 | type: tcp #User setting 8 | host: 192.168.10.22 #User setting 9 | port: 8432 #User setting 10 | timeout: 3 #Timeout for slave response in seconds (default=3) 11 | delay: 1 #Time to sleep in seconds after connecting and before sending messages (defualt=0) 12 | #message_wait_milliseconds: 50 #Increased to hopefully reduce errors in my serial comm (Default:30 for serial connection, 0 for all other connections.) 13 | 14 | climates: 15 | - name: vent_VSR300 16 | unique_id: vent_VSR300 17 | address: 12102 18 | slave: 1 19 | scale: 0.1 20 | offset: 0 21 | precision: 1 22 | max_temp: 30 23 | min_temp: 15 24 | temp_step: 1 25 | target_temp_register: 2000 26 | 27 | sensors: 28 | # All addresses are a number lower than value in MODBUS variable list 29 | - name: vsr300_outdoor_temperature 30 | unique_id: vsr300_outdoor_temperature 31 | ##hub: VSR300 32 | device_class: temperature 33 | slave: 1 34 | address: 12101 35 | input_type: holding 36 | unit_of_measurement: °C 37 | scale: 0.1 38 | offset: 0 39 | precision: 1 40 | data_type: int16 41 | 42 | # Removed due to HA2024.3 not allowing duplicate use of address. Replaced with template sensor under # SENSORS. 43 | # - name: vsr300_supply_temperature 44 | # unique_id: vsr300_supply_temperature 45 | # ##hub: VSR300 46 | # device_class: temperature 47 | # slave: 1 48 | # address: 12102 49 | # input_type: holding 50 | # unit_of_measurement: °C 51 | # scale: 0.1 52 | # offset: 0 53 | # precision: 1 54 | # data_type: int16 55 | 56 | - name: vsr300_exhaust_temperature 57 | unique_id: vsr300_exhaust_temperature 58 | #hub: VSR300 59 | device_class: temperature 60 | slave: 1 61 | address: 12543 #2050 #NB!EAT/RAT used for extract air controller 62 | input_type: holding 63 | unit_of_measurement: °C 64 | scale: 0.1 65 | offset: 0 66 | precision: 1 67 | data_type: uint16 68 | - name: vsr300_efficiency_temperature 69 | unique_id: vsr300_efficiency_temperature 70 | #hub: VSR300 71 | device_class: temperature 72 | slave: 1 73 | address: 12106 74 | input_type: holding 75 | unit_of_measurement: °C 76 | scale: 0.1 77 | offset: 0 78 | precision: 1 79 | data_type: uint16 80 | - name: vsr300_overheat_temperature 81 | unique_id: vsr300_overheat_temperature 82 | #hub: VSR300 83 | device_class: temperature 84 | slave: 1 85 | address: 12107 86 | input_type: holding 87 | unit_of_measurement: °C 88 | scale: 0.1 89 | offset: 0 90 | precision: 1 91 | data_type: uint16 92 | - name: vsr300_relative_moisture_extraction 93 | unique_id: vsr300_relative_moisture_extraction 94 | #hub: VSR300 95 | device_class: humidity 96 | slave: 1 97 | address: 12135 98 | input_type: holding 99 | unit_of_measurement: "%" 100 | data_type: uint16 101 | - name: vsr300_calculated_moisture_extraction 102 | unique_id: vsr300_calculated_moisture_extraction 103 | #hub: VSR300 104 | device_class: humidity 105 | slave: 1 106 | address: 2210 107 | input_type: holding 108 | unit_of_measurement: "%" 109 | data_type: uint16 110 | - name: vsr300_calculated_moisture_intake 111 | unique_id: vsr300_calculated_moisture_intake 112 | #hub: VSR300 113 | device_class: humidity 114 | slave: 1 115 | address: 2211 116 | input_type: holding 117 | unit_of_measurement: "%" 118 | data_type: uint16 119 | - name: vsr300_supply_air_fan 120 | unique_id: vsr300_supply_air_fan_pwr_fact 121 | #hub: VSR300 122 | device_class: power_factor 123 | slave: 1 124 | address: 14000 125 | input_type: holding 126 | unit_of_measurement: "%" 127 | data_type: uint16 128 | - name: vsr300_extractor_fan 129 | unique_id: vsr300_extractor_fan_pwr_fact 130 | #hub: VSR300 131 | device_class: power_factor 132 | slave: 1 133 | address: 14001 134 | input_type: holding 135 | unit_of_measurement: "%" 136 | data_type: uint16 137 | - name: vsr300_summer_winter_operation #Actual seasson for Demand Control: 0: Summer,1: Winter 138 | unique_id: vsr300_summer_winter_operation_1_0 139 | #hub: VSR300 140 | slave: 1 141 | address: 1038 142 | input_type: holding 143 | data_type: uint16 144 | - name: vsr300_extractor_hood_pressure_switch_off_on 145 | unique_id: vsr300_digital_ui_1 146 | #hub: VSR300 147 | slave: 1 148 | address: 12020 149 | input_type: holding 150 | data_type: uint16 151 | - name: vsr300_TRIAC_after_manual_override #PWM TRIAC after manual override 152 | unique_id: vsr300_triac_after_manual_override 153 | #hub: VSR300 154 | device_class: power_factor 155 | slave: 1 156 | address: 2148 157 | input_type: holding 158 | unit_of_measurement: "%" 159 | data_type: uint16 160 | - name: vsr300_TRIAC_control_signal_on_off #TRIAC Control signal 161 | unique_id: vsr300_triac_control_signal 162 | #hub: VSR300 163 | slave: 1 164 | address: 14380 165 | input_type: holding 166 | data_type: uint16 167 | - name: vsr300_heat_recovery 168 | unique_id: vsr300_heat_recovery 169 | #hub: VSR300 170 | device_class: power_factor 171 | slave: 1 172 | address: 14102 173 | input_type: holding 174 | unit_of_measurement: "%" 175 | data_type: uint16 176 | - name: vsr300_filter_replacement_alarm 177 | unique_id: vsr300_filter_replacement_alarm 178 | #hub: VSR300 179 | slave: 1 180 | address: 7006 181 | input_type: holding 182 | data_type: uint16 183 | - name: vsr300_filter_replacement_period_months 184 | unique_id: vsr300_filter_replacement_period 185 | #hub: VSR300 186 | slave: 1 187 | address: 7000 188 | input_type: holding 189 | unit_of_measurement: "months" 190 | data_type: int16 191 | - name: vsr300_time_to_filter_replacement_s 192 | unique_id: vsr300_time_to_filter_replacement 193 | #hub: VSR300 194 | slave: 1 195 | address: 7005 196 | input_type: holding 197 | unit_of_measurement: "s" 198 | data_type: uint32 199 | - name: vsr300_mode_status_register 200 | unique_id: vsr300_mode_status_register 201 | #hub: VSR300 202 | slave: 1 203 | address: 1160 #Active User mode.0: Auto,1: Manual,2: Crowded,3: Refresh,4: Fireplace,5: Away,6: Holiday,7: Cooker Hood,8: Vacuum Cleaner,9: CDI1,10: CDI2,11: CDI3,12: PressureGuard 204 | input_type: holding 205 | data_type: uint16 206 | - name: vsr300_manual_mode_command_register 207 | unique_id: vsr300_manual_mode_command_register 208 | #hub: VSR300 209 | slave: 1 210 | address: 1130 #0: Off(1),2: Low,3: Normal,4: High,(1):value Off only allowed if contents of register REG_FAN_MANUAL_STOP_ALLOWED is 1. 211 | input_type: holding 212 | data_type: uint16 213 | - name: vsr300_supply_air_fan_speed 214 | unique_id: vsr300_saf_speed_rpm 215 | #hub: VSR300 216 | slave: 1 217 | address: 12400 218 | input_type: holding 219 | unit_of_measurement: rpm 220 | data_type: uint16 221 | - name: vsr300_exhaust_air_fan_speed 222 | unique_id: vsr300_eaf_speed_rpm 223 | #hub: VSR300 224 | slave: 1 225 | address: 12401 226 | input_type: holding 227 | unit_of_measurement: rpm 228 | data_type: uint16 229 | - name: vsr300_supply_air_fan_speed_mode_holiday 230 | unique_id: vsr300_saf_speed_holiday 231 | #hub: VSR300 232 | slave: 1 233 | address: 1220 234 | input_type: holding 235 | unit_of_measurement: rpm 236 | data_type: uint16 237 | - name: vsr300_exhaust_air_fan_speed_mode_holiday 238 | unique_id: vsr300_eaf_speed_holiday 239 | #hub: VSR300 240 | slave: 1 241 | address: 1221 242 | input_type: holding 243 | unit_of_measurement: rpm 244 | data_type: uint16 245 | - name: vsr300_supply_air_fan_speed_mode_cooker_hood 246 | unique_id: vsr300_saf_speed_cooker_hood 247 | #hub: VSR300 248 | slave: 1 249 | address: 1222 250 | input_type: holding 251 | unit_of_measurement: rpm 252 | data_type: uint16 253 | - name: vsr300_exhaust_air_fan_speed_mode_cooker_hood 254 | unique_id: vsr300_eaf_speed_cooker_hood 255 | #hub: VSR300 256 | slave: 1 257 | address: 1223 258 | input_type: holding 259 | unit_of_measurement: rpm 260 | data_type: uint16 261 | - name: vsr300_supply_air_fan_speed_mode_vacuumcleaner 262 | unique_id: vsr300_saf_speed_vacuumcleaner 263 | #hub: VSR300 264 | slave: 1 265 | address: 1224 266 | input_type: holding 267 | unit_of_measurement: rpm 268 | data_type: uint16 269 | - name: vsr300_exhaust_air_fan_speed_mode_vacuumcleaner 270 | unique_id: vsr300_eaf_speed_vacuumcleaner 271 | #hub: VSR300 272 | slave: 1 273 | address: 1225 274 | input_type: holding 275 | unit_of_measurement: rpm 276 | data_type: uint16 277 | - name: vsr300_supply_air_fan_speed_low_rpm 278 | unique_id: vsr300_saf_speed_low_rpm 279 | #hub: VSR300 280 | slave: 1 281 | address: 1412 282 | input_type: holding 283 | unit_of_measurement: rpm 284 | data_type: uint16 285 | - name: vsr300_exhaust_air_fan_speed_low_rpm 286 | unique_id: vsr300_eaf_speed_low_rpm 287 | #hub: VSR300 288 | slave: 1 289 | address: 1413 290 | input_type: holding 291 | unit_of_measurement: rpm 292 | data_type: uint16 293 | - name: vsr300_supply_air_fan_speed_minimum_rpm 294 | unique_id: vsr300_saf_speed_minimum_rpm 295 | #hub: VSR300 296 | slave: 1 297 | address: 1410 298 | input_type: holding 299 | unit_of_measurement: rpm 300 | data_type: uint16 301 | - name: vsr300_exhaust_air_fan_speed_minimum_rpm 302 | unique_id: vsr300_eaf_speed_minimum_rpm 303 | #hub: VSR300 304 | slave: 1 305 | address: 1411 306 | input_type: holding 307 | unit_of_measurement: rpm 308 | data_type: uint16 309 | - name: vsr300_supply_air_fan_speed_low 310 | unique_id: vsr300_saf_speed_low 311 | #hub: VSR300 312 | slave: 1 313 | address: 1302 314 | input_type: holding 315 | unit_of_measurement: rpm 316 | data_type: uint16 317 | - name: vsr300_exhaust_air_fan_speed_low 318 | unique_id: vsr300_eaf_speed_low 319 | #hub: VSR300 320 | slave: 1 321 | address: 1303 322 | input_type: holding 323 | unit_of_measurement: rpm 324 | data_type: uint16 325 | - name: vsr300_supply_air_fan_speed_normal 326 | unique_id: vsr300_saf_speed_normal 327 | #hub: VSR300 328 | slave: 1 329 | address: 1414 330 | input_type: holding 331 | unit_of_measurement: rpm 332 | data_type: uint16 333 | - name: vsr300_exhaust_air_fan_speed_normal 334 | unique_id: vsr300_eaf_speed_normal 335 | #hub: VSR300 336 | slave: 1 337 | address: 1415 338 | input_type: holding 339 | unit_of_measurement: rpm 340 | data_type: uint16 341 | - name: vsr300_supply_air_fan_speed_high 342 | unique_id: vsr300_saf_speed_high 343 | #hub: VSR300 344 | slave: 1 345 | address: 1416 346 | input_type: holding 347 | unit_of_measurement: rpm 348 | data_type: uint16 349 | - name: vsr300_exhaust_air_fan_speed_high 350 | unique_id: vsr300_eaf_speed_high 351 | #hub: VSR300 352 | slave: 1 353 | address: 1417 354 | input_type: holding 355 | unit_of_measurement: rpm 356 | data_type: uint16 357 | - name: vsr300_supply_air_fan_speed_maximum 358 | unique_id: vsr300_saf_speed_maximum 359 | #hub: VSR300 360 | slave: 1 361 | address: 1418 362 | input_type: holding 363 | unit_of_measurement: rpm 364 | data_type: uint16 365 | - name: vsr300_exhaust_air_fan_speed_maximum 366 | unique_id: vsr300_eaf_speed_maximum 367 | #hub: VSR300 368 | slave: 1 369 | address: 1419 370 | input_type: holding 371 | unit_of_measurement: rpm 372 | data_type: uint16 373 | - name: vsr300_fan_manual_stop_allowed_register 374 | unique_id: vsr300_fan_manual_stop_allowed_reg 375 | #hub: VSR300 376 | slave: 1 377 | address: 1352 378 | input_type: holding 379 | data_type: uint16 380 | - name: vsr300_supply_air_sp 381 | unique_id: vsr300_supply_air_sp 382 | #hub: VSR300 383 | device_class: temperature 384 | slave: 1 385 | address: 2000 386 | input_type: holding 387 | unit_of_measurement: °C 388 | scale: 0.1 389 | offset: 0 390 | precision: 1 391 | data_type: uint16 392 | - name: vsr300_exhaust_air_sp 393 | unique_id: vsr300_exhaust_air_sp 394 | #hub: VSR300 395 | device_class: temperature 396 | slave: 1 397 | address: 2012 398 | input_type: holding 399 | unit_of_measurement: °C 400 | scale: 0.1 401 | offset: 0 402 | precision: 1 403 | data_type: uint16 404 | - name: vsr300_exhaust_air_min_sp 405 | unique_id: vsr300_exhaust_air_min_sp 406 | #hub: VSR300 407 | device_class: temperature 408 | slave: 1 409 | address: 2020 410 | input_type: holding 411 | unit_of_measurement: °C 412 | scale: 0.1 413 | offset: 0 414 | precision: 1 415 | data_type: uint16 416 | - name: vsr300_exhaust_air_max_sp 417 | unique_id: vsr300_exhaust_air_max_sp 418 | #hub: VSR300 419 | device_class: temperature 420 | slave: 1 421 | address: 2021 422 | input_type: holding 423 | unit_of_measurement: °C 424 | scale: 0.1 425 | offset: 0 426 | precision: 1 427 | data_type: uint16 428 | # Unit temperature control mode. Requires room temp sensor. 0: Supply,1: Room,2: Extract 429 | - name: vsr300_supply_air_room_exhaust_reg 430 | unique_id: vsr300_supply_air_room_exhaust_reg 431 | #hub: VSR300 432 | slave: 1 433 | address: 2030 434 | input_type: holding 435 | data_type: uint16 436 | - name: vsr300_eco_heat_offset 437 | unique_id: vsr300_eco_heat_offset 438 | #hub: VSR300 439 | device_class: temperature 440 | slave: 1 441 | address: 2503 #Temperature offset for heating during Eco mode 442 | input_type: holding 443 | unit_of_measurement: °C 444 | scale: 0.1 445 | offset: 0 446 | precision: 1 447 | data_type: uint16 448 | scan_interval: 9 449 | - name: vsr300_countdown_mode_time_s 450 | unique_id: vsr300_countdown_mode_time 451 | #hub: VSR300 452 | slave: 1 453 | address: 1110 454 | input_type: input 455 | unit_of_measurement: s 456 | data_type: uint16 457 | - name: vsr300_countdown_mode_time_s_factor 458 | #hub: VSR300 459 | slave: 1 460 | address: 1111 461 | input_type: input 462 | data_type: uint16 463 | - name: vsr300_holiday_mode_duration 464 | unique_id: vsr300_holiday_mode_duration 465 | #hub: VSR300 466 | slave: 1 467 | address: 1100 468 | input_type: holding 469 | unit_of_measurement: days 470 | data_type: uint16 471 | scan_interval: 9 472 | - name: vsr300_away_mode_duration 473 | unique_id: vsr300_away_mode_duration 474 | #hub: VSR300 475 | slave: 1 476 | address: 1101 477 | input_type: holding 478 | unit_of_measurement: h 479 | data_type: uint16 480 | scan_interval: 9 481 | - name: vsr300_fireplace_mode_duration 482 | unique_id: vsr300_fireplace_mode_duration 483 | #hub: VSR300 484 | slave: 1 485 | address: 1102 486 | input_type: holding 487 | unit_of_measurement: min 488 | data_type: uint16 489 | scan_interval: 9 490 | - name: vsr300_refresh_mode_duration 491 | unique_id: vsr300_refresh_mode_duration 492 | #hub: VSR300 493 | slave: 1 494 | address: 1103 495 | input_type: holding 496 | unit_of_measurement: min 497 | data_type: uint16 498 | scan_interval: 9 499 | - name: vsr300_crowded_mode_duration 500 | unique_id: vsr300_crowded_mode_duration 501 | #hub: VSR300 502 | slave: 1 503 | address: 1104 504 | input_type: holding 505 | unit_of_measurement: h 506 | data_type: uint16 507 | scan_interval: 9 508 | - name: vsr300_moisture_extraction_sp 509 | unique_id: vsr300_moisture_extraction_sp 510 | #hub: VSR300 511 | device_class: humidity 512 | slave: 1 513 | address: 2202 514 | input_type: holding 515 | unit_of_measurement: "%" 516 | data_type: uint16 517 | - name: vsr300_fan_speed_comp_read 518 | unique_id: vsr300_fan_speed_comp_read 519 | #hub: VSR300 520 | device_class: power_factor 521 | slave: 1 522 | address: 1254 523 | input_type: holding 524 | unit_of_measurement: "%" 525 | data_type: int16 526 | - name: vsr300_fan_speed_comp_winter 527 | unique_id: vsr300_fan_speed_comp_winter 528 | #hub: VSR300 529 | device_class: power_factor 530 | slave: 1 531 | address: 1251 532 | input_type: holding 533 | unit_of_measurement: "%" 534 | data_type: int16 535 | - name: vsr300_fan_speed_comp_winter_start_temp 536 | unique_id: vsr300_fan_speed_comp_winter_start_temp 537 | #hub: VSR300 538 | device_class: temperature 539 | slave: 1 540 | address: 1255 541 | input_type: holding 542 | unit_of_measurement: °C 543 | scale: 0.1 544 | offset: 0 545 | precision: 1 546 | data_type: int16 547 | - name: vsr300_fan_speed_comp_winter_max_temp 548 | unique_id: vsr300_fan_speed_comp_winter_max_temp 549 | #hub: VSR300 550 | device_class: temperature 551 | slave: 1 552 | address: 1253 553 | input_type: holding 554 | unit_of_measurement: °C 555 | scale: 0.1 556 | offset: 0 557 | precision: 1 558 | data_type: int16 559 | - name: vsr300_fan_speed_comp_checked 560 | unique_id: vsr300_fan_speed_comp_checked 561 | #hub: VSR300 562 | device_class: temperature 563 | slave: 1 564 | address: 1252 565 | input_type: holding 566 | unit_of_measurement: °C 567 | scale: 0.1 568 | offset: 0 569 | precision: 1 570 | data_type: int16 571 | - name: vsr300_fan_speed_comp_summer 572 | unique_id: vsr300_fan_speed_comp_summer 573 | #hub: VSR300 574 | device_class: power_factor 575 | slave: 1 576 | address: 1258 577 | input_type: holding 578 | unit_of_measurement: "%" 579 | data_type: int16 580 | - name: vsr300_fan_speed_comp_summer_start_temp 581 | unique_id: vsr300_fan_speed_comp_summer_start_temp 582 | #hub: VSR300 583 | device_class: temperature 584 | slave: 1 585 | address: 1256 586 | input_type: holding 587 | unit_of_measurement: °C 588 | scale: 0.1 589 | offset: 0 590 | precision: 1 591 | data_type: int16 592 | - name: vsr300_fan_speed_comp_max_temp 593 | unique_id: vsr300_fan_speed_comp_max_temp 594 | #hub: VSR300 595 | device_class: temperature 596 | slave: 1 597 | address: 1257 598 | input_type: holding 599 | unit_of_measurement: °C 600 | scale: 0.1 601 | offset: 0 602 | precision: 1 603 | data_type: int16 604 | - name: vsr300_a_alarm 605 | unique_id: vsr300_a_alarm 606 | #hub: VSR300 607 | slave: 1 608 | address: 15900 609 | input_type: holding 610 | data_type: uint16 611 | - name: vsr300_b_alarm 612 | unique_id: vsr300_b_alarm 613 | #hub: VSR300 614 | slave: 1 615 | address: 15901 616 | input_type: holding 617 | data_type: uint16 618 | - name: vsr300_c_alarm 619 | unique_id: vsr300_c_alarm 620 | #hub: VSR300 621 | slave: 1 622 | address: 15902 623 | input_type: holding 624 | data_type: uint16 625 | - name: vsr300_filter_warning_alarm 626 | unique_id: vsr300_filter_warning_alarm 627 | #hub: VSR300 628 | slave: 1 629 | address: 15543 630 | input_type: holding 631 | data_type: uint16 632 | - name: vsr300_filter_alarm 633 | unique_id: vsr300_filter_alarm 634 | #hub: VSR300 635 | slave: 1 636 | address: 15141 637 | input_type: holding 638 | data_type: uint16 639 | - name: vsr300_supply_air_temp_low_alarm 640 | unique_id: vsr300_supply_air_temp_low_alarm 641 | #hub: VSR300 642 | slave: 1 643 | address: 15176 644 | input_type: holding 645 | data_type: uint16 646 | - name: vsr300_filter_warning_alarm_delay_counter 647 | unique_id: vsr300_filter_warning_alarm_delay_counter 648 | #hub: VSR300 649 | slave: 1 650 | address: 15548 651 | input_type: holding 652 | data_type: uint16 653 | 654 | ################################################################################ 655 | # INPUT BOOLEAN 656 | ################################################################################ 657 | 658 | input_boolean: 659 | vsr300_auto_mode_status_dummy: 660 | name: vsr300 Auto mode status dummy 661 | icon: mdi:fan 662 | vsr300_crowded_mode_status_dummy: 663 | name: vsr300 Crowded mode status dummy 664 | icon: mdi:fan 665 | vsr300_refresh_mode_status_dummy: 666 | name: vsr300 Refresh mode status dummy 667 | icon: mdi:fan 668 | vsr300_fireplace_mode_status_dummy: 669 | name: vsr300 Fireplace mode status dummy 670 | icon: mdi:fan 671 | vsr300_away_mode_status_dummy: 672 | name: vsr300 Away mode status dummy 673 | icon: mdi:fan 674 | vsr300_holiday_mode_status_dummy: 675 | name: vsr300 Holiday mode status dummy 676 | icon: mdi:fan 677 | vsr300_man_stop_mode_status_dummy: 678 | name: vsr300 Manuall stop mode status dummy 679 | icon: mdi:fan 680 | vsr300_man_low_mode_status_dummy: 681 | name: vsr300 Manual Low mode status dummy 682 | icon: mdi:fan 683 | vsr300_man_normal_mode_status_dummy: 684 | name: vsr300 Manual Normal mode status dummy 685 | icon: mdi:fan 686 | vsr300_man_high_mode_status_dummy: 687 | name: vsr300 Manual high mode status dummy 688 | icon: mdi:fan 689 | 690 | ################################################################################ 691 | # INPUT NUMBER 692 | ################################################################################ 693 | 694 | input_number: 695 | vsr300_eco_offset_temp_sp: 696 | name: Eco offset 697 | min: 0 698 | max: 10 699 | step: 1 700 | mode: slider 701 | unit_of_measurement: °C 702 | icon: mdi:thermometer 703 | 704 | vsr300_holiday_mode_duration_sp: 705 | name: Holiday mode - Desired duration 706 | min: 1 707 | max: 365 708 | step: 1 709 | mode: slider 710 | unit_of_measurement: days 711 | icon: mdi:timelapse 712 | 713 | vsr300_away_mode_duration_sp: 714 | name: Away mode - Desired duration 715 | min: 1 716 | max: 72 717 | step: 1 718 | mode: slider 719 | unit_of_measurement: h 720 | icon: mdi:timelapse 721 | 722 | vsr300_refresh_mode_duration_sp: 723 | name: Refresh mode - Desired duration 724 | min: 1 725 | max: 240 726 | step: 1 727 | mode: slider 728 | unit_of_measurement: min 729 | icon: mdi:timelapse 730 | 731 | vsr300_crowded_mode_duration_sp: 732 | name: Crowded mode - Desired duration 733 | min: 1 734 | max: 8 735 | step: 1 736 | mode: slider 737 | unit_of_measurement: h 738 | icon: mdi:timelapse 739 | 740 | vsr300_fireplace_mode_duration_sp: 741 | name: Fireplace mode - Desired duration 742 | min: 1 743 | max: 60 744 | step: 1 745 | mode: slider 746 | unit_of_measurement: min 747 | icon: mdi:timelapse 748 | 749 | vsr300_supply_air_fan_speed_normal_sp: 750 | name: Supply air fan speed normal 751 | min: 1000 752 | max: 3000 753 | step: 50 754 | mode: slider 755 | unit_of_measurement: rpm 756 | icon: mdi:fan 757 | 758 | vsr300_exhaust_air_fan_speed_normal_sp: 759 | name: Exhaust air fan speed normal 760 | min: 1000 761 | max: 3000 762 | step: 50 763 | mode: slider 764 | unit_of_measurement: rpm 765 | icon: mdi:fan 766 | 767 | vsr300_filter_replacement_period_months_sp: 768 | name: Filter Replacement Cycle 769 | min: 3 770 | max: 15 771 | step: 1 772 | mode: slider 773 | unit_of_measurement: months 774 | icon: mdi:timelapse 775 | 776 | ################################################################################ 777 | # SENSORS 778 | ################################################################################ 779 | 780 | sensor: 781 | - platform: template 782 | sensors: 783 | vsr300_supply_temperature: 784 | value_template: "{{ state_attr('climate.vent_VSR300', 'current_temperature') }}" 785 | friendly_name: "vsr300 supply temperature" 786 | unique_id: vsr300_supply_temperature 787 | unit_of_measurement: "°C" 788 | - platform: template 789 | sensors: 790 | vsr300_supply_air_rf: 791 | #value_template: "{{((states('sensor.vsr300_supply_air_fan') | int) * 3) | round(0) }}" 792 | 793 | value_template: >- 794 | {% if is_state('sensor.vsr300_supply_air_fan', 'unavailable') or is_state('sensor.vsr300_supply_air_fan', 'unknown') %} 795 | unavailable 796 | {% else %} 797 | {{ ((states('sensor.vsr300_supply_air_fan') | float(0)) * 3) | round(0) }} 798 | {% endif %} 799 | friendly_name: "Supply air flow rate" 800 | unique_id: vsr300_supply_air_rf 801 | unit_of_measurement: "m³/h" 802 | - platform: template 803 | sensors: 804 | vsr300_exhaust_air_rf: 805 | #value_template: "{{((states('sensor.vsr300_extractor_fan') | int) * 3) | round(0)}}" 806 | value_template: >- 807 | {% if is_state('sensor.vsr300_extractor_fan', 'unavailable') or is_state('sensor.vsr300_extractor_fan', 'unknown') %} 808 | unavailable 809 | {% else %} 810 | {{ ((states('sensor.vsr300_extractor_fan') | float(0)) * 3) | round(0) }} 811 | {% endif %} 812 | friendly_name: "Exhaust air flow rate" 813 | unique_id: vsr300_exhaust_air_rf 814 | unit_of_measurement: "m³/h" 815 | - platform: template 816 | sensors: 817 | vsr300_recovery_rate: 818 | #value_template: "{{((((states('sensor.vsr300_supply_temperature') | float ) - (states('sensor.vsr300_outdoor_temperature') | float)) / ((states('sensor.vsr300_exhaust_temperature') | float ) - (states('sensor.vsr300_outdoor_temperature') | float))) * 100) | round(1) }}" 819 | value_template: >- 820 | {% if is_state('sensor.vsr300_supply_temperature', 'unavailable') or 821 | is_state('sensor.vsr300_outdoor_temperature', 'unavailable') or 822 | is_state('sensor.vsr300_exhaust_temperature', 'unavailable') or 823 | is_state('sensor.vsr300_supply_temperature', 'unknown') or 824 | is_state('sensor.vsr300_outdoor_temperature', 'unknown') or 825 | is_state('sensor.vsr300_exhaust_temperature', 'unknown') %} 826 | unavailable 827 | {% else %} 828 | {% set supply = states('sensor.vsr300_supply_temperature') | float(0) %} 829 | {% set outdoor = states('sensor.vsr300_outdoor_temperature') | float(0) %} 830 | {% set exhaust = states('sensor.vsr300_exhaust_temperature') | float(0) %} 831 | {% if (exhaust - outdoor) != 0 %} 832 | {{ (((supply - outdoor) / (exhaust - outdoor)) * 100) | round(1) }} 833 | {% else %} 834 | 0 835 | {% endif %} 836 | {% endif %} 837 | unit_of_measurement: "%" 838 | friendly_name: "Recovery rate" 839 | unique_id: vsr300_recovery_rate 840 | 841 | vsr300_time_to_filter_change_months: 842 | friendly_name: "Next filter change" 843 | unique_id: vsr300_time_to_filter_change 844 | value_template: >- 845 | {% if states('sensor.vsr300_time_to_filter_replacement_s')|int > 1 %} 846 | {% set time = states('sensor.vsr300_time_to_filter_replacement_s') | int %} 847 | {% set days = (time / 86400) | int %} 848 | {% set months = (days / 30) | int %} 849 | {%- if days > 548 -%} 850 | More than 1.5 year 851 | {%- else -%} 852 | {%- if days >= 31 -%} 853 | {{ months }} months 854 | {%- endif -%} 855 | {%- if days <= 30 -%} 856 | {{ days }} days 857 | {%- endif -%} 858 | {%- endif -%} 859 | {% else %} 860 | Change filter! 861 | {% endif %} 862 | 863 | vsr300_away_countdown_time_t: 864 | friendly_name: "Time remaining when active - Away" 865 | unique_id: vsr300_away_countdown_time 866 | value_template: >- 867 | {% if states('sensor.vsr300_mode_status_register')|int == 5 %} 868 | {% set time = states('sensor.vsr300_countdown_mode_time_s') | int %} 869 | {% set minutes = ((time % 3600) / 60) | int %} 870 | {% set hours = ((time % 86400) / 3600) | int %} 871 | 872 | {%- if time < 60 -%} 873 | Less than 1 minute 874 | {%- else -%} 875 | {%- if hours > 0 -%} 876 | {{ hours }} h 877 | {%- endif -%} 878 | {%- if minutes > 0 -%} 879 | {%- if hours > 0 -%} 880 | {{ ' ' }} 881 | {%- endif -%} 882 | {{ minutes }} min 883 | {%- endif -%} 884 | {%- endif -%} 885 | {% else %} 886 | Inactive 887 | {% endif %} 888 | 889 | vsr300_crowded_countdown_time_t: 890 | friendly_name: "Time remaining when active - Crowded" 891 | unique_id: vsr300_crowded_countdown_time 892 | value_template: >- 893 | {% if states('sensor.vsr300_mode_status_register')|int == 2 %} 894 | {% set time = states('sensor.vsr300_countdown_mode_time_s') | int %} 895 | {% set minutes = ((time % 3600) / 60) | int %} 896 | {% set hours = ((time % 86400) / 3600) | int %} 897 | 898 | {%- if time < 60 -%} 899 | Less than 1 minute 900 | {%- else -%} 901 | {%- if hours > 0 -%} 902 | {{ hours }} h 903 | {%- endif -%} 904 | {%- if minutes > 0 -%} 905 | {%- if hours > 0 -%} 906 | {{ ' ' }} 907 | {%- endif -%} 908 | {{ minutes }} min 909 | {%- endif -%} 910 | {%- endif -%} 911 | {% else %} 912 | Inactive 913 | {% endif %} 914 | 915 | vsr300_refresh_countdown_time_t: 916 | friendly_name: "Time remaining when active - Refresh" 917 | unique_id: vsr300_refresh_countdown_time 918 | value_template: >- 919 | {% if states('sensor.vsr300_mode_status_register')|int == 3 %} 920 | {% set time = states('sensor.vsr300_countdown_mode_time_s') | int %} 921 | {% set minutes = ((time % 3600) / 60) | int %} 922 | {% set hours = ((time % 86400) / 3600) | int %} 923 | 924 | {%- if time < 60 -%} 925 | Less than 1 minute 926 | {%- else -%} 927 | {%- if hours > 0 -%} 928 | {{ hours }} h 929 | {%- endif -%} 930 | {%- if minutes > 0 -%} 931 | {%- if hours > 0 -%} 932 | {{ ' ' }} 933 | {%- endif -%} 934 | {{ minutes }} min 935 | {%- endif -%} 936 | {%- endif -%} 937 | {% else %} 938 | Inactive 939 | {% endif %} 940 | 941 | vsr300_fireplace_countdown_time_t: 942 | friendly_name: "Time remaining when active - Fireplace" 943 | unique_id: vsr300_fireplace_countdown_time 944 | value_template: >- 945 | {% if states('sensor.vsr300_mode_status_register')|int == 4 %} 946 | {% set time = states('sensor.vsr300_countdown_mode_time_s') | int %} 947 | {% set minutes = ((time % 3600) / 60) | int %} 948 | {% set hours = ((time % 86400) / 3600) | int %} 949 | 950 | {%- if time < 60 -%} 951 | Less than 1 minute 952 | {%- else -%} 953 | {%- if hours > 0 -%} 954 | {{ hours }} h 955 | {%- endif -%} 956 | {%- if minutes > 0 -%} 957 | {%- if hours > 0 -%} 958 | {{ ' ' }} 959 | {%- endif -%} 960 | {{ minutes }} min 961 | {%- endif -%} 962 | {%- endif -%} 963 | {% else %} 964 | Inactive 965 | {% endif %} 966 | 967 | vsr300_holiday_countdown_time_t: 968 | friendly_name: "Time remaining when active - Holiday" 969 | unique_id: vsr300_holiday_countdown_time 970 | value_template: >- 971 | {% if is_state('sensor.vsr300_mode_status_register', 'unavailable') or 972 | is_state('sensor.vsr300_countdown_mode_time_s', 'unavailable') or 973 | is_state('sensor.vsr300_countdown_mode_time_s_factor', 'unavailable') %} 974 | unavailable 975 | {% elif states('sensor.vsr300_mode_status_register')|int == 6 %} 976 | {% set time = states('sensor.vsr300_countdown_mode_time_s')|int + (states('sensor.vsr300_countdown_mode_time_s_factor')|int * 65535) %} 977 | {% set days = (time / 86400) | int %} 978 | {% set hours = ((time % 86400) / 3600) | int %} 979 | {% set minutes = ((time % 3600) / 60) | int %} 980 | 981 | {%- if days > 0 -%} 982 | {{ days }} days 983 | {% else %} 984 | {%- if time < 60 -%} 985 | Less than 1 minute 986 | {%- else -%} 987 | {%- if hours > 0 -%} 988 | {{ hours }} h 989 | {%- endif -%} 990 | {%- if minutes > 0 -%} 991 | {%- if hours > 0 -%} 992 | {{ ' ' }} 993 | {%- endif -%} 994 | {{ minutes }} min 995 | {%- endif -%} 996 | {%- endif -%} 997 | {%- endif -%} 998 | {% else %} 999 | Inactive 1000 | {% endif %} 1001 | 1002 | vsr300_summer_winter_operational_status: 1003 | friendly_name: "Active season" 1004 | unique_id: vs300_active_season01 1005 | value_template: >- 1006 | {% if is_state('sensor.vsr300_summer_winter_operation', 'unavailable') %} 1007 | unavailable 1008 | {% elif states('sensor.vsr300_summer_winter_operation')|int == 0 %} 1009 | Summer 1010 | {% elif states('sensor.vsr300_summer_winter_operation')|int == 1 %} 1011 | Winter 1012 | {% else %} 1013 | Stone dead 1014 | {% endif %} 1015 | 1016 | vsr300_regulation_mode: 1017 | friendly_name: "Regulation" 1018 | unique_id: vsr300_regulation_mode 1019 | value_template: >- 1020 | {% if is_state('sensor.vsr300_supply_air_room_exhaust_reg', 'unavailable') %} 1021 | unavailable 1022 | {% elif states('sensor.vsr300_supply_air_room_exhaust_reg')|int == 0 %} 1023 | Supply air regulation 1024 | {% elif states('sensor.vsr300_supply_air_room_exhaust_reg')|int == 1 %} 1025 | Room regulation 1026 | {% elif states('sensor.vsr300_supply_air_room_exhaust_reg')|int == 2 %} 1027 | Extract regulation 1028 | {% else %} 1029 | Stone dead 1030 | {% endif %} 1031 | 1032 | vsr300_mode_status: 1033 | friendly_name: "Mode" 1034 | unique_id: vsr300_mode_status 1035 | value_template: >- 1036 | {% if is_state('sensor.vsr300_mode_status_register', 'unavailable') or 1037 | is_state('sensor.vsr300_manual_mode_command_register', 'unavailable') %} 1038 | unavailable 1039 | {% elif states('sensor.vsr300_mode_status_register')|int == 0 and states('sensor.vsr300_manual_mode_command_register')|int == 2 %} 1040 | Auto schedule - Low 1041 | {% elif states('sensor.vsr300_mode_status_register')|int == 0 and states('sensor.vsr300_manual_mode_command_register')|int == 3 %} 1042 | Auto schedule - Normal 1043 | {% elif states('sensor.vsr300_mode_status_register')|int == 0 and states('sensor.vsr300_manual_mode_command_register')|int == 4 %} 1044 | Auto schedule - High 1045 | {% elif states('sensor.vsr300_mode_status_register')|int == 0 and states('sensor.vsr300_manual_mode_command_register')|int == 0 %} 1046 | Auto schedule - Normal 1047 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int == 0 %} 1048 | Manual STOP 1049 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int == 1 %} 1050 | Manual Shitstorm? 1051 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int == 2 %} 1052 | Manual Low 1053 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int == 3 %} 1054 | Manual Normal 1055 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int == 4 %} 1056 | Manual High 1057 | {% elif states('sensor.vsr300_mode_status_register')|int == 3 %} 1058 | Refresh 1059 | {% elif states('sensor.vsr300_mode_status_register')|int == 2 %} 1060 | Crowded 1061 | {% elif states('sensor.vsr300_mode_status_register')|int == 4 %} 1062 | Fireplace 1063 | {% elif states('sensor.vsr300_mode_status_register')|int == 5 %} 1064 | Away 1065 | {% elif states('sensor.vsr300_mode_status_register')|int == 6 %} 1066 | Holiday 1067 | {% elif states('sensor.vsr300_mode_status_register')|int == 7 %} 1068 | Cooker Hood 1069 | {% elif states('sensor.vsr300_mode_status_register')|int == 8 %} 1070 | Vacuum Cleaner 1071 | {% elif states('sensor.vsr300_mode_status_register')|int == 9 %} 1072 | CDI1 1073 | {% elif states('sensor.vsr300_mode_status_register')|int == 10 %} 1074 | CDI2 1075 | {% elif states('sensor.vsr300_mode_status_register')|int == 11 %} 1076 | CDI3 1077 | {% elif states('sensor.vsr300_mode_status_register')|int == 12 %} 1078 | Pressure guard 1079 | {% else %} 1080 | WTF 1081 | {% endif %} 1082 | 1083 | vsr300_manual_button_mode_status: 1084 | friendly_name: "Manual button mode status" 1085 | unique_id: vsr300_manual_button_mode_status 1086 | value_template: >- 1087 | {% if is_state('sensor.vsr300_mode_status_register', 'unavailable') or 1088 | is_state('sensor.vsr300_manual_mode_command_register', 'unavailable') %} 1089 | unavailable 1090 | {% elif states('sensor.vsr300_mode_status_register')|int == 0 and states('sensor.vsr300_manual_mode_command_register')|int > 0 %} 1091 | Auto schedule 1092 | {% elif states('sensor.vsr300_mode_status_register')|int == 1 and states('sensor.vsr300_manual_mode_command_register')|int > 0 %} 1093 | Manual 1094 | {% elif states('sensor.vsr300_mode_status_register')|int > 1 and states('sensor.vsr300_manual_mode_command_register')|int > 0 %} 1095 | Standby 1096 | {% else %} 1097 | Off 1098 | {% endif %} 1099 | 1100 | ################################################################################ 1101 | # Switches 1102 | ################################################################################ 1103 | 1104 | switch: 1105 | - platform: template 1106 | switches: 1107 | vsr300_auto_mode: 1108 | friendly_name: Auto mode 1109 | unique_id: vsr300_auto_mode 1110 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Auto schedule - Low') or is_state('sensor.vsr300_mode_status', 'Auto schedule - Normal') or is_state('sensor.vsr300_mode_status', 'Auto schedule - High') }}" 1111 | turn_on: 1112 | - service: script.vsr300_auto_mode 1113 | data: 1114 | action: "on" 1115 | turn_off: 1116 | service: script.vsr300_auto_dummy_off 1117 | data: 1118 | action: "off" 1119 | 1120 | vsr300_crowded_mode: 1121 | friendly_name: Crowded-mode 1122 | unique_id: vsr300_crowded_mode 1123 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Crowded') }}" 1124 | turn_on: 1125 | service: script.vsr300_crowded_mode 1126 | data: 1127 | action: "on" 1128 | turn_off: 1129 | service: script.vsr300_crowded_dummy_off 1130 | data: 1131 | action: "off" 1132 | 1133 | vsr300_fireplace_mode: 1134 | friendly_name: Fireplace-mode 1135 | unique_id: vsr300_fireplace_mode 1136 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Fireplace') }}" 1137 | turn_on: 1138 | service: script.vsr300_fireplace_mode 1139 | data: 1140 | action: "on" 1141 | turn_off: 1142 | service: script.vsr300_fireplace_dummy_off 1143 | data: 1144 | action: "off" 1145 | 1146 | vsr300_refresh_mode: 1147 | friendly_name: Refresh-mode 1148 | unique_id: vsr300_refresh_mode 1149 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Refresh') }}" 1150 | turn_on: 1151 | service: script.vsr300_refresh_mode 1152 | data: 1153 | action: "on" 1154 | turn_off: 1155 | service: script.vsr300_refresh_dummy_off 1156 | data: 1157 | action: "off" 1158 | 1159 | vsr300_away_mode: 1160 | friendly_name: Away-mode 1161 | unique_id: vsr300_away_mode 1162 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Away') }}" 1163 | turn_on: 1164 | service: script.vsr300_away_mode 1165 | data: 1166 | action: "on" 1167 | turn_off: 1168 | service: script.vsr300_away_dummy_off 1169 | data: 1170 | action: "off" 1171 | 1172 | vsr300_holiday_mode: 1173 | friendly_name: Holiday-mode 1174 | unique_id: vsr300_holiday_mode 1175 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Holiday') }}" 1176 | turn_on: 1177 | service: script.vsr300_holiday_mode 1178 | data: 1179 | action: "on" 1180 | turn_off: 1181 | service: script.vsr300_holiday_dummy_off 1182 | data: 1183 | action: "off" 1184 | 1185 | vsr300_man_stop_mode: 1186 | friendly_name: Manual stop 1187 | unique_id: vsr300_manual_stop_mode 1188 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Manual STOP') }}" 1189 | turn_on: 1190 | - service: script.vsr300_man_stop_mode 1191 | data: 1192 | action: "on" 1193 | turn_off: 1194 | service: script.vsr300_man_stop_dummy_off 1195 | data: 1196 | action: "off" 1197 | 1198 | vsr300_man_low_mode: 1199 | friendly_name: Low speed 1200 | unique_id: vsr300_low_speed_mode 1201 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Manual Low') or is_state('sensor.vsr300_mode_status', 'Auto schedule - Low') or is_state('sensor.vsr300_mode_status', 'PPM Auto - Low') }}" 1202 | turn_on: 1203 | - service: script.vsr300_man_low_mode 1204 | data: 1205 | action: "on" 1206 | turn_off: 1207 | service: script.vsr300_man_low_dummy_off 1208 | data: 1209 | action: "off" 1210 | 1211 | vsr300_man_normal_mode: 1212 | friendly_name: Normal speed 1213 | unique_id: vsr300_normal_speed_mode 1214 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Manual Normal') or is_state('sensor.vsr300_mode_status', 'Auto schedule - Normal') or is_state('sensor.vsr300_mode_status', 'PPM Auto - Normal') }}" 1215 | turn_on: 1216 | - service: script.vsr300_man_normal_mode 1217 | data: 1218 | action: "on" 1219 | turn_off: 1220 | service: script.vsr300_man_normal_dummy_off 1221 | data: 1222 | action: "off" 1223 | 1224 | vsr300_man_high_mode: 1225 | friendly_name: High speed 1226 | unique_id: vsr300_high_speed_mode 1227 | value_template: "{{ is_state('sensor.vsr300_mode_status', 'Manual High') or is_state('sensor.vsr300_mode_status', 'Auto schedule - High') or is_state('sensor.vsr300_mode_status', 'PPM Auto - High') }}" 1228 | turn_on: 1229 | service: script.vsr300_man_high_mode 1230 | data: 1231 | action: "on" 1232 | turn_off: 1233 | service: script.vsr300_man_high_dummy_off 1234 | data: 1235 | action: "off" 1236 | 1237 | - platform: modbus 1238 | scan_interval: 10 1239 | registers: 1240 | - name: vsr300_eco_mode 1241 | hub: vsr300 1242 | slowe: 1 1243 | address: 2504 1244 | command_on: 1 #Enable Eco operation based on temp. offset 1245 | command_off: 0 #Disable Eco operation 1246 | verify_state: true 1247 | input_type: holding 1248 | verify_register: 2504 1249 | state_on: 1 1250 | state_off: 0 1251 | 1252 | ################################################################################ 1253 | # INPUT BUTTON 1254 | ################################################################################ 1255 | input_button: 1256 | vsr300_clear_all_alarms: 1257 | name: "Clear All VSR300 Alarms" 1258 | icon: mdi:alert-remove 1259 | 1260 | ################################################################################ 1261 | # Script 1262 | ################################################################################ 1263 | script: 1264 | vsr300_man_stop_mode: 1265 | sequence: 1266 | - service: input_boolean.turn_on 1267 | entity_id: input_boolean.vsr300_man_stop_mode_status_dummy 1268 | #Activate manual mode before speed 1269 | - service: switch.turn_off 1270 | entity_id: switch.vsr300_man_low_mode 1271 | - service: switch.turn_off 1272 | entity_id: switch.vsr300_man_normal_mode 1273 | - service: switch.turn_off 1274 | entity_id: switch.vsr300_man_high_mode 1275 | - service: switch.turn_off 1276 | entity_id: switch.vsr300_auto_mode 1277 | - service: switch.turn_off 1278 | entity_id: switch.vsr300_crowded_mode 1279 | - service: switch.turn_off 1280 | entity_id: switch.vsr300_refresh_mode 1281 | - service: switch.turn_off 1282 | entity_id: switch.vsr300_fireplace_mode 1283 | - service: switch.turn_off 1284 | entity_id: switch.vsr300_away_mode 1285 | - service: switch.turn_off 1286 | entity_id: switch.vsr300_holiday_mode 1287 | - delay: "00:00:02" 1288 | - service: modbus.write_register 1289 | data_template: 1290 | hub: VSR300 1291 | unit: 1 1292 | address: 1130 1293 | value: 0 1294 | vsr300_man_stop_dummy_off: 1295 | sequence: 1296 | service: input_boolean.turn_off 1297 | entity_id: input_boolean.vsr300_man_stop_mode_status_dummy 1298 | 1299 | vsr300_man_low_mode: 1300 | sequence: 1301 | - service: input_boolean.turn_on 1302 | entity_id: input_boolean.vsr300_man_low_mode_status_dummy 1303 | #Activate manual mode before speed 1304 | - service: modbus.write_register 1305 | data_template: 1306 | hub: VSR300 1307 | unit: 1 1308 | address: 1161 1309 | value: 2 1310 | - service: switch.turn_off 1311 | entity_id: switch.vsr300_man_stop_mode 1312 | - service: switch.turn_off 1313 | entity_id: switch.vsr300_man_normal_mode 1314 | - service: switch.turn_off 1315 | entity_id: switch.vsr300_man_high_mode 1316 | - service: switch.turn_off 1317 | entity_id: switch.vsr300_auto_mode 1318 | - service: switch.turn_off 1319 | entity_id: switch.vsr300_crowded_mode 1320 | - service: switch.turn_off 1321 | entity_id: switch.vsr300_refresh_mode 1322 | - service: switch.turn_off 1323 | entity_id: switch.vsr300_fireplace_mode 1324 | - service: switch.turn_off 1325 | entity_id: switch.vsr300_away_mode 1326 | - service: switch.turn_off 1327 | entity_id: switch.vsr300_holiday_mode 1328 | - delay: "00:00:02" 1329 | - service: modbus.write_register 1330 | data_template: 1331 | hub: VSR300 1332 | unit: 1 1333 | address: 1130 1334 | value: 2 1335 | vsr300_man_low_dummy_off: 1336 | sequence: 1337 | service: input_boolean.turn_off 1338 | entity_id: input_boolean.vsr300_man_low_mode_status_dummy 1339 | 1340 | vsr300_man_normal_mode: 1341 | sequence: 1342 | - service: input_boolean.turn_on 1343 | entity_id: input_boolean.vsr300_man_normal_mode_status_dummy 1344 | #Activate manual mode before speed 1345 | - service: modbus.write_register 1346 | data_template: 1347 | hub: VSR300 1348 | unit: 1 1349 | address: 1161 1350 | value: 2 1351 | - service: switch.turn_off 1352 | entity_id: switch.vsr300_man_stop_mode 1353 | - service: switch.turn_off 1354 | entity_id: switch.vsr300_man_low_mode 1355 | - service: switch.turn_off 1356 | entity_id: switch.vsr300_man_high_mode 1357 | - service: switch.turn_off 1358 | entity_id: switch.vsr300_auto_mode 1359 | - service: switch.turn_off 1360 | entity_id: switch.vsr300_crowded_mode 1361 | - service: switch.turn_off 1362 | entity_id: switch.vsr300_refresh_mode 1363 | - service: switch.turn_off 1364 | entity_id: switch.vsr300_fireplace_mode 1365 | - service: switch.turn_off 1366 | entity_id: switch.vsr300_away_mode 1367 | - service: switch.turn_off 1368 | entity_id: switch.vsr300_holiday_mode 1369 | - delay: "00:00:02" 1370 | - service: modbus.write_register 1371 | data_template: 1372 | hub: VSR300 1373 | unit: 1 1374 | address: 1130 1375 | value: 3 1376 | vsr300_man_normal_dummy_off: 1377 | sequence: 1378 | service: input_boolean.turn_off 1379 | entity_id: input_boolean.vsr300_man_normal_mode_status_dummy 1380 | 1381 | vsr300_man_high_mode: 1382 | sequence: 1383 | - service: input_boolean.turn_on 1384 | entity_id: input_boolean.vsr300_man_high_mode_status_dummy 1385 | #Activate manual mode before speed 1386 | - service: modbus.write_register 1387 | data_template: 1388 | hub: VSR300 1389 | unit: 1 1390 | address: 1161 1391 | value: 2 1392 | - service: switch.turn_off 1393 | entity_id: switch.vsr300_man_stop_mode 1394 | - service: switch.turn_off 1395 | entity_id: switch.vsr300_man_low_mode 1396 | - service: switch.turn_off 1397 | entity_id: switch.vsr300_man_normal_mode 1398 | - service: switch.turn_off 1399 | entity_id: switch.vsr300_auto_mode 1400 | - service: switch.turn_off 1401 | entity_id: switch.vsr300_crowded_mode 1402 | - service: switch.turn_off 1403 | entity_id: switch.vsr300_refresh_mode 1404 | - service: switch.turn_off 1405 | entity_id: switch.vsr300_fireplace_mode 1406 | - service: switch.turn_off 1407 | entity_id: switch.vsr300_away_mode 1408 | - service: switch.turn_off 1409 | entity_id: switch.vsr300_holiday_mode 1410 | - delay: "00:00:02" 1411 | - service: modbus.write_register 1412 | data_template: 1413 | hub: VSR300 1414 | unit: 1 1415 | address: 1130 1416 | value: 4 1417 | vsr300_man_high_dummy_off: 1418 | sequence: 1419 | service: input_boolean.turn_off 1420 | entity_id: input_boolean.vsr300_man_high_mode_status_dummy 1421 | 1422 | vsr300_auto_mode: 1423 | sequence: 1424 | - service: input_boolean.turn_on 1425 | entity_id: input_boolean.vsr300_auto_mode_status_dummy 1426 | - service: switch.turn_off 1427 | entity_id: switch.vsr300_man_stop_mode 1428 | - service: switch.turn_off 1429 | entity_id: switch.vsr300_man_low_mode 1430 | - service: switch.turn_off 1431 | entity_id: switch.vsr300_man_normal_mode 1432 | - service: switch.turn_off 1433 | entity_id: switch.vsr300_man_high_mode 1434 | - service: switch.turn_off 1435 | entity_id: switch.vsr300_crowded_mode 1436 | - service: switch.turn_off 1437 | entity_id: switch.vsr300_refresh_mode 1438 | - service: switch.turn_off 1439 | entity_id: switch.vsr300_fireplace_mode 1440 | - service: switch.turn_off 1441 | entity_id: switch.vsr300_away_mode 1442 | - service: switch.turn_off 1443 | entity_id: switch.vsr300_holiday_mode 1444 | - delay: "00:00:02" 1445 | - service: modbus.write_register 1446 | data_template: 1447 | hub: VSR300 1448 | unit: 1 1449 | address: 1161 1450 | value: 1 1451 | vsr300_auto_dummy_off: 1452 | sequence: 1453 | service: input_boolean.turn_off 1454 | entity_id: input_boolean.vsr300_auto_mode_status_dummy 1455 | 1456 | vsr300_crowded_mode: 1457 | sequence: 1458 | - service: input_boolean.turn_on 1459 | entity_id: input_boolean.vsr300_crowded_mode_status_dummy 1460 | - service: switch.turn_off 1461 | entity_id: switch.vsr300_man_stop_mode 1462 | - service: switch.turn_off 1463 | entity_id: switch.vsr300_man_low_mode 1464 | - service: switch.turn_off 1465 | entity_id: switch.vsr300_man_normal_mode 1466 | - service: switch.turn_off 1467 | entity_id: switch.vsr300_man_high_mode 1468 | - service: switch.turn_off 1469 | entity_id: switch.vsr300_auto_mode 1470 | - service: switch.turn_off 1471 | entity_id: switch.vsr300_refresh_mode 1472 | - service: switch.turn_off 1473 | entity_id: switch.vsr300_fireplace_mode 1474 | - service: switch.turn_off 1475 | entity_id: switch.vsr300_away_mode 1476 | - service: switch.turn_off 1477 | entity_id: switch.vsr300_holiday_mode 1478 | - delay: "00:00:02" 1479 | - service: modbus.write_register 1480 | data_template: 1481 | hub: VSR300 1482 | unit: 1 1483 | address: 1161 1484 | value: 3 1485 | vsr300_crowded_dummy_off: 1486 | sequence: 1487 | service: input_boolean.turn_off 1488 | entity_id: input_boolean.vsr300_crowded_mode_status_dummy 1489 | 1490 | vsr300_refresh_mode: 1491 | sequence: 1492 | - service: input_boolean.turn_on 1493 | entity_id: input_boolean.vsr300_refresh_mode_status_dummy 1494 | - service: switch.turn_off 1495 | entity_id: switch.vsr300_man_stop_mode 1496 | - service: switch.turn_off 1497 | entity_id: switch.vsr300_man_low_mode 1498 | - service: switch.turn_off 1499 | entity_id: switch.vsr300_man_normal_mode 1500 | - service: switch.turn_off 1501 | entity_id: switch.vsr300_man_high_mode 1502 | - service: switch.turn_off 1503 | entity_id: switch.vsr300_crowded_mode 1504 | - service: switch.turn_off 1505 | entity_id: switch.vsr300_auto_mode 1506 | - service: switch.turn_off 1507 | entity_id: switch.vsr300_fireplace_mode 1508 | - service: switch.turn_off 1509 | entity_id: switch.vsr300_away_mode 1510 | - service: switch.turn_off 1511 | entity_id: switch.vsr300_holiday_mode 1512 | - delay: "00:00:02" 1513 | - service: modbus.write_register 1514 | data_template: 1515 | hub: VSR300 1516 | unit: 1 1517 | address: 1161 1518 | value: 4 1519 | vsr300_refresh_dummy_off: 1520 | sequence: 1521 | service: input_boolean.turn_off 1522 | entity_id: input_boolean.vsr300_refresh_mode_status_dummy 1523 | 1524 | vsr300_fireplace_mode: 1525 | sequence: 1526 | - service: input_boolean.turn_on 1527 | entity_id: input_boolean.vsr300_fireplace_mode_status_dummy 1528 | - service: switch.turn_off 1529 | entity_id: switch.vsr300_man_stop_mode 1530 | - service: switch.turn_off 1531 | entity_id: switch.vsr300_man_low_mode 1532 | - service: switch.turn_off 1533 | entity_id: switch.vsr300_man_normal_mode 1534 | - service: switch.turn_off 1535 | entity_id: switch.vsr300_man_high_mode 1536 | - service: switch.turn_off 1537 | entity_id: switch.vsr300_crowded_mode 1538 | - service: switch.turn_off 1539 | entity_id: switch.vsr300_auto_mode 1540 | - service: switch.turn_off 1541 | entity_id: switch.vsr300_refresh_mode 1542 | - service: switch.turn_off 1543 | entity_id: switch.vsr300_away_mode 1544 | - service: switch.turn_off 1545 | entity_id: switch.vsr300_holiday_mode 1546 | - delay: "00:00:02" 1547 | - service: modbus.write_register 1548 | data_template: 1549 | hub: VSR300 1550 | unit: 1 1551 | address: 1161 1552 | value: 5 1553 | vsr300_fireplace_dummy_off: 1554 | sequence: 1555 | service: input_boolean.turn_off 1556 | entity_id: input_boolean.vsr300_fireplace_mode_status_dummy 1557 | 1558 | vsr300_away_mode: 1559 | sequence: 1560 | - service: input_boolean.turn_on 1561 | entity_id: input_boolean.vsr300_away_mode_status_dummy 1562 | - service: switch.turn_off 1563 | entity_id: switch.vsr300_man_stop_mode 1564 | - service: switch.turn_off 1565 | entity_id: switch.vsr300_man_low_mode 1566 | - service: switch.turn_off 1567 | entity_id: switch.vsr300_man_normal_mode 1568 | - service: switch.turn_off 1569 | entity_id: switch.vsr300_man_high_mode 1570 | - service: switch.turn_off 1571 | entity_id: switch.vsr300_crowded_mode 1572 | - service: switch.turn_off 1573 | entity_id: switch.vsr300_auto_mode 1574 | - service: switch.turn_off 1575 | entity_id: switch.vsr300_refresh_mode 1576 | - service: switch.turn_off 1577 | entity_id: switch.vsr300_fireplace_mode 1578 | - service: switch.turn_off 1579 | entity_id: switch.vsr300_holiday_mode 1580 | - delay: "00:00:02" 1581 | - service: modbus.write_register 1582 | data_template: 1583 | hub: VSR300 1584 | unit: 1 1585 | address: 1161 1586 | value: 6 1587 | vsr300_away_dummy_off: 1588 | sequence: 1589 | service: input_boolean.turn_off 1590 | entity_id: input_boolean.vsr300_away_mode_status_dummy 1591 | 1592 | vsr300_holiday_mode: 1593 | sequence: 1594 | - service: input_boolean.turn_on 1595 | entity_id: input_boolean.vsr300_holiday_mode_status_dummy 1596 | - service: switch.turn_off 1597 | entity_id: switch.vsr300_man_stop_mode 1598 | - service: switch.turn_off 1599 | entity_id: switch.vsr300_man_low_mode 1600 | - service: switch.turn_off 1601 | entity_id: switch.vsr300_man_normal_mode 1602 | - service: switch.turn_off 1603 | entity_id: switch.vsr300_man_high_mode 1604 | - service: switch.turn_off 1605 | entity_id: switch.vsr300_crowded_mode 1606 | - service: switch.turn_off 1607 | entity_id: switch.vsr300_auto_mode 1608 | - service: switch.turn_off 1609 | entity_id: switch.vsr300_refresh_mode 1610 | - service: switch.turn_off 1611 | entity_id: switch.vsr300_fireplace_mode 1612 | - service: switch.turn_off 1613 | entity_id: switch.vsr300_away_mode 1614 | - delay: "00:00:02" 1615 | - service: modbus.write_register 1616 | data_template: 1617 | hub: VSR300 1618 | unit: 1 1619 | address: 1161 1620 | value: 7 1621 | vsr300_holiday_dummy_off: 1622 | sequence: 1623 | service: input_boolean.turn_off 1624 | entity_id: input_boolean.vsr300_holiday_mode_status_dummy 1625 | 1626 | vsr300_send_notification: 1627 | alias: "Send VSR300 Notification" 1628 | description: "Send both persistent and phone notifications for VSR300 events" 1629 | fields: 1630 | title: 1631 | description: "Notification title" 1632 | example: "VSR300 Alert" 1633 | message: 1634 | description: "Notification message" 1635 | example: "This is an alert message" 1636 | notification_id: 1637 | description: "ID for persistent notification" 1638 | example: "vsr300_alert" 1639 | priority: 1640 | description: "Notification priority (normal/high/critical)" 1641 | example: "high" 1642 | default: "normal" 1643 | sequence: 1644 | # Persistent notification 1645 | - service: persistent_notification.create 1646 | data: 1647 | title: "{{ title }}" 1648 | message: "{{ message }}" 1649 | notification_id: "{{ notification_id }}" 1650 | 1651 | # Phone notification 1652 | - service: notify.all_devices 1653 | data: 1654 | title: "{{ title }}" 1655 | message: "{{ message }}" 1656 | data: 1657 | channel: "vsr300_alerts" 1658 | importance: "{{ priority }}" 1659 | ttl: 0 1660 | sticky: true 1661 | tag: "{{ notification_id }}" 1662 | ################################################################################ 1663 | # Automation 1664 | ################################################################################ 1665 | 1666 | automation: 1667 | - id: "vsr300getsetpointeco" 1668 | alias: VSR300 Get setpoint Eco Heat offset 1669 | mode: restart 1670 | description: "" 1671 | trigger: 1672 | - platform: state 1673 | entity_id: 1674 | - input_number.vsr300_eco_offset_temp_sp 1675 | condition: [] 1676 | action: 1677 | - delay: "00:00:11" 1678 | - service: input_number.set_value 1679 | data_template: 1680 | entity_id: input_number.vsr300_eco_offset_temp_sp 1681 | value: "{{ states('sensor.vsr300_eco_heat_offset') | int }}" 1682 | alias: Get setpoint eco offset temp 1683 | - id: "vsr300getsetpointaway" 1684 | alias: VSR300 Get setpoint Away Duration 1685 | mode: restart 1686 | description: "" 1687 | trigger: 1688 | - platform: state 1689 | entity_id: 1690 | - input_number.vsr300_away_mode_duration_sp 1691 | condition: [] 1692 | action: 1693 | - delay: "00:00:11" 1694 | - service: input_number.set_value 1695 | data_template: 1696 | entity_id: input_number.vsr300_away_mode_duration_sp 1697 | value: "{{ states('sensor.vsr300_away_mode_duration') | int }}" 1698 | alias: Get setpoint away 1699 | - id: "vsr300getsetpointcrowded" 1700 | alias: VSR300 Get setpoint Crowded Duration 1701 | mode: restart 1702 | description: "" 1703 | trigger: 1704 | - platform: state 1705 | entity_id: 1706 | - input_number.vsr300_crowded_mode_duration 1707 | condition: [] 1708 | action: 1709 | - delay: "00:00:11" 1710 | - service: input_number.set_value 1711 | data_template: 1712 | entity_id: input_number.vsr300_crowded_mode_duration 1713 | value: "{{ states('sensor.vsr300_crowded_mode_duration') | int }}" 1714 | alias: Get setpoint crowded 1715 | - id: "vsr300getsetpointfireplace" 1716 | alias: VSR300 Get setpoint Fireplace Duration 1717 | mode: restart 1718 | description: "" 1719 | trigger: 1720 | - platform: state 1721 | entity_id: 1722 | - input_number.vsr300_fireplace_mode_duration_sp 1723 | condition: [] 1724 | action: 1725 | - delay: "00:00:11" 1726 | - service: input_number.set_value 1727 | data_template: 1728 | entity_id: input_number.vsr300_fireplace_mode_duration_sp 1729 | value: "{{ states('sensor.vsr300_fireplace_mode_duration') | int }}" 1730 | alias: Get setpoint fireplace 1731 | - id: "vsr300getsetpointholiday" 1732 | alias: VSR300 Get setpoint Holiday Duration 1733 | mode: restart 1734 | description: "" 1735 | trigger: 1736 | - platform: state 1737 | entity_id: 1738 | - input_number.vsr300_holiday_mode_duration_sp 1739 | condition: [] 1740 | action: 1741 | - delay: "00:00:11" 1742 | - service: input_number.set_value 1743 | data_template: 1744 | entity_id: input_number.vsr300_holiday_mode_duration_sp 1745 | value: "{{ states('sensor.vsr300_holiday_mode_duration') | int }}" 1746 | alias: Get setpoint holiday 1747 | - id: "vsr300getsetpointrefresh" 1748 | alias: VSR300 Get setpoint Refresh Duration 1749 | mode: restart 1750 | description: "" 1751 | trigger: 1752 | - platform: state 1753 | entity_id: 1754 | - input_number.vsr300_refresh_mode_duration_sp 1755 | condition: [] 1756 | action: 1757 | - delay: "00:00:11" 1758 | - service: input_number.set_value 1759 | data_template: 1760 | entity_id: input_number.vsr300_refresh_mode_duration_sp 1761 | value: "{{ states('sensor.vsr300_refresh_mode_duration') | int }}" 1762 | alias: Get setpoint refresh 1763 | - service: input_number.set_value 1764 | data_template: 1765 | entity_id: input_number.vsr300_supply_air_fan_speed_normal_sp 1766 | value: "{{ states('sensor.vsr300_supply_air_fan_speed_normal') | int }}" 1767 | alias: Get setpoint away 1768 | - service: input_number.set_value 1769 | data_template: 1770 | entity_id: input_number.vsr300_exhaust_air_fan_speed_normal_sp 1771 | value: "{{ states('sensor.vsr300_exhaust_air_fan_speed_normal') | int }}" 1772 | alias: Get setpoint away 1773 | - id: "vsr300getsetpointfilter" 1774 | alias: VSR300 Get setpoint Filter Replacement 1775 | mode: restart 1776 | description: "" 1777 | trigger: 1778 | - platform: state 1779 | entity_id: 1780 | - input_number.vsr300_filter_replacement_period_months_sp 1781 | condition: [] 1782 | action: 1783 | - delay: "00:00:11" 1784 | - service: input_number.set_value 1785 | data_template: 1786 | entity_id: input_number.vsr300_filter_replacement_period_months_sp 1787 | value: "{{ states('sensor.vsr300_filter_replacement_period_months') | int }}" 1788 | alias: Get setpoint filter 1789 | 1790 | - id: "vsr300SetSetpointCrowded" 1791 | alias: vsr300 Set Setpoint Crowded Mode 1792 | # unique_id: vsr300SetSetpointCrowded01 1793 | description: "" 1794 | trigger: 1795 | - platform: state 1796 | entity_id: input_number.vsr300_crowded_mode_duration_sp 1797 | condition: [] 1798 | action: 1799 | - service: modbus.write_register 1800 | data_template: 1801 | hub: VSR300 1802 | unit: 1 1803 | address: 1104 1804 | value: "{{ states.input_number.vsr300_crowded_mode_duration_sp.state | int }}" 1805 | 1806 | - id: "vsr300SetSetpointEco" 1807 | alias: vsr300 Set Setpoint Eco Mode 1808 | # unique_id: vsr300SetSetpointEco01 1809 | description: "" 1810 | trigger: 1811 | - platform: state 1812 | entity_id: input_number.vsr300_eco_offset_temp_sp 1813 | condition: [] 1814 | action: 1815 | - service: modbus.write_register 1816 | data_template: 1817 | hub: VSR300 1818 | unit: 1 1819 | address: 2503 1820 | value: "{{ states.input_number.vsr300_eco_offset_temp_sp.state | int * 10 }}" 1821 | 1822 | - id: "vsr300SetSetpointFireplace" 1823 | alias: vsr300 Set Setpoint Fireplace Mode 1824 | # unique_id: vsr300SetSetpointFireplace01 1825 | description: "" 1826 | trigger: 1827 | - platform: state 1828 | entity_id: input_number.vsr300_fireplace_mode_duration_sp 1829 | condition: [] 1830 | action: 1831 | - service: modbus.write_register 1832 | data_template: 1833 | hub: VSR300 1834 | unit: 1 1835 | address: 1102 1836 | value: "{{ states.input_number.vsr300_fireplace_mode_duration_sp.state | int }}" 1837 | 1838 | - id: "vsr300SetSetpointAway" 1839 | alias: vsr300 Set Setpoint Away Mode 1840 | description: "" 1841 | trigger: 1842 | - platform: state 1843 | entity_id: input_number.vsr300_away_mode_duration_sp 1844 | condition: [] 1845 | action: 1846 | - service: modbus.write_register 1847 | data_template: 1848 | hub: VSR300 1849 | unit: 1 1850 | address: 1101 1851 | value: "{{ states.input_number.vsr300_away_mode_duration_sp.state | int }}" 1852 | 1853 | - id: "vsr300SetSetpointHoliday" 1854 | alias: vsr300 Set Setpoint Holiday 1855 | # unique_id: vsr300SetSetpointHoliday01 1856 | description: "" 1857 | trigger: 1858 | - platform: state 1859 | entity_id: input_number.vsr300_holiday_mode_duration_sp 1860 | condition: [] 1861 | action: 1862 | - service: modbus.write_register 1863 | data_template: 1864 | hub: VSR300 1865 | unit: 1 1866 | address: 1100 1867 | value: "{{ states.input_number.vsr300_holiday_mode_duration_sp.state | int }}" 1868 | 1869 | - id: "vsr300SetSetpointRefresh" 1870 | alias: vsr300 Set Setpoint Refresh Mode 1871 | # unique_id: vsr300SetSetpointRefresh01 1872 | description: "" 1873 | trigger: 1874 | - platform: state 1875 | entity_id: input_number.vsr300_refresh_mode_duration_sp 1876 | condition: [] 1877 | action: 1878 | - service: modbus.write_register 1879 | data_template: 1880 | hub: VSR300 1881 | unit: 1 1882 | address: 1103 1883 | value: "{{ states('input_number.vsr300_refresh_mode_duration_sp') | int }}" 1884 | 1885 | - id: "vsr300SetSetpointSAFnorm" 1886 | alias: vsr300 Set Setpoint Supply air fan speed normal 1887 | description: "" 1888 | trigger: 1889 | - platform: state 1890 | entity_id: input_number.vsr300_supply_air_fan_speed_normal_sp 1891 | condition: [] 1892 | action: 1893 | - service: modbus.write_register 1894 | data_template: 1895 | hub: VSR300 1896 | unit: 1 1897 | address: 1414 1898 | value: "{{ states('input_number.vsr300_supply_air_fan_speed_normal_sp') | int }}" 1899 | 1900 | - id: "vsr300SetSetpointexhaustairfanspeednormal" 1901 | alias: vsr300 Set Setpoint Exhaust air fan speed normal 1902 | description: "" 1903 | trigger: 1904 | - platform: state 1905 | entity_id: input_number.vsr300_exhaust_air_fan_speed_normal_sp 1906 | condition: [] 1907 | action: 1908 | - service: modbus.write_register 1909 | data_template: 1910 | hub: VSR300 1911 | unit: 1 1912 | address: 1415 1913 | value: "{{ states('input_number.vsr300_exhaust_air_fan_speed_normal_sp') | int }}" 1914 | 1915 | - id: "vsr300SetSetpointFilter" 1916 | alias: vsr300 Set Setpoint Filter Replacement 1917 | # unique_id: vsr300SetSetpointFilter01 1918 | description: "" 1919 | trigger: 1920 | - platform: state 1921 | entity_id: input_number.vsr300_filter_replacement_period_months_sp 1922 | condition: [] 1923 | action: 1924 | - service: modbus.write_register 1925 | data_template: 1926 | hub: VSR300 1927 | unit: 1 1928 | address: 7000 1929 | value: "{{ states.input_number.vsr300_filter_replacement_period_months_sp.state | int }}" 1930 | 1931 | - id: "vsr300_clear_all_alarms" 1932 | alias: vsr300 Clear All Alarms 1933 | description: "Clear all VSR300 alarms" 1934 | trigger: 1935 | - platform: state 1936 | entity_id: input_button.vsr300_clear_all_alarms 1937 | condition: [] 1938 | action: 1939 | - service: modbus.write_register 1940 | data_template: 1941 | hub: VSR300 1942 | unit: 1 1943 | address: 15904 1944 | value: 1 1945 | 1946 | - id: "vsr300_one_automation_notification" 1947 | alias: VSR300 Status Monitor and Notification 1948 | description: "Monitor VSR300 system and send appropriate notifications" 1949 | mode: queued 1950 | trigger: 1951 | # Filter replacement triggers 1952 | - platform: numeric_state 1953 | entity_id: sensor.vsr300_time_to_filter_replacement_s 1954 | below: 432000 # 5 days in seconds 1955 | id: "filter_soon" 1956 | - platform: numeric_state 1957 | entity_id: sensor.vsr300_time_to_filter_replacement_s 1958 | below: 1 1959 | id: "filter_now" 1960 | 1961 | # Alarm triggers - using individual alarm sensors 1962 | - platform: state 1963 | entity_id: sensor.vsr300_a_alarm 1964 | to: "1" 1965 | id: "type_a_alarm_on" 1966 | - platform: state 1967 | entity_id: sensor.vsr300_b_alarm 1968 | to: "1" 1969 | id: "type_b_alarm_on" 1970 | - platform: state 1971 | entity_id: sensor.vsr300_c_alarm 1972 | to: "1" 1973 | id: "type_c_alarm_on" 1974 | 1975 | # Alarm cleared triggers 1976 | - platform: state 1977 | entity_id: sensor.vsr300_a_alarm 1978 | from: "1" 1979 | to: "0" 1980 | id: "type_a_alarm_off" 1981 | - platform: state 1982 | entity_id: sensor.vsr300_b_alarm 1983 | from: "1" 1984 | to: "0" 1985 | id: "type_b_alarm_off" 1986 | - platform: state 1987 | entity_id: sensor.vsr300_c_alarm 1988 | from: "1" 1989 | to: "0" 1990 | id: "type_c_alarm_off" 1991 | action: 1992 | - choose: 1993 | # Filter soon 1994 | - conditions: 1995 | - condition: trigger 1996 | id: "filter_soon" 1997 | - condition: template 1998 | value_template: "{{ states('sensor.vsr300_time_to_filter_replacement_s')|int(0) > 0 }}" 1999 | sequence: 2000 | - service: script.vsr300_send_notification 2001 | data: 2002 | title: "VSR300 Filter Replacement Required Soon" 2003 | message: >- 2004 | The VSR300 ventilation unit filter will need replacement soon. 2005 | Time remaining: {{ states('sensor.vsr300_time_to_filter_change_months') }} 2006 | notification_id: vsr300_filter_reminder 2007 | priority: high 2008 | 2009 | # Filter now 2010 | - conditions: 2011 | - condition: trigger 2012 | id: "filter_now" 2013 | sequence: 2014 | - service: script.vsr300_send_notification 2015 | data: 2016 | title: "VSR300 FILTER REPLACEMENT REQUIRED!" 2017 | message: >- 2018 | The VSR300 ventilation unit filter needs to be replaced immediately! 2019 | 2020 | After replacing the filter, press the "Reset Filter Timer" button in the VSR300 control panel. 2021 | notification_id: vsr300_filter_replacement_required 2022 | priority: critical 2023 | 2024 | # Any alarm activated 2025 | - conditions: 2026 | - condition: or 2027 | conditions: 2028 | - condition: trigger 2029 | id: "type_a_alarm_on" 2030 | - condition: trigger 2031 | id: "type_b_alarm_on" 2032 | - condition: trigger 2033 | id: "type_c_alarm_on" 2034 | sequence: 2035 | - service: script.vsr300_send_notification 2036 | data: 2037 | title: "VSR300 Alarm Activated" 2038 | message: >- 2039 | The VSR300 has active alarms! 2040 | 2041 | {% if is_state('sensor.vsr300_a_alarm', 'unavailable') %} 2042 | Type A: Unknown 2043 | {% else %} 2044 | Type A: {{ 'Yes' if states('sensor.vsr300_a_alarm')|int(0) == 1 else 'No' }} 2045 | {% endif %} 2046 | 2047 | {% if is_state('sensor.vsr300_b_alarm', 'unavailable') %} 2048 | Type B: Unknown 2049 | {% else %} 2050 | Type B: {{ 'Yes' if states('sensor.vsr300_b_alarm')|int(0) == 1 else 'No' }} 2051 | {% endif %} 2052 | 2053 | {% if is_state('sensor.vsr300_c_alarm', 'unavailable') %} 2054 | Type C: Unknown 2055 | {% else %} 2056 | Type C: {{ 'Yes' if states('sensor.vsr300_c_alarm')|int(0) == 1 else 'No' }} 2057 | {% endif %} 2058 | notification_id: vsr300_alarm 2059 | priority: high 2060 | 2061 | # All alarms cleared 2062 | - conditions: 2063 | - condition: or 2064 | conditions: 2065 | - condition: trigger 2066 | id: "type_a_alarm_off" 2067 | - condition: trigger 2068 | id: "type_b_alarm_off" 2069 | - condition: trigger 2070 | id: "type_c_alarm_off" 2071 | - condition: template 2072 | value_template: "{{ states('sensor.vsr300_a_alarm')|int(0) == 0 and states('sensor.vsr300_b_alarm')|int(0) == 0 and states('sensor.vsr300_c_alarm')|int(0) == 0 }}" 2073 | sequence: 2074 | - service: script.vsr300_send_notification 2075 | data: 2076 | title: "VSR300 Alarms Cleared" 2077 | message: "All alarms on the VSR300 ventilation unit have been cleared." 2078 | notification_id: vsr300_alarm_cleared 2079 | priority: normal 2080 | - service: persistent_notification.dismiss 2081 | data: 2082 | notification_id: vsr300_alarm 2083 | default: [] 2084 | --------------------------------------------------------------------------------