1
- # pylint: disable=bad-continuation
2
1
'''
3
2
The module of Helios Easy Controls thread safe controller.
4
3
'''
5
4
import logging
6
5
import re
7
- import threading
6
+ from asyncio import Lock
8
7
from typing import Any
9
8
10
- import eazyctrl
11
- from custom_components .easycontrols .modbus_variable import ModbusVariable
9
+ from eazyctrl import AsyncEazyController
12
10
13
11
from .const import (VARIABLE_ARTICLE_DESCRIPTION , VARIABLE_SERIAL_NUMBER ,
14
12
VARIABLE_SOFTWARE_VERSION )
13
+ from .modbus_variable import ModbusVariable
15
14
16
15
_LOGGER = logging .getLogger (__name__ )
17
16
18
17
19
- class ThreadSafeController :
18
+ class Controller :
20
19
'''
21
20
Represents a Helios Easy Controls controller.
22
- The get_variable and set_variables methods are thread safe.
23
- For more information please visit:
24
- https://github.com/baradi09/eazyctrl#notes-on-concurrent-access-conflicts
25
21
'''
26
22
27
23
def __init__ (self , device_name : str , host : str , mac : str ):
28
24
'''
29
- Initialize a new instance of ThreadSafeController class.
25
+ Initialize a new instance of Controller class.
30
26
31
27
Parameters
32
28
----------
@@ -39,14 +35,27 @@ def __init__(self, device_name: str, host: str, mac: str):
39
35
'''
40
36
self ._host = host
41
37
self ._device_name = device_name
42
- self ._eazyctrl = eazyctrl . EazyController (host )
43
- self ._lock = threading . Lock ()
38
+ self ._eazyctrl = AsyncEazyController (host )
39
+ self ._lock = Lock ()
44
40
self ._mac = mac
45
41
self ._model = None
46
42
self ._version = None
47
43
self ._serial_number = None
48
44
self ._maximum_air_flow = None
49
45
46
+ async def init (self ):
47
+ '''
48
+ Initialize device specific properties:
49
+ - model
50
+ - version
51
+ - serial_number
52
+ - maximum_air_flow
53
+ '''
54
+ self ._model = await self .get_variable (VARIABLE_ARTICLE_DESCRIPTION )
55
+ self ._version = await self .get_variable (VARIABLE_SOFTWARE_VERSION )
56
+ self ._serial_number = await self .get_variable (VARIABLE_SERIAL_NUMBER )
57
+ self ._maximum_air_flow = float (re .findall (r'\d+' , self ._model )[0 ])
58
+
50
59
@property
51
60
def device_name (self ) -> str :
52
61
'''
@@ -60,11 +69,6 @@ def maximum_air_flow(self) -> float:
60
69
Gets the maximum airflow rate of the Helios device.
61
70
The value is extracted from the model name.
62
71
'''
63
- if self ._maximum_air_flow is None :
64
- if self .model is None :
65
- return None
66
-
67
- self ._maximum_air_flow = float (re .findall (r'\d+' , self .model )[0 ])
68
72
return self ._maximum_air_flow
69
73
70
74
@property
@@ -86,43 +90,23 @@ def model(self) -> str:
86
90
'''
87
91
Gets the model of Helios device.
88
92
'''
89
- if self ._model is None :
90
- try :
91
- self ._model = self .get_variable (VARIABLE_ARTICLE_DESCRIPTION )
92
- # pylint: disable=broad-except
93
- except Exception as error :
94
- _LOGGER .error ('Failed to get the model of Helios device: %s' , error )
95
93
return self ._model
96
94
97
95
@property
98
96
def version (self ) -> str :
99
97
'''
100
98
Gets the software version of Helios device.
101
99
'''
102
- if self ._version is None :
103
- try :
104
- self ._version = self .get_variable (VARIABLE_SOFTWARE_VERSION )
105
- # pylint: disable=broad-except
106
- except Exception as error :
107
- _LOGGER .error ('Failed to get the software version of Helios device: %s' , error )
108
-
109
100
return self ._version
110
101
111
102
@property
112
103
def serial_number (self ) -> str :
113
104
'''
114
105
Gets the serial number of Helios device.
115
106
'''
116
- if self ._serial_number is None :
117
- try :
118
- self ._serial_number = self .get_variable (VARIABLE_SERIAL_NUMBER )
119
- # pylint: disable=broad-except
120
- except Exception as error :
121
- _LOGGER .error ('Failed to get the serial number of Helios device: %s' , error )
122
-
123
107
return self ._serial_number
124
108
125
- def get_variable (
109
+ async def get_variable (
126
110
self ,
127
111
variable : ModbusVariable ,
128
112
) -> Any :
@@ -134,17 +118,17 @@ def get_variable(
134
118
variable: ModbusVariable
135
119
The variable to get.
136
120
'''
137
- with self ._lock :
121
+ async with self ._lock :
138
122
_LOGGER .debug ('Getting %s.' , variable .name )
139
- value = self ._eazyctrl .get_variable (
123
+ value = await self ._eazyctrl .get_variable (
140
124
variable .name ,
141
125
variable .size ,
142
126
variable .get_converter
143
127
)
144
128
_LOGGER .debug ('%s value: %s' , variable .name , value )
145
129
return value
146
130
147
- def set_variable (
131
+ async def set_variable (
148
132
self ,
149
133
variable : ModbusVariable ,
150
134
value : Any
@@ -160,9 +144,10 @@ def set_variable(
160
144
The value to set on Helios device.
161
145
162
146
Returns
147
+ -------
163
148
bool
164
149
True if setting of variable succeeded otherwise False.
165
150
'''
166
- with self ._lock :
151
+ async with self ._lock :
167
152
_LOGGER .debug ('Setting %s to %s.' , variable .name , value )
168
- return self ._eazyctrl .set_variable (variable .name , value , variable .set_converter )
153
+ return await self ._eazyctrl .set_variable (variable .name , value , variable .set_converter )
0 commit comments