diff --git a/custom_components/roomba_rest980/RoombaSensor.py b/custom_components/roomba_rest980/RoombaSensor.py index de5c519..3e57d19 100644 --- a/custom_components/roomba_rest980/RoombaSensor.py +++ b/custom_components/roomba_rest980/RoombaSensor.py @@ -31,6 +31,20 @@ class RoombaSensor(CoordinatorEntity, SensorEntity): "manufacturer": "iRobot", } + def isMissionActive(self) -> bool: + """Return whether or not there is a mission in progress.""" + data = self.coordinator.data or {} + status = data.get("cleanMissionStatus", {}) + # Mission State + phase = status.get("phase") + battery = data.get("batPct") + state = False + if status.get("mssnStrtTm"): + state = True + if phase == "charge" and battery == 100: + state = False + return state + def returnIn(self, mapping: dict[str, str], index: str) -> str: """Default or map value.""" mapping.get(index, index) diff --git a/custom_components/roomba_rest980/manifest.json b/custom_components/roomba_rest980/manifest.json index 7518e08..ace117f 100644 --- a/custom_components/roomba_rest980/manifest.json +++ b/custom_components/roomba_rest980/manifest.json @@ -4,7 +4,7 @@ "codeowners": [ "@ia74" ], - "version": "1.8.0", + "version": "1.9.0", "config_flow": true, "dependencies": [], "dhcp": [ diff --git a/custom_components/roomba_rest980/sensor.py b/custom_components/roomba_rest980/sensor.py index 4fd2bf4..4728cc8 100644 --- a/custom_components/roomba_rest980/sensor.py +++ b/custom_components/roomba_rest980/sensor.py @@ -286,16 +286,12 @@ class RoombaMissionStartTime(RoombaSensor): def _handle_coordinator_update(self): """Update sensor when coordinator data changes.""" - data = self.coordinator.data or {} - status = data.get("cleanMissionStatus", {}) - # Mission State - phase = status.get("phase") - battery = data.get("batPct") - - if phase == "charge" and battery == 100: + if not self.isMissionActive(): self._attr_available = False self._attr_native_value = None else: + data = self.coordinator.data or {} + status = data.get("cleanMissionStatus", {}) missionStartTime = status.get("mssnStrtTm") # Unix timestamp in seconds? if missionStartTime: @@ -327,23 +323,27 @@ class RoombaMissionElapsedTime(RoombaSensor): def _handle_coordinator_update(self): """Update sensor when coordinator data changes.""" - data = self.coordinator.data or {} - status = data.get("cleanMissionStatus", {}) - missionStartTime = status.get("mssnStrtTm") # Unix timestamp in seconds? - - if missionStartTime: - self._attr_available = True - try: - elapsed_time = dt_util.utcnow() - dt_util.utc_from_timestamp( - missionStartTime - ) - # Convert timedelta to minutes - self._attr_native_value = elapsed_time.total_seconds() / 60 - except (TypeError, ValueError): - self._attr_native_value = None - else: - self._attr_native_value = None + if not self.isMissionActive(): self._attr_available = False + self._attr_native_value = None + else: + data = self.coordinator.data or {} + status = data.get("cleanMissionStatus", {}) + missionStartTime = status.get("mssnStrtTm") # Unix timestamp in seconds? + + if missionStartTime: + self._attr_available = True + try: + elapsed_time = dt_util.utcnow() - dt_util.utc_from_timestamp( + missionStartTime + ) + # Convert timedelta to minutes + self._attr_native_value = elapsed_time.total_seconds() / 60 + except (TypeError, ValueError): + self._attr_native_value = None + else: + self._attr_native_value = None + self._attr_available = False self.async_write_ha_state() @@ -363,12 +363,14 @@ class RoombaRechargeTime(RoombaSensor): """Update sensor when coordinator data changes.""" data = self.coordinator.data or {} status = data.get("cleanMissionStatus", {}) - missionStartTime = status.get("rechrgTm") # Unix timestamp in seconds? + estimatedRechargeTime = status.get("rechrgTm") # Unix timestamp in seconds? - if missionStartTime: + if estimatedRechargeTime: self._attr_available = True try: - self._attr_native_value = dt_util.utc_from_timestamp(missionStartTime) + self._attr_native_value = dt_util.utc_from_timestamp( + estimatedRechargeTime + ) except (TypeError, ValueError): self._attr_native_value = None else: