@@ -18,20 +18,23 @@ class EQ3BTThermostat(ble.BLEPeripheral):
18
18
19
19
STATUS_MANUAL_MASK = 0x01
20
20
STATUS_BOOST_MASK = 0x04
21
+ STATUS_LOCKED_MASK = 0x20
21
22
22
23
STATUS_BITS_INDEX = 2
23
24
STATUS_TEMP_INDEX = 5
24
25
25
26
WRITE_TEMP_HEADER = 0x41
26
27
WRITE_MANUAL_HEADER = 0x40
27
28
WRITE_BOOST_HEADER = 0x45
29
+ WRITE_LOCKED_HEADER = 0x80
28
30
29
31
def __init__ (self , ** kwargs ) -> None :
30
32
super ().__init__ (** kwargs )
31
33
32
34
self ._temp : Optional [float ] = None
33
35
self ._manual : Optional [bool ] = False
34
36
self ._boost : Optional [bool ] = False
37
+ self ._locked : Optional [bool ] = False
35
38
36
39
async def set_temp (self , temp : float ) -> None :
37
40
self .debug ('setting temperature to %.1f degrees' , temp )
@@ -63,13 +66,24 @@ async def set_boost(self, boost: bool) -> None:
63
66
def get_boost (self ) -> Optional [bool ]:
64
67
return self ._boost
65
68
69
+ async def set_locked (self , locked : bool ) -> None :
70
+ self .debug (['unlocked' , 'locked' ][locked ])
71
+
72
+ await self .write (self .WRITE_HANDLE , bytes ([self .WRITE_LOCKED_HEADER , int (locked )]))
73
+ self .debug ('successfully set locked' )
74
+ self ._locked = locked
75
+
76
+ def get_locked (self ) -> Optional [bool ]:
77
+ return self ._locked
78
+
66
79
async def make_port_args (self ) -> List [Type [core_ports .BasePort ]]:
67
- from .ports import Temperature , Manual , Boost
80
+ from .ports import Temperature , Manual , Boost , Locked
68
81
69
82
return [
70
83
Temperature ,
71
84
Manual ,
72
- Boost
85
+ Boost ,
86
+ Locked
73
87
]
74
88
75
89
async def poll (self ) -> None :
@@ -96,13 +110,15 @@ async def _read_config(self) -> None:
96
110
if data [0 ] != self .STATUS_RECV_HEADER :
97
111
raise EQ3Exception (f'Unexpected notification data header: { data [0 ]:02X} ' )
98
112
113
+ self ._temp = data [self .STATUS_TEMP_INDEX ] / 2.0
99
114
self ._manual = bool (data [self .STATUS_BITS_INDEX ] & self .STATUS_MANUAL_MASK )
100
115
self ._boost = bool (data [self .STATUS_BITS_INDEX ] & self .STATUS_BOOST_MASK )
101
- self ._temp = data [self .STATUS_TEMP_INDEX ] / 2.0
116
+ self ._locked = bool ( data [self .STATUS_BITS_INDEX ] & self . STATUS_LOCKED_MASK )
102
117
103
118
self .debug ('temperature is %.1f degrees' , self ._temp )
104
119
self .debug ('manual mode is %s' , ['disabled' , 'enabled' ][self ._manual ])
105
120
self .debug ('boost mode is %s' , ['disabled' , 'enabled' ][self ._boost ])
121
+ self .debug ('thermostat is %s' , ['unlocked' , 'locked' ][self ._locked ])
106
122
107
123
@staticmethod
108
124
def _make_status_value () -> List [int ]:
0 commit comments