From e20e1f46378b1db7360c8aeaeb8e3d26e69726c0 Mon Sep 17 00:00:00 2001 From: Raphael Hehl <7577984+RaHehl@users.noreply.github.com> Date: Sun, 4 Oct 2026 08:57:23 +0200 Subject: [PATCH] Keep colons in UniFi Protect custom doorbell messages (#184188) --- homeassistant/components/unifiprotect/select.py | 8 +++++--- tests/components/unifiprotect/test_select.py | 12 +++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/unifiprotect/select.py b/homeassistant/components/unifiprotect/select.py index ad64b2df0ecd..cc71f59202b1 100644 --- a/homeassistant/components/unifiprotect/select.py +++ b/homeassistant/components/unifiprotect/select.py @@ -192,11 +192,13 @@ async def _set_paired_camera(obj: Light | Sensor, camera_id: str) -> None: async def _set_doorbell_message(obj: Camera, message: str) -> None: - if message.startswith(DoorbellMessageType.CUSTOM_MESSAGE.value): - message = message.rsplit(":", maxsplit=1)[-1] + custom_prefix = f"{DoorbellMessageType.CUSTOM_MESSAGE.value}:" + if message.startswith(custom_prefix): # reset_at=None keeps the message up until it is changed await obj.set_lcd_message_public( - DoorbellMessageType.CUSTOM_MESSAGE, text=message, reset_at=None + DoorbellMessageType.CUSTOM_MESSAGE, + text=message.removeprefix(custom_prefix), + reset_at=None, ) elif message == TYPE_EMPTY_VALUE: await obj.set_lcd_message_public(None) diff --git a/tests/components/unifiprotect/test_select.py b/tests/components/unifiprotect/test_select.py index bbe6deadec5f..dbd07f6416cc 100644 --- a/tests/components/unifiprotect/test_select.py +++ b/tests/components/unifiprotect/test_select.py @@ -639,11 +639,17 @@ async def test_select_set_option_camera_ir( mock_method.assert_called_once_with(expected) +@pytest.mark.parametrize("message", ["Test", "Back at 5:30"]) async def test_select_set_option_camera_doorbell_custom( - hass: HomeAssistant, ufp: MockUFPFixture, doorbell: Camera + hass: HomeAssistant, ufp: MockUFPFixture, doorbell: Camera, message: str ) -> None: """Test Doorbell Text select (user defined message).""" + doorbell_settings = ufp.api.bootstrap.nvr.doorbell_settings + doorbell_settings.all_messages = [ + *doorbell_settings.all_messages, + DoorbellMessage(type=DoorbellMessageType.CUSTOM_MESSAGE, text="Back at 5:30"), + ] await init_entry(hass, ufp, [doorbell]) assert_entity_counts(hass, Platform.SELECT, 5, 5) @@ -657,14 +663,14 @@ async def test_select_set_option_camera_doorbell_custom( await hass.services.async_call( "select", "select_option", - {ATTR_ENTITY_ID: entity_id, ATTR_OPTION: "Test"}, + {ATTR_ENTITY_ID: entity_id, ATTR_OPTION: message}, blocking=True, ) # reset_at=None keeps the message up; omitting it lets the NVR # clear it after its own timeout mock_method.assert_called_once_with( - DoorbellMessageType.CUSTOM_MESSAGE, text="Test", reset_at=None + DoorbellMessageType.CUSTOM_MESSAGE, text=message, reset_at=None )