mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-02-14 00:17:05 +01:00
MQTT support for all
objects for each camera & zone (#2908)
This commit is contained in:
parent
3e07d4eddb
commit
006569391f
@ -18,10 +18,12 @@ Causes frigate to exit. Docker should be configured to automatically restart the
|
|||||||
### `frigate/<camera_name>/<object_name>`
|
### `frigate/<camera_name>/<object_name>`
|
||||||
|
|
||||||
Publishes the count of objects for the camera for use as a sensor in Home Assistant.
|
Publishes the count of objects for the camera for use as a sensor in Home Assistant.
|
||||||
|
`all` can be used as the object_name for the count of all objects for the camera.
|
||||||
|
|
||||||
### `frigate/<zone_name>/<object_name>`
|
### `frigate/<zone_name>/<object_name>`
|
||||||
|
|
||||||
Publishes the count of objects for the zone for use as a sensor in Home Assistant.
|
Publishes the count of objects for the zone for use as a sensor in Home Assistant.
|
||||||
|
`all` can be used as the object_name for the count of all objects for the zone.
|
||||||
|
|
||||||
### `frigate/<camera_name>/<object_name>/snapshot`
|
### `frigate/<camera_name>/<object_name>/snapshot`
|
||||||
|
|
||||||
|
@ -554,13 +554,24 @@ class CameraState:
|
|||||||
if not obj.false_positive
|
if not obj.false_positive
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# keep track of all labels detected for this camera
|
||||||
|
total_label_count = 0
|
||||||
|
|
||||||
# report on detected objects
|
# report on detected objects
|
||||||
for obj_name, count in obj_counter.items():
|
for obj_name, count in obj_counter.items():
|
||||||
|
total_label_count += count
|
||||||
|
|
||||||
if count != self.object_counts[obj_name]:
|
if count != self.object_counts[obj_name]:
|
||||||
self.object_counts[obj_name] = count
|
self.object_counts[obj_name] = count
|
||||||
for c in self.callbacks["object_status"]:
|
for c in self.callbacks["object_status"]:
|
||||||
c(self.name, obj_name, count)
|
c(self.name, obj_name, count)
|
||||||
|
|
||||||
|
# publish for all labels detected for this camera
|
||||||
|
if total_label_count != self.object_counts.get("all"):
|
||||||
|
self.object_counts["all"] = total_label_count
|
||||||
|
for c in self.callbacks["object_status"]:
|
||||||
|
c(self.name, "all", total_label_count)
|
||||||
|
|
||||||
# expire any objects that are >0 and no longer detected
|
# expire any objects that are >0 and no longer detected
|
||||||
expired_objects = [
|
expired_objects = [
|
||||||
obj_name
|
obj_name
|
||||||
@ -568,6 +579,10 @@ class CameraState:
|
|||||||
if count > 0 and obj_name not in obj_counter
|
if count > 0 and obj_name not in obj_counter
|
||||||
]
|
]
|
||||||
for obj_name in expired_objects:
|
for obj_name in expired_objects:
|
||||||
|
# Ignore the artificial all label
|
||||||
|
if obj_name == "all":
|
||||||
|
continue
|
||||||
|
|
||||||
self.object_counts[obj_name] = 0
|
self.object_counts[obj_name] = 0
|
||||||
for c in self.callbacks["object_status"]:
|
for c in self.callbacks["object_status"]:
|
||||||
c(self.name, obj_name, 0)
|
c(self.name, obj_name, 0)
|
||||||
@ -889,9 +904,14 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
for obj in camera_state.tracked_objects.values()
|
for obj in camera_state.tracked_objects.values()
|
||||||
if zone in obj.current_zones and not obj.false_positive
|
if zone in obj.current_zones and not obj.false_positive
|
||||||
)
|
)
|
||||||
|
total_label_count = 0
|
||||||
|
|
||||||
# update counts and publish status
|
# update counts and publish status
|
||||||
for label in set(self.zone_data[zone].keys()) | set(obj_counter.keys()):
|
for label in set(self.zone_data[zone].keys()) | set(obj_counter.keys()):
|
||||||
|
# Ignore the artificial all label
|
||||||
|
if label == "all":
|
||||||
|
continue
|
||||||
|
|
||||||
# if we have previously published a count for this zone/label
|
# if we have previously published a count for this zone/label
|
||||||
zone_label = self.zone_data[zone][label]
|
zone_label = self.zone_data[zone][label]
|
||||||
if camera in zone_label:
|
if camera in zone_label:
|
||||||
@ -906,6 +926,10 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
new_count,
|
new_count,
|
||||||
retain=False,
|
retain=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Set the count for the /zone/all topic.
|
||||||
|
total_label_count += new_count
|
||||||
|
|
||||||
# if this is a new zone/label combo for this camera
|
# if this is a new zone/label combo for this camera
|
||||||
else:
|
else:
|
||||||
if label in obj_counter:
|
if label in obj_counter:
|
||||||
@ -916,6 +940,31 @@ class TrackedObjectProcessor(threading.Thread):
|
|||||||
retain=False,
|
retain=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Set the count for the /zone/all topic.
|
||||||
|
total_label_count += obj_counter[label]
|
||||||
|
|
||||||
|
# if we have previously published a count for this zone all labels
|
||||||
|
zone_label = self.zone_data[zone]["all"]
|
||||||
|
if camera in zone_label:
|
||||||
|
current_count = sum(zone_label.values())
|
||||||
|
zone_label[camera] = total_label_count
|
||||||
|
new_count = sum(zone_label.values())
|
||||||
|
|
||||||
|
if new_count != current_count:
|
||||||
|
self.client.publish(
|
||||||
|
f"{self.topic_prefix}/{zone}/all",
|
||||||
|
new_count,
|
||||||
|
retain=False,
|
||||||
|
)
|
||||||
|
# if this is a new zone all label for this camera
|
||||||
|
else:
|
||||||
|
zone_label[camera] = total_label_count
|
||||||
|
self.client.publish(
|
||||||
|
f"{self.topic_prefix}/{zone}/all",
|
||||||
|
total_label_count,
|
||||||
|
retain=False,
|
||||||
|
)
|
||||||
|
|
||||||
# cleanup event finished queue
|
# cleanup event finished queue
|
||||||
while not self.event_processed_queue.empty():
|
while not self.event_processed_queue.empty():
|
||||||
event_id, camera = self.event_processed_queue.get()
|
event_id, camera = self.event_processed_queue.get()
|
||||||
|
Loading…
Reference in New Issue
Block a user