Skip to content

Commit 93b4a07

Browse files
committed
Add locked port
1 parent 18f191b commit 93b4a07

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

qtoggleserver/eq3bt/eq3btthermostat.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ class EQ3BTThermostat(ble.BLEPeripheral):
1818

1919
STATUS_MANUAL_MASK = 0x01
2020
STATUS_BOOST_MASK = 0x04
21+
STATUS_LOCKED_MASK = 0x20
2122

2223
STATUS_BITS_INDEX = 2
2324
STATUS_TEMP_INDEX = 5
2425

2526
WRITE_TEMP_HEADER = 0x41
2627
WRITE_MANUAL_HEADER = 0x40
2728
WRITE_BOOST_HEADER = 0x45
29+
WRITE_LOCKED_HEADER = 0x80
2830

2931
def __init__(self, **kwargs) -> None:
3032
super().__init__(**kwargs)
3133

3234
self._temp: Optional[float] = None
3335
self._manual: Optional[bool] = False
3436
self._boost: Optional[bool] = False
37+
self._locked: Optional[bool] = False
3538

3639
async def set_temp(self, temp: float) -> None:
3740
self.debug('setting temperature to %.1f degrees', temp)
@@ -63,13 +66,24 @@ async def set_boost(self, boost: bool) -> None:
6366
def get_boost(self) -> Optional[bool]:
6467
return self._boost
6568

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+
6679
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
6881

6982
return [
7083
Temperature,
7184
Manual,
72-
Boost
85+
Boost,
86+
Locked
7387
]
7488

7589
async def poll(self) -> None:
@@ -96,13 +110,15 @@ async def _read_config(self) -> None:
96110
if data[0] != self.STATUS_RECV_HEADER:
97111
raise EQ3Exception(f'Unexpected notification data header: {data[0]:02X}')
98112

113+
self._temp = data[self.STATUS_TEMP_INDEX] / 2.0
99114
self._manual = bool(data[self.STATUS_BITS_INDEX] & self.STATUS_MANUAL_MASK)
100115
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)
102117

103118
self.debug('temperature is %.1f degrees', self._temp)
104119
self.debug('manual mode is %s', ['disabled', 'enabled'][self._manual])
105120
self.debug('boost mode is %s', ['disabled', 'enabled'][self._boost])
121+
self.debug('thermostat is %s', ['unlocked', 'locked'][self._locked])
106122

107123
@staticmethod
108124
def _make_status_value() -> List[int]:

qtoggleserver/eq3bt/ports.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ async def write_value(self, value: bool) -> None:
4444
await self.get_peripheral().set_boost(value)
4545

4646

47+
class Locked(EQ3BTPort):
48+
TYPE = ports.TYPE_BOOLEAN
49+
WRITABLE = True
50+
51+
ID = 'locked'
52+
53+
async def read_value(self) -> Optional[bool]:
54+
return self.get_peripheral().get_locked()
55+
56+
@ble.port_exceptions
57+
async def write_value(self, value: bool) -> None:
58+
await self.get_peripheral().set_locked(value)
59+
60+
4761
class Temperature(EQ3BTPort):
4862
TYPE = 'number'
4963
WRITABLE = True

0 commit comments

Comments
 (0)