Files
Backend/sensor_7_in_1/seeds.py
T
2026-04-29 01:27:16 +03:30

175 lines
5.1 KiB
Python

from datetime import timedelta
import uuid
from django.db import transaction
from django.utils import timezone
from farm_hub.models import FarmSensor
from farm_hub.seeds import seed_admin_farm
from sensor_catalog.models import SensorCatalog
from sensor_external_api.models import SensorExternalRequestLog
SENSOR_7_IN_1_CATALOG_CODE = "sensor-7-in-1"
SENSOR_7_IN_1_DEVICE_UUID = uuid.UUID("77777777-7777-7777-7777-777777777777")
SENSOR_7_IN_1_LOG_SERIES = [
{
"days_ago": 6,
"payload": {
"soil_moisture": 44.0,
"soil_temperature": 20.6,
"soil_ph": 6.3,
"electrical_conductivity": 1.0,
"nitrogen": 25.0,
"phosphorus": 13.0,
"potassium": 21.0,
},
},
{
"days_ago": 5,
"payload": {
"soil_moisture": 45.5,
"soil_temperature": 21.1,
"soil_ph": 6.4,
"electrical_conductivity": 1.1,
"nitrogen": 26.0,
"phosphorus": 13.8,
"potassium": 21.8,
},
},
{
"days_ago": 4,
"payload": {
"soil_moisture": 46.8,
"soil_temperature": 21.7,
"soil_ph": 6.5,
"electrical_conductivity": 1.1,
"nitrogen": 27.4,
"phosphorus": 14.2,
"potassium": 22.5,
},
},
{
"days_ago": 3,
"payload": {
"soil_moisture": 48.2,
"soil_temperature": 22.0,
"soil_ph": 6.6,
"electrical_conductivity": 1.2,
"nitrogen": 28.9,
"phosphorus": 15.1,
"potassium": 23.3,
},
},
{
"days_ago": 2,
"payload": {
"soil_moisture": 49.6,
"soil_temperature": 22.4,
"soil_ph": 6.6,
"electrical_conductivity": 1.2,
"nitrogen": 29.7,
"phosphorus": 15.7,
"potassium": 24.1,
},
},
{
"days_ago": 1,
"payload": {
"soil_moisture": 50.9,
"soil_temperature": 22.8,
"soil_ph": 6.7,
"electrical_conductivity": 1.3,
"nitrogen": 30.8,
"phosphorus": 16.2,
"potassium": 24.8,
},
},
{
"days_ago": 0,
"payload": {
"soil_moisture": 52.4,
"soil_temperature": 23.1,
"soil_ph": 6.8,
"electrical_conductivity": 1.3,
"nitrogen": 32.0,
"phosphorus": 16.8,
"potassium": 25.6,
},
},
]
def seed_sensor_7_in_1_catalog():
sensor_catalog, created = SensorCatalog.objects.update_or_create(
code=SENSOR_7_IN_1_CATALOG_CODE,
defaults={
"name": "Sensor 7 in 1 Soil Sensor",
"description": "Demo 7 in 1 soil sensor for dashboard summary and chart endpoints.",
"customizable_fields": [],
"supported_power_sources": ["solar", "battery", "direct_power"],
"returned_data_fields": [
"soil_moisture",
"soil_temperature",
"soil_ph",
"electrical_conductivity",
"nitrogen",
"phosphorus",
"potassium",
],
"sample_payload": SENSOR_7_IN_1_LOG_SERIES[-1]["payload"],
"is_active": True,
},
)
return sensor_catalog, created
@transaction.atomic
def seed_sensor_7_in_1_demo_data():
farm, _ = seed_admin_farm()
sensor_catalog, catalog_created = seed_sensor_7_in_1_catalog()
sensor, sensor_created = FarmSensor.objects.update_or_create(
farm=farm,
physical_device_uuid=SENSOR_7_IN_1_DEVICE_UUID,
defaults={
"sensor_catalog": sensor_catalog,
"name": "Sensor 7 in 1 Demo",
"sensor_type": "soil_7_in_1",
"is_active": True,
"specifications": {
"capabilities": sensor_catalog.returned_data_fields,
"demo_seed": True,
},
"power_source": {"type": "solar"},
},
)
SensorExternalRequestLog.objects.filter(
farm_uuid=farm.farm_uuid,
physical_device_uuid=sensor.physical_device_uuid,
).delete()
base_time = timezone.now().replace(hour=12, minute=0, second=0, microsecond=0)
created_logs = []
for item in SENSOR_7_IN_1_LOG_SERIES:
log = SensorExternalRequestLog.objects.create(
farm_uuid=farm.farm_uuid,
sensor_catalog_uuid=sensor_catalog.uuid,
physical_device_uuid=sensor.physical_device_uuid,
payload=item["payload"],
)
created_at = base_time - timedelta(days=item["days_ago"])
SensorExternalRequestLog.objects.filter(id=log.id).update(created_at=created_at)
log.created_at = created_at
created_logs.append(log)
return {
"farm": farm,
"sensor_catalog": sensor_catalog,
"sensor": sensor,
"catalog_created": catalog_created,
"sensor_created": sensor_created,
"log_count": len(created_logs),
}