From ef5608a970e348f7f2d5fd59f1b026c86fe10587 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Wed, 18 Feb 2026 10:48:45 -0700 Subject: [PATCH] Imporove attributes handling (#22035) * Revert "Fix saving attributes for object to DB (#22000)" This reverts commit 73c1e12faff13a04cae8cb44ddc356100d63a915. * Automatically handle attributes by obj data parsing --- frigate/track/object_processing.py | 11 +---------- frigate/track/tracked_object.py | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/frigate/track/object_processing.py b/frigate/track/object_processing.py index a2638e5a5..e0ee74228 100644 --- a/frigate/track/object_processing.py +++ b/frigate/track/object_processing.py @@ -33,7 +33,6 @@ from frigate.config.camera.updater import ( CameraConfigUpdateEnum, CameraConfigUpdateSubscriber, ) -from frigate.config.classification import ObjectClassificationType from frigate.const import ( FAST_QUEUE_TIMEOUT, UPDATE_CAMERA_ACTIVITY, @@ -760,16 +759,8 @@ 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(attribute_model_names=attribute_model_names) - for o in camera_state.tracked_objects.values() + o.to_dict() 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 ffa4f51fb..a95221bbd 100644 --- a/frigate/track/tracked_object.py +++ b/frigate/track/tracked_object.py @@ -376,11 +376,15 @@ class TrackedObject: ) return (thumb_update, significant_change, path_update, autotracker_update) - def to_dict( - self, - attribute_model_names: list[str] | None = None, - ) -> dict[str, Any]: - event = { + def to_dict(self) -> dict[str, Any]: + # Tracking internals excluded from output (centroid, estimate, estimate_velocity) + _EXCLUDED_OBJ_DATA_KEYS = { + "centroid", + "estimate", + "estimate_velocity", + } + + event: dict[str, Any] = { "id": self.obj_data["id"], "camera": self.camera_config.name, "frame_time": self.obj_data["frame_time"], @@ -414,11 +418,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 + + # Add any other obj_data keys (e.g. custom attribute fields) not yet included + for key, value in self.obj_data.items(): + if key not in _EXCLUDED_OBJ_DATA_KEYS and key not in event: + event[key] = value return event