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鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

P1 Monitor add water meter support #74004

Merged
merged 10 commits into from Aug 18, 2022
22 changes: 21 additions & 1 deletion homeassistant/components/p1_monitor/__init__.py
Expand Up @@ -3,7 +3,14 @@

from typing import TypedDict

from p1monitor import P1Monitor, Phases, Settings, SmartMeter
from p1monitor import (
P1Monitor,
P1MonitorNoDataError,
Phases,
Settings,
SmartMeter,
WaterMeter,
)

from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, Platform
Expand All @@ -19,6 +26,7 @@
SERVICE_PHASES,
SERVICE_SETTINGS,
SERVICE_SMARTMETER,
SERVICE_WATERMETER,
)

PLATFORMS = [Platform.SENSOR]
Expand Down Expand Up @@ -55,12 +63,14 @@ class P1MonitorData(TypedDict):
smartmeter: SmartMeter
phases: Phases
settings: Settings
watermeter: WaterMeter | None


class P1MonitorDataUpdateCoordinator(DataUpdateCoordinator[P1MonitorData]):
"""Class to manage fetching P1 Monitor data from single endpoint."""

config_entry: ConfigEntry
has_water_meter: bool | None = None

def __init__(
self,
Expand All @@ -84,6 +94,16 @@ async def _async_update_data(self) -> P1MonitorData:
SERVICE_SMARTMETER: await self.p1monitor.smartmeter(),
SERVICE_PHASES: await self.p1monitor.phases(),
SERVICE_SETTINGS: await self.p1monitor.settings(),
SERVICE_WATERMETER: None,
}

if self.has_water_meter or self.has_water_meter is None:
try:
data[SERVICE_WATERMETER] = await self.p1monitor.watermeter()
self.has_water_meter = True
except P1MonitorNoDataError:
LOGGER.debug("No watermeter data received from P1 Monitor")
if self.has_water_meter is None:
self.has_water_meter = False

return data
7 changes: 1 addition & 6 deletions homeassistant/components/p1_monitor/const.py
Expand Up @@ -10,11 +10,6 @@
SCAN_INTERVAL = timedelta(seconds=5)

SERVICE_SMARTMETER: Final = "smartmeter"
SERVICE_WATERMETER: Final = "watermeter"
SERVICE_PHASES: Final = "phases"
SERVICE_SETTINGS: Final = "settings"

SERVICES: dict[str, str] = {
SERVICE_SMARTMETER: "SmartMeter",
SERVICE_PHASES: "Phases",
SERVICE_SETTINGS: "Settings",
}
15 changes: 13 additions & 2 deletions homeassistant/components/p1_monitor/diagnostics.py
Expand Up @@ -10,7 +10,13 @@
from homeassistant.core import HomeAssistant

from . import P1MonitorDataUpdateCoordinator
from .const import DOMAIN, SERVICE_PHASES, SERVICE_SETTINGS, SERVICE_SMARTMETER
from .const import (
DOMAIN,
SERVICE_PHASES,
SERVICE_SETTINGS,
SERVICE_SMARTMETER,
SERVICE_WATERMETER,
)

TO_REDACT = {
CONF_HOST,
Expand All @@ -23,7 +29,7 @@ async def async_get_config_entry_diagnostics(
"""Return diagnostics for a config entry."""
coordinator: P1MonitorDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]

return {
data = {
"entry": {
"title": entry.title,
"data": async_redact_data(entry.data, TO_REDACT),
Expand All @@ -34,3 +40,8 @@ async def async_get_config_entry_diagnostics(
"settings": asdict(coordinator.data[SERVICE_SETTINGS]),
},
}

if coordinator.has_water_meter:
data["data"]["watermeter"] = asdict(coordinator.data[SERVICE_WATERMETER])

return data
2 changes: 1 addition & 1 deletion homeassistant/components/p1_monitor/manifest.json
Expand Up @@ -3,7 +3,7 @@
"name": "P1 Monitor",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/p1_monitor",
"requirements": ["p1monitor==1.0.1"],
"requirements": ["p1monitor==2.1.0"],
"codeowners": ["@klaasnicolaas"],
"quality_scale": "platinum",
"iot_class": "local_polling",
Expand Down