Add total energy, preheater and RMOT sensors to comfoconnect (#45373)

This commit is contained in:
Robert Chmielowiec 2021-01-27 14:10:58 +01:00 committed by GitHub
parent eea50c8ccc
commit 80c2efa9f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 137 additions and 10 deletions

View File

@ -144,7 +144,7 @@ omit =
homeassistant/components/co2signal/*
homeassistant/components/coinbase/*
homeassistant/components/comed_hourly_pricing/sensor.py
homeassistant/components/comfoconnect/*
homeassistant/components/comfoconnect/fan.py
homeassistant/components/concord232/alarm_control_panel.py
homeassistant/components/concord232/binary_sensor.py
homeassistant/components/control4/__init__.py

View File

@ -3,6 +3,7 @@ import logging
from pycomfoconnect import (
SENSOR_BYPASS_STATE,
SENSOR_CURRENT_RMOT,
SENSOR_DAYS_TO_REPLACE_FILTER,
SENSOR_FAN_EXHAUST_DUTY,
SENSOR_FAN_EXHAUST_FLOW,
@ -15,7 +16,9 @@ from pycomfoconnect import (
SENSOR_HUMIDITY_OUTDOOR,
SENSOR_HUMIDITY_SUPPLY,
SENSOR_POWER_CURRENT,
SENSOR_POWER_TOTAL,
SENSOR_PREHEATER_POWER_CURRENT,
SENSOR_PREHEATER_POWER_TOTAL,
SENSOR_TEMPERATURE_EXHAUST,
SENSOR_TEMPERATURE_EXTRACT,
SENSOR_TEMPERATURE_OUTDOOR,
@ -27,9 +30,11 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import (
ATTR_DEVICE_CLASS,
CONF_RESOURCES,
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_POWER,
DEVICE_CLASS_TEMPERATURE,
ENERGY_KILO_WATT_HOUR,
PERCENTAGE,
POWER_WATT,
TEMP_CELSIUS,
@ -46,6 +51,7 @@ ATTR_AIR_FLOW_EXHAUST = "air_flow_exhaust"
ATTR_AIR_FLOW_SUPPLY = "air_flow_supply"
ATTR_BYPASS_STATE = "bypass_state"
ATTR_CURRENT_HUMIDITY = "current_humidity"
ATTR_CURRENT_RMOT = "current_rmot"
ATTR_CURRENT_TEMPERATURE = "current_temperature"
ATTR_DAYS_TO_REPLACE_FILTER = "days_to_replace_filter"
ATTR_EXHAUST_FAN_DUTY = "exhaust_fan_duty"
@ -55,7 +61,9 @@ ATTR_EXHAUST_TEMPERATURE = "exhaust_temperature"
ATTR_OUTSIDE_HUMIDITY = "outside_humidity"
ATTR_OUTSIDE_TEMPERATURE = "outside_temperature"
ATTR_POWER_CURRENT = "power_usage"
ATTR_POWER_TOTAL = "power_total"
ATTR_PREHEATER_POWER_CURRENT = "preheater_power_usage"
ATTR_PREHEATER_POWER_TOTAL = "preheater_power_total"
ATTR_SUPPLY_FAN_DUTY = "supply_fan_duty"
ATTR_SUPPLY_FAN_SPEED = "supply_fan_speed"
ATTR_SUPPLY_HUMIDITY = "supply_humidity"
@ -74,7 +82,7 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_LABEL: "Inside Temperature",
ATTR_UNIT: TEMP_CELSIUS,
ATTR_ICON: "mdi:thermometer",
ATTR_ICON: None,
ATTR_ID: SENSOR_TEMPERATURE_EXTRACT,
ATTR_MULTIPLIER: 0.1,
},
@ -82,14 +90,22 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_LABEL: "Inside Humidity",
ATTR_UNIT: PERCENTAGE,
ATTR_ICON: "mdi:water-percent",
ATTR_ICON: None,
ATTR_ID: SENSOR_HUMIDITY_EXTRACT,
},
ATTR_CURRENT_RMOT: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_LABEL: "Current RMOT",
ATTR_UNIT: TEMP_CELSIUS,
ATTR_ICON: None,
ATTR_ID: SENSOR_CURRENT_RMOT,
ATTR_MULTIPLIER: 0.1,
},
ATTR_OUTSIDE_TEMPERATURE: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_LABEL: "Outside Temperature",
ATTR_UNIT: TEMP_CELSIUS,
ATTR_ICON: "mdi:thermometer",
ATTR_ICON: None,
ATTR_ID: SENSOR_TEMPERATURE_OUTDOOR,
ATTR_MULTIPLIER: 0.1,
},
@ -97,14 +113,14 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_LABEL: "Outside Humidity",
ATTR_UNIT: PERCENTAGE,
ATTR_ICON: "mdi:water-percent",
ATTR_ICON: None,
ATTR_ID: SENSOR_HUMIDITY_OUTDOOR,
},
ATTR_SUPPLY_TEMPERATURE: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_LABEL: "Supply Temperature",
ATTR_UNIT: TEMP_CELSIUS,
ATTR_ICON: "mdi:thermometer",
ATTR_ICON: None,
ATTR_ID: SENSOR_TEMPERATURE_SUPPLY,
ATTR_MULTIPLIER: 0.1,
},
@ -112,7 +128,7 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_LABEL: "Supply Humidity",
ATTR_UNIT: PERCENTAGE,
ATTR_ICON: "mdi:water-percent",
ATTR_ICON: None,
ATTR_ID: SENSOR_HUMIDITY_SUPPLY,
},
ATTR_SUPPLY_FAN_SPEED: {
@ -147,7 +163,7 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_LABEL: "Exhaust Temperature",
ATTR_UNIT: TEMP_CELSIUS,
ATTR_ICON: "mdi:thermometer",
ATTR_ICON: None,
ATTR_ID: SENSOR_TEMPERATURE_EXHAUST,
ATTR_MULTIPLIER: 0.1,
},
@ -155,7 +171,7 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_LABEL: "Exhaust Humidity",
ATTR_UNIT: PERCENTAGE,
ATTR_ICON: "mdi:water-percent",
ATTR_ICON: None,
ATTR_ID: SENSOR_HUMIDITY_EXHAUST,
},
ATTR_AIR_FLOW_SUPPLY: {
@ -190,9 +206,16 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: DEVICE_CLASS_POWER,
ATTR_LABEL: "Power usage",
ATTR_UNIT: POWER_WATT,
ATTR_ICON: "mdi:flash",
ATTR_ICON: None,
ATTR_ID: SENSOR_POWER_CURRENT,
},
ATTR_POWER_TOTAL: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_ENERGY,
ATTR_LABEL: "Power total",
ATTR_UNIT: ENERGY_KILO_WATT_HOUR,
ATTR_ICON: None,
ATTR_ID: SENSOR_POWER_TOTAL,
},
ATTR_PREHEATER_POWER_CURRENT: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_POWER,
ATTR_LABEL: "Preheater power usage",
@ -200,6 +223,13 @@ SENSOR_TYPES = {
ATTR_ICON: None,
ATTR_ID: SENSOR_PREHEATER_POWER_CURRENT,
},
ATTR_PREHEATER_POWER_TOTAL: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_ENERGY,
ATTR_LABEL: "Preheater power total",
ATTR_UNIT: ENERGY_KILO_WATT_HOUR,
ATTR_ICON: None,
ATTR_ID: SENSOR_PREHEATER_POWER_TOTAL,
},
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(

View File

@ -672,6 +672,9 @@ pycfdns==1.2.1
# homeassistant.components.cast
pychromecast==7.7.2
# homeassistant.components.comfoconnect
pycomfoconnect==0.4
# homeassistant.components.coolmaster
pycoolmasternet-async==0.1.2

View File

@ -0,0 +1 @@
"""Tests for the comfoconnect component."""

View File

@ -0,0 +1,93 @@
"""Tests for the comfoconnect sensor platform."""
# import json
from unittest.mock import patch
import pytest
from homeassistant.components.sensor import DOMAIN
from homeassistant.setup import async_setup_component
from tests.common import assert_setup_component
COMPONENT = "comfoconnect"
VALID_CONFIG = {
COMPONENT: {"host": "1.2.3.4"},
DOMAIN: {
"platform": COMPONENT,
"resources": [
"current_humidity",
"current_temperature",
"supply_fan_duty",
"power_usage",
"preheater_power_total",
],
},
}
@pytest.fixture
def mock_bridge_discover():
"""Mock the bridge discover method."""
with patch("pycomfoconnect.bridge.Bridge.discover") as mock_bridge_discover:
mock_bridge_discover.return_value[0].uuid.hex.return_value = "00"
yield mock_bridge_discover
@pytest.fixture
def mock_comfoconnect_command():
"""Mock the ComfoConnect connect method."""
with patch(
"pycomfoconnect.comfoconnect.ComfoConnect._command"
) as mock_comfoconnect_command:
yield mock_comfoconnect_command
@pytest.fixture
async def setup_sensor(hass, mock_bridge_discover, mock_comfoconnect_command):
"""Set up demo sensor component."""
with assert_setup_component(1, DOMAIN):
await async_setup_component(hass, DOMAIN, VALID_CONFIG)
await hass.async_block_till_done()
async def test_sensors(hass, setup_sensor):
"""Test the sensors."""
state = hass.states.get("sensor.comfoairq_inside_humidity")
assert state is not None
assert state.name == "ComfoAirQ Inside Humidity"
assert state.attributes.get("unit_of_measurement") == "%"
assert state.attributes.get("device_class") == "humidity"
assert state.attributes.get("icon") is None
state = hass.states.get("sensor.comfoairq_inside_temperature")
assert state is not None
assert state.name == "ComfoAirQ Inside Temperature"
assert state.attributes.get("unit_of_measurement") == "°C"
assert state.attributes.get("device_class") == "temperature"
assert state.attributes.get("icon") is None
state = hass.states.get("sensor.comfoairq_supply_fan_duty")
assert state is not None
assert state.name == "ComfoAirQ Supply Fan Duty"
assert state.attributes.get("unit_of_measurement") == "%"
assert state.attributes.get("device_class") is None
assert state.attributes.get("icon") == "mdi:fan"
state = hass.states.get("sensor.comfoairq_power_usage")
assert state is not None
assert state.name == "ComfoAirQ Power usage"
assert state.attributes.get("unit_of_measurement") == "W"
assert state.attributes.get("device_class") == "power"
assert state.attributes.get("icon") is None
state = hass.states.get("sensor.comfoairq_preheater_power_total")
assert state is not None
assert state.name == "ComfoAirQ Preheater power total"
assert state.attributes.get("unit_of_measurement") == "kWh"
assert state.attributes.get("device_class") == "energy"
assert state.attributes.get("icon") is None