core/homeassistant/components/toon/sensor.py

190 lines
7.7 KiB
Python

"""Support for Toon sensors."""
from datetime import timedelta
import logging
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.typing import HomeAssistantType
from . import (ToonEntity, ToonElectricityMeterDeviceEntity,
ToonGasMeterDeviceEntity, ToonSolarDeviceEntity,
ToonBoilerDeviceEntity)
from .const import (CURRENCY_EUR, DATA_TOON_CLIENT, DOMAIN, POWER_KWH,
POWER_WATT, VOLUME_CM3, VOLUME_M3, RATIO_PERCENT)
DEPENDENCIES = ['toon']
_LOGGER = logging.getLogger(__name__)
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=5)
SCAN_INTERVAL = timedelta(seconds=300)
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry,
async_add_entities) -> None:
"""Set up Toon sensors based on a config entry."""
toon = hass.data[DATA_TOON_CLIENT][entry.entry_id]
sensors = [
ToonElectricityMeterDeviceSensor(toon, 'power', 'value',
"Current Power Usage",
'mdi:power-plug', POWER_WATT),
ToonElectricityMeterDeviceSensor(toon, 'power', 'average',
"Average Power Usage",
'mdi:power-plug', POWER_WATT),
ToonElectricityMeterDeviceSensor(toon, 'power', 'daily_value',
"Power Usage Today",
'mdi:power-plug', POWER_KWH),
ToonElectricityMeterDeviceSensor(toon, 'power', 'daily_cost',
"Power Cost Today",
'mdi:power-plug', CURRENCY_EUR),
ToonElectricityMeterDeviceSensor(toon, 'power', 'average_daily',
"Average Daily Power Usage",
'mdi:power-plug', POWER_KWH),
ToonElectricityMeterDeviceSensor(toon, 'power', 'meter_reading',
"Power Meter Feed IN Tariff 1",
'mdi:power-plug', POWER_KWH),
ToonElectricityMeterDeviceSensor(toon, 'power', 'meter_reading_low',
"Power Meter Feed IN Tariff 2",
'mdi:power-plug', POWER_KWH),
]
if toon.gas:
sensors.extend([
ToonGasMeterDeviceSensor(toon, 'gas', 'value', "Current Gas Usage",
'mdi:gas-cylinder', VOLUME_CM3),
ToonGasMeterDeviceSensor(toon, 'gas', 'average',
"Average Gas Usage", 'mdi:gas-cylinder',
VOLUME_CM3),
ToonGasMeterDeviceSensor(toon, 'gas', 'daily_usage',
"Gas Usage Today", 'mdi:gas-cylinder',
VOLUME_M3),
ToonGasMeterDeviceSensor(toon, 'gas', 'average_daily',
"Average Daily Gas Usage",
'mdi:gas-cylinder', VOLUME_M3),
ToonGasMeterDeviceSensor(toon, 'gas', 'meter_reading', "Gas Meter",
'mdi:gas-cylinder', VOLUME_M3),
ToonGasMeterDeviceSensor(toon, 'gas', 'daily_cost',
"Gas Cost Today", 'mdi:gas-cylinder',
CURRENCY_EUR),
])
if toon.solar:
sensors.extend([
ToonSolarDeviceSensor(toon, 'solar', 'value',
"Current Solar Production",
'mdi:solar-power', POWER_WATT),
ToonSolarDeviceSensor(toon, 'solar', 'maximum',
"Max Solar Production", 'mdi:solar-power',
POWER_WATT),
ToonSolarDeviceSensor(toon, 'solar', 'produced',
"Solar Production to Grid",
'mdi:solar-power', POWER_WATT),
ToonSolarDeviceSensor(toon, 'solar', 'average_produced',
"Average Solar Production to Grid",
'mdi:solar-power', POWER_WATT),
ToonElectricityMeterDeviceSensor(toon, 'solar',
'meter_reading_produced',
"Power Meter Feed OUT Tariff 1",
'mdi:solar-power',
POWER_KWH),
ToonElectricityMeterDeviceSensor(toon, 'solar',
'meter_reading_low_produced',
"Power Meter Feed OUT Tariff 2",
'mdi:solar-power', POWER_KWH),
])
if toon.thermostat_info.have_ot_boiler:
sensors.extend([
ToonBoilerDeviceSensor(toon, 'thermostat_info',
'current_modulation_level',
"Boiler Modulation Level",
'mdi:percent',
RATIO_PERCENT),
])
async_add_entities(sensors)
class ToonSensor(ToonEntity):
"""Defines a Toon sensor."""
def __init__(self, toon, section: str, measurement: str,
name: str, icon: str, unit_of_measurement: str) -> None:
"""Initialize the Toon sensor."""
self._state = None
self._unit_of_measurement = unit_of_measurement
self.section = section
self.measurement = measurement
super().__init__(toon, name, icon)
@property
def unique_id(self) -> str:
"""Return the unique ID for this sensor."""
return '_'.join([DOMAIN, self.toon.agreement.id, 'sensor',
self.section, self.measurement])
@property
def state(self):
"""Return the state of the sensor."""
return self._state
@property
def unit_of_measurement(self) -> str:
"""Return the unit this state is expressed in."""
return self._unit_of_measurement
def update(self) -> None:
"""Get the latest data from the sensor."""
section = getattr(self.toon, self.section)
value = None
if self.section == 'power' and self.measurement == 'daily_value':
value = round((float(section.daily_usage)
+ float(section.daily_usage_low)) / 1000.0, 2)
if value is None:
value = getattr(section, self.measurement)
if self.section == 'power' and \
self.measurement in ['meter_reading', 'meter_reading_low',
'average_daily']:
value = round(float(value)/1000.0, 2)
if self.section == 'solar' and \
self.measurement in ['meter_reading_produced',
'meter_reading_low_produced']:
value = float(value)/1000.0
if self.section == 'gas' and \
self.measurement in ['average_daily', 'daily_usage',
'meter_reading']:
value = round(float(value)/1000.0, 2)
self._state = max(0, value)
class ToonElectricityMeterDeviceSensor(ToonSensor,
ToonElectricityMeterDeviceEntity):
"""Defines a Eletricity Meter sensor."""
pass
class ToonGasMeterDeviceSensor(ToonSensor, ToonGasMeterDeviceEntity):
"""Defines a Gas Meter sensor."""
pass
class ToonSolarDeviceSensor(ToonSensor, ToonSolarDeviceEntity):
"""Defines a Solar sensor."""
pass
class ToonBoilerDeviceSensor(ToonSensor, ToonBoilerDeviceEntity):
"""Defines a Boiler sensor."""
pass