Systemair SAVECare Ventilation unit

@moskovskiy82 Great idea to use climates in the modbus definition. I hadn’t used them much before so I didn’t think of that.

I have an actual power measurement plug on my FTX so I get the power it consumes directly that way.

Here’s the code for the display I have. The basic idea is that I designed the graphic in powerpoint, then copied just the parts that changed for each mode into same-sized PNGs. (I just copied them from powerpoint and pasted them into Apple’s Preview program.) I then deleted the parts of the image that didn’t change and saved each one as a separate PNG. Then when that state is “on” I show that graphic, and the non-transparent part covers the rest. For example, there is a PNG that just has the heater in yellow for the FTX and the rest is transparent, so when the heater is on, it overlays that over the rest.

type: picture-elements
image: /local/heat_graphics2/base3_all_off.png
theme: light
elements:
  - entity: binary_sensor.pump_cold_circuit
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_brine_on.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: binary_sensor.compressor
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_compressor_on.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: sensor.heatpump_status_direct
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      Idle: /local/heat_graphics2/blank.png
      Water Heat Pumping: /local/heat_graphics2/base3_water_heat_on.png
      Floor Heat Pumping: /local/heat_graphics2/base3_floor_heat_on.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: sensor.ftx_supply_fan_mode
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      Low: /local/heat_graphics2/base3_ftx_supply_low.png
      Normal: /local/heat_graphics2/base3_ftx_supply_normal.png
      High: /local/heat_graphics2/base3_ftx_supply_high.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: sensor.ftx_extract_fan_mode
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      Low: /local/heat_graphics2/base3_ftx_extract_low.png
      Normal: /local/heat_graphics2/base3_ftx_extract_normal.png
      High: /local/heat_graphics2/base3_ftx_extract_high.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: binary_sensor.pump_radiator
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_floor_on.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: sensor.ftx_heater_on
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_ftx_electric_on.png
      'off': /local/heat_graphics2/blank.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: sensor.heatpump_heater_on
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_heat_pump_electric_on.png
      'off': /local/heat_graphics2/blank.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: binary_sensor.alarm
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_heatpump_warning.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: binary_sensor.ftx_alarm
    type: image
    image: /local/heat_graphics2/blank.png
    state_image:
      'on': /local/heat_graphics2/base3_ftx_warning.png
    style:
      left: 0%
      top: 0%
      transform: none
      width: 100%
  - entity: climate.room_temp_setpoint
    attribute: current_temperature
    style:
      left: 2%
      top: 50.5%
      transform: translate(0%, -50%)
      font-size: 1.5vw
      text-decoration: underline
    type: state-label
    prefix: 'Setpoint: '
    suffix: °C
  - entity: sensor.heatpump_status_direct
    type: state-label
    style:
      right: 46.5%
      top: 81%
      transform: translate(0%, -50%)
      font-size: 1vw
  - entity: sensor.brine_out_condenser
    style:
      right: 86%
      top: 58.8%
      font-size: 1.5vw
      transform: translate(0%,-50%)
    type: state-label
  - entity: sensor.brine_in_evaporator
    style:
      right: 86%
      top: 70%
      font-size: 1.5vw
      transform: translate(0%,-50%)
    type: state-label
  - entity: sensor.radiator_forward
    style:
      left: 83.5%
      top: 63.5%
      transform: translate(0%,-50%)
      font-size: 1.5vw
    type: state-label
  - entity: sensor.heating_setpoint
    style:
      left: 83.5%
      top: 67.5%
      transform: translate(0%,-50%)
      font-size: 1vw
    prefix: 'Target: '
    type: state-label
  - entity: sensor.heat_carrier_forwrd
    style:
      right: 45.7%
      top: 58.8%
      font-size: 1.5vw
      transform: translate(0%,-50%)
    type: state-label
  - entity: sensor.heat_carrier_return
    style:
      right: 45.7%
      top: 70%
      font-size: 1.5vw
      transform: translate(0%,-50%)
    type: state-label
  - entity: sensor.warm_water_1_top
    style:
      left: 73.8%
      top: 81.6%
      font-size: 1.5vw
    type: state-label
  - entity: sensor.hot_gas_compr
    style:
      right: 68%
      top: 58.8%
      font-size: 1.5vw
      transform: translate(0%,-50%)
    type: state-label
  - entity: sensor.outdoor
    style:
      left: 7%
      top: 81%
      transform: translate(0%, -50%)
      font-size: 1vw
    type: state-label
    prefix: 'Outside: '
  - entity: sensor.add_heat_status
    style:
      left: 42%
      bottom: 45%
      font-size: 1.5vw
      transform: translate(-50%,50%)
    type: state-label
  - entity: sensor.ftx_humidity_filtered
    suffix: RH
    style:
      left: 79.5%
      top: 26.5%
      transform: translate(0%,-50%)
      font-size: 1.5vw
    type: state-label
  - entity: sensor.ftx_extract_temperature_filtered
    style:
      left: 79.5%
      top: 30%
      transform: translate(0%,-50%)
      font-size: 1.5vw
    type: state-label
  - entity: sensor.ftx_supply_temperature
    style:
      right: 36%
      top: 30%
      transform: translate(50%,-50%)
      font-size: 1.5vw
    type: state-label
  - entity: sensor.ftx_exhaust_temperature
    style:
      right: 94%
      top: 12.5%
      font-size: 1.5vw
      transform: translate(50%,-50%)
    type: state-label
  - entity: sensor.ftx_outdoor_temperature
    style:
      right: 94%
      top: 22.5%
      font-size: 1.5vw
      transform: translate(50%,-50%)
    type: state-label
  - entity: sensor.ftx_heater_active
    type: state-label
    style:
      left: 44%
      top: 30%
      font-size: 1.5vw
      transform: translate(-50%,-50%)
  - entity: sensor.ftx_heat_exchanger_active
    type: state-label
    style:
      left: 22%
      top: 18%
      font-size: 1.5vw
      transform: translate(-50%,-50%)
  - entity: sensor.ftx_extract_efficiency
    type: state-label
    style:
      left: 28%
      top: 26.5%
      font-size: 1vw
      transform: translate(-50%,-50%)
    suffix: ' eff'
  - entity: sensor.ftx_exhaust_efficiency
    type: state-label
    style:
      left: 28%
      top: 8.5%
      font-size: 1vw
      transform: translate(-50%,-50%)
    suffix: ' eff'
  - entity: sensor.ftx_supply_fan_speed_percent
    type: state-label
    style:
      left: 36.5%
      top: 30%
      font-size: 1.5vw
      transform: translate(-50%,-50%)
  - entity: sensor.ftx_extract_fan_speed_percent
    type: state-label
    style:
      left: 36.5%
      top: 5.7%
      font-size: 1.5vw
      transform: translate(-50%,-50%)
  - entity: sensor.kitchen_fan_status
    type: state-label
    style:
      left: 92.5%
      top: 54%
      transform: translate(0%,-50%)
      font-size: 1.5vw
  - entity: sensor.bathroom_humidity
    type: state-label
    suffix: RH
    style:
      left: 88.5%
      top: 40%
      transform: translate(0%,-50%)
      font-size: 1.5vw
  - entity: sensor.bathroom_temperature
    type: state-label
    style:
      left: 88.5%
      top: 43.5%
      transform: translate(0%,-50%)
      font-size: 1.5vw
  - entity: sensor.upstairs_humidity
    type: state-label
    suffix: RH
    style:
      left: 78%
      top: 42%
      font-size: 1.5vw
  - entity: sensor.upstairs_temperature
    type: state-label
    style:
      left: 69.5%
      top: 42%
      font-size: 1.5vw
  - entity: sensor.downstairs_humidity
    type: state-label
    suffix: RH
    style:
      left: 78%
      top: 54%
      font-size: 1.5vw
  - entity: sensor.downstairs_temperature
    type: state-label
    style:
      left: 69.5%
      top: 54%
      font-size: 1.5vw
  - entity: input_number.ftx_temperature_setpoint
    style:
      left: 19%
      top: 4%
      transform: translate(0%, -50%)
      font-size: 1.5vw
      text-decoration: underline
    type: state-label
    prefix: 'Setpoint: '
  - entity: input_select.ftx_active_user_mode
    type: state-label
    style:
      left: 19%
      top: 34.4%
      transform: translate(0%, -50%)
      font-size: 1.5vw
      text-decoration: underline
    prefix: 'Mode: '
  - entity: input_select.ftx_manual_fan_speed
    type: state-label
    style:
      left: 36.5%
      top: 34.4%
      transform: translate(-50%, -50%)
      font-size: 1.5vw
      text-decoration: underline
    prefix: 'Fans: '
  - entity: switch.ftx_eco_mode_enabled
    type: state-label
    style:
      left: 44%
      top: 34.4%
      transform: translate(-50%, -50%)
      font-size: 1.5vw
      text-decoration: underline
    prefix: 'Eco: '

