Skip to content

Commit

Permalink
Added air quality, humidity and additional temperature sensors.
Browse files Browse the repository at this point in the history
  • Loading branch information
StephanU committed Nov 26, 2023
1 parent 2e45a9b commit f908e1b
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 20 deletions.
2 changes: 1 addition & 1 deletion custom_components/mygekko/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
"iot_class": "cloud_polling",
"issue_tracker": "https://github.com/stephanu/mygekko/issues",
"logger": ["PyMyGekko"],
"requirements": ["pymygekko==0.0.5rc8"],
"requirements": ["pymygekko==0.0.5rc10"],
"version": "1.0.0"
}
166 changes: 148 additions & 18 deletions custom_components/mygekko/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,17 @@
from homeassistant.components.sensor import SensorEntity
from homeassistant.components.sensor import SensorEntityDescription
from homeassistant.components.sensor import SensorStateClass
from homeassistant.const import CONCENTRATION_PARTS_PER_MILLION
from homeassistant.const import PERCENTAGE
from homeassistant.const import UnitOfEnergy
from homeassistant.const import UnitOfPower
from homeassistant.const import UnitOfTemperature
from PyMyGekko.resources.AlarmsLogics import AlarmsLogic
from PyMyGekko.resources.EnergyCosts import EnergyCost
from PyMyGekko.resources.HotWaterSystems import HotWaterSystem
from PyMyGekko.resources.HotWaterSystems import HotWaterSystemFeature
from PyMyGekko.resources.RoomTemps import RoomTemp
from PyMyGekko.resources.RoomTemps import RoomTempsFeature

from .const import DOMAIN

Expand Down Expand Up @@ -97,6 +104,24 @@
state_class=SensorStateClass.TOTAL,
device_class=SensorDeviceClass.ENERGY,
),
SensorEntityDescription(
key="air_quality",
name="Air Quality",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.CO2,
),
SensorEntityDescription(
key="humidity",
name="Humidity",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.HUMIDITY,
),
SensorEntityDescription(
key="temperature",
name="Temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
),
)

SENSORS = {desc.key: desc for desc in SENSOR_TYPES}
Expand All @@ -113,27 +138,60 @@ async def async_setup_entry(hass, entry, async_add_devices):
"""Setup sensor platform."""
coordinator = hass.data[DOMAIN][entry.entry_id]
energy_costs: list[EnergyCost] = coordinator.api.get_energy_costs()
if energy_costs is not None:
for energy_cost in energy_costs:
if energy_cost.sensor_data and "values" in energy_cost.sensor_data:
for index, sensor in enumerate(energy_cost.sensor_data["values"]):
if sensor and "name" in sensor and sensor["name"] in SENSORS:
async_add_devices(
[
MyGekkoEnergySensor(
coordinator,
energy_cost,
index,
SENSORS[sensor["name"]],
)
]
)
for energy_cost in energy_costs:
if energy_cost.sensor_data and "values" in energy_cost.sensor_data:
for index, sensor in enumerate(energy_cost.sensor_data["values"]):
if sensor and "name" in sensor and sensor["name"] in SENSORS:
async_add_devices(
[
MyGekkoEnergySensor(
coordinator,
energy_cost,
index,
SENSORS[sensor["name"]],
)
]
)

globals_network = coordinator.api.get_globals_network()
alarms_logics: list[AlarmsLogic] = coordinator.api.get_alarms_logics()
if alarms_logics is not None:
for alarms_logic in alarms_logics:
for alarms_logic in alarms_logics:
async_add_devices(
[MyGekkoAlarmsLogicsSensor(coordinator, alarms_logic, globals_network)]
)

room_temps: list[RoomTemp] = coordinator.api.get_room_temps()
for room_temp in room_temps:
if RoomTempsFeature.HUMIDITY in room_temp.supported_features:
async_add_devices([MyGekkoRoomTempsHumiditySensor(coordinator, room_temp)])
if RoomTempsFeature.AIR_QUALITY in room_temp.supported_features:
async_add_devices(
[MyGekkoRoomTempsAirQualitySensor(coordinator, room_temp)]
)

hotwater_systems: list[HotWaterSystem] = coordinator.api.get_hot_water_systems()
for hotwater_system in hotwater_systems:
if (
HotWaterSystemFeature.BOTTOM_TEMPERATURE
in hotwater_system.supported_features
):
async_add_devices(
[
MyGekkoHotwaterSystemsBottomTemperatureSensor(
coordinator, hotwater_system
)
]
)
if (
HotWaterSystemFeature.BOTTOM_TEMPERATURE
in hotwater_system.supported_features
):
async_add_devices(
[MyGekkoAlarmsLogicsSensor(coordinator, alarms_logic, globals_network)]
[
MyGekkoHotwaterSystemsTopTemperatureSensor(
coordinator, hotwater_system
)
]
)


Expand Down Expand Up @@ -186,3 +244,75 @@ def native_unit_of_measurement(self) -> str | None:
return None

return SENSOR_UNIT_MAPPING[unit]


class MyGekkoRoomTempsHumiditySensor(MyGekkoEntity, SensorEntity):
"""mygekko Humidity Sensor class."""

_attr_has_entity_name = True
_attr_native_unit_of_measurement = PERCENTAGE

def __init__(self, coordinator, room_temp: RoomTemp):
super().__init__(coordinator, room_temp, "room_temps", "Humidity")
self._room_temp = room_temp
self.entity_description = SENSORS["humidity"]

@property
def state(self):
"""Return the state of the sensor."""
return self._room_temp.humidity


class MyGekkoRoomTempsAirQualitySensor(MyGekkoEntity, SensorEntity):
"""mygekko AirQuality Sensor class."""

_attr_has_entity_name = True
_attr_native_unit_of_measurement = CONCENTRATION_PARTS_PER_MILLION

def __init__(self, coordinator, room_temp: RoomTemp):
super().__init__(coordinator, room_temp, "room_temps", "Air Quality")
self._room_temp = room_temp
self.entity_description = SENSORS["air_quality"]

@property
def state(self):
"""Return the state of the sensor."""
return self._room_temp.air_quality


class MyGekkoHotwaterSystemsBottomTemperatureSensor(MyGekkoEntity, SensorEntity):
"""mygekko Bottom Temperature Sensor class."""

_attr_has_entity_name = True
_attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS

def __init__(self, coordinator, hotwater_system: HotWaterSystem):
super().__init__(
coordinator, hotwater_system, "hotwater_systems", "Bottom Temperature"
)
self._hotwater_system = hotwater_system
self.entity_description = SENSORS["temperature"]

@property
def state(self):
"""Return the state of the sensor."""
return self._hotwater_system.current_temperature_bottom


class MyGekkoHotwaterSystemsTopTemperatureSensor(MyGekkoEntity, SensorEntity):
"""mygekko Top Temperature Sensor class."""

_attr_has_entity_name = True
_attr_native_unit_of_measurement = UnitOfTemperature.CELSIUS

def __init__(self, coordinator, hotwater_system: HotWaterSystem):
super().__init__(
coordinator, hotwater_system, "hotwater_systems", "Top Temperature"
)
self._hotwater_system = hotwater_system
self.entity_description = SENSORS["temperature"]

@property
def state(self):
"""Return the state of the sensor."""
return self._hotwater_system.current_temperature_top
2 changes: 1 addition & 1 deletion requirements_test.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-r requirements_dev.txt
pytest-asyncio
pytest-homeassistant-custom-component==0.13.76
PyMyGekko==0.0.5rc8
PyMyGekko==0.0.5rc10

0 comments on commit f908e1b

Please sign in to comment.