Vallox ValloPlus 350MV partial success -> Work in progress on vallox component

Hi,

I am now able to at least read data from my Vallox automatic ventilation ValloPlus 350MV. I am using phantomjs (fortunately included in the docker-image of home assistant) to access the web-interface of the ventilation as this makes heavy use of Javascript (Jquery). Sorry these are my first steps in Javascript so expect it to be ugly and buggy.

So far at least reading the values works. Controlling the switches is my next focus. Challenge seems to be that not all switches are visible per default. However this approach might also be a start for accessing other webinterfaces with Javascript/Jquery, where no other interface exists. Potentially the ValloPlus should be also accessible by Modbus. However as I already had it connected to my Network (and have no experience with modbus either) I wanted to try this first.

I have stored the javascript-file for phantomjs in config/vallox/read_vallox.js:

var system = require('system');
var webPage = require('webpage');

var page = webPage.create();
var url = system.args[1];

var requestsArray = [];

page.onResourceRequested = function(requestData, networkRequest) {
  requestsArray.push(requestData.id);
};

// to circumvent issue that console.log is normally not available.
page.onAlert = function(msg) {
  console.log(msg);
page.onResourceReceived = function(response) {
  var index = requestsArray.indexOf(response.id);
  requestsArray.splice(index, 1);
};

page.open(url, function(status) {

  var interval = setInterval(function () {

    if (requestsArray.length === 0) {

      clearInterval(interval);
      var pageData = page.evaluate(function() {
        window.console.log = function(msg) { alert(msg) };
        // Model 
        console.log(document.querySelector('div.dashboard-panel div.wizard-panel-device.wizard-panel-device-active p').innerHTML.trim());

        // Temp Supply Air
        console.log(document.querySelector('div[l10n-path="dashboard.now.supply"] p').innerHTML.trim().replace(' °C',''));
        // Humidity
        console.log( document.querySelector('div[l10n-path="info.diagnostics.rh.sensors.0"] p').innerHTML.trim().replace('%',''));
        // Temp indor Air
        console.log(document.querySelector('div[l10n-path="dashboard.now.indoor"] p').innerHTML.trim().replace(' °C',''));
        // Power Status (attention: Language)
console.log(document.querySelector('div[l10n-path="info.status.power"] p').innerHTML.trim());
        // Temp outdoor
        console.log(document.querySelector('div[l10n-path="dashboard.now.outdoor"] p').innerHTML.trim().replace(' °C',''));
        // Temp Exhaust
        console.log(document.querySelector('div[l10n-path="dashboard.now.exhaust"] p').innerHTML.trim().replace(' °C',''));
        console.log(document.querySelector('div[l10n-path="dashboard.profile.fanspeed"] p').innerHTML.trim().replace('%',''));
        //return document.querySelector('div[l10n-path="dashboard.now.supply"] p');
      });
      phantom.exit();
    }
  }, 5000);
});

Now in the configuration I have defined one command line sensor which reads all values at once and is split via template sensors:

sensor:
  - platform: command_line
      #  Vallox Sensor 
      # /usr/bin/phantomjs /config/vallox/read_vallox.js
    name: Vallox Gesamt
    command: "/usr/bin/phantomjs /config/vallox/read_vallox.js http://192.168.70.20"
    scan_interval: 120

- platform: template
sensors:
  vallox_model:
    friendly_name: 'Vallox Model'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[0] }}"
  vallox_temp_supply:
    friendly_name: 'Vallox Temp Zuluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[1] | int }}"
    unit_of_measurement: '°C'
  vallox_humidity:
    friendly_name: 'Vallox Rel. LF'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[2] | int }}"
    unit_of_measurement: '%'
  vallox_temp_indoor:
    friendly_name: 'Vallox Temp Innen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[3] | int }}"
    unit_of_measurement: '°C'
  vallox_power:
    friendly_name: 'Vallox Ein/Aus'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[4] }}"
  vallox_temp_outdoor:
    friendly_name: 'Vallox Temp Außen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[5] | int }}"
    unit_of_measurement: '°C'
  vallox_temp_exhaust:
    friendly_name: 'Vallox Abluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[6] | int }}"
    unit_of_measurement: '°C'

