From 97c64c7e335ef0ab78a663187493ad6df1ac651d Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sat, 14 Jun 2025 18:39:31 +0200 Subject: [PATCH 1/9] Update number.py --- custom_components/simple_pid_controller/number.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom_components/simple_pid_controller/number.py b/custom_components/simple_pid_controller/number.py index 6f5288b..bf44c7b 100644 --- a/custom_components/simple_pid_controller/number.py +++ b/custom_components/simple_pid_controller/number.py @@ -168,9 +168,9 @@ def __init__(self, hass: HomeAssistant, entry: ConfigEntry, desc: dict) -> None: if self._key == "setpoint": min_val, max_val = range_min, range_max elif self._key == "output_min": - min_val, max_val = -abs(range_max), 0.0 + min_val, max_val = -abs(range_max), range_min elif self._key == "output_max": - min_val, max_val = 0.0, range_max + min_val, max_val = range_min, range_max else: _LOGGER.error("Unexpected PID parameter key: %s", self._key) min_val, max_val = DEFAULT_RANGE_MIN, DEFAULT_RANGE_MAX From d9935479a922ac3ef9442b94e2aadc05082b4bab Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:08:11 +0200 Subject: [PATCH 2/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index 6537018..d81e8f8 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -43,7 +43,7 @@ async def update_pid(): input_value = handle.get_input_sensor_value() if input_value is None: raise ValueError("Input sensor not available") - + # Read parameters from UI kp = handle.get_number("kp") ki = handle.get_number("ki") @@ -200,9 +200,12 @@ def __init__( @property def native_value(self): contributions = self._handle.last_contributions + error = handle.get_input_sensor_value() - handle.get_number("setpoint") value = { "p": contributions[0], "i": contributions[1], "d": contributions[2], + "error": error, + }.get(self._key) return round(value, 2) if value is not None else None From 04b1052a35c65964ceb0ad3ad6a52d5763b72a15 Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:09:51 +0200 Subject: [PATCH 3/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index d81e8f8..b1628ea 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -200,7 +200,7 @@ def __init__( @property def native_value(self): contributions = self._handle.last_contributions - error = handle.get_input_sensor_value() - handle.get_number("setpoint") + error = self._handle.get_input_sensor_value() - self._handle.get_number("setpoint") value = { "p": contributions[0], "i": contributions[1], From 5c82d89bacfb8e8fb2dc5e8dd4bd90c51290fec2 Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:17:39 +0200 Subject: [PATCH 4/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index b1628ea..31703a1 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -125,6 +125,9 @@ async def start_refresh(_: Any) -> None: PIDContributionSensor( hass, entry, "pid_d_contrib", "D contribution", coordinator ), + PIDContributionSensor( + hass, entry, "error", "Error", coordinator + ), ] ) From 97f8ae7c7c49e3d0abec3d539f6d093fa6eb1e0e Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:25:28 +0200 Subject: [PATCH 5/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index 31703a1..1a383f0 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -173,6 +173,7 @@ def __init__( BasePIDEntity.__init__(self, hass, entry, key, name) self._attr_native_unit_of_measurement = "%" + self._attr_state_class = SensorStateClass.MEASUREMENT @property def native_value(self) -> float | None: @@ -198,6 +199,7 @@ def __init__( self._attr_entity_category = EntityCategory.DIAGNOSTIC self._attr_entity_registry_enabled_default = False + self._attr_state_class = SensorStateClass.MEASUREMENT self._key = key @property From 19350f1d55e2d3b1629c05481f9b87d1aa668143 Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:27:40 +0200 Subject: [PATCH 6/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index 1a383f0..5b1d408 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -10,6 +10,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.entity import EntityCategory +from homeassistant.components.sensor import SensorStateClass from datetime import timedelta from simple_pid import PID From b71ef827af31d0e28708eb48771fd4a727c8de01 Mon Sep 17 00:00:00 2001 From: bvweerd Date: Sun, 15 Jun 2025 19:55:11 +0200 Subject: [PATCH 7/9] Update sensor.py --- custom_components/simple_pid_controller/sensor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index 5b1d408..f6f9e1b 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -4,13 +4,12 @@ import logging -from homeassistant.components.sensor import SensorEntity +from homeassistant.components.sensor import SensorEntity, SensorStateClass from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.entity import EntityCategory -from homeassistant.components.sensor import SensorStateClass from datetime import timedelta from simple_pid import PID From bbc9185689671e105879c81aa4d9ecd5a8926fec Mon Sep 17 00:00:00 2001 From: bvweerd Date: Mon, 16 Jun 2025 06:02:27 +0000 Subject: [PATCH 8/9] Add check on valid data for error calculation --- .../simple_pid_controller/sensor.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index f6f9e1b..2adb93f 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -43,7 +43,7 @@ async def update_pid(): input_value = handle.get_input_sensor_value() if input_value is None: raise ValueError("Input sensor not available") - + # Read parameters from UI kp = handle.get_number("kp") ki = handle.get_number("ki") @@ -125,9 +125,7 @@ async def start_refresh(_: Any) -> None: PIDContributionSensor( hass, entry, "pid_d_contrib", "D contribution", coordinator ), - PIDContributionSensor( - hass, entry, "error", "Error", coordinator - ), + PIDContributionSensor(hass, entry, "error", "Error", coordinator), ] ) @@ -205,12 +203,18 @@ def __init__( @property def native_value(self): contributions = self._handle.last_contributions - error = self._handle.get_input_sensor_value() - self._handle.get_number("setpoint") + input_value = self._handle.get_input_sensor_value() + if input_value is None: + error = 0 + else: + error = self._handle.get_input_sensor_value() - self._handle.get_number( + "setpoint" + ) + value = { "p": contributions[0], "i": contributions[1], "d": contributions[2], "error": error, - }.get(self._key) return round(value, 2) if value is not None else None From da5746467d4fbfe0fac786bd4438bb9575d05dbf Mon Sep 17 00:00:00 2001 From: bvweerd Date: Mon, 16 Jun 2025 06:07:35 +0000 Subject: [PATCH 9/9] modified: custom_components/simple_pid_controller/sensor.py --- custom_components/simple_pid_controller/sensor.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/custom_components/simple_pid_controller/sensor.py b/custom_components/simple_pid_controller/sensor.py index 2adb93f..8137637 100644 --- a/custom_components/simple_pid_controller/sensor.py +++ b/custom_components/simple_pid_controller/sensor.py @@ -204,12 +204,12 @@ def __init__( def native_value(self): contributions = self._handle.last_contributions input_value = self._handle.get_input_sensor_value() - if input_value is None: + setpoint = self._handle.get_number("setpoint") + + if input_value is None or setpoint is None: error = 0 else: - error = self._handle.get_input_sensor_value() - self._handle.get_number( - "setpoint" - ) + error = input_value - setpoint value = { "p": contributions[0],