1 Like

Here are two of the graphics I use. The first is the “base” that is always on, and the second is overlayed when the FTX extract is on high.


1 Like

Hi, I am trying to set up my SystemAir with modbus over serial, but I cant get the modbus to work. Getting errors on the modbus integration. ny one know what I do wrong?

Setup in configuration.yaml

modbus:

  • name: SystemAir
    type: serial
    method: rtu
    port: /dev/ttyUSB0
    baudrate: 115200
    stopbits: 1
    bytesize: 8
    parity: N

Error message:

Logger: homeassistant.config
Source: components/modbus/validators.py:232
First occurred: 02:59:11 (1 occurrences)
Last logged: 02:59:11

Unknown error calling modbus CONFIG_SCHEMA
Traceback (most recent call last):
File “/usr/src/homeassistant/homeassistant/config.py”, line 876, in async_process_component_config
return component.CONFIG_SCHEMA(config) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/schema_builder.py”, line 272, in call
return self._compiled(, data)
^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/schema_builder.py”, line 595, in validate_dict
return base_validate(path, iteritems(data), out)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/schema_builder.py”, line 387, in validate_mapping
cval = cvalue(key_path, value)
^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/validators.py”, line 229, in _run
return self._exec(self._compiled, value, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/validators.py”, line 353, in _exec
v = func(path, v)
^^^^^^^^^^^^^
File “/usr/local/lib/python3.11/site-packages/voluptuous/schema_builder.py”, line 818, in validate_callable
return schema(data)
^^^^^^^^^^^^
File “/usr/src/homeassistant/homeassistant/components/modbus/validators.py”, line 232, in duplicate_modbus_validator
if hub[CONF_TYPE] == SERIAL:
~~~^^^^^^^^^^^
KeyError: ‘type’

Hi, I just wanted to say thank you for this thread.

I was able to set my VTR500 up in HA using
“Waveshare RS485 to Ethernet Converter” and a “POE splitter”

Using Ztaeyn’s github, I am not advanced enough to go for GMTrevis’s node-red stuff yet :slight_smile:

I am very happy to be able to control my unit from Home assistant, absolutely love it.

This is my current dashboard if anyone is interested.

2 Likes

Hi!
Did anyone have any luck with implementing the seasonal compensations?


I have added triggers for the summer ones and those work fine (in terms that they update the modbus register).
However, for the winter ones, I just can’t make them work. I have tried with negative values (as in the documentation) and none of them update.
And, if anyone understood how the “Winter/Summer” selection works (if it’s automated or if it has a register for the switch), I would really appreciate it.

In case anyone is getting configuration errors with a recent HA core update, this post helped:
Modbus configuration gives an error - Home Assistant Community (home-assistant.io)

Example error
count: 2 cannot be combined with data_type: float32

tldr: Remove / comment out the line(s) with count: 1 or count:2

Can you explain the compensation values? Systemair has quite a genius in writing the manuals

That’s quite a low supply heat point you got there - 12 C with a house temp of 22?

Anyone integrated the VSR as a fan entity and integrating the ventilation modes as presets? Mind sharing the code?

Hi!

I have an older Systemair unit with a wheel on the display for control. It seems that most projects here are designed for newer units with touch displays. Anyway, I’ve created a GitHub repository to integrate these older units. I personally tested it on the vtr200b. Here’s the link if someone else might find it useful. Please don’t judge me harshly; this is my first attempt at working with Modbus and HA.

1 Like

I just scrolled through the code very very fast and generally good job :slight_smile:

One thing to watch out for is that the temperature set point calculation changes dependant of what heater you have I think. I have disabled the heater parts of the year and then I think the range is different to when I have it active (electrical). So the script could be wrong in some instances.

1 Like

Hi @camelen ! Great catch. Indeed if heater is off then temperature set points are 15-19 vs 12-22 with electric heater… Additionally if water heater is used it is 12-40…

How you disable heater via Modbus? Are there any advantages to disable heater at all? Just curious for my own usage…

hi not sure if you are talking about the electrical heater (resistor) for warming up the air… If yes I am controlling it more than less with the ‘Eco Mode’ with the address 2504 …

2504 seems to be for ones with touchscreen…

Ohh yes I have realized late that you were talking about the older version. sorry

After updating the Home Assistant Core to the latest version 2024.1.2 I get the following error. Invalid config for ‘modbus’ at packages/save_vsr_300.yaml

There are other threads warning of the modbus having issues.

This one is undocumented. Got it from SA support (took them around a month to figure out sigh)

      - name: vsr500_heater_switch
        unique_id: vsr500_heater_switch
        slave: 1
        address: 3001
        command_on: 1
        command_off: 0
        verify:
          address: 3001
          state_on: 1
          state_off: 0

I might be wrong, but based on high number(3001), it seems that this address is for newer version Systemair with touch screen. And it do not work on my Systemair with wheel.

This one?
image

Then it’s documented in the modbus manual. Don’t copy directly as this is from an old config.

  • platform: modbus

    slave: 1

    coils:
    • name: VSR Heater off
      slave: 1
      coil: 11203

Anyone know if something like this can be used as a wireless alternative?

https://www.aliexpress.com/item/1005005646573212.html?src=google&src=google&albch=shopping&acnt=897-548-8760&slnk=&plac=&mtctp=&albbt=Google_7_shopping&gclsrc=aw.ds&albagn=888888&ds_e_adid=&ds_e_matchtype=&ds_e_device=c&ds_e_network=x&ds_e_product_group_id=&ds_e_product_id=en1005005646573212&ds_e_product_merchant_id=109235179&ds_e_product_country=NO&ds_e_product_language=en&ds_e_product_channel=online&ds_e_product_store_id=&ds_url_v=2&albcp=19366796373&albag=&isSmbAutoCall=false&needSmbHouyi=false&gad_source=1&gclid=Cj0KCQiAnrOtBhDIARIsAFsSe53KEjPRqM27heMbMzzKJedOiePfSH2sjn5r0ww-SUsG1av79JhboRoaApKXEALw_wcB&aff_fcid=97f08b5e4b1243eeb5198f44d5bb114b-1705865555669-01285-UneMJZVf&aff_fsk=UneMJZVf&aff_platform=aaf&sk=UneMJZVf&aff_trace_key=97f08b5e4b1243eeb5198f44d5bb114b-1705865555669-01285-UneMJZVf&terminal_id=f98c9dd9fd6a4c5f997efc2e56d091be&afSmartRedirect=y

Wired connection would be hard for me.