Convert Mill consumption attributes to sensors (#52311)

This commit is contained in:
Daniel Hjelseth Høyer 2021-07-21 07:41:08 +02:00 committed by GitHub
parent 90765132cc
commit 8a72e8df79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 111 additions and 21 deletions

View file

@ -622,6 +622,7 @@ omit =
homeassistant/components/mill/__init__.py
homeassistant/components/mill/climate.py
homeassistant/components/mill/const.py
homeassistant/components/mill/sensor.py
homeassistant/components/minecraft_server/__init__.py
homeassistant/components/minecraft_server/binary_sensor.py
homeassistant/components/minecraft_server/const.py

View file

@ -1,10 +1,29 @@
"""The mill component."""
from mill import Mill
PLATFORMS = ["climate"]
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
PLATFORMS = ["climate", "sensor"]
async def async_setup_entry(hass, entry):
"""Set up the Mill heater."""
mill_data_connection = Mill(
entry.data[CONF_USERNAME],
entry.data[CONF_PASSWORD],
websession=async_get_clientsession(hass),
)
if not await mill_data_connection.connect():
raise ConfigEntryNotReady
await mill_data_connection.find_all_heaters()
hass.data[DOMAIN] = mill_data_connection
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True

View file

@ -1,5 +1,4 @@
"""Support for mill wifi-enabled home heaters."""
from mill import Mill
import voluptuous as vol
from homeassistant.components.climate import ClimateEntity
@ -12,15 +11,8 @@ from homeassistant.components.climate.const import (
SUPPORT_FAN_MODE,
SUPPORT_TARGET_TEMPERATURE,
)
from homeassistant.const import (
ATTR_TEMPERATURE,
CONF_PASSWORD,
CONF_USERNAME,
TEMP_CELSIUS,
)
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import (
ATTR_AWAY_TEMP,
@ -48,15 +40,8 @@ SET_ROOM_TEMP_SCHEMA = vol.Schema(
async def async_setup_entry(hass, entry, async_add_entities):
"""Set up the Mill climate."""
mill_data_connection = Mill(
entry.data[CONF_USERNAME],
entry.data[CONF_PASSWORD],
websession=async_get_clientsession(hass),
)
if not await mill_data_connection.connect():
raise ConfigEntryNotReady
await mill_data_connection.find_all_heaters()
mill_data_connection = hass.data[DOMAIN]
dev = []
for heater in mill_data_connection.heaters.values():
@ -109,8 +94,6 @@ class MillHeater(ClimateEntity):
"heating": self._heater.is_heating,
"controlled_by_tibber": self._heater.tibber_control,
"heater_generation": 1 if self._heater.is_gen1 else 2,
"consumption_today": self._heater.day_consumption,
"consumption_total": self._heater.year_consumption,
}
if self._heater.room:
res["room"] = self._heater.room.name

View file

@ -4,8 +4,10 @@ ATTR_AWAY_TEMP = "away_temp"
ATTR_COMFORT_TEMP = "comfort_temp"
ATTR_ROOM_NAME = "room_name"
ATTR_SLEEP_TEMP = "sleep_temp"
CONSUMPTION_TODAY = "consumption_today"
CONSUMPTION_YEAR = "consumption_year"
DOMAIN = "mill"
MANUFACTURER = "Mill"
MAX_TEMP = 35
MIN_TEMP = 5
DOMAIN = "mill"
SERVICE_SET_ROOM_TEMP = "set_room_temperature"

View file

@ -0,0 +1,85 @@
"""Support for mill wifi-enabled home heaters."""
from homeassistant.components.sensor import (
DEVICE_CLASS_ENERGY,
STATE_CLASS_MEASUREMENT,
SensorEntity,
)
from homeassistant.const import ENERGY_KILO_WATT_HOUR, STATE_UNKNOWN
from homeassistant.util import dt as dt_util
from .const import CONSUMPTION_TODAY, CONSUMPTION_YEAR, DOMAIN, MANUFACTURER
async def async_setup_entry(hass, entry, async_add_entities):
"""Set up the Mill sensor."""
mill_data_connection = hass.data[DOMAIN]
dev = []
for heater in mill_data_connection.heaters.values():
for sensor_type in [CONSUMPTION_TODAY, CONSUMPTION_YEAR]:
dev.append(
MillHeaterEnergySensor(heater, mill_data_connection, sensor_type)
)
async_add_entities(dev)
class MillHeaterEnergySensor(SensorEntity):
"""Representation of a Mill Sensor device."""
def __init__(self, heater, mill_data_connection, sensor_type):
"""Initialize the sensor."""
self._id = heater.device_id
self._conn = mill_data_connection
self._sensor_type = sensor_type
self._attr_device_class = DEVICE_CLASS_ENERGY
self._attr_name = f"{heater.name} {sensor_type.replace('_', ' ')}"
self._attr_unique_id = f"{heater.device_id}_{sensor_type}"
self._attr_unit_of_measurement = ENERGY_KILO_WATT_HOUR
self._attr_state_class = STATE_CLASS_MEASUREMENT
self._attr_device_info = {
"identifiers": {(DOMAIN, heater.device_id)},
"name": self.name,
"manufacturer": MANUFACTURER,
"model": f"generation {1 if heater.is_gen1 else 2}",
}
if self._sensor_type == CONSUMPTION_TODAY:
self._attr_last_reset = dt_util.as_utc(
dt_util.now().replace(hour=0, minute=0, second=0, microsecond=0)
)
elif self._sensor_type == CONSUMPTION_YEAR:
self._attr_last_reset = dt_util.as_utc(
dt_util.now().replace(
month=1, day=1, hour=0, minute=0, second=0, microsecond=0
)
)
async def async_update(self):
"""Retrieve latest state."""
heater = await self._conn.update_device(self._id)
self._attr_available = heater.available
if self._sensor_type == CONSUMPTION_TODAY:
_state = heater.day_consumption
elif self._sensor_type == CONSUMPTION_YEAR:
_state = heater.year_consumption
else:
_state = None
if _state is None:
self._attr_state = _state
return
if self.state not in [STATE_UNKNOWN, None] and _state < self.state:
if self._sensor_type == CONSUMPTION_TODAY:
self._attr_last_reset = dt_util.as_utc(
dt_util.now().replace(hour=0, minute=0, second=0, microsecond=0)
)
elif self._sensor_type == CONSUMPTION_YEAR:
self._attr_last_reset = dt_util.as_utc(
dt_util.now().replace(
month=1, day=1, hour=0, minute=0, second=0, microsecond=0
)
)
self._attr_state = _state