So far reading the sensors works fine although there is probably some improvement potential (e.g. the interval “workaround” - as the page in JS takes very long to load - might check actually for some date, have the Javascript return JSON to avoid further formatting), etc.

controlling / clicking so far was not successful. I started with:

document.querySelector(‘a[l10n-path=“dashboard.profile.list.0.activate”]’).click();

within the page.evaluate. However this seems to have no effect but I will continue experimenting and keep posting here. Hope that this might help others.

Back again. Now I can at least control the 4 states which can be directly accessed via a button. Unfortunately I am still unable to access anything which first needs to be set to “edit mode”. So I did a workaround, set the vents in chimney-mode to 0% and this way do the “off” state.

I have now another Javascript file “click_vallox.js” :
var system = require(‘system’);
var webPage = require(‘webpage’);

var page = webPage.create();
//Website
var url = system.args[1];
// States (0: at home, 1: away, 2: high vent, 3: chimney)
// As I Was unable to simulate clicks to open the device state dashboard
// I set on the web-interface the chimney vents to 0 -> off
var state = system.args[2];

var requestsArray = [];

page.onResourceRequested = function(requestData, networkRequest) {
  requestsArray.push(requestData.id);
};

//page.onAlert = function(msg) {
//  console.log(msg);
//};


page.onResourceReceived = function(response) {
  var index = requestsArray.indexOf(response.id);
  requestsArray.splice(index, 1);
};

function evaluate(page, func) {
    var args = [].slice.call(arguments, 2);
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + ");}";
    return page.evaluate(fn);
}

page.open(url, function(status) {
  var interval = setInterval(function () {
        if (requestsArray.length === 0) {
      clearInterval(interval);
        var pageData = evaluate(page, function(state) {
        window.console.log = function(msg) { alert(msg) };
        // Works fine, selects active profiles 0-3
        $('a[l10n-path="dashboard.profile.list.'+ state +'.activate"]').click();
   },state);
      // Hack to have the click processed before exiting
      setTimeout(function(){
          phantom.exit();
      }, 10000);


   }
  }, 5000);
});

in my configuration.yaml I added a shell-command and an input number for the 4 states

shell_command:
  set_state_to_vent: '/usr/bin/phantomjs /config/vallox/click_vallox.js http://192.168.70.20 {{ states.input_number.state_vent.state | int }}'
input_number:
  state_vent:
    name: Vallox KWL Status
    min: 0
    max: 3

and in automations.yaml I added an automation that is triggered via changes:

# Ventilation state command
- alias: LĂŒftung Änderung
  trigger:
  - entity_id: input_number.state_vent
    platform: state
  action:
  - service: shell_command.set_state_to_vent

I am convinced this is not the most elegant solution (especially the Javascript with the long interval times), however what I needed most (constolling the vent-states) at least now works. Improvments proposal welcome any time : -)

Hi!

Im also have a Vallox HVAC unit (145MV) that I would like to integrate in HA.
I found this: https://github.com/yozik04/vallox_websocket_api
Should be fairly easy to make a component from but I am a total noob at HA and python but thought I should share the resource :slight_smile:

Hi Jakob,

you are right, thanks for sharing. That looks more sophisticated and complete than my approach. Unfortunately I am also no expert on websockets and no expert on setting up home assistant modules. Meanwhile I can share my enhanced versions:

read_vallox.js

var system = require('system');
var webPage = require('webpage');

var page = webPage.create();
var url = system.args[1];

/* page.viewportSize = {
  width: 1280,
  height: 720
};*/

var requestsArray = [];

page.onResourceRequested = function(requestData, networkRequest) {
  requestsArray.push(requestData.id);
};

//page.onConsoleMessage = function(msg) {
//  console.log(msg);
//};

page.onAlert = function(msg) {
  console.log(msg);
};


page.onResourceReceived = function(response) {    
  var index = requestsArray.indexOf(response.id);
  requestsArray.splice(index, 1);
};

page.open(url, function(status) {

  var interval = setInterval(function () {
    if (requestsArray.length === 0) {

  clearInterval(interval);
      //page.render('yourLoadedPage.png');
      var pageData = page.evaluate(function() {
        window.console.log = function(msg) { alert(msg) };
        // Model
        console.log(document.querySelector('div.dashboard-panel div.wizard-panel-device.wizard-panel-device-active p').innerHTML.trim());

        // Temp Supply Air
        console.log(document.querySelector('div[l10n-path="dashboard.now.supply"] p').innerHTML.trim().replace(' °C',''));
            // Humidity
        console.log( document.querySelector('div[l10n-path="info.diagnostics.rh.sensors.0"] p').innerHTML.trim().replace('%',''));
        // Temp indor Air
        console.log(document.querySelector('div[l10n-path="dashboard.now.indoor"] p').innerHTML.trim().replace(' °C',''));
        // Power Status (attention: Language)
        console.log(document.querySelector('div[l10n-path="info.status.power"] p').innerHTML.trim());
        // Temp outdoor
        console.log(document.querySelector('div[l10n-path="dashboard.now.outdoor"] p').innerHTML.trim().replace(' °C',''));
        // Temp Exhaust
        console.log(document.querySelector('div[l10n-path="dashboard.now.exhaust"] p').innerHTML.trim().replace(' °C',''));
       // Get active profile 0-3
        var profile_radios = document.querySelector('div [id="profileradios"]').innerHTML.trim();
//        console.log(profile_radios);
        var matches = profile_radios.match(/dashboard\-profile\-radioactive" dashboard="(\d)">/);
         if ( matches[1] < 3) {
           // Fanspeed profiles 0-2
          console.log(document.querySelector('div[l10n-path="dashboard.profile.fanspeed"] p').innerHTML.trim().replace('%',''));
        } else {
          // Fanspeed fireplace (take average of supply and extract)
          var supply_fs = document.querySelector('div[l10n-path="wizard.expert.profiles.fireplace.supply"] p').innerHTML.trim().replace('%','');
          var extract_fs = document.querySelector('div[l10n-path="wizard.expert.profiles.fireplace.extract"] p').innerHTML.trim().replace('%','');
          console.log((supply_fs - extract_fs)/2);
        }
        // Print active profile number (0-3)
       console.log(matches[1]);
      });
//      console.log('XXX;'+ pageData.innerHTML.trim());
      phantom.exit();
    }
  }, 5000);
});

an click_vallox.js

var system = require('system');
var webPage = require('webpage');

var page = webPage.create();
//Website
var url = system.args[1];
// States (0: at home, 1: away, 2: high vent, 3: chimney)
// As I Was unable to simulate clicks to open the device state dashboard
// I set on the web-interface the chimney vents to 0 -> off
var state = system.args[2];

var requestsArray = [];

page.onResourceRequested = function(requestData, networkRequest) {
  requestsArray.push(requestData.id);
};

//page.onAlert = function(msg) {
//  console.log(msg);
//};


page.onResourceReceived = function(response) {
  var index = requestsArray.indexOf(response.id);
  requestsArray.splice(index, 1);
};

function evaluate(page, func) {
    var args = [].slice.call(arguments, 2);
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) +     ");}";
    return page.evaluate(fn);
}
page.open(url, function(status) {
  var interval = setInterval(function () {
        if (requestsArray.length === 0) {
      clearInterval(interval);
        var pageData = evaluate(page, function(state) {
        window.console.log = function(msg) { alert(msg) };
        // Works fine, selects active profiles 0-3
        $('a[l10n-path="dashboard.profile.list.'+ state +'.activate"]').click();
   },state);
      // Hack to have the click processed before exiting
      setTimeout(function(){
          phantom.exit();
      }, 10000);


   }
  }, 5000);
});

