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+
396463class 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
0 commit comments