Add last reset and state class to rainforest eagle (#52951)
This commit is contained in:
parent
1746103e0e
commit
1ed7b00b71
1 changed files with 54 additions and 50 deletions
|
@ -1,5 +1,8 @@
|
|||
"""Support for the Rainforest Eagle-200 energy monitor."""
|
||||
from datetime import timedelta
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
|
||||
from eagle200_reader import EagleReader
|
||||
|
@ -7,14 +10,19 @@ from requests.exceptions import ConnectionError as ConnectError, HTTPError, Time
|
|||
from uEagle import Eagle as LegacyReader
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
|
||||
from homeassistant.components.sensor import (
|
||||
DEVICE_CLASS_ENERGY,
|
||||
PLATFORM_SCHEMA,
|
||||
STATE_CLASS_MEASUREMENT,
|
||||
SensorEntity,
|
||||
)
|
||||
from homeassistant.const import (
|
||||
CONF_IP_ADDRESS,
|
||||
DEVICE_CLASS_POWER,
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
)
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.util import Throttle
|
||||
from homeassistant.util import Throttle, dt
|
||||
|
||||
CONF_CLOUD_ID = "cloud_id"
|
||||
CONF_INSTALL_CODE = "install_code"
|
||||
|
@ -24,19 +32,43 @@ _LOGGER = logging.getLogger(__name__)
|
|||
|
||||
MIN_SCAN_INTERVAL = timedelta(seconds=30)
|
||||
|
||||
|
||||
@dataclass
|
||||
class SensorType:
|
||||
"""Rainforest sensor type."""
|
||||
|
||||
name: str
|
||||
unit_of_measurement: str
|
||||
device_class: str | None = None
|
||||
state_class: str | None = None
|
||||
last_reset: datetime | None = None
|
||||
|
||||
|
||||
SENSORS = {
|
||||
"instantanous_demand": ("Eagle-200 Meter Power Demand", POWER_KILO_WATT),
|
||||
"summation_delivered": (
|
||||
"Eagle-200 Total Meter Energy Delivered",
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
"instantanous_demand": SensorType(
|
||||
name="Eagle-200 Meter Power Demand",
|
||||
unit_of_measurement=POWER_KILO_WATT,
|
||||
device_class=DEVICE_CLASS_POWER,
|
||||
),
|
||||
"summation_received": (
|
||||
"Eagle-200 Total Meter Energy Received",
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
"summation_delivered": SensorType(
|
||||
name="Eagle-200 Total Meter Energy Delivered",
|
||||
unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||
device_class=DEVICE_CLASS_ENERGY,
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
last_reset=dt.utc_from_timestamp(0),
|
||||
),
|
||||
"summation_total": (
|
||||
"Eagle-200 Net Meter Energy (Delivered minus Received)",
|
||||
ENERGY_KILO_WATT_HOUR,
|
||||
"summation_received": SensorType(
|
||||
name="Eagle-200 Total Meter Energy Received",
|
||||
unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||
device_class=DEVICE_CLASS_ENERGY,
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
last_reset=dt.utc_from_timestamp(0),
|
||||
),
|
||||
"summation_total": SensorType(
|
||||
name="Eagle-200 Net Meter Energy (Delivered minus Received)",
|
||||
unit_of_measurement=ENERGY_KILO_WATT_HOUR,
|
||||
device_class=DEVICE_CLASS_ENERGY,
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
),
|
||||
}
|
||||
|
||||
|
@ -86,56 +118,28 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||
|
||||
eagle_data = EagleData(eagle_reader)
|
||||
eagle_data.update()
|
||||
monitored_conditions = list(SENSORS)
|
||||
sensors = []
|
||||
for condition in monitored_conditions:
|
||||
sensors.append(
|
||||
EagleSensor(
|
||||
eagle_data, condition, SENSORS[condition][0], SENSORS[condition][1]
|
||||
)
|
||||
)
|
||||
|
||||
add_entities(sensors)
|
||||
add_entities(EagleSensor(eagle_data, condition) for condition in SENSORS)
|
||||
|
||||
|
||||
class EagleSensor(SensorEntity):
|
||||
"""Implementation of the Rainforest Eagle-200 sensor."""
|
||||
|
||||
def __init__(self, eagle_data, sensor_type, name, unit):
|
||||
def __init__(self, eagle_data, sensor_type):
|
||||
"""Initialize the sensor."""
|
||||
self.eagle_data = eagle_data
|
||||
self._type = sensor_type
|
||||
self._name = name
|
||||
self._unit_of_measurement = unit
|
||||
self._state = None
|
||||
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the power device class for the instantanous_demand sensor."""
|
||||
if self._type == "instantanous_demand":
|
||||
return DEVICE_CLASS_POWER
|
||||
|
||||
return None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the sensor."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
"""Return the state of the sensor."""
|
||||
return self._state
|
||||
|
||||
@property
|
||||
def unit_of_measurement(self):
|
||||
"""Return the unit of measurement."""
|
||||
return self._unit_of_measurement
|
||||
sensor_info = SENSORS[sensor_type]
|
||||
self._attr_name = sensor_info.name
|
||||
self._attr_unit_of_measurement = sensor_info.unit_of_measurement
|
||||
self._attr_device_class = sensor_info.device_class
|
||||
self._attr_state_class = sensor_info.state_class
|
||||
self._attr_last_reset = sensor_info.last_reset
|
||||
|
||||
def update(self):
|
||||
"""Get the energy information from the Rainforest Eagle."""
|
||||
self.eagle_data.update()
|
||||
self._state = self.eagle_data.get_state(self._type)
|
||||
self._attr_state = self.eagle_data.get_state(self._type)
|
||||
|
||||
|
||||
class EagleData:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue