From 27ad4d3ee5e8fbbbe52e534e07baab453481c1f6 Mon Sep 17 00:00:00 2001 From: David Vallee Delisle Date: Fri, 7 Jan 2022 22:13:50 -0500 Subject: [PATCH] Adding appreciation phase --- custom_components/hilo/__init__.py | 5 +++++ custom_components/hilo/config_flow.py | 14 ++++++++++++++ custom_components/hilo/const.py | 3 +++ custom_components/hilo/sensor.py | 6 ++++-- custom_components/hilo/translations/en.json | 3 ++- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/custom_components/hilo/__init__.py b/custom_components/hilo/__init__.py index bfe59064..4e6ea5d8 100644 --- a/custom_components/hilo/__init__.py +++ b/custom_components/hilo/__init__.py @@ -44,6 +44,7 @@ from .config_flow import STEP_OPTION_SCHEMA from .const import ( + CONF_APPRECIATION_PHASE, CONF_CHALLENGE_LOCK, CONF_GENERATE_ENERGY_METERS, CONF_HIGH_PERIODS, @@ -51,6 +52,7 @@ CONF_LOG_TRACES, CONF_TARIFF, CONF_UNTARIFICATED_DEVICES, + DEFAULT_APPRECIATION_PHASE, DEFAULT_CHALLENGE_LOCK, DEFAULT_GENERATE_ENERGY_METERS, DEFAULT_HQ_PLAN_NAME, @@ -204,6 +206,9 @@ def __init__(self, hass: HomeAssistant, entry: ConfigEntry, api: API) -> None: 1: self.subscribe_to_attributes, } self.hq_plan_name = entry.options.get(CONF_HQ_PLAN_NAME, DEFAULT_HQ_PLAN_NAME) + self.appreciation = entry.options.get( + CONF_APPRECIATION_PHASE, DEFAULT_APPRECIATION_PHASE + ) self.challenge_lock = entry.options.get( CONF_CHALLENGE_LOCK, DEFAULT_CHALLENGE_LOCK ) diff --git a/custom_components/hilo/config_flow.py b/custom_components/hilo/config_flow.py index 71c8f4d9..f0544bb0 100644 --- a/custom_components/hilo/config_flow.py +++ b/custom_components/hilo/config_flow.py @@ -20,11 +20,13 @@ import voluptuous as vol from .const import ( + CONF_APPRECIATION_PHASE, CONF_CHALLENGE_LOCK, CONF_GENERATE_ENERGY_METERS, CONF_HQ_PLAN_NAME, CONF_LOG_TRACES, CONF_UNTARIFICATED_DEVICES, + DEFAULT_APPRECIATION_PHASE, DEFAULT_CHALLENGE_LOCK, DEFAULT_GENERATE_ENERGY_METERS, DEFAULT_HQ_PLAN_NAME, @@ -59,6 +61,10 @@ CONF_CHALLENGE_LOCK, default=DEFAULT_CHALLENGE_LOCK, ): cv.boolean, + vol.Optional( + CONF_APPRECIATION_PHASE, + default=DEFAULT_APPRECIATION_PHASE, + ): cv.positive_int, vol.Optional(CONF_HQ_PLAN_NAME, default=DEFAULT_HQ_PLAN_NAME): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): ( vol.All(cv.positive_int, vol.Range(min=MIN_SCAN_INTERVAL)) @@ -191,6 +197,14 @@ async def async_step_init( ) }, ): cv.string, + vol.Optional( + CONF_APPRECIATION_PHASE, + description={ + "suggested_value": self.config_entry.options.get( + CONF_APPRECIATION_PHASE + ) + }, + ): cv.positive_int, vol.Optional( CONF_SCAN_INTERVAL, description={ diff --git a/custom_components/hilo/const.py b/custom_components/hilo/const.py index be76e20f..99a98c06 100644 --- a/custom_components/hilo/const.py +++ b/custom_components/hilo/const.py @@ -26,6 +26,9 @@ CONF_ENERGY_METER_PERIOD = "energy_meter_period" DEFAULT_ENERGY_METER_PERIOD = DAILY +CONF_APPRECIATION_PHASE = "appreciation_phase" +DEFAULT_APPRECIATION_PHASE = 0 + DEFAULT_SCAN_INTERVAL = 60 MIN_SCAN_INTERVAL = 15 diff --git a/custom_components/hilo/sensor.py b/custom_components/hilo/sensor.py index 0a5efb71..49db7677 100644 --- a/custom_components/hilo/sensor.py +++ b/custom_components/hilo/sensor.py @@ -518,8 +518,10 @@ async def _async_update(self): details = await self._hilo._api.get_events( self._hilo.devices.location_id, event_id=raw_event["id"] ) - event = Event(**details).as_dict() - self._next_events.append(event) + event = Event(**details) + if self._hilo.appreciation > 0: + event.appreciation(self._hilo.appreciation) + self._next_events.append(event.as_dict()) self._state = "off" if len(self._next_events): self._state = self._next_events[0]["state"] diff --git a/custom_components/hilo/translations/en.json b/custom_components/hilo/translations/en.json index 4c9dd48c..73bf1177 100644 --- a/custom_components/hilo/translations/en.json +++ b/custom_components/hilo/translations/en.json @@ -28,7 +28,8 @@ "hq_plan_name": "Hydro Quebec rate plan name ('rate d' or 'flex d')", "scan_interval": "Scan interval (min: 15s)", "log_traces": "Also log request data and websocket messages (requires debug log level on both the integration and pyhilo)", - "challenge_lock": "Lock climate entities during Hilo challenges, preventing any changes when a challenge is in progress." + "challenge_lock": "Lock climate entities during Hilo challenges, preventing any changes when a challenge is in progress.", + "appreciation_phase": "Add an appreciation phase of X hours before the preheat phase." } } }