Add IntelliFire sensors (#64600)

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
This commit is contained in:
Jeef 2022-01-26 08:16:25 -07:00 committed by GitHub
parent e203efa8b1
commit 2b101dd5c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 137 additions and 12 deletions

View File

@ -513,6 +513,7 @@ omit =
homeassistant/components/intellifire/__init__.py homeassistant/components/intellifire/__init__.py
homeassistant/components/intellifire/coordinator.py homeassistant/components/intellifire/coordinator.py
homeassistant/components/intellifire/binary_sensor.py homeassistant/components/intellifire/binary_sensor.py
homeassistant/components/intellifire/sensor.py
homeassistant/components/incomfort/* homeassistant/components/incomfort/*
homeassistant/components/intesishome/* homeassistant/components/intesishome/*
homeassistant/components/ios/* homeassistant/components/ios/*

View File

@ -10,7 +10,7 @@ from homeassistant.core import HomeAssistant
from .const import DOMAIN, LOGGER from .const import DOMAIN, LOGGER
from .coordinator import IntellifireDataUpdateCoordinator from .coordinator import IntellifireDataUpdateCoordinator
PLATFORMS = [Platform.BINARY_SENSOR] PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:

View File

@ -20,7 +20,7 @@ from .const import DOMAIN
@dataclass @dataclass
class IntellifireSensorEntityDescriptionMixin: class IntellifireBinarySensorRequiredKeysMixin:
"""Mixin for required keys.""" """Mixin for required keys."""
value_fn: Callable[[IntellifirePollData], bool] value_fn: Callable[[IntellifirePollData], bool]
@ -28,7 +28,7 @@ class IntellifireSensorEntityDescriptionMixin:
@dataclass @dataclass
class IntellifireBinarySensorEntityDescription( class IntellifireBinarySensorEntityDescription(
BinarySensorEntityDescription, IntellifireSensorEntityDescriptionMixin BinarySensorEntityDescription, IntellifireBinarySensorRequiredKeysMixin
): ):
"""Describes a binary sensor entity.""" """Describes a binary sensor entity."""

View File

@ -3,12 +3,8 @@
"name": "IntelliFire", "name": "IntelliFire",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/intellifire", "documentation": "https://www.home-assistant.io/integrations/intellifire",
"requirements": [ "requirements": ["intellifire4py==0.5"],
"intellifire4py==0.4.3"
],
"dependencies": [], "dependencies": [],
"codeowners": [ "codeowners": ["@jeeftor"],
"@jeeftor"
],
"iot_class": "local_polling" "iot_class": "local_polling"
} }

View File

@ -0,0 +1,128 @@
"""Platform for sensor integration."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime, timedelta
from intellifire4py import IntellifirePollData
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import TEMP_CELSIUS
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.dt import utcnow
from . import IntellifireDataUpdateCoordinator
from .const import DOMAIN
class IntellifireSensor(CoordinatorEntity, SensorEntity):
"""Define a generic class for Sensors."""
# Define types
coordinator: IntellifireDataUpdateCoordinator
entity_description: IntellifireSensorEntityDescription
_attr_attribution = "Data provided by unpublished Intellifire API"
def __init__(
self,
coordinator: IntellifireDataUpdateCoordinator,
description: IntellifireSensorEntityDescription,
) -> None:
"""Init the sensor."""
super().__init__(coordinator=coordinator)
self.entity_description = description
# Set the Display name the User will see
self._attr_name = f"Fireplace {description.name}"
self._attr_unique_id = f"{description.key}_{coordinator.api.data.serial}"
# Configure the Device Info
self._attr_device_info = self.coordinator.device_info
@property
def native_value(self) -> int | str | datetime | None:
"""Return the state."""
return self.entity_description.value_fn(self.coordinator.api.data)
def _time_remaining_to_timestamp(data: IntellifirePollData) -> datetime | None:
"""Define a sensor that takes into account timezone."""
if not (seconds_offset := data.timeremaining_s):
return None
return utcnow() + timedelta(seconds=seconds_offset)
@dataclass
class IntellifireSensorRequiredKeysMixin:
"""Mixin for required keys."""
value_fn: Callable[[IntellifirePollData], int | str | datetime | None]
@dataclass
class IntellifireSensorEntityDescription(
SensorEntityDescription, IntellifireSensorRequiredKeysMixin
):
"""Describes a sensor sensor entity."""
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Define setup entry call."""
coordinator: IntellifireDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
IntellifireSensor(coordinator=coordinator, description=description)
for description in INTELLIFIRE_SENSORS
)
INTELLIFIRE_SENSORS: tuple[IntellifireSensorEntityDescription, ...] = (
IntellifireSensorEntityDescription(
key="flame_height",
icon="mdi:fire-circle",
name="Flame Height",
state_class=SensorStateClass.MEASUREMENT,
value_fn=lambda data: data.flameheight,
),
IntellifireSensorEntityDescription(
key="temperature",
name="Temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=TEMP_CELSIUS,
value_fn=lambda data: data.temperature_c,
),
IntellifireSensorEntityDescription(
key="target_temp",
name="Target Temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=TEMP_CELSIUS,
value_fn=lambda data: data.thermostat_setpoint_c,
),
IntellifireSensorEntityDescription(
key="fan_speed",
icon="mdi:fan",
name="Fan Speed",
state_class=SensorStateClass.MEASUREMENT,
value_fn=lambda data: data.fanspeed,
),
IntellifireSensorEntityDescription(
key="timer_end_timestamp",
icon="mdi:timer-sand",
name="Timer End",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TIMESTAMP,
value_fn=_time_remaining_to_timestamp,
),
)

View File

@ -914,7 +914,7 @@ influxdb-client==1.24.0
influxdb==5.3.1 influxdb==5.3.1
# homeassistant.components.intellifire # homeassistant.components.intellifire
intellifire4py==0.4.3 intellifire4py==0.5
# homeassistant.components.iotawatt # homeassistant.components.iotawatt
iotawattpy==0.1.0 iotawattpy==0.1.0

View File

@ -586,7 +586,7 @@ influxdb-client==1.24.0
influxdb==5.3.1 influxdb==5.3.1
# homeassistant.components.intellifire # homeassistant.components.intellifire
intellifire4py==0.4.3 intellifire4py==0.5
# homeassistant.components.iotawatt # homeassistant.components.iotawatt
iotawattpy==0.1.0 iotawattpy==0.1.0