1 """Support for Tasmota sensors."""
3 from __future__
import annotations
5 from datetime
import datetime
8 from hatasmota
import const
as hc, sensor
as tasmota_sensor, status_sensor
9 from hatasmota.entity
import TasmotaEntity
as HATasmotaEntity
10 from hatasmota.models
import DiscoveryHashType
20 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
21 CONCENTRATION_PARTS_PER_BILLION,
22 CONCENTRATION_PARTS_PER_MILLION,
25 SIGNAL_STRENGTH_DECIBELS,
26 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
29 UnitOfElectricCurrent,
30 UnitOfElectricPotential,
45 from .const
import DATA_REMOVE_DISCOVER_COMPONENT
46 from .discovery
import TASMOTA_DISCOVERY_ENTITY_NEW
47 from .entity
import TasmotaAvailability, TasmotaDiscoveryUpdate
49 DEVICE_CLASS =
"device_class"
50 STATE_CLASS =
"state_class"
55 SENSOR_DEVICE_CLASS_ICON_MAP: dict[str, dict[str, Any]] = {
57 DEVICE_CLASS: SensorDeviceClass.ILLUMINANCE,
58 STATE_CLASS: SensorStateClass.MEASUREMENT,
61 DEVICE_CLASS: SensorDeviceClass.BATTERY,
62 STATE_CLASS: SensorStateClass.MEASUREMENT,
65 ICON:
"mdi:temperature-kelvin",
66 STATE_CLASS: SensorStateClass.MEASUREMENT,
69 DEVICE_CLASS: SensorDeviceClass.CO2,
70 STATE_CLASS: SensorStateClass.MEASUREMENT,
72 hc.SENSOR_COLOR_BLUE: {ICON:
"mdi:palette"},
73 hc.SENSOR_COLOR_GREEN: {ICON:
"mdi:palette"},
74 hc.SENSOR_COLOR_RED: {ICON:
"mdi:palette"},
76 DEVICE_CLASS: SensorDeviceClass.CURRENT,
77 STATE_CLASS: SensorStateClass.MEASUREMENT,
79 hc.SENSOR_CURRENT_NEUTRAL: {
80 DEVICE_CLASS: SensorDeviceClass.CURRENT,
81 STATE_CLASS: SensorStateClass.MEASUREMENT,
84 DEVICE_CLASS: SensorDeviceClass.TEMPERATURE,
85 ICON:
"mdi:weather-rainy",
86 STATE_CLASS: SensorStateClass.MEASUREMENT,
89 DEVICE_CLASS: SensorDeviceClass.DISTANCE,
90 STATE_CLASS: SensorStateClass.MEASUREMENT,
92 hc.SENSOR_ECO2: {ICON:
"mdi:molecule-co2"},
94 DEVICE_CLASS: SensorDeviceClass.ENERGY,
95 STATE_CLASS: SensorStateClass.TOTAL,
97 hc.SENSOR_ENERGY_EXPORT_ACTIVE: {
98 DEVICE_CLASS: SensorDeviceClass.ENERGY,
99 STATE_CLASS: SensorStateClass.TOTAL,
101 hc.SENSOR_ENERGY_EXPORT_REACTIVE: {STATE_CLASS: SensorStateClass.TOTAL},
102 hc.SENSOR_ENERGY_EXPORT_TARIFF: {
103 DEVICE_CLASS: SensorDeviceClass.ENERGY,
104 STATE_CLASS: SensorStateClass.TOTAL,
106 hc.SENSOR_ENERGY_IMPORT_ACTIVE: {
107 DEVICE_CLASS: SensorDeviceClass.ENERGY,
108 STATE_CLASS: SensorStateClass.TOTAL,
110 hc.SENSOR_ENERGY_IMPORT_REACTIVE: {STATE_CLASS: SensorStateClass.TOTAL},
111 hc.SENSOR_ENERGY_IMPORT_TODAY: {
112 DEVICE_CLASS: SensorDeviceClass.ENERGY,
113 STATE_CLASS: SensorStateClass.TOTAL_INCREASING,
115 hc.SENSOR_ENERGY_IMPORT_TOTAL: {
116 DEVICE_CLASS: SensorDeviceClass.ENERGY,
117 STATE_CLASS: SensorStateClass.TOTAL,
119 hc.SENSOR_ENERGY_IMPORT_TOTAL_TARIFF: {
120 DEVICE_CLASS: SensorDeviceClass.ENERGY,
121 STATE_CLASS: SensorStateClass.TOTAL,
123 hc.SENSOR_ENERGY_IMPORT_YESTERDAY: {DEVICE_CLASS: SensorDeviceClass.ENERGY},
124 hc.SENSOR_ENERGY_TOTAL_START_TIME: {ICON:
"mdi:progress-clock"},
125 hc.SENSOR_FREQUENCY: {
126 DEVICE_CLASS: SensorDeviceClass.FREQUENCY,
127 STATE_CLASS: SensorStateClass.MEASUREMENT,
129 hc.SENSOR_HUMIDITY: {
130 DEVICE_CLASS: SensorDeviceClass.HUMIDITY,
131 STATE_CLASS: SensorStateClass.MEASUREMENT,
133 hc.SENSOR_ILLUMINANCE: {
134 DEVICE_CLASS: SensorDeviceClass.ILLUMINANCE,
135 STATE_CLASS: SensorStateClass.MEASUREMENT,
137 hc.SENSOR_POWER_ACTIVE: {
138 DEVICE_CLASS: SensorDeviceClass.POWER,
139 STATE_CLASS: SensorStateClass.MEASUREMENT,
141 hc.SENSOR_POWER_APPARENT: {
142 DEVICE_CLASS: SensorDeviceClass.APPARENT_POWER,
143 STATE_CLASS: SensorStateClass.MEASUREMENT,
145 hc.SENSOR_STATUS_IP: {ICON:
"mdi:ip-network"},
146 hc.SENSOR_STATUS_LINK_COUNT: {ICON:
"mdi:counter"},
147 hc.SENSOR_MOISTURE: {DEVICE_CLASS: SensorDeviceClass.MOISTURE},
148 hc.SENSOR_STATUS_MQTT_COUNT: {ICON:
"mdi:counter"},
149 hc.SENSOR_PB0_3: {ICON:
"mdi:flask"},
150 hc.SENSOR_PB0_5: {ICON:
"mdi:flask"},
151 hc.SENSOR_PB10: {ICON:
"mdi:flask"},
152 hc.SENSOR_PB1: {ICON:
"mdi:flask"},
153 hc.SENSOR_PB2_5: {ICON:
"mdi:flask"},
154 hc.SENSOR_PB5: {ICON:
"mdi:flask"},
156 DEVICE_CLASS: SensorDeviceClass.PM10,
157 STATE_CLASS: SensorStateClass.MEASUREMENT,
160 DEVICE_CLASS: SensorDeviceClass.PM1,
161 STATE_CLASS: SensorStateClass.MEASUREMENT,
164 DEVICE_CLASS: SensorDeviceClass.PM25,
165 STATE_CLASS: SensorStateClass.MEASUREMENT,
167 hc.SENSOR_POWER_FACTOR: {
168 DEVICE_CLASS: SensorDeviceClass.POWER_FACTOR,
169 STATE_CLASS: SensorStateClass.MEASUREMENT,
172 DEVICE_CLASS: SensorDeviceClass.POWER,
173 STATE_CLASS: SensorStateClass.MEASUREMENT,
175 hc.SENSOR_PRESSURE: {
176 DEVICE_CLASS: SensorDeviceClass.PRESSURE,
177 STATE_CLASS: SensorStateClass.MEASUREMENT,
179 hc.SENSOR_PRESSURE_AT_SEA_LEVEL: {
180 DEVICE_CLASS: SensorDeviceClass.PRESSURE,
181 STATE_CLASS: SensorStateClass.MEASUREMENT,
183 hc.SENSOR_PROXIMITY: {ICON:
"mdi:ruler"},
184 hc.SENSOR_POWER_REACTIVE: {
185 DEVICE_CLASS: SensorDeviceClass.REACTIVE_POWER,
186 STATE_CLASS: SensorStateClass.MEASUREMENT,
188 hc.SENSOR_STATUS_LAST_RESTART_TIME: {DEVICE_CLASS: SensorDeviceClass.TIMESTAMP},
189 hc.SENSOR_STATUS_RESTART_REASON: {ICON:
"mdi:information-outline"},
190 hc.SENSOR_STATUS_SIGNAL: {
191 DEVICE_CLASS: SensorDeviceClass.SIGNAL_STRENGTH,
192 STATE_CLASS: SensorStateClass.MEASUREMENT,
194 hc.SENSOR_STATUS_RSSI: {
195 ICON:
"mdi:access-point",
196 STATE_CLASS: SensorStateClass.MEASUREMENT,
198 hc.SENSOR_STATUS_SSID: {ICON:
"mdi:access-point-network"},
199 hc.SENSOR_TEMPERATURE: {
200 DEVICE_CLASS: SensorDeviceClass.TEMPERATURE,
201 STATE_CLASS: SensorStateClass.MEASUREMENT,
203 hc.SENSOR_TVOC: {ICON:
"mdi:air-filter"},
205 DEVICE_CLASS: SensorDeviceClass.VOLTAGE,
206 STATE_CLASS: SensorStateClass.MEASUREMENT,
209 DEVICE_CLASS: SensorDeviceClass.WEIGHT,
210 STATE_CLASS: SensorStateClass.MEASUREMENT,
215 hc.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER: (
216 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
218 hc.CONCENTRATION_PARTS_PER_BILLION: CONCENTRATION_PARTS_PER_BILLION,
219 hc.CONCENTRATION_PARTS_PER_MILLION: CONCENTRATION_PARTS_PER_MILLION,
220 hc.ELECTRICAL_CURRENT_AMPERE: UnitOfElectricCurrent.AMPERE,
221 hc.ELECTRICAL_VOLT_AMPERE: UnitOfApparentPower.VOLT_AMPERE,
222 hc.ENERGY_KILO_WATT_HOUR: UnitOfEnergy.KILO_WATT_HOUR,
223 hc.FREQUENCY_HERTZ: UnitOfFrequency.HERTZ,
224 hc.LENGTH_CENTIMETERS: UnitOfLength.CENTIMETERS,
225 hc.LIGHT_LUX: LIGHT_LUX,
226 hc.MASS_KILOGRAMS: UnitOfMass.KILOGRAMS,
227 hc.PERCENTAGE: PERCENTAGE,
228 hc.POWER_WATT: UnitOfPower.WATT,
229 hc.PRESSURE_HPA: UnitOfPressure.HPA,
230 hc.REACTIVE_POWER: UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
231 hc.SIGNAL_STRENGTH_DECIBELS: SIGNAL_STRENGTH_DECIBELS,
232 hc.SIGNAL_STRENGTH_DECIBELS_MILLIWATT: SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
233 hc.SPEED_KILOMETERS_PER_HOUR: UnitOfSpeed.KILOMETERS_PER_HOUR,
234 hc.SPEED_METERS_PER_SECOND: UnitOfSpeed.METERS_PER_SECOND,
235 hc.SPEED_MILES_PER_HOUR: UnitOfSpeed.MILES_PER_HOUR,
236 hc.TEMP_CELSIUS: UnitOfTemperature.CELSIUS,
237 hc.TEMP_FAHRENHEIT: UnitOfTemperature.FAHRENHEIT,
238 hc.TEMP_KELVIN: UnitOfTemperature.KELVIN,
239 hc.VOLT: UnitOfElectricPotential.VOLT,
245 config_entry: ConfigEntry,
246 async_add_entities: AddEntitiesCallback,
248 """Set up Tasmota sensor dynamically through discovery."""
252 tasmota_entity: HATasmotaEntity, discovery_hash: DiscoveryHashType
254 """Discover and add a Tasmota sensor."""
258 tasmota_entity=tasmota_entity, discovery_hash=discovery_hash
263 hass.data[DATA_REMOVE_DISCOVER_COMPONENT.format(sensor.DOMAIN)] = (
266 TASMOTA_DISCOVERY_ENTITY_NEW.format(sensor.DOMAIN),
273 """Representation of a Tasmota sensor."""
275 _tasmota_entity: tasmota_sensor.TasmotaSensor
278 """Initialize the Tasmota sensor."""
279 self.
_state_state: Any |
None =
None
286 class_or_icon = SENSOR_DEVICE_CLASS_ICON_MAP.get(
291 if self.
_tasmota_entity_tasmota_entity.quantity
in status_sensor.SENSORS:
296 hc.SENSOR_STATUS_RSSI,
297 hc.SENSOR_STATUS_SIGNAL,
298 hc.SENSOR_STATUS_VERSION,
316 """Subscribe to MQTT events."""
322 """Handle state updates."""
331 """Return the state of the entity."""
SensorDeviceClass|None device_class(self)
None __init__(self, **Any kwds)
None sensor_state_updated(self, Any state, **Any kwargs)
_attr_native_unit_of_measurement
datetime|str|None native_value(self)
_attr_entity_registry_enabled_default
None async_added_to_hass(self)
str|None device_class(self)
None async_write_ha_state(self)
None async_discover(DiscoveryInfo discovery_info)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)