From 5960179844d73a64d5a59fdf65cc8fba6a878b4a Mon Sep 17 00:00:00 2001 From: Nathan Spencer Date: Fri, 12 Sep 2025 06:17:45 -0400 Subject: [PATCH] Add food dispensed today and next feeding sensors to litterrobot (#152016) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: AbĂ­lio Costa --- .../components/litterrobot/icons.json | 3 +++ .../components/litterrobot/sensor.py | 17 +++++++++++++++++ .../components/litterrobot/strings.json | 7 +++++++ tests/components/litterrobot/common.py | 19 +++++++++++++++++++ tests/components/litterrobot/test_sensor.py | 11 +++++++++++ 5 files changed, 57 insertions(+) diff --git a/homeassistant/components/litterrobot/icons.json b/homeassistant/components/litterrobot/icons.json index 86a95b59b18..91d48924ff3 100644 --- a/homeassistant/components/litterrobot/icons.json +++ b/homeassistant/components/litterrobot/icons.json @@ -36,6 +36,9 @@ } }, "sensor": { + "food_dispensed_today": { + "default": "mdi:counter" + }, "hopper_status": { "default": "mdi:filter", "state": { diff --git a/homeassistant/components/litterrobot/sensor.py b/homeassistant/components/litterrobot/sensor.py index 33f803a52b5..ecbf805bea0 100644 --- a/homeassistant/components/litterrobot/sensor.py +++ b/homeassistant/components/litterrobot/sensor.py @@ -163,6 +163,17 @@ ROBOT_SENSOR_MAP: dict[type[Robot], list[RobotSensorEntityDescription]] = { ), ], FeederRobot: [ + RobotSensorEntityDescription[FeederRobot]( + key="food_dispensed_today", + translation_key="food_dispensed_today", + state_class=SensorStateClass.TOTAL, + last_reset_fn=dt_util.start_of_local_day, + value_fn=( + lambda robot: ( + robot.get_food_dispensed_since(dt_util.start_of_local_day()) + ) + ), + ), RobotSensorEntityDescription[FeederRobot]( key="food_level", translation_key="food_level", @@ -181,6 +192,12 @@ ROBOT_SENSOR_MAP: dict[type[Robot], list[RobotSensorEntityDescription]] = { ) ), ), + RobotSensorEntityDescription[FeederRobot]( + key="next_feeding", + translation_key="next_feeding", + device_class=SensorDeviceClass.TIMESTAMP, + value_fn=lambda robot: robot.next_feeding, + ), ], } diff --git a/homeassistant/components/litterrobot/strings.json b/homeassistant/components/litterrobot/strings.json index b5702ef855c..e68e74011bd 100644 --- a/homeassistant/components/litterrobot/strings.json +++ b/homeassistant/components/litterrobot/strings.json @@ -59,6 +59,10 @@ } }, "sensor": { + "food_dispensed_today": { + "name": "Food dispensed today", + "unit_of_measurement": "cups" + }, "food_level": { "name": "Food level" }, @@ -82,6 +86,9 @@ "litter_level": { "name": "Litter level" }, + "next_feeding": { + "name": "Next feeding" + }, "pet_weight": { "name": "Pet weight" }, diff --git a/tests/components/litterrobot/common.py b/tests/components/litterrobot/common.py index 19c0c3600ea..ad80c7cb94a 100644 --- a/tests/components/litterrobot/common.py +++ b/tests/components/litterrobot/common.py @@ -128,6 +128,25 @@ FEEDER_ROBOT_DATA = { "mealInsertSize": 1, }, "updated_at": "2022-09-08T15:07:00.000000+00:00", + "active_schedule": { + "id": "1", + "name": "Feeding", + "meals": [ + { + "id": "1", + "days": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + "hour": 6, + "name": "Breakfast", + "skip": None, + "minute": 30, + "paused": False, + "portions": 3, + "mealNumber": 1, + "scheduleId": None, + } + ], + "created_at": "2021-12-17T07:07:31.047747+00:00", + }, }, "feeding_snack": [ {"timestamp": "2022-09-04T03:03:00.000000+00:00", "amount": 0.125}, diff --git a/tests/components/litterrobot/test_sensor.py b/tests/components/litterrobot/test_sensor.py index 09c5c3a3dad..b6ce4d60954 100644 --- a/tests/components/litterrobot/test_sensor.py +++ b/tests/components/litterrobot/test_sensor.py @@ -104,6 +104,7 @@ async def test_litter_robot_sensor( assert sensor.attributes["state_class"] == SensorStateClass.TOTAL_INCREASING +@pytest.mark.freeze_time("2022-09-08 19:00:00+00:00") async def test_feeder_robot_sensor( hass: HomeAssistant, mock_account_with_feederrobot: MagicMock ) -> None: @@ -117,6 +118,16 @@ async def test_feeder_robot_sensor( assert sensor.state == "2022-09-08T18:00:00+00:00" assert sensor.attributes["device_class"] == SensorDeviceClass.TIMESTAMP + sensor = hass.states.get("sensor.test_next_feeding") + assert sensor.state == "2022-09-09T12:30:00+00:00" + assert sensor.attributes["device_class"] == SensorDeviceClass.TIMESTAMP + + sensor = hass.states.get("sensor.test_food_dispensed_today") + assert sensor.state == "0.375" + assert sensor.attributes["last_reset"] == "2022-09-08T00:00:00-07:00" + assert sensor.attributes["state_class"] == SensorStateClass.TOTAL + assert sensor.attributes["unit_of_measurement"] == "cups" + async def test_pet_weight_sensor( hass: HomeAssistant, mock_account_with_pet: MagicMock