Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions homeassistant/components/fumis/icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,55 @@
}
},
"sensor": {
"alert": {
"default": "mdi:alert",
"state": {
"airflow_malfunction": "mdi:fan-off",
"door_open": "mdi:door-open",
"flue_gas_warning": "mdi:thermometer-alert",
"low_battery": "mdi:battery-alert",
"low_fuel": "mdi:gauge-empty",
"none": "mdi:check-circle",
"service_due": "mdi:wrench-clock",
"speed_sensor_failure": "mdi:fan-alert"
}
},
"combustion_chamber_temperature": {
"default": "mdi:thermometer-high"
},
"detailed_stove_status": {
"default": "mdi:fireplace"
},
"error": {
"default": "mdi:alert-circle",
"state": {
"chimney_alarm": "mdi:broom",
"chimney_dirty": "mdi:broom",
"door_alarm": "mdi:door-open",
"fire_error": "mdi:fire-alert",
"flue_gas_overtemp": "mdi:thermometer-high",
"fuel_ignition_timeout": "mdi:fire-off",
"gas_alarm": "mdi:alert-circle",
"general_error": "mdi:alert-circle",
"grate_error": "mdi:alert-circle",
"ignition_failed": "mdi:fire-alert",
"mfdoor_alarm": "mdi:door-open",
"no_pellet_alarm": "mdi:gauge-empty",
"none": "mdi:check-circle",
"ntc1_alarm": "mdi:thermometer-alert",
"ntc2_alarm": "mdi:thermometer-alert",
"ntc3_alarm": "mdi:thermometer-alert",
"pressure_alarm": "mdi:gauge-empty",
"pressure_sensor_off": "mdi:gauge-empty",
"safety_switch": "mdi:shield-alert",
"sensor_t01_t02": "mdi:thermometer-alert",
"sensor_t01_t03": "mdi:thermometer-alert",
"sensor_t02": "mdi:thermometer-alert",
"sensor_t03_t05": "mdi:thermometer-alert",
"sensor_t04": "mdi:thermometer-alert",
"tc1_alarm": "mdi:thermometer-alert"
}
},
"fan_1_speed": {
"default": "mdi:fan"
},
Expand Down
63 changes: 62 additions & 1 deletion homeassistant/components/fumis/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import Any

from fumis import FumisInfo, StoveState, StoveStatus
from fumis import FumisInfo, StoveAlert, StoveError, StoveState, StoveStatus

from homeassistant.components.sensor import (
SensorDeviceClass,
Expand Down Expand Up @@ -34,15 +35,52 @@
PARALLEL_UPDATES = 0


def _code_to_state(code: StoveAlert | StoveError | None) -> str | None:
"""Convert a stove alert or error code to a sensor state value.

Returns "none" when there is no active alert/error, None when the code
is unknown, or the enum member name in lowercase for known codes.
"""
if code is None:
return "none"
if code.name == "UNKNOWN":
return None
return code.name.lower()


def _code_to_attr(code: StoveAlert | StoveError | None) -> dict[str, str | None]:
"""Convert a stove alert or error code to extra state attributes."""
if code is None or code.name == "UNKNOWN":
return {"code": None}
return {"code": code.value}


@dataclass(frozen=True, kw_only=True)
class FumisSensorEntityDescription(SensorEntityDescription):
"""Describes a Fumis sensor entity."""

attr_fn: Callable[[FumisInfo], dict[str, Any]] | None = None
has_fn: Callable[[FumisInfo], bool] = lambda _: True
value_fn: Callable[[FumisInfo], datetime | float | int | str | None]


SENSORS: tuple[FumisSensorEntityDescription, ...] = (
FumisSensorEntityDescription(
key="alert",
translation_key="alert",
device_class=SensorDeviceClass.ENUM,
entity_category=EntityCategory.DIAGNOSTIC,
options=[
"none",
*(
alert.name.lower()
for alert in StoveAlert
if alert != StoveAlert.UNKNOWN
),
],
value_fn=lambda data: _code_to_state(data.controller.stove_alert),
attr_fn=lambda data: _code_to_attr(data.controller.stove_alert),
),
FumisSensorEntityDescription(
key="combustion_chamber_temperature",
translation_key="combustion_chamber_temperature",
Expand All @@ -69,6 +107,22 @@ class FumisSensorEntityDescription(SensorEntityDescription):
else data.controller.stove_status.name.lower()
),
),
FumisSensorEntityDescription(
key="error",
translation_key="error",
device_class=SensorDeviceClass.ENUM,
entity_category=EntityCategory.DIAGNOSTIC,
options=[
"none",
*(
error.name.lower()
for error in StoveError
if error != StoveError.UNKNOWN
),
],
value_fn=lambda data: _code_to_state(data.controller.stove_error),
attr_fn=lambda data: _code_to_attr(data.controller.stove_error),
),
FumisSensorEntityDescription(
key="fan_1_speed",
translation_key="fan_1_speed",
Expand Down Expand Up @@ -267,6 +321,13 @@ def __init__(
self.entity_description = description
self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{description.key}"

@property
def extra_state_attributes(self) -> dict[str, Any] | None:
"""Return additional state attributes."""
if self.entity_description.attr_fn is None:
return None
return self.entity_description.attr_fn(self.coordinator.data)

@property
def native_value(self) -> datetime | float | int | str | None:
"""Return the sensor value."""
Expand Down
43 changes: 43 additions & 0 deletions homeassistant/components/fumis/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,19 @@
}
},
"sensor": {
"alert": {
"name": "Alert",
"state": {
"airflow_malfunction": "Airflow sensor malfunction",
"door_open": "Door open",
"flue_gas_warning": "Flue gas temperature warning",
"low_battery": "Low battery",
"low_fuel": "Low fuel level",
"none": "No alert",
"service_due": "Service due",
"speed_sensor_failure": "Speed sensor failure"
}
},
"combustion_chamber_temperature": {
"name": "Combustion chamber"
},
Expand All @@ -81,6 +94,36 @@
"wood_start": "Wood start"
}
},
"error": {
"name": "Error",
"state": {
"chimney_alarm": "Chimney alarm",
"chimney_dirty": "Chimney or burning pot dirty",
"door_alarm": "Door alarm",
"fire_error": "Fire error",
"flue_gas_overtemp": "Flue gas overtemperature",
"fuel_ignition_timeout": "Fuel ignition timeout",
"gas_alarm": "Gas alarm",
"general_error": "General error",
"grate_error": "Grate error",
"ignition_failed": "Ignition failed",
"mfdoor_alarm": "MFDoor alarm",
"no_pellet_alarm": "No pellet alarm",
"none": "No error",
"ntc1_alarm": "NTC1 alarm",
"ntc2_alarm": "NTC2 alarm",
"ntc3_alarm": "NTC3 alarm",
"pressure_alarm": "Pressure alarm",
"pressure_sensor_off": "Pressure sensor off",
"safety_switch": "Safety switch tripped",
"sensor_t01_t02": "Sensor T01/T02 malfunction",
"sensor_t01_t03": "Sensor T01/T03 malfunction",
"sensor_t02": "Sensor T02 malfunction",
"sensor_t03_t05": "Sensor T03/T05 malfunction",
"sensor_t04": "Sensor T04 malfunction",
"tc1_alarm": "TC1 alarm"
}
},
"fan_1_speed": {
"name": "Fan 1 speed"
},
Expand Down
Loading