Fix audio detection for IP4m-1041 Amcrest camera (#80066)
This commit is contained in:
parent
c9130e2892
commit
e7c614a825
2 changed files with 28 additions and 27 deletions
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue