Fix UniFi Protect G6 Instant speaker volume control (#157549)

This commit is contained in:
Raphael Hehl
2025-12-01 11:38:34 +01:00
committed by GitHub
parent e7edd51a65
commit 3551c4b01f
6 changed files with 52 additions and 4 deletions

View File

@@ -79,7 +79,13 @@ class ProtectMediaPlayer(ProtectDeviceEntity, MediaPlayerEntity):
def _async_update_device_from_protect(self, device: ProtectDeviceType) -> None:
super()._async_update_device_from_protect(device)
updated_device = self.device
self._attr_volume_level = float(updated_device.speaker_settings.volume / 100)
speaker_settings = updated_device.speaker_settings
volume = (
speaker_settings.speaker_volume
if speaker_settings.speaker_volume is not None
else speaker_settings.volume
)
self._attr_volume_level = float(volume / 100)
if (
updated_device.talkback_stream is not None

View File

@@ -92,6 +92,36 @@ CAMERA_NUMBERS: tuple[ProtectNumberEntityDescription, ...] = (
ufp_set_method="set_mic_volume",
ufp_perm=PermRequired.WRITE,
),
ProtectNumberEntityDescription(
key="system_sounds_volume",
translation_key="system_sounds_volume",
icon="mdi:volume-high",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=PERCENTAGE,
ufp_min=0,
ufp_max=100,
ufp_step=1,
ufp_required_field="feature_flags.has_speaker",
ufp_value="speaker_settings.volume",
ufp_enabled="feature_flags.has_speaker",
ufp_set_method="set_volume",
ufp_perm=PermRequired.WRITE,
),
ProtectNumberEntityDescription(
key="doorbell_ring_volume",
translation_key="doorbell_ring_volume",
icon="mdi:bell-ring",
entity_category=EntityCategory.CONFIG,
native_unit_of_measurement=PERCENTAGE,
ufp_min=0,
ufp_max=100,
ufp_step=1,
ufp_required_field="feature_flags.is_doorbell",
ufp_value="speaker_settings.ring_volume",
ufp_enabled="feature_flags.is_doorbell",
ufp_set_method="set_ring_volume",
ufp_perm=PermRequired.WRITE,
),
ProtectNumberEntityDescription(
key="zoom_position",
translation_key="zoom_level",

View File

@@ -289,6 +289,9 @@
"chime_duration": {
"name": "Chime duration"
},
"doorbell_ring_volume": {
"name": "Doorbell ring volume"
},
"infrared_custom_lux_trigger": {
"name": "Infrared custom lux trigger"
},
@@ -298,6 +301,9 @@
"motion_sensitivity": {
"name": "Motion sensitivity"
},
"system_sounds_volume": {
"name": "System sounds volume"
},
"volume": {
"name": "[%key:component::sensor::entity_component::volume::name%]"
},

View File

@@ -173,7 +173,9 @@
"speakerSettings": {
"isEnabled": true,
"areSystemSoundsEnabled": false,
"volume": 100
"volume": 100,
"speakerVolume": 100,
"ringVolume": 100
},
"recordingSettings": {
"prePaddingSecs": 10,

View File

@@ -66,7 +66,7 @@ async def test_media_player_setup(
assert entity
assert entity.unique_id == unique_id
expected_volume = float(doorbell.speaker_settings.volume / 100)
expected_volume = float(doorbell.speaker_settings.speaker_volume / 100)
state = hass.states.get(entity_id)
assert state

View File

@@ -107,8 +107,12 @@ async def test_number_setup_camera_all(
camera.feature_flags.has_led_ir = True
camera.isp_settings.icr_custom_value = 1
camera.isp_settings.ir_led_mode = IRLEDMode.CUSTOM
camera.feature_flags.has_speaker = True
camera.speaker_settings.volume = 1
camera.feature_flags.is_doorbell = True
camera.speaker_settings.ring_volume = 1
await init_entry(hass, ufp, [camera])
assert_entity_counts(hass, Platform.NUMBER, 5, 5)
assert_entity_counts(hass, Platform.NUMBER, 7, 7)
for description in CAMERA_NUMBERS:
unique_id, entity_id = await ids_from_device_description(