diff --git a/homeassistant/components/logbook/__init__.py b/homeassistant/components/logbook/__init__.py index 266ff3601eb5..9921abdb59d2 100644 --- a/homeassistant/components/logbook/__init__.py +++ b/homeassistant/components/logbook/__init__.py @@ -199,6 +199,9 @@ def humanify(hass, events): """ domain_prefixes = tuple(f"{dom}." for dom in CONTINUOUS_DOMAINS) + # Track last states to filter out duplicates + last_state = {} + # Group events in batches of GROUP_BY_MINUTES for _, g_events in groupby( events, lambda event: event.time_fired.minute // GROUP_BY_MINUTES @@ -236,9 +239,15 @@ def humanify(hass, events): # Yield entries for event in events_batch: if event.event_type == EVENT_STATE_CHANGED: - to_state = State.from_dict(event.data.get("new_state")) + # Filter out states that become same state again (force_update=True) + # or light becoming different color + if last_state.get(to_state.entity_id) == to_state.state: + continue + + last_state[to_state.entity_id] = to_state.state + domain = to_state.domain # Skip all but the last sensor state diff --git a/tests/components/logbook/test_init.py b/tests/components/logbook/test_init.py index 70e769a54f2d..750ad17b5232 100644 --- a/tests/components/logbook/test_init.py +++ b/tests/components/logbook/test_init.py @@ -1484,3 +1484,36 @@ async def test_humanify_script_started_event(hass): assert event2["domain"] == "script" assert event2["message"] == "started" assert event2["entity_id"] == "script.bye" + + +async def test_humanify_same_state(hass): + """Test humanifying Script Run event.""" + state_50 = ha.State("light.kitchen", "on", {"brightness": 50}).as_dict() + state_100 = ha.State("light.kitchen", "on", {"brightness": 100}).as_dict() + state_200 = ha.State("light.kitchen", "on", {"brightness": 200}).as_dict() + + events = list( + logbook.humanify( + hass, + [ + ha.Event( + EVENT_STATE_CHANGED, + { + "entity_id": "light.kitchen", + "old_state": state_50, + "new_state": state_100, + }, + ), + ha.Event( + EVENT_STATE_CHANGED, + { + "entity_id": "light.kitchen", + "old_state": state_100, + "new_state": state_200, + }, + ), + ], + ) + ) + + assert len(events) == 1