Skip to content

Commit 269a1cf

Browse files
authored
Merge pull request #55 from kzosabe/add-lock-and-meters
Add new devices(Meter Plus, Lock)
2 parents 71a3a21 + b0e04a1 commit 269a1cf

3 files changed

Lines changed: 122 additions & 0 deletions

File tree

switchbot_client/devices/physical.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
CurtainDeviceStatus,
1010
DeviceStatus,
1111
HumidifierDeviceStatus,
12+
LockDeviceStatus,
1213
MeterDeviceStatus,
14+
MeterPlusJpDeviceStatus,
15+
MeterPlusUsDeviceStatus,
1316
MotionSensorDeviceStatus,
1417
PlugDeviceStatus,
1518
PlugMiniJpDeviceStatus,
@@ -59,6 +62,10 @@ def create_by_api_object( # noqa
5962
return Curtain(client, device)
6063
if device_type == DeviceType.METER:
6164
return Meter(client, device)
65+
if device_type == DeviceType.METER_PLUS_US:
66+
return MeterPlusUs(client, device)
67+
if device_type == DeviceType.METER_PLUS_JP:
68+
return MeterPlusJp(client, device)
6269
if device_type == DeviceType.MOTION_SENSOR:
6370
return MotionSensor(client, device)
6471
if device_type == DeviceType.CONTACT_SENSOR:
@@ -75,6 +82,8 @@ def create_by_api_object( # noqa
7582
return IndoorCam(client, device)
7683
if device_type == DeviceType.REMOTE:
7784
return Remote(client, device)
85+
if device_type == DeviceType.LOCK:
86+
return Lock(client, device)
7887

7988
raise TypeError(f"invalid physical device object: {device}")
8089

@@ -393,6 +402,64 @@ def humidity(self) -> int:
393402
return self.status().humidity
394403

395404

405+
class MeterPlusUs(SwitchBotPhysicalDevice):
406+
def __init__(self, client: SwitchBotClient, device: APIPhysicalDeviceObject):
407+
super().__init__(client, device)
408+
self._check_device_type(DeviceType.METER_PLUS_US)
409+
410+
@staticmethod
411+
def create_by_id(client: SwitchBotClient, device_id: str) -> MeterPlusUs:
412+
device = SwitchBotPhysicalDevice.get_device_by_id(client, device_id)
413+
return MeterPlusUs(client, device)
414+
415+
def status(self) -> MeterPlusUsDeviceStatus:
416+
status = super().status()
417+
return MeterPlusUsDeviceStatus(
418+
device_id=status.device_id,
419+
device_type=status.device_type,
420+
device_name=status.device_name,
421+
hub_device_id=status.hub_device_id,
422+
raw_data=status.raw_data,
423+
humidity=status.raw_data["humidity"],
424+
temperature=float(status.raw_data["temperature"]),
425+
)
426+
427+
def temperature(self) -> float:
428+
return self.status().temperature
429+
430+
def humidity(self) -> int:
431+
return self.status().humidity
432+
433+
434+
class MeterPlusJp(SwitchBotPhysicalDevice):
435+
def __init__(self, client: SwitchBotClient, device: APIPhysicalDeviceObject):
436+
super().__init__(client, device)
437+
self._check_device_type(DeviceType.METER_PLUS_JP)
438+
439+
@staticmethod
440+
def create_by_id(client: SwitchBotClient, device_id: str) -> MeterPlusJp:
441+
device = SwitchBotPhysicalDevice.get_device_by_id(client, device_id)
442+
return MeterPlusJp(client, device)
443+
444+
def status(self) -> MeterPlusJpDeviceStatus:
445+
status = super().status()
446+
return MeterPlusJpDeviceStatus(
447+
device_id=status.device_id,
448+
device_type=status.device_type,
449+
device_name=status.device_name,
450+
hub_device_id=status.hub_device_id,
451+
raw_data=status.raw_data,
452+
humidity=status.raw_data["humidity"],
453+
temperature=float(status.raw_data["temperature"]),
454+
)
455+
456+
def temperature(self) -> float:
457+
return self.status().temperature
458+
459+
def humidity(self) -> int:
460+
return self.status().humidity
461+
462+
396463
class MotionSensor(SwitchBotPhysicalDevice):
397464
def __init__(self, client: SwitchBotClient, device: APIPhysicalDeviceObject):
398465
super().__init__(client, device)
@@ -792,3 +859,36 @@ def __init__(self, client: SwitchBotClient, device: APIPhysicalDeviceObject):
792859
def create_by_id(client: SwitchBotClient, device_id: str) -> Remote:
793860
device = SwitchBotPhysicalDevice.get_device_by_id(client, device_id)
794861
return Remote(client, device)
862+
863+
864+
class Lock(SwitchBotPhysicalDevice):
865+
def __init__(self, client: SwitchBotClient, device: APIPhysicalDeviceObject):
866+
super().__init__(client, device)
867+
self._check_device_type(DeviceType.LOCK)
868+
869+
@staticmethod
870+
def create_by_id(client: SwitchBotClient, device_id: str) -> Lock:
871+
device = SwitchBotPhysicalDevice.get_device_by_id(client, device_id)
872+
return Lock(client, device)
873+
874+
def status(self) -> LockDeviceStatus:
875+
status = super().status()
876+
return LockDeviceStatus(
877+
device_id=status.device_id,
878+
device_type=status.device_type,
879+
device_name=status.device_name,
880+
hub_device_id=status.hub_device_id,
881+
raw_data=status.raw_data,
882+
is_calibrated=status.raw_data["calibrate"],
883+
lock_state=status.raw_data["lock_state"],
884+
door_state=status.raw_data["door_state"],
885+
)
886+
887+
def is_calibrated(self) -> bool:
888+
return self.status().is_calibrated
889+
890+
def lock_state(self) -> str:
891+
return self.status().lock_state
892+
893+
def door_state(self) -> str:
894+
return self.status().door_state

switchbot_client/devices/status.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,18 @@ class MeterDeviceStatus(DeviceStatus):
101101
temperature: float
102102

103103

104+
@dataclass()
105+
class MeterPlusUsDeviceStatus(DeviceStatus):
106+
humidity: int
107+
temperature: float
108+
109+
110+
@dataclass()
111+
class MeterPlusJpDeviceStatus(DeviceStatus):
112+
humidity: int
113+
temperature: float
114+
115+
104116
@dataclass()
105117
class MotionSensorDeviceStatus(DeviceStatus):
106118
is_move_detected: bool
@@ -114,6 +126,13 @@ class ContactSensorDeviceStatus(DeviceStatus):
114126
open_state: str
115127

116128

129+
@dataclass()
130+
class LockDeviceStatus(DeviceStatus):
131+
is_calibrated: bool
132+
lock_state: str
133+
door_state: str
134+
135+
117136
@dataclass
118137
class PseudoRemoteDeviceStatus(DeviceStatus):
119138
power: Optional[str]

switchbot_client/enums.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class DeviceType:
88
PLUG_MINI_US = "Plug Mini (US)"
99
PLUG_MINI_JP = "Plug Mini (JP)"
1010
METER = "Meter"
11+
METER_PLUS_US = "Meter Plus (US)"
12+
METER_PLUS_JP = "Meter Plus (JP)"
1113
MOTION_SENSOR = "Motion Sensor"
1214
CONTACT_SENSOR = "Contact Sensor"
1315
COLOR_BULB = "Color Bulb"
@@ -16,6 +18,7 @@ class DeviceType:
1618
STRIP_LIGHT = "Strip Light"
1719
INDOOR_CAM = "Indoor Cam"
1820
REMOTE = "Remote" # undocumented in official api reference?
21+
LOCK = "Lock"
1922

2023

2124
class RemoteType:

0 commit comments

Comments
 (0)