oin/oin_ha/sensors/__init__.py
2024-11-11 15:22:09 +01:00

129 lines
3.8 KiB
Python

import json
from sense_hat import SenseHat
class Sensors:
def __init__(self, mqttc, uid, name):
self.mqttc = mqttc
self.sense = SenseHat()
self.uid = uid
self.name = name
self.init_sensors()
self.mqttc.will_set(self.availability_topic, "offline", retain=True)
@property
def device(self):
return {
"identifiers": [self.uid],
"name": self.name,
}
@property
def availability_topic(self):
return f"{self.uid}/availability"
@property
def state_topic(self):
return f"{self.uid}/state"
def init_sensors(self):
options = {
"device": self.device,
"availability_topic": self.availability_topic,
"state_topic": self.state_topic,
"entity_category": "diagnostic",
}
self.sensors = [
TemperatureSensor(
"Température",
self.uid,
"temperature",
self.sense.get_temperature,
**options,
),
HumiditySensor(
"Humidité", self.uid, "humidity", self.sense.get_humidity, **options
),
PressureSensor(
"Pression", self.uid, "pressure", self.sense.get_pressure, **options
),
]
def publish_discovery(self):
for sensor in self.sensors:
sensor.publish_discovery(self.mqttc)
def publish_online(self):
self.mqttc.publish(self.availability_topic, "online", retain=True)
def publish_state(self):
self.mqttc.publish(
self.state_topic,
json.dumps({sensor.slug: sensor.get_value() for sensor in self.sensors}),
)
class SingleSensor:
def __init__(self, name, parent_uid, slug, get_value, **kwargs):
self.name = name
self.parent_uid = parent_uid
self.slug = slug
self.get_value = get_value
self.options = kwargs
def publish_discovery(self, mqttc):
mqttc.publish(
self.discovery_topic,
json.dumps(
{
"name": self.name,
"state_class": "MEASUREMENT",
"unique_id": self.uid,
"value_template": self.value_template,
}
| self.options
),
retain=True,
)
@property
def uid(self):
return f"{self.parent_uid}_{self.slug}"
@property
def discovery_topic(self):
return f"homeassistant/sensor/{self.uid}/config"
@property
def value_template(self):
return "{{" + f"value_json.{self.slug}" + "}}"
class TemperatureSensor(SingleSensor):
def __init__(self, name, parent_uid, slug, get_value, **kwargs):
super().__init__(name, parent_uid, slug, get_value, **kwargs)
self.options["device_class"] = "temperature"
self.options["icon"] = "mdi:thermometer"
self.options["suggested_display_precision"] = 1
self.options["unit_of_measurement"] = "°C"
class HumiditySensor(SingleSensor):
def __init__(self, name, parent_uid, slug, get_value, **kwargs):
super().__init__(name, parent_uid, slug, get_value, **kwargs)
self.options["device_class"] = "humidity"
self.options["icon"] = "mdi:water-percent"
self.options["suggested_display_precision"] = 0
self.options["unit_of_measurement"] = "%"
class PressureSensor(SingleSensor):
def __init__(self, name, parent_uid, slug, get_value, **kwargs):
super().__init__(name, parent_uid, slug, get_value, **kwargs)
self.options["device_class"] = "pressure"
self.options["icon"] = "mdi:gauge"
self.options["suggested_display_precision"] = 0
self.options["unit_of_measurement"] = "mbar"