diff --git a/src/demetriek/device.py b/src/demetriek/device.py index 7b802b66..3abd9989 100644 --- a/src/demetriek/device.py +++ b/src/demetriek/device.py @@ -142,9 +142,9 @@ async def device(self) -> Device: response = await self._request("/api/v2/device") response["wifi"].update( - mac=response["wifi"].get("address"), - ssid=response["wifi"].get("essid"), - rssi=response["wifi"].get("strength"), + mac=response["wifi"].get("address", response["wifi"].get("mac")), + ssid=response["wifi"].get("essid", response["wifi"].get("ssid")), + rssi=response["wifi"].get("strength", response["wifi"].get("rssi")), ) return Device.from_dict(response) diff --git a/src/demetriek/models.py b/src/demetriek/models.py index 7a6f2b8e..fcdc0d03 100644 --- a/src/demetriek/models.py +++ b/src/demetriek/models.py @@ -41,21 +41,21 @@ class Audio(DataClassORJSONMixin): """Object holding the audio state of an LaMetric device.""" available: bool = True - volume: int | None - volume_limit: Range | None - volume_range: Range | None + volume: int | None = None + volume_limit: Range | None = None + volume_range: Range | None = None @dataclass(kw_only=True) class Bluetooth(DataClassORJSONMixin): """Object holding the Bluetooth state of an LaMetric device.""" - active: bool - address: str + active: bool | None = None + address: str | None = None available: bool - discoverable: bool - name: str - pairable: bool + discoverable: bool | None = None + name: str | None = None + pairable: bool | None = None @dataclass(kw_only=True) @@ -78,12 +78,20 @@ class DisplayScreensaverWhenDark(DataClassORJSONMixin): enabled: bool +@dataclass(kw_only=True) +class DisplayScreensaverScreenOff(DataClassORJSONMixin): + """Object holding the screen off screensaver mode of an LaMetric device.""" + + enabled: bool + + @dataclass(kw_only=True) class DisplayScreensaverModes(DataClassORJSONMixin): """Object holding the screensaver modes of an LaMetric device.""" time_based: DisplayScreensaverTimeBased - when_dark: DisplayScreensaverWhenDark + when_dark: DisplayScreensaverWhenDark | None = None + screen_off: DisplayScreensaverScreenOff | None = None @dataclass(kw_only=True) diff --git a/tests/__snapshots__/test_device.ambr b/tests/__snapshots__/test_device.ambr index 09c1d323..fd8597d2 100644 --- a/tests/__snapshots__/test_device.ambr +++ b/tests/__snapshots__/test_device.ambr @@ -39,6 +39,7 @@ 'screensaver': dict({ 'enabled': False, 'modes': dict({ + 'screen_off': None, 'time_based': dict({ 'enabled': True, 'end_time': None, @@ -113,6 +114,7 @@ 'screensaver': dict({ 'enabled': False, 'modes': dict({ + 'screen_off': None, 'time_based': dict({ 'enabled': True, 'end_time': None, @@ -187,6 +189,7 @@ 'screensaver': dict({ 'enabled': True, 'modes': dict({ + 'screen_off': None, 'time_based': dict({ 'enabled': False, 'end_time': None, @@ -223,3 +226,133 @@ }), }) # --- +# name: test_get_device[device_sa5.json] + dict({ + 'audio': dict({ + 'available': False, + 'volume': None, + 'volume_limit': None, + 'volume_range': None, + }), + 'bluetooth': dict({ + 'active': None, + 'address': None, + 'available': False, + 'discoverable': None, + 'name': None, + 'pairable': None, + }), + 'device_id': '123', + 'display': dict({ + 'brightness': 8, + 'brightness_limit': dict({ + 'range_max': 100, + 'range_min': 2, + }), + 'brightness_mode': , + 'brightness_range': dict({ + 'range_max': 100, + 'range_min': 0, + }), + 'display_type': , + 'height': 16, + 'on': True, + 'screensaver': None, + 'width': 16, + }), + 'mode': , + 'model': 'sa5', + 'name': 'SKY', + 'os_version': '3.2.7', + 'serial_number': 'SA52100000000TBNC', + 'update': None, + 'wifi': dict({ + 'active': True, + 'available': True, + 'encryption': 'WPA', + 'ip': IPv4Address('192.168.0.2'), + 'mac': '20:57:9E:00:00:00', + 'mode': , + 'netmask': '255.255.255.0', + 'rssi': 86, + 'ssid': '.', + }), + }) +# --- +# name: test_get_device[device_sa5_1.json] + dict({ + 'audio': dict({ + 'available': True, + 'volume': 100, + 'volume_limit': dict({ + 'range_max': 100, + 'range_min': 0, + }), + 'volume_range': dict({ + 'range_max': 100, + 'range_min': 0, + }), + }), + 'bluetooth': dict({ + 'active': True, + 'address': 'AA:BB:CC:DD:EE:FF', + 'available': True, + 'discoverable': True, + 'name': 'SKY0123', + 'pairable': False, + }), + 'device_id': '12345', + 'display': dict({ + 'brightness': 66, + 'brightness_limit': dict({ + 'range_max': 100, + 'range_min': 2, + }), + 'brightness_mode': , + 'brightness_range': dict({ + 'range_max': 100, + 'range_min': 0, + }), + 'display_type': , + 'height': 8, + 'on': True, + 'screensaver': dict({ + 'enabled': True, + 'modes': dict({ + 'screen_off': dict({ + 'enabled': False, + }), + 'time_based': dict({ + 'enabled': False, + 'end_time': None, + 'local_end_time': None, + 'local_start_time': None, + 'start_time': None, + }), + 'when_dark': None, + }), + 'widget': '', + }), + 'width': 64, + }), + 'mode': , + 'model': 'sa5', + 'name': "spyfly's LaMetric SKY", + 'os_version': '3.0.13', + 'serial_number': 'SA52100000123TBNC', + 'update': dict({ + 'version': '3.2.1', + }), + 'wifi': dict({ + 'active': True, + 'available': True, + 'encryption': 'WPA', + 'ip': IPv4Address('127.0.0.1'), + 'mac': 'AA:BB:CC:DD:EE:FF', + 'mode': , + 'netmask': '255.255.255.0', + 'rssi': 58, + 'ssid': 'IoT', + }), + }) +# --- diff --git a/tests/fixtures/device_sa5.json b/tests/fixtures/device_sa5.json new file mode 100644 index 00000000..17f24a71 --- /dev/null +++ b/tests/fixtures/device_sa5.json @@ -0,0 +1,41 @@ +{ + "audio": { + "available": false + }, + "bluetooth": { + "available": false + }, + "display": { + "brightness": 8, + "brightness_limit": { + "max": 100, + "min": 2 + }, + "brightness_mode": "manual", + "brightness_range": { + "max": 100, + "min": 0 + }, + "height": 16, + "on": true, + "type": "full_rgb", + "width": 16 + }, + "id": "123", + "mode": "manual", + "model": "sa5", + "name": "SKY", + "os_version": "3.2.7", + "serial_number": "SA52100000000TBNC", + "wifi": { + "active": true, + "address": "20:57:9E:00:00:00", + "available": true, + "encryption": "WPA", + "essid": ".", + "ip": "192.168.0.2", + "mode": "dhcp", + "netmask": "255.255.255.0", + "strength": 86 + } +} diff --git a/tests/fixtures/device_sa5_1.json b/tests/fixtures/device_sa5_1.json new file mode 100644 index 00000000..b82a4bda --- /dev/null +++ b/tests/fixtures/device_sa5_1.json @@ -0,0 +1,74 @@ +{ + "audio": { + "volume": 100, + "volume_limit": { + "max": 100, + "min": 0 + }, + "volume_range": { + "max": 100, + "min": 0 + } + }, + "bluetooth": { + "active": true, + "address": "AA:BB:CC:DD:EE:FF", + "available": true, + "discoverable": true, + "low_energy": { + "active": true, + "advertising": true, + "connectable": true + }, + "name": "SKY0123", + "pairable": false + }, + "display": { + "brightness": 66, + "brightness_limit": { + "max": 100, + "min": 2 + }, + "brightness_mode": "manual", + "brightness_range": { + "max": 100, + "min": 0 + }, + "height": 8, + "on": true, + "screensaver": { + "enabled": true, + "modes": { + "screen_off": { + "enabled": false + }, + "time_based": { + "enabled": false + } + }, + "widget": "" + }, + "type": "mixed", + "width": 64 + }, + "id": "12345", + "mode": "manual", + "model": "sa5", + "name": "spyfly's LaMetric SKY", + "os_version": "3.0.13", + "serial_number": "SA52100000123TBNC", + "update_available": { + "version": "3.2.1" + }, + "wifi": { + "active": true, + "mac": "AA:BB:CC:DD:EE:FF", + "available": true, + "encryption": "WPA", + "ssid": "IoT", + "ip": "127.0.0.1", + "mode": "dhcp", + "netmask": "255.255.255.0", + "strength": 58 + } +} diff --git a/tests/test_device.py b/tests/test_device.py index 159e9189..22c4955b 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -35,6 +35,8 @@ "device.json", "device2.json", "device3.json", + "device_sa5.json", + "device_sa5_1.json", ], ) async def test_get_device( diff --git a/tests/test_display.py b/tests/test_display.py index 8e233eea..195112be 100644 --- a/tests/test_display.py +++ b/tests/test_display.py @@ -45,6 +45,7 @@ async def test_get_display(aresponses: ResponsesMockServer) -> None: assert display.screensaver.enabled is False assert display.screensaver.widget == "08b8eac21074f8f7e5a29f2855ba8060" assert display.screensaver.modes + assert display.screensaver.modes.when_dark assert display.screensaver.modes.when_dark.enabled is False assert display.screensaver.modes.time_based.enabled is True assert display.screensaver.modes.time_based.start_time == time(0, 0, 39) @@ -138,6 +139,7 @@ async def response_handler(request: aiohttp.ClientResponse) -> Response: assert display.screensaver.modes.time_based.local_start_time == time(1, 0, 0) assert display.screensaver.modes.time_based.local_end_time == time(9, 0, 0) # Enabling one mode disables the other on the device. + assert display.screensaver.modes.when_dark assert display.screensaver.modes.when_dark.enabled is False