Fix audio detection for IP4m-1041 Amcrest camera (#80066)

This commit is contained in:
Sean Vig 2022-10-11 08:29:35 -04:00 committed by GitHub
parent c9130e2892
commit e7c614a825
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 27 deletions

View file

@ -370,11 +370,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
) )
) )
event_codes = { event_codes = {
sensor.event_code event_code
for sensor in BINARY_SENSORS for sensor in BINARY_SENSORS
if sensor.key in binary_sensors if sensor.key in binary_sensors
and not sensor.should_poll and not sensor.should_poll
and sensor.event_code is not None and sensor.event_codes is not None
for event_code in sensor.event_codes
} }
_start_event_monitor(hass, name, api, event_codes) _start_event_monitor(hass, name, api, event_codes)

View file

@ -39,7 +39,7 @@ if TYPE_CHECKING:
class AmcrestSensorEntityDescription(BinarySensorEntityDescription): class AmcrestSensorEntityDescription(BinarySensorEntityDescription):
"""Describe Amcrest sensor entity.""" """Describe Amcrest sensor entity."""
event_code: str | None = None event_codes: set[str] | None = None
should_poll: bool = False should_poll: bool = False
@ -51,7 +51,7 @@ _ONLINE_SCAN_INTERVAL = timedelta(seconds=60 - BINARY_SENSOR_SCAN_INTERVAL_SECS)
_AUDIO_DETECTED_KEY = "audio_detected" _AUDIO_DETECTED_KEY = "audio_detected"
_AUDIO_DETECTED_POLLED_KEY = "audio_detected_polled" _AUDIO_DETECTED_POLLED_KEY = "audio_detected_polled"
_AUDIO_DETECTED_NAME = "Audio Detected" _AUDIO_DETECTED_NAME = "Audio Detected"
_AUDIO_DETECTED_EVENT_CODE = "AudioMutation" _AUDIO_DETECTED_EVENT_CODES = {"AudioMutation", "AudioIntensity"}
_CROSSLINE_DETECTED_KEY = "crossline_detected" _CROSSLINE_DETECTED_KEY = "crossline_detected"
_CROSSLINE_DETECTED_POLLED_KEY = "crossline_detected_polled" _CROSSLINE_DETECTED_POLLED_KEY = "crossline_detected_polled"
@ -70,39 +70,39 @@ BINARY_SENSORS: tuple[AmcrestSensorEntityDescription, ...] = (
key=_AUDIO_DETECTED_KEY, key=_AUDIO_DETECTED_KEY,
name=_AUDIO_DETECTED_NAME, name=_AUDIO_DETECTED_NAME,
device_class=BinarySensorDeviceClass.SOUND, device_class=BinarySensorDeviceClass.SOUND,
event_code=_AUDIO_DETECTED_EVENT_CODE, event_codes=_AUDIO_DETECTED_EVENT_CODES,
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
key=_AUDIO_DETECTED_POLLED_KEY, key=_AUDIO_DETECTED_POLLED_KEY,
name=_AUDIO_DETECTED_NAME, name=_AUDIO_DETECTED_NAME,
device_class=BinarySensorDeviceClass.SOUND, device_class=BinarySensorDeviceClass.SOUND,
event_code=_AUDIO_DETECTED_EVENT_CODE, event_codes=_AUDIO_DETECTED_EVENT_CODES,
should_poll=True, should_poll=True,
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
key=_CROSSLINE_DETECTED_KEY, key=_CROSSLINE_DETECTED_KEY,
name=_CROSSLINE_DETECTED_NAME, name=_CROSSLINE_DETECTED_NAME,
device_class=BinarySensorDeviceClass.MOTION, device_class=BinarySensorDeviceClass.MOTION,
event_code=_CROSSLINE_DETECTED_EVENT_CODE, event_codes={_CROSSLINE_DETECTED_EVENT_CODE},
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
key=_CROSSLINE_DETECTED_POLLED_KEY, key=_CROSSLINE_DETECTED_POLLED_KEY,
name=_CROSSLINE_DETECTED_NAME, name=_CROSSLINE_DETECTED_NAME,
device_class=BinarySensorDeviceClass.MOTION, device_class=BinarySensorDeviceClass.MOTION,
event_code=_CROSSLINE_DETECTED_EVENT_CODE, event_codes={_CROSSLINE_DETECTED_EVENT_CODE},
should_poll=True, should_poll=True,
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
key=_MOTION_DETECTED_KEY, key=_MOTION_DETECTED_KEY,
name=_MOTION_DETECTED_NAME, name=_MOTION_DETECTED_NAME,
device_class=BinarySensorDeviceClass.MOTION, device_class=BinarySensorDeviceClass.MOTION,
event_code=_MOTION_DETECTED_EVENT_CODE, event_codes={_MOTION_DETECTED_EVENT_CODE},
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
key=_MOTION_DETECTED_POLLED_KEY, key=_MOTION_DETECTED_POLLED_KEY,
name=_MOTION_DETECTED_NAME, name=_MOTION_DETECTED_NAME,
device_class=BinarySensorDeviceClass.MOTION, device_class=BinarySensorDeviceClass.MOTION,
event_code=_MOTION_DETECTED_EVENT_CODE, event_codes={_MOTION_DETECTED_EVENT_CODE},
should_poll=True, should_poll=True,
), ),
AmcrestSensorEntityDescription( AmcrestSensorEntityDescription(
@ -211,13 +211,13 @@ class AmcrestBinarySensor(BinarySensorEntity):
log_update_error(_LOGGER, "update", self.name, "binary sensor", error) log_update_error(_LOGGER, "update", self.name, "binary sensor", error)
return return
if (event_code := self.entity_description.event_code) is None: if not (event_codes := self.entity_description.event_codes):
_LOGGER.error("Binary sensor %s event code not set", self.name) raise ValueError(f"Binary sensor {self.name} event codes not set")
return
try: try:
self._attr_is_on = ( self._attr_is_on = any( # type: ignore[arg-type]
len(await self._api.async_event_channels_happened(event_code)) > 0 len(await self._api.async_event_channels_happened(event_code)) > 0
for event_code in event_codes
) )
except AmcrestError as error: except AmcrestError as error:
log_update_error(_LOGGER, "update", self.name, "binary sensor", error) log_update_error(_LOGGER, "update", self.name, "binary sensor", error)
@ -266,17 +266,17 @@ class AmcrestBinarySensor(BinarySensorEntity):
) )
if ( if (
self.entity_description.event_code event_codes := self.entity_description.event_codes
and not self.entity_description.should_poll ) and not self.entity_description.should_poll:
): for event_code in event_codes:
self.async_on_remove( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self.hass, self.hass,
service_signal( service_signal(
SERVICE_EVENT, SERVICE_EVENT,
self._signal_name, self._signal_name,
self.entity_description.event_code, event_code,
), ),
self.async_event_received, self.async_event_received,
)
) )
)