From 2f24661c589d43d6c25a2065f068b09ac20a3b76 Mon Sep 17 00:00:00 2001 From: Hannah Eslinger Date: Fri, 5 Jan 2024 11:38:18 -0700 Subject: [PATCH] Fix and optimize sensors (#4461) * Fix sensor import * Optimize sensor usage * Performance improvement * Add comment --------- Co-authored-by: Alex Swindler --- .../seed/partials/sensors_upload_modal.html | 2 +- seed/utils/sensors.py | 26 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/seed/static/seed/partials/sensors_upload_modal.html b/seed/static/seed/partials/sensors_upload_modal.html index 2ab51d6143..9e0460d459 100644 --- a/seed/static/seed/partials/sensors_upload_modal.html +++ b/seed/static/seed/partials/sensors_upload_modal.html @@ -49,7 +49,7 @@ class="btn btn-primary col-sm-6 center-block" sd-uploader organization-id="organization_id" - sourcetype="SensorMetaData" + sourcetype="SensorMetadata" sourceprog="" sourcever="" importrecord="selectedDataset.id" diff --git a/seed/utils/sensors.py b/seed/utils/sensors.py index eb1273e1fc..1ef0afddcd 100644 --- a/seed/utils/sensors.py +++ b/seed/utils/sensors.py @@ -50,7 +50,9 @@ def _usages_by_exact_times(self, page, per_page): sensor_readings = SensorReading.objects.filter(sensor__in=self.sensors) if self.showOnlyOccupiedReadings: sensor_readings = sensor_readings.filter(is_occupied=True) - timestamps = sensor_readings.distinct('timestamp').order_by("timestamp").values_list("timestamp", flat=True) + + # order by id **greatly** speeds this up (cause of indexing, I think + timestamps = sensor_readings.distinct('timestamp').order_by("timestamp", "id").values_list("timestamp", flat=True) paginator = Paginator(timestamps, per_page) timestamps_in_page = paginator.page(page) @@ -71,19 +73,21 @@ def _usages_by_exact_times(self, page, per_page): time_format = "%Y-%m-%d %H:%M:%S" - for sensor in self.sensors: - field_name = self._build_column_def(sensor, column_defs) + field_name_by_sensor_id = { + sensor.id: self._build_column_def(sensor, column_defs) + for sensor in self.sensors + } - sensor_readings = sensor.sensor_readings.filter(timestamp__range=[earliest_time, latest_time]) - if self.showOnlyOccupiedReadings: - sensor_readings = sensor_readings.filter(is_occupied=True) + sensor_readings = SensorReading.objects.filter(timestamp__range=[earliest_time, latest_time], sensor__in=self.sensors) + if self.showOnlyOccupiedReadings: + sensor_readings = sensor_readings.filter(is_occupied=True) - for sensor_reading in sensor_readings.all(): - timestamp = sensor_reading.timestamp.astimezone(tz=self.tz).strftime(time_format) - times_key = str(timestamp) + for sensor_reading in sensor_readings.all(): + timestamp = sensor_reading.timestamp.astimezone(tz=self.tz).strftime(time_format) + times_key = str(timestamp) - timestamps[times_key]["timestamp"] = timestamp - timestamps[times_key][field_name] = sensor_reading.reading + timestamps[times_key]["timestamp"] = timestamp + timestamps[times_key][field_name_by_sensor_id[sensor_reading.sensor_id]] = sensor_reading.reading return { 'pagination': {