Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Sensors for Airzone WebServer #69748

Merged
merged 7 commits into from May 14, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
39 changes: 39 additions & 0 deletions homeassistant/components/airzone/entity.py
Expand Up @@ -7,16 +7,19 @@
AZD_FIRMWARE,
AZD_FULL_NAME,
AZD_ID,
AZD_MAC,
AZD_MODEL,
AZD_NAME,
AZD_SYSTEM,
AZD_SYSTEMS,
AZD_THERMOSTAT_FW,
AZD_THERMOSTAT_MODEL,
AZD_WEBSERVER,
AZD_ZONES,
)

from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity

Expand Down Expand Up @@ -67,6 +70,42 @@ def get_airzone_value(self, key: str) -> Any:
return value


class AirzoneWebServerEntity(AirzoneEntity):
"""Define an Airzone WebServer entity."""

def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
entry: ConfigEntry,
) -> None:
"""Initialize."""
super().__init__(coordinator)

self._attr_device_info: DeviceInfo = {
"connections": {
(
dr.CONNECTION_NETWORK_MAC,
self.get_airzone_value(AZD_MAC),
)
},
Noltari marked this conversation as resolved.
Show resolved Hide resolved
"identifiers": {(DOMAIN, f"{entry.entry_id}_ws")},
"manufacturer": MANUFACTURER,
"model": self.get_airzone_value(AZD_MODEL),
"name": self.get_airzone_value(AZD_FULL_NAME),
"sw_version": self.get_airzone_value(AZD_FIRMWARE),
}
self._attr_unique_id = (
entry.entry_id if entry.unique_id is None else entry.unique_id
)
bdraco marked this conversation as resolved.
Show resolved Hide resolved

def get_airzone_value(self, key: str) -> Any:
"""Return system value by key."""
value = None
if key in self.coordinator.data[AZD_WEBSERVER]:
value = self.coordinator.data[AZD_WEBSERVER][key]
return value
Noltari marked this conversation as resolved.
Show resolved Hide resolved


class AirzoneZoneEntity(AirzoneEntity):
"""Define an Airzone Zone entity."""

Expand Down
61 changes: 58 additions & 3 deletions homeassistant/components/airzone/sensor.py
Expand Up @@ -3,7 +3,15 @@

from typing import Any, Final

from aioairzone.const import AZD_HUMIDITY, AZD_NAME, AZD_TEMP, AZD_TEMP_UNIT, AZD_ZONES
from aioairzone.const import (
AZD_HUMIDITY,
AZD_NAME,
AZD_TEMP,
AZD_TEMP_UNIT,
AZD_WEBSERVER,
AZD_WIFI_RSSI,
AZD_ZONES,
)

from homeassistant.components.sensor import (
SensorDeviceClass,
Expand All @@ -12,13 +20,30 @@
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, TEMP_CELSIUS
from homeassistant.const import (
PERCENTAGE,
SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
TEMP_CELSIUS,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN, TEMP_UNIT_LIB_TO_HASS
from .coordinator import AirzoneUpdateCoordinator
from .entity import AirzoneEntity, AirzoneZoneEntity
from .entity import AirzoneEntity, AirzoneWebServerEntity, AirzoneZoneEntity

WEBSERVER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
SensorEntityDescription(
device_class=SensorDeviceClass.SIGNAL_STRENGTH,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
key=AZD_WIFI_RSSI,
name="RSSI",
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
Noltari marked this conversation as resolved.
Show resolved Hide resolved
state_class=SensorStateClass.MEASUREMENT,
),
)

ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
SensorEntityDescription(
Expand All @@ -45,6 +70,19 @@ async def async_setup_entry(
coordinator = hass.data[DOMAIN][entry.entry_id]

sensors: list[AirzoneSensor] = []

if AZD_WEBSERVER in coordinator.data:
ws_data = coordinator.data[AZD_WEBSERVER]
for description in WEBSERVER_SENSOR_TYPES:
if description.key in ws_data:
sensors.append(
AirzoneWebServerSensor(
coordinator,
description,
entry,
)
)

for system_zone_id, zone_data in coordinator.data[AZD_ZONES].items():
for description in ZONE_SENSOR_TYPES:
if description.key in zone_data:
Expand All @@ -70,6 +108,23 @@ def _async_update_attrs(self) -> None:
self._attr_native_value = self.get_airzone_value(self.entity_description.key)


class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor):
"""Define an Airzone WebServer sensor."""

def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
description: SensorEntityDescription,
entry: ConfigEntry,
) -> None:
"""Initialize."""
super().__init__(coordinator, entry)
self._attr_name = f"WebServer {description.name}"
self._attr_unique_id = f"{self._attr_unique_id}_ws_{description.key}"
self.entity_description = description
self._async_update_attrs()


class AirzoneZoneSensor(AirzoneZoneEntity, AirzoneSensor):
"""Define an Airzone Zone sensor."""

Expand Down
9 changes: 9 additions & 0 deletions tests/components/airzone/test_sensor.py
@@ -1,5 +1,6 @@
"""The sensor tests for the Airzone platform."""

from homeassistant.components.airzone.sensor import WEBSERVER_SENSOR_TYPES
from homeassistant.core import HomeAssistant

from .util import async_init_integration
Expand All @@ -8,8 +9,16 @@
async def test_airzone_create_sensors(hass: HomeAssistant) -> None:
Noltari marked this conversation as resolved.
Show resolved Hide resolved
"""Test creation of sensors."""

for sensor in WEBSERVER_SENSOR_TYPES:
sensor.entity_registry_enabled_default = True

await async_init_integration(hass)

# WebServer
state = hass.states.get("sensor.webserver_rssi")
assert state.state == "-42"

# Zones
state = hass.states.get("sensor.despacho_temperature")
assert state.state == "21.2"

Expand Down
3 changes: 1 addition & 2 deletions tests/components/airzone/util.py
Expand Up @@ -34,7 +34,6 @@
API_WIFI_RSSI,
API_ZONE_ID,
)
from aioairzone.exceptions import InvalidMethod

from homeassistant.components.airzone import DOMAIN
from homeassistant.const import CONF_HOST, CONF_ID, CONF_PORT
Expand Down Expand Up @@ -219,7 +218,7 @@ async def async_init_integration(
return_value=HVAC_SYSTEMS_MOCK,
), patch(
"homeassistant.components.airzone.AirzoneLocalApi.get_webserver",
side_effect=InvalidMethod,
return_value=HVAC_WEBSERVER_MOCK,
):
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()