Skip to content

Commit abc3c67

Browse files
committed
refactor,create separate sensors,remove attributes
1 parent afcbf77 commit abc3c67

File tree

6 files changed

+717
-179
lines changed

6 files changed

+717
-179
lines changed
+12-6
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
"""Helios Easy Controls integration."""
22
import eazyctrl
33

4-
from homeassistant.const import CONF_HOST
5-
6-
from .const import CONTROLLER, DOMAIN
7-
4+
from homeassistant.const import (CONF_HOST)
5+
from .const import (CONTROLLER, DOMAIN)
6+
from .threadsafe_controller import (ThreadSafeController)
87

98
async def async_setup(hass, config):
109
hass.data[DOMAIN] = {CONTROLLER: {}}
1110
return True
1211

13-
1412
async def async_setup_entry(hass, config_entry):
1513
if not (config_entry.data[CONF_HOST] in hass.data[DOMAIN][CONTROLLER]):
1614
hass.data[DOMAIN][CONTROLLER][
1715
config_entry.data[CONF_HOST]
18-
] = eazyctrl.EazyController(config_entry.data[CONF_HOST])
16+
] = ThreadSafeController(config_entry.data[CONF_HOST])
1917

2018
hass.async_create_task(
2119
hass.config_entries.async_forward_entry_setup(config_entry, "fan")
2220
)
21+
22+
hass.async_create_task(
23+
hass.config_entries.async_forward_entry_setup(config_entry, "sensor")
24+
)
25+
26+
hass.async_create_task(
27+
hass.config_entries.async_forward_entry_setup(config_entry, "binary_sensor")
28+
)
2329
return True
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from .const import (
2+
CONTROLLER,
3+
DOMAIN,
4+
VARIABLE_BYPASS,
5+
VARIABLE_INFOS,
6+
INFO_FILTER_CHANGE_FLAG
7+
)
8+
9+
from .threadsafe_controller import (ThreadSafeController)
10+
from homeassistant.const import (CONF_HOST, CONF_NAME)
11+
from homeassistant.helpers.entity import (Entity)
12+
from homeassistant.helpers import device_registry as dr
13+
14+
import logging
15+
16+
_LOGGER = logging.getLogger(__name__)
17+
18+
class EasyControlBinarySensor(Entity):
19+
def __init__(self, controller: ThreadSafeController, variable: str, size: int, converter, name: str, device_name: str, icon: str, device_class:str):
20+
self._controller = controller
21+
self._variable = variable
22+
self._converter = converter
23+
self._size = size
24+
self._name = name
25+
self._device_name = device_name
26+
self._icon = icon
27+
self._device_class = device_class
28+
self._state = "unavailable"
29+
30+
async def async_update(self):
31+
value = self._controller.get_variable(
32+
self._variable, self._size, self._converter)
33+
self._state = "unavailable" if value is None else value
34+
35+
@property
36+
def device_class(self):
37+
return self._device_class
38+
39+
@property
40+
def unique_id(self):
41+
return self._controller.mac + self._name
42+
43+
@property
44+
def device_info(self):
45+
return {
46+
"connections": {(dr.CONNECTION_NETWORK_MAC, self._controller.mac)},
47+
"identifiers": {(DOMAIN, self._controller.serial_number)},
48+
"name": self._device_name,
49+
"manufacturer": "Helios",
50+
"model": self._controller.model,
51+
"sw_version": self._controller.version
52+
}
53+
54+
@property
55+
def should_poll(self):
56+
return True
57+
58+
@property
59+
def name(self):
60+
"""Return the name of the sensor."""
61+
return self._name
62+
63+
@property
64+
def state(self):
65+
"""Return the state of the sensor."""
66+
return self._state
67+
68+
@property
69+
def icon(self):
70+
"""Return the icon of the sensor."""
71+
return self._icon
72+
73+
async def async_setup_entry(hass, entry, async_add_entities):
74+
_LOGGER.info("Setting up Helios EasyControls binary sensors.")
75+
76+
name = entry.data[CONF_NAME]
77+
controller = hass.data[DOMAIN][CONTROLLER][entry.data[CONF_HOST]]
78+
79+
async_add_entities([
80+
EasyControlBinarySensor(
81+
controller, VARIABLE_BYPASS, 8, lambda x : "on" if int(x) == 1 else "off", f"{name} bypass", name, "mdi:delta", "opening"
82+
),
83+
EasyControlBinarySensor(
84+
controller, VARIABLE_INFOS, 32, lambda x : "on" if (int(x) & INFO_FILTER_CHANGE_FLAG) == INFO_FILTER_CHANGE_FLAG else "off", f"{name} filter change", name, "mdi:air-filter", None
85+
)
86+
])
87+
88+
_LOGGER.info("Setting up Helios EasyControls binary sensors completed.")

custom_components/easycontrols/const.py

+63-1
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
MODE_AUTO = "auto"
88

99
VARIABLE_ARTICLE_DESCRIPTION = "v00000"
10+
VARIABLE_MAC_ADDRESS = "v00002"
1011
VARIABLE_PREHEATER_STATUS = "v00024"
12+
VARIABLE_AFTERHEATER_STATUS = "v00201"
1113
VARIABLE_PARTY_MODE = "v00094"
1214
VARIABLE_STANDBY_MODE = "v00099"
1315
VARIABLE_OPERATING_MODE = "v00101"
1416
VARIABLE_FAN_STAGE = "v00102"
15-
VARIABLE_PERCENTAGE_FAN_STAGE = "v00103"
17+
VARIABLE_PERCENTAGE_FAN_SPEED = "v00103"
1618
VARIABLE_TEMPERATURE_OUTSIDE_AIR = "v00104"
1719
VARIABLE_TEMPERATURE_SUPPLY_AIR = "v00105"
1820
VARIABLE_TEMPERATURE_OUTGOING_AIR = "v00106"
1921
VARIABLE_TEMPERATURE_EXTRACT_AIR = "v00107"
22+
VARIABLE_SERIAL_NUMBER = "v00303"
2023
VARIABLE_SUPPLY_AIR_RPM = "v00348"
2124
VARIABLE_EXTRACT_AIR_RPM = "v00349"
2225
VARIABLE_HOLIDAY_MODE = "v00601"
@@ -41,3 +44,62 @@
4144
PRESET_STANDBY = "standby"
4245
PRESET_HOLIDAY_INTERVAL = "holiday interval"
4346
PRESET_HOLIDAY_CONSTANT = "holiday constant"
47+
48+
ERRORS = {
49+
0x00000001: "Fan speed error «Supply air» (outside air)",
50+
0x00000002: "Fan speed error «Extract air» (outgoing air)",
51+
0x00000004: "?", # free
52+
0x00000008: "SD card error when writing E-Eprom data with «FLASH ring buffer FULL»",
53+
0x00000010: "Bus overcurrent",
54+
0x00000020: "?", # free
55+
0x00000040: "BASIS: 0-Xing error VHZ EH (0-Xing = Zero-Crossing, Zero-crossing detection)",
56+
0x00000080: "Ext. module (VHZ): 0-Xing error VHZ EH",
57+
0x00000100: "Ext. module (NHZ): 0-Xing error NHZ EH",
58+
0x00000200: "BASIS: Internal temp. sensor error - (T1) -Outside air (missing or cable break)",
59+
0x00000400: "BASIS: Internal temp. sensor error - (T2) -Supply air- (missing or cable break)",
60+
0x00000800: "BASIS: Internal temp. sensor error - (T3) -Extract air- (missing or cable break)",
61+
0x00001000: "BASIS: Internal temp. sensor error - (T4) -Outgoing air- (missing or cable break)",
62+
0x00002000: "BASIS: Internal temp. sensor error - (T1) -Outside air- (short circuit)",
63+
0x00004000: "BASIS: Internal temp. sensor error - (T2) -Supply air- (short circuit)",
64+
0x00008000: "BASIS: Internal temp. sensor error - (T3) -Extract air- (short circuit)",
65+
0x00010000: "BASIS: Internal temp. sensor error - (T4) -Outgoing air- (short circuit)",
66+
0x00020000: "Ext. module configured as VHZ, but missing or malfunctioned",
67+
0x00040000: "Ext. module configured as NHZ, but missing or malfunctioned",
68+
0x00080000: "Ext. module (VHZ): Duct sensor (T5) -Outside air- (missing or cable break)",
69+
0x00100000: "Ext. module (NHZ): Duct sensor (T6) -Supply air- (missing or cable break)",
70+
0x00200000: "Ext. module (NHZ): Duct sensor (T7) -Return WW-Register- (missing or cable break)",
71+
0x00400000: "Ext. module (VHZ): Duct sensor (T5) -Outside air- (short circuit)",
72+
0x00800000: "Ext. module (NHZ): Duct sensor (T6) -Supply air- (short circuit)",
73+
0x01000000: "Ext. module (NHZ): Duct sensor (T7) -Return WW-Register- (short circuit)",
74+
0x02000000: "Ext. module (VHZ): Safety limiter automatic",
75+
0x04000000: "Ext. module (VHZ): Safety limiter manual",
76+
0x08000000: "Ext. module (NHZ): Safety limiter automatic",
77+
0x10000000: "Ext. module (NHZ): Safety limiter manual",
78+
0x20000000: "Ext. module (NHZ): Frost protection WW-Reg. measured via WW-return (T7) (switching threshold adjustable per variable list e.g. < 7°C)",
79+
0x40000000: "Ext. module (NHZ): Frost protection WW-Reg. measured via supply air sensor (T6) (switching threshold adjustable per variable list e.g. < 7°C)",
80+
0x80000000: "Frost protection external WW Reg.: ( fixed < 5°C only PHI), measured either via (1.) Ext. module (NHZ): Supply air duct sensor (T6) or (2.) BASIS: Supply air duct sensor (T2)",
81+
}
82+
83+
WARNINGS = {
84+
0x01: "Internal humidity sensor provides no value",
85+
0x02: "?", # free
86+
0x04: "?", # free
87+
0x08: "?", # free
88+
0x10: "?", # free
89+
0x20: "?", # free
90+
0x40: "?", # free
91+
0x80: "?", # free
92+
}
93+
94+
INFO_FILTER_CHANGE_FLAG = 0x01
95+
96+
INFOS = {
97+
INFO_FILTER_CHANGE_FLAG: "Filter change",
98+
0x02: "Frost protection WT",
99+
0x04: "SD card error",
100+
0x08: "Failure of external module (more info in LOG-File)",
101+
0x10: "?", #free
102+
0x20: "?", # free
103+
0x40: "?", # free
104+
0x80: "?", # free
105+
}

0 commit comments

Comments
 (0)