ha integration
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import json
|
||||
|
||||
from requests import api
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass
|
||||
class EntityState:
|
||||
timestamp: str
|
||||
name:str
|
||||
room:str
|
||||
temperature:float
|
||||
humidity:int
|
||||
battery_percent:int
|
||||
battery_volt:float
|
||||
rssi:int
|
||||
|
||||
|
||||
def test_api(gateway):
|
||||
request = f'http://{gateway}:8000/api'
|
||||
response = api.get(request)
|
||||
if not response.ok: return False
|
||||
response_json = json.loads(response.text)
|
||||
version = response_json['version']['version']
|
||||
return True
|
||||
|
||||
|
||||
def get_state(gateway, device) -> EntityState | None:
|
||||
request = f'http://{gateway}:8000/api/state/{device}'
|
||||
response = api.get(request)
|
||||
if not response.ok: return None
|
||||
response_json = json.loads(response.text)
|
||||
return EntityState(response_json['timestamp'],
|
||||
response_json['name'],
|
||||
response_json['room'],
|
||||
response_json['temperature'],
|
||||
response_json['humidity'],
|
||||
response_json['battery_percent'],
|
||||
response_json['battery_volt'],
|
||||
response_json['rssi'])
|
||||
|
||||
|
||||
def get_deices(gateway) -> list | None:
|
||||
request = f'http://{gateway}:8000/api'
|
||||
response = api.get(request)
|
||||
if not response.ok: return None
|
||||
response_json = json.loads(response.text)
|
||||
return response_json['info']['devices']
|
||||
|
||||
|
||||
def get_device(gateway, device) -> str | None:
|
||||
devices = get_deices(gateway)
|
||||
if device in devices:
|
||||
index = devices.index(device)
|
||||
return devices[index]
|
||||
return None
|
||||
|
||||
|
||||
def get_entity_state(entity_mac, gateway):
|
||||
device = get_device(gateway, entity_mac)
|
||||
if device is None: return None
|
||||
entity_state = get_state(gateway, device)
|
||||
return entity_state
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,21 +3,23 @@ from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from .discover_gateways import start_discovery_client
|
||||
from api import *
|
||||
import voluptuous as vol
|
||||
|
||||
from pprint import pformat
|
||||
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
||||
from homeassistant.components.sensor import SensorEntity
|
||||
from homeassistant.const import CONF_NAME, CONF_MAC
|
||||
from homeassistant.const import CONF_NAME, CONF_HOST
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.helpers.typing import ConfigType
|
||||
from homeassistant.helpers.typing import DiscoveryInfoType
|
||||
|
||||
_LOGGER = logging.getLogger("atc_mi_thermometer_gateway")
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||
vol.Optional(CONF_NAME): cv.string,
|
||||
vol.Required(CONF_HOST): cv.string,
|
||||
})
|
||||
|
||||
|
||||
def setup_platform(
|
||||
@@ -26,26 +28,55 @@ def setup_platform(
|
||||
add_entities: AddEntitiesCallback,
|
||||
discovery_info: DiscoveryInfoType | None = None):
|
||||
|
||||
_LOGGER.info(pformat(config))
|
||||
gateway = start_discovery_client()
|
||||
|
||||
add_entities([Gateway(ip=gateway[0])])
|
||||
devices = get_deices(gateway=config[CONF_HOST])
|
||||
for device in devices:
|
||||
device_state = get_state(gateway=config[CONF_HOST], device=device)
|
||||
add_entities([MiThermometer(mac=device, state=device_state)])
|
||||
|
||||
|
||||
class Gateway(SensorEntity):
|
||||
def __init__(self, ip:str):
|
||||
self._ip = ip
|
||||
class MiThermometer(SensorEntity):
|
||||
def __init__(self, mac:str, state:EntityState):
|
||||
self._mac = mac
|
||||
self._online = False
|
||||
self._discovered_devices = []
|
||||
self._last_update = ""
|
||||
self._temperature = state.temperature
|
||||
self._humidity = state.temperature
|
||||
self._battery_percentage = state.battery_percent
|
||||
self._rssi = state.rssi
|
||||
self._name = state.name
|
||||
self._room = state.room
|
||||
|
||||
@property
|
||||
def ip(self):
|
||||
return self._ip
|
||||
def mac(self):
|
||||
return self._mac
|
||||
|
||||
@property
|
||||
def online(self):
|
||||
return self._online
|
||||
|
||||
@property
|
||||
def discovered_devices(self):
|
||||
return self._discovered_devices
|
||||
def get_name(self):
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def get_room(self):
|
||||
return self._room
|
||||
|
||||
@property
|
||||
def get_temperature(self):
|
||||
return self._temperature
|
||||
|
||||
@property
|
||||
def get_humidity(self):
|
||||
return self._humidity
|
||||
|
||||
@property
|
||||
def get_battery_percentage(self):
|
||||
return self._battery_percentage
|
||||
|
||||
@property
|
||||
def get_rssi(self):
|
||||
return self._rssi
|
||||
|
||||
def update(self) -> None:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user