Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/demetriek/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
26 changes: 17 additions & 9 deletions src/demetriek/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down
133 changes: 133 additions & 0 deletions tests/__snapshots__/test_device.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
'screensaver': dict({
'enabled': False,
'modes': dict({
'screen_off': None,
'time_based': dict({
'enabled': True,
'end_time': None,
Expand Down Expand Up @@ -113,6 +114,7 @@
'screensaver': dict({
'enabled': False,
'modes': dict({
'screen_off': None,
'time_based': dict({
'enabled': True,
'end_time': None,
Expand Down Expand Up @@ -187,6 +189,7 @@
'screensaver': dict({
'enabled': True,
'modes': dict({
'screen_off': None,
'time_based': dict({
'enabled': False,
'end_time': None,
Expand Down Expand Up @@ -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': <BrightnessMode.MANUAL: 'manual'>,
'brightness_range': dict({
'range_max': 100,
'range_min': 0,
}),
'display_type': <DisplayType.FULL_RGB: 'full_rgb'>,
'height': 16,
'on': True,
'screensaver': None,
'width': 16,
}),
'mode': <DeviceMode.MANUAL: 'manual'>,
'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': <WifiMode.DHCP: 'dhcp'>,
'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': <BrightnessMode.MANUAL: 'manual'>,
'brightness_range': dict({
'range_max': 100,
'range_min': 0,
}),
'display_type': <DisplayType.MIXED: 'mixed'>,
'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': <DeviceMode.MANUAL: 'manual'>,
'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': <WifiMode.DHCP: 'dhcp'>,
'netmask': '255.255.255.0',
'rssi': 58,
'ssid': 'IoT',
}),
})
# ---
41 changes: 41 additions & 0 deletions tests/fixtures/device_sa5.json
Original file line number Diff line number Diff line change
@@ -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
}
}
74 changes: 74 additions & 0 deletions tests/fixtures/device_sa5_1.json
Original file line number Diff line number Diff line change
@@ -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
}
}
2 changes: 2 additions & 0 deletions tests/test_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
"device.json",
"device2.json",
"device3.json",
"device_sa5.json",
"device_sa5_1.json",
],
)
async def test_get_device(
Expand Down
2 changes: 2 additions & 0 deletions tests/test_display.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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


Expand Down