In configuration.yaml I added some splits

  vallox_model:
    friendly_name: 'Vallox Model'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[0] }}"
  vallox_temp_supply:
    friendly_name: 'Vallox Temp Zuluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[1] | int }}"
    unit_of_measurement: '°C'
  vallox_humidity:
    friendly_name: 'Vallox Rel. LF'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[2] | int }}"
    unit_of_measurement: '%'
  vallox_temp_indoor:
    friendly_name: 'Vallox Temp Innen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[3] | int }}"
    unit_of_measurement: '°C'
  vallox_power:
    friendly_name: 'Vallox Ein/Aus'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[4] }}"
  vallox_temp_outdoor:
    friendly_name: 'Vallox Temp Außen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[5] | int }}"
    unit_of_measurement: '°C'
  vallox_temp_exhaust:
    friendly_name: 'Vallox Abluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[6] | int }}"
    unit_of_measurement: '°C'
  vallox_model:
    friendly_name: 'Vallox Model'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[0] }}"
  vallox_temp_supply:
    friendly_name: 'Vallox Temp Zuluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[1] | int }}"
    unit_of_measurement: '°C'
  vallox_humidity:
    friendly_name: 'Vallox Rel. LF'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[2] | int }}"
    unit_of_measurement: '%'
  vallox_temp_indoor:
    friendly_name: 'Vallox Temp Innen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[3] | int }}"
    unit_of_measurement: '°C'
  vallox_power:
    friendly_name: 'Vallox Ein/Aus'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[4] }}"
  vallox_temp_outdoor:
    friendly_name: 'Vallox Temp Außen'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[5] | int }}"
    unit_of_measurement: '°C'
  vallox_temp_exhaust:
    friendly_name: 'Vallox Abluft'
    value_template: "{% set list = states.sensor.vallox_gesamt.state.split('\n') %} {{ list[6] | int }}"
    unit_of_measurement: '°C'

As I had some issues that phantomjs instances hung I added a command to kill it:

shell_command:
  set_state_to_vent: '/usr/bin/phantomjs /config/vallox/click_vallox.js http://192.168.70.20 {{ states.input_number.state_vent.state | int }}'
  kill_phantomjs: '/usr/bin/pkill -f phantomjs || true'

So before I issue the command set_state_to_vent I use kill_phantomjs and wait for 2 seconds, e.g.:

  - service: shell_command.kill_phantomjs
  - delay: 2
  - service: shell_command.set_state_to_vent

Hi there, I am in a ValloPlus 270MV and I can confirm that the linked vallox websocket API is the way to go. I had a nice vallox platform that I could use but lost it. I will recreate it over Christmas. Would be nice to merge it upstream if it works. I could read and switch between the different States etc
 so in theory it works well

Hi,

sounds great, so far I only found the time to experiment with it. I can confirm websocket API access works, is much quicker and I assume it would be much more reliable than my phantomjs approach.

For the time beeing I got stuck with my approach to dynamically install the required modules in my docker-compose-setup (as I do not have experience in creating HHA-add-ins my approach was to use again the shell_command).

If you have anything to test, I am happy to help. :slight_smile:

Best regards

Good news, managed it to make it work on HA 0.86.2 (docker version). I created two shell_commands:

shell_command:
  install_vallox_req: 'python -c "import vallox_websocket_api" || pip install vallox-websocket-api'
  set_state_to_vent: 'python /config/vallox/set_profile.py {{ states.input_number.state_vent.state | int }}'

As I did not want to fiddle around with the docker-file the first shell command I trigger at every start to check whether the python module for vallox is installed and if not to trigger the installation The second one I use to set the active profile (using numbers 0-3 for historic reasons).

For reading the values I use:

sensor:
    - platform: command_line
      #  Vallox Sensor 
      name: Vallox Gesamt
      command: "python /config/vallox/read_vallox.py"
      scan_interval: 120

Then I am using the template sensors as above to split the values.

The set_profile.py runs as follows:

from vallox_websocket_api import Client
from vallox_websocket_api import Vallox, PROFILE
import sys
clientV = Vallox('192.168.70.20')
clientV.set_profile(int(sys.argv[1])+1);

while read_vallox.py is:

from vallox_websocket_api import Client
from vallox_websocket_api import Vallox, PROFILE

client = Client('192.168.70.20')
clientV = Vallox('192.168.70.20')

metrics = client.fetch_metrics([
   'A_CYC_MACHINE_MODEL',
   'A_CYC_TEMP_SUPPLY_AIR',
   'A_CYC_RH_VALUE',
   'A_CYC_TEMP_EXTRACT_AIR',
   'A_CYC_MODE',
   'A_CYC_TEMP_OUTDOOR_AIR',
   'A_CYC_TEMP_EXHAUST_AIR',
   'A_CYC_FAN_SPEED'
 ])

 print(metrics['A_CYC_MACHINE_MODEL'])
 print(metrics['A_CYC_TEMP_SUPPLY_AIR'])
 print(metrics['A_CYC_RH_VALUE'])
 print(metrics['A_CYC_TEMP_EXTRACT_AIR'])
 # Translate 0 = on, 5 = normal operation
 print(1-metrics['A_CYC_MODE']/5)
 print(metrics['A_CYC_TEMP_OUTDOOR_AIR'])
 print(metrics['A_CYC_TEMP_EXHAUST_AIR'])
 print(metrics['A_CYC_FAN_SPEED'])

 #Model Translate as in home-assistant I start profile numbers with 0
 print(clientV.get_profile()-1)

Not very elegant, but works. For setting values (e.g fan levels of the profiles) I set up a set_value.py (HA-side I still need to implement but should be an easy shell_command as well, Parameter definitions can be found in the vallox-websocket-api documentation or just via “metrics = client.fetch_metrics()” which fetches all values):

from vallox_websocket_api import Client
from vallox_websocket_api import Vallox, PROFILE
import sys

client = Client('192.168.70.20')

# First argument see variable in vallox_websocket_api Doc
# Second argument is value to set variable to
client.set_values({sys.argv[1] : sys.argv[2]})

Cheers!

I have the 270 MV as well. Any news on your new platform? :slight_smile:

Hi,

I started implementing this. Still early work in progress, but thanks to the websocket API lib already available it’s straight forward.

Please tell me what kind of sensors you consider a must have. I included some obvious ones already. But some are still missing. Like date of filter change.

Screenshot%20from%202019-06-12%2016-01-16

Regarding fan control, I am quite unhappy with the home assistant Fan class. It inherits from Toggle Switch, so it has some implicit on/off semantics. In my opinion, this doesn’t fit very well with the Vallox units, since they are always-on devices in most cases.

I was thinking about using the on-off toggle for the Boost profile of the Vallox units, since this is probably the most prevalent use case. Toggle switch on would then mean “Vallox is in boost mode”.

Let me know what you think about this situation. Does this sound useful, or would you rather prefer the toggle to completely shut down the ventilation (I have yet to verify if this is possible via the Websocket API).

BR,
Andre

https://github.com/andre-richter/home-assistant/tree/vallox

Hi Andre,

this is great news, on my wish-list in addition would be for reading:
A_CYC_MACHINE_MODEL (Model)
A_CYC_RH_VALUE (Humidity)
A_CYC_MODE (On/Off -> 0 = on, 5 = off)

for writing (first two I really require the others nice to have):
A_CYC_MODE (On/Off -> 0 = on, 5 = off)
A_CYC_AWAY_SPEED_SETTING (Fanspeed Away)
A_CYC_HOME_SPEED_SETTING (Fanspeed Home)
A_CYC_BOOST_SPEED_SETTING (Fanspeed Boost)

A_CYC_AWAY_AIR_TEMP_TARGET (Away Temp Target)
A_CYC_HOME_AIR_TEMP_TARGET (Home Temp Target)
A_CYC_BOOST_AIR_TEMP_TARGET (Boost Temp Target)

A_CYC_FIREPLACE_EXTR_FAN (Fireplace Extract Fan)
A_CYC_FIREPLACE_SUPP_FAN (Fireplace Supply Fan)

A_CYC_FIREPLACE_TIMER (Fireplace Timer)

and setting one of the profiles above via “clientV.set_profile”

Thanks
Hartmut

Hello!

Thank a lot for your work! I am very interested in using this component. I have a ValloPlus 240MV installed in my brand new home and would like to integrate it in my home assistant. This ist the last part to be added in my smart home! :slight_smile:

Thanks
Bernd

@frufo, I pushed a work in progress update that now contains the fan component.
The toggle switch is toggling A_CYC_MODE (On/Off -> 0 = on, 5 = off).
The profiles and therefore speed can be set via dropdown menu.

For changing the SPEED_SETTING registers, I’ll add some services when I get to it.

If anybody is in the mood, feel free to test the current state with your device and give feedback.

BR,
Andre

image

Dear Andre,

i really want to test your current implementation. Would you be so kind to give me a short introduction of installing it? A really short overview should be enough. Thanks a lot and

best regards
Bernd

I would also be interested in testing this. Small installation guide would help be as well. Looking forward as this last major device missing from me from HA.

Hi Guys, I am also fairly new to home-assistant “development”. So there is probably a more elegant way. From the documentation I figured that a component can be copied either to the normal component directory or into a directory that is named like the component (here vallox) in the configuration directory. Since I am using the docker-version of HA I definitely prefer the latter one.

So if I go into the my HA config dir create a directory “custom_components”, change into that one and type (subversion must be installed):

svn checkout http://github.com/andre-richter/home-assistant/branches/vallox/homeassistant/components/vallox

I get the directory “vallox” where it should be. As Andre did also add the requirements (outside of the vallox-directory):

vallox-websocket-api==1.5.1
numpy==1.16.3
websocket-client==0.56.0

you might have to manually install these via pip depending on your installation (not sure, I only install the last one automatically via shell_command: install_vallox_req, see above - probably a dirty hack - should go away when the component is officially integrated into HA): commands should be:

pip install numpy
pip install websocket-client
pip install vallox-websocket-api

Now I still need to know what to add to my configuration.yaml, I suppose:

vallox:
  <something here to define the host/name, etc.>

should do but by reading the code so far I was not enlighted yet. Maybe Andre can give a hint/paste his config here


Thank you
Frufo

Hi, figured it out for the fan

vallox:
  host: <IP address of ventilation unit>

Switching on/off and switching the profile works like a charm. Not sure yet how to get the sensors.

Hi!

It works! Great to see
 Thanks a lot! :slight_smile:

Getting information about the temperatures and humidity would be great.

Dear Andre!

I had to think about your opinion and for me it sounds good. I use my Vallox MV240 as a always on device, so there is no need to shut it down by toggle. But for the overal usability in home-assistant it would be a little break to use the toggle for boost-mode, i think.

I am really interested in using the sensors. Could you give me a hint, how to use and show them in home-assistant or is it work in progress?

BR
Bernd

Hi guys,

I went for the toggle switch shutting down the whole device in the end for the reason you mentioned: To be consistent with the rest of HA.

In fact I opened the PRs for final review yesterday, you’ll find documentation there:

I hope we can get this upstream soon :slight_smile:

Cheers,
Andre

Hi guys, excellent news, thank you Andre. I also like the idea of having the switch for on/off as in summer depending on temp/humidity conditions I like to switch it off during the day. Found the docs, with

vallox:
    host: <ip>
  sensors:
    - fan_speed
    - temp_outdoor_air
    - temp_extract_air
    - temp_exhaust_air
    - temp_supply_air

I do get all sensors, However, when I do not specify any sensor also all should show up according to the dcoumentation, right? Does not work for me. HA version 0.94.

As Bernd I would be a big fan to get also (Extract Air) humidity for my dewpoint calculation.
A_CYC_RH_VALUE

:wink: