1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
"""Models for Async IO Modern Forms."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Dict
from .const import (
INFO_CLIENT_ID,
INFO_DEVICE_NAME,
INFO_FAN_MOTOR_TYPE,
INFO_FAN_TYPE,
INFO_FEDERATED_IDENTITY,
INFO_FIRMWARE_URL,
INFO_FIRMWARE_VERSION,
INFO_LIGHT_TYPE,
INFO_MAC,
INFO_MAIN_MCU_FIRMWARE_VERSION,
INFO_OWNER,
INFO_PRODUCT_SKU,
INFO_PRODUCTION_LOT_NUMBER,
STATE_ADAPTIVE_LEARNING,
STATE_AWAY_MODE,
STATE_FAN_DIRECTION,
STATE_FAN_POWER,
STATE_FAN_SLEEP_TIMER,
STATE_FAN_SPEED,
STATE_LIGHT_BRIGHTNESS,
STATE_LIGHT_POWER,
STATE_LIGHT_SLEEP_TIMER,
)
@dataclass
class Info:
"""Info about the Modern Forms device."""
client_id: str
mac_address: str
light_type: str
fan_type: str
fan_motor_type: str
production_lot_number: str
product_sku: str
owner: str
federated_identity: str
device_name: str
firmware_version: str
main_mcu_firmware_version: str
firmware_url: str
@staticmethod
def from_dict(data: Dict[str, Any]) -> Info:
"""Return Info object from Modern Forms API response."""
return Info(
client_id=data.get(INFO_CLIENT_ID, ""),
mac_address=data.get(INFO_MAC, ""),
light_type=data.get(INFO_LIGHT_TYPE, ""),
fan_type=data.get(INFO_FAN_TYPE, ""),
fan_motor_type=data.get(INFO_FAN_MOTOR_TYPE, ""),
production_lot_number=data.get(INFO_PRODUCTION_LOT_NUMBER, ""),
product_sku=data.get(INFO_PRODUCT_SKU, ""),
owner=data.get(INFO_OWNER, ""),
federated_identity=data.get(INFO_FEDERATED_IDENTITY, ""),
device_name=data.get(INFO_DEVICE_NAME, ""),
firmware_version=data.get(INFO_FIRMWARE_VERSION, ""),
main_mcu_firmware_version=data.get(INFO_MAIN_MCU_FIRMWARE_VERSION, ""),
firmware_url=data.get(INFO_FIRMWARE_URL, ""),
)
@dataclass
class State:
"""Object holding the state of Modern Forms Device."""
fan_on: bool
fan_speed: int
fan_direction: str
fan_sleep_timer: int
light_on: bool
light_brightness: int
light_sleep_timer: int
away_mode_enabled: bool
adaptive_learning_enabled: bool
@staticmethod
def from_dict(data: Dict[str, Any]) -> State:
"""Return State object from Modern Forms API response."""
return State(
fan_on=data.get(STATE_FAN_POWER, False),
fan_speed=data.get(STATE_FAN_SPEED, 6),
fan_direction=data.get(STATE_FAN_DIRECTION, "forward"),
fan_sleep_timer=data.get(STATE_FAN_SLEEP_TIMER, 0),
light_on=data.get(STATE_LIGHT_POWER, False),
light_brightness=data.get(STATE_LIGHT_BRIGHTNESS, 100),
light_sleep_timer=data.get(STATE_LIGHT_SLEEP_TIMER, 0),
away_mode_enabled=data.get(STATE_AWAY_MODE, False),
adaptive_learning_enabled=data.get(STATE_ADAPTIVE_LEARNING, False),
)
class Device:
"""Object holding all information of Modern Forms Device."""
info: Info
state: State
def __init__(self, state_data: dict, info_data: dict):
"""Initialize an empty Modern Forms device class."""
self.update_from_dict(state_data=state_data, info_data=info_data)
def update_from_dict(
self, state_data: dict = None, info_data: dict = None
) -> "Device":
"""Update the device status with the passed dict."""
if state_data is not None:
self.state = State.from_dict(state_data)
if info_data is not None:
self.info = Info.from_dict(info_data)
return self
|