96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
"""Base class for iRobot devices."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.const import ATTR_CONNECTIONS
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.device_registry import DeviceInfo
|
|
from homeassistant.helpers.entity import Entity
|
|
import homeassistant.util.dt as dt_util
|
|
|
|
from . import roomba_reported_state
|
|
from .const import DOMAIN
|
|
|
|
|
|
class IRobotEntity(Entity):
|
|
"""Base class for iRobot Entities."""
|
|
|
|
_attr_should_poll = False
|
|
_attr_has_entity_name = True
|
|
|
|
def __init__(self, roomba, blid) -> None:
|
|
"""Initialize the iRobot handler."""
|
|
self.vacuum = roomba
|
|
self._blid = blid
|
|
self.vacuum_state = roomba_reported_state(roomba)
|
|
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, self.robot_unique_id)},
|
|
serial_number=self.vacuum_state.get("hwPartsRev", {}).get("navSerialNo"),
|
|
manufacturer="iRobot",
|
|
model=self.vacuum_state.get("sku"),
|
|
name=str(self.vacuum_state.get("name")),
|
|
sw_version=self.vacuum_state.get("softwareVer"),
|
|
hw_version=self.vacuum_state.get("hardwareRev"),
|
|
)
|
|
|
|
if mac_address := self.vacuum_state.get("hwPartsRev", {}).get(
|
|
"wlan0HwAddr", self.vacuum_state.get("mac")
|
|
):
|
|
self._attr_device_info[ATTR_CONNECTIONS] = {
|
|
(dr.CONNECTION_NETWORK_MAC, mac_address)
|
|
}
|
|
|
|
@property
|
|
def robot_unique_id(self):
|
|
"""Return the uniqueid of the vacuum cleaner."""
|
|
return f"roomba_{self._blid}"
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return the uniqueid of the vacuum cleaner."""
|
|
return self.robot_unique_id
|
|
|
|
@property
|
|
def battery_level(self):
|
|
"""Return the battery level of the vacuum cleaner."""
|
|
return self.vacuum_state.get("batPct")
|
|
|
|
@property
|
|
def run_stats(self):
|
|
"""Return the run stats."""
|
|
return self.vacuum_state.get("bbrun", {})
|
|
|
|
@property
|
|
def mission_stats(self):
|
|
"""Return the mission stats."""
|
|
return self.vacuum_state.get("bbmssn", {})
|
|
|
|
@property
|
|
def battery_stats(self):
|
|
"""Return the battery stats."""
|
|
return self.vacuum_state.get("bbchg3", {})
|
|
|
|
@property
|
|
def last_mission(self):
|
|
"""Return last mission start time."""
|
|
if (
|
|
ts := self.vacuum_state.get("cleanMissionStatus", {}).get("mssnStrtTm")
|
|
) is None or ts == 0:
|
|
return None
|
|
return dt_util.utc_from_timestamp(ts)
|
|
|
|
async def async_added_to_hass(self):
|
|
"""Register callback function."""
|
|
self.vacuum.register_on_message_callback(self.on_message)
|
|
|
|
def new_state_filter(self, new_state):
|
|
"""Filter out wifi state messages."""
|
|
return len(new_state) > 1 or "signal" not in new_state
|
|
|
|
def on_message(self, json_data):
|
|
"""Update state on message change."""
|
|
state = json_data.get("state", {}).get("reported", {})
|
|
if self.new_state_filter(state):
|
|
self.schedule_update_ha_state()
|