From 73c1e12faff13a04cae8cb44ddc356100d63a915 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sat, 14 Feb 2026 06:40:08 -0700 Subject: [PATCH] Fix saving attributes for object to DB (#22000) --- frigate/events/maintainer.py | 13 +++++++++++++ frigate/track/object_processing.py | 11 ++++++++++- frigate/track/tracked_object.py | 10 +++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/frigate/events/maintainer.py b/frigate/events/maintainer.py index 67d8cf2e8..f6ab777c1 100644 --- a/frigate/events/maintainer.py +++ b/frigate/events/maintainer.py @@ -6,6 +6,7 @@ from typing import Dict from frigate.comms.events_updater import EventEndPublisher, EventUpdateSubscriber from frigate.config import FrigateConfig +from frigate.config.classification import ObjectClassificationType from frigate.events.types import EventStateEnum, EventTypeEnum from frigate.models import Event from frigate.util.builtin import to_relative_box @@ -247,6 +248,18 @@ class EventProcessor(threading.Thread): "recognized_license_plate" ][1] + # only overwrite attribute-type custom model fields in the database if they're set + for name, model_config in self.config.classification.custom.items(): + if ( + model_config.object_config + and model_config.object_config.classification_type + == ObjectClassificationType.attribute + ): + value = event_data.get(name) + if value is not None: + event[Event.data][name] = value[0] + event[Event.data][f"{name}_score"] = value[1] + ( Event.insert(event) .on_conflict( diff --git a/frigate/track/object_processing.py b/frigate/track/object_processing.py index e0ee74228..a2638e5a5 100644 --- a/frigate/track/object_processing.py +++ b/frigate/track/object_processing.py @@ -33,6 +33,7 @@ from frigate.config.camera.updater import ( CameraConfigUpdateEnum, CameraConfigUpdateSubscriber, ) +from frigate.config.classification import ObjectClassificationType from frigate.const import ( FAST_QUEUE_TIMEOUT, UPDATE_CAMERA_ACTIVITY, @@ -759,8 +760,16 @@ class TrackedObjectProcessor(threading.Thread): self.update_mqtt_motion(camera, frame_time, motion_boxes) + attribute_model_names = [ + name + for name, model_config in self.config.classification.custom.items() + if model_config.object_config + and model_config.object_config.classification_type + == ObjectClassificationType.attribute + ] tracked_objects = [ - o.to_dict() for o in camera_state.tracked_objects.values() + o.to_dict(attribute_model_names=attribute_model_names) + for o in camera_state.tracked_objects.values() ] # publish info on this frame diff --git a/frigate/track/tracked_object.py b/frigate/track/tracked_object.py index 453798651..ffa4f51fb 100644 --- a/frigate/track/tracked_object.py +++ b/frigate/track/tracked_object.py @@ -376,7 +376,10 @@ class TrackedObject: ) return (thumb_update, significant_change, path_update, autotracker_update) - def to_dict(self) -> dict[str, Any]: + def to_dict( + self, + attribute_model_names: list[str] | None = None, + ) -> dict[str, Any]: event = { "id": self.obj_data["id"], "camera": self.camera_config.name, @@ -411,6 +414,11 @@ class TrackedObject: "path_data": self.path_data.copy(), "recognized_license_plate": self.obj_data.get("recognized_license_plate"), } + if attribute_model_names is not None: + for name in attribute_model_names: + value = self.obj_data.get(name) + if value is not None: + event[name] = value return event