Use types.SimpleNamespace when parsing JSon reply.

This commit is contained in:
Andrius Štikonas 2020-11-23 23:09:37 +00:00
parent fc9141d168
commit 3718cb64d1
4 changed files with 23 additions and 90 deletions

View File

@ -20,3 +20,15 @@ class ScheduleFormat(str, enum.Enum):
ONE = "24HOURSFIXED" ONE = "24HOURSFIXED"
TWO = "5DAY/2DAY" TWO = "5DAY/2DAY"
SEVEN = "7DAY" SEVEN = "7DAY"
def schedule_format_int_to_enum(int_format):
if int_format == 0:
return ScheduleFormat.ZERO
elif int_format == 1:
return ScheduleFormat.ONE
elif int_format == 2:
return ScheduleFormat.TWO
elif int_format == 4:
return ScheduleFormat.SEVEN
else:
raise ValueError('Unrecognized ScheduleFormat')

View File

@ -1,46 +0,0 @@
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2020 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-License-Identifier: LGPL-3.0-or-later
import datetime
import enum
class Holiday:
"""
Class representing Holidays
start, end: holiday datetime objects or None
ids
"""
def __init__(self, reply: str):
start = reply["start"]
if start:
self._start = datetime.datetime.strptime(start.strip(), "%a %b %d %H:%M:%S %Y")
else:
self._start = None
end = reply["end"]
if end:
self.end = datetime.datetime.strptime(end.strip(), "%a %b %d %H:%M:%S %Y")
else:
self._end = None
self._ids = reply["ids"]
@property
def start(self):
""" Beginning of holiday. """
return self._start
@property
def end(self):
""" End of holiday. """
return self._end
@property
def ids(self):
""" Devices that have holiday set up. """
return self._ids

View File

@ -5,9 +5,10 @@ import asyncio
import datetime import datetime
import json import json
import logging import logging
from types import SimpleNamespace
from enums import ScheduleFormat from enums import ScheduleFormat
from system import System from enums import schedule_format_int_to_enum
from holiday import Holiday from holiday import Holiday
from neostat import NeoStat from neostat import NeoStat
@ -37,7 +38,7 @@ class NeoHub:
await writer.wait_closed() await writer.wait_closed()
try: try:
reply = json.loads(json_string) reply = json.loads(json_string, object_hook=lambda d: SimpleNamespace(**d))
except json.decoder.JSONDecodeError as e: except json.decoder.JSONDecodeError as e:
if expected_reply is None: if expected_reply is None:
raise(e) raise(e)
@ -67,14 +68,13 @@ class NeoHub:
async def get_system(self): async def get_system(self):
""" """
Get system wide variables Get system wide variables
Returns System object
""" """
message = {"GET_SYSTEM": 0} message = {"GET_SYSTEM": 0}
data = await self._send(message) data = await self._send(message)
system_data = System(data) data.FORMAT = schedule_format_int_to_enum(data.FORMAT)
return system_data data.ALT_TIMER_FORMAT = schedule_format_int_to_enum(data.ALT_TIMER_FORMAT)
return data
async def reset(self): async def reset(self):
""" """
@ -164,12 +164,14 @@ class NeoHub:
""" """
Get list of holidays Get list of holidays
Returns Holiday object start end end times are converted to datetimes
""" """
message = {"GET_HOLIDAY": 0} message = {"GET_HOLIDAY": 0}
result = await self._send(message) result = await self._send(message)
return Holiday(result) result.start = datetime.datetime.strptime(result.start.strip(), "%a %b %d %H:%M:%S %Y") if result.start else None
result.end = datetime.datetime.strptime(result.end.strip(), "%a %b %d %H:%M:%S %Y") if result.end else None
return result
async def cancel_holiday(self): async def cancel_holiday(self):
""" """
@ -193,7 +195,7 @@ class NeoHub:
zones = await self._send(message) zones = await self._send(message)
result = [] result = []
for name, zone_id in zones.items(): for name, zone_id in zones.__dict__.items():
result.append(NeoStat(self, name, zone_id)) result.append(NeoStat(self, name, zone_id))
return result return result

View File

@ -1,35 +0,0 @@
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2020 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-License-Identifier: LGPL-3.0-or-later
from enums import ScheduleFormat
def schedule_format(int_format):
if int_format == 0:
return ScheduleFormat.ZERO
elif int_format == 1:
return ScheduleFormat.ONE
elif int_format == 2:
return ScheduleFormat.TWO
elif int_format == 4:
return ScheduleFormat.SEVEN
else:
raise ValueError('Unrecognized ScheduleFormat')
class System:
def __init__(self, system_info):
self.dst_auto = system_info['DST_AUTO']
self.dst_on = system_info['DST_ON']
self.timer_format = schedule_format(system_info['FORMAT'])
# If system timer format is set to non programmable, then any time clock remain
# in the previous setting which is stored in ALT_TIMER_FORMAT.
self.alt_timer_format = schedule_format(system_info['ALT_TIMER_FORMAT'])
self.ntp = system_info['NTP_ON'] == "Running"
self.hub_type = system_info['HUB_TYPE']
self.hub_version = system_info['HUB_VERSION']
self.temperature_unit = system_info["CORF"]
self.timezone = system_info['TIME_ZONE']
self.time = system_info['UTC']