2026-03-26 15:39:31 +03:30
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
from django.db import transaction
|
|
|
|
|
|
|
|
|
|
from account.seeds import seed_admin_user
|
|
|
|
|
|
|
|
|
|
from .models import Sensor
|
2026-03-30 23:29:03 +03:30
|
|
|
from .services import dispatch_sensor_zoning
|
2026-03-26 15:39:31 +03:30
|
|
|
|
|
|
|
|
|
|
|
|
|
ADMIN_SENSOR_UUID = uuid.UUID("11111111-1111-1111-1111-111111111111")
|
|
|
|
|
ADMIN_SENSOR_DATA = {
|
|
|
|
|
"name": "Admin Smart Farm Sensor",
|
|
|
|
|
"is_active": True,
|
|
|
|
|
"specifications": {
|
|
|
|
|
"model": "CL-SENSE-PRO-X",
|
|
|
|
|
"firmware": "2.4.1",
|
|
|
|
|
"manufacturer": "CropLogic",
|
|
|
|
|
"serial_number": "CL-ADMIN-0001",
|
|
|
|
|
"capabilities": [
|
|
|
|
|
"temperature",
|
|
|
|
|
"humidity",
|
|
|
|
|
"soil_moisture",
|
|
|
|
|
"soil_temperature",
|
|
|
|
|
"light_intensity",
|
|
|
|
|
"ph",
|
|
|
|
|
"ec",
|
|
|
|
|
"wind_speed",
|
|
|
|
|
],
|
|
|
|
|
"connectivity": {
|
|
|
|
|
"protocol": "LoRaWAN",
|
|
|
|
|
"sim_enabled": True,
|
|
|
|
|
"bluetooth": True,
|
|
|
|
|
"wifi_fallback": True,
|
|
|
|
|
},
|
|
|
|
|
"location": {
|
|
|
|
|
"label": "Admin Demo Field",
|
|
|
|
|
"lat": 35.6892,
|
|
|
|
|
"lng": 51.389,
|
|
|
|
|
"altitude_m": 1190,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
"power_source": {
|
|
|
|
|
"type": "hybrid",
|
|
|
|
|
"battery": {
|
|
|
|
|
"capacity_mah": 12000,
|
|
|
|
|
"voltage": 12,
|
|
|
|
|
"health_percent": 98,
|
|
|
|
|
},
|
|
|
|
|
"solar": {
|
|
|
|
|
"panel_watt": 40,
|
|
|
|
|
"controller": "MPPT",
|
|
|
|
|
},
|
|
|
|
|
"backup": "dc_adapter",
|
|
|
|
|
},
|
|
|
|
|
"customized_sensors": {
|
|
|
|
|
"thresholds": {
|
|
|
|
|
"temperature_c": {"min": 10, "max": 36},
|
|
|
|
|
"humidity_percent": {"min": 30, "max": 85},
|
|
|
|
|
"soil_moisture_percent": {"min": 25, "max": 70},
|
|
|
|
|
"ph": {"min": 5.8, "max": 7.2},
|
|
|
|
|
"ec_ds_m": {"min": 1.1, "max": 2.4},
|
|
|
|
|
},
|
|
|
|
|
"report_interval_sec": 300,
|
|
|
|
|
"alerts": {
|
|
|
|
|
"sms": True,
|
|
|
|
|
"email": True,
|
|
|
|
|
"push": True,
|
|
|
|
|
},
|
|
|
|
|
"calibration": {
|
|
|
|
|
"last_calibrated_at": "2025-03-01T08:30:00Z",
|
|
|
|
|
"technician": "system",
|
|
|
|
|
"status": "passed",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-30 23:29:03 +03:30
|
|
|
ADMIN_SENSOR_AREA_GEOJSON = {
|
|
|
|
|
"type": "Feature",
|
|
|
|
|
"properties": {},
|
|
|
|
|
"geometry": {
|
|
|
|
|
"type": "Polygon",
|
|
|
|
|
"coordinates": [
|
|
|
|
|
[
|
|
|
|
|
[51.418934, 35.706815],
|
|
|
|
|
[51.423054, 35.691062],
|
|
|
|
|
[51.384258, 35.689389],
|
|
|
|
|
[51.418934, 35.706815],
|
|
|
|
|
]
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 15:39:31 +03:30
|
|
|
|
|
|
|
|
@transaction.atomic
|
|
|
|
|
def seed_admin_sensor():
|
|
|
|
|
owner, _ = seed_admin_user()
|
|
|
|
|
sensor, created = Sensor.objects.update_or_create(
|
|
|
|
|
uuid_sensor=ADMIN_SENSOR_UUID,
|
|
|
|
|
defaults={
|
|
|
|
|
"owner": owner,
|
|
|
|
|
"name": ADMIN_SENSOR_DATA["name"],
|
|
|
|
|
"is_active": ADMIN_SENSOR_DATA["is_active"],
|
|
|
|
|
"specifications": ADMIN_SENSOR_DATA["specifications"],
|
|
|
|
|
"power_source": ADMIN_SENSOR_DATA["power_source"],
|
|
|
|
|
"customized_sensors": ADMIN_SENSOR_DATA["customized_sensors"],
|
|
|
|
|
},
|
|
|
|
|
)
|
2026-03-30 23:29:03 +03:30
|
|
|
if created:
|
|
|
|
|
dispatch_sensor_zoning(ADMIN_SENSOR_AREA_GEOJSON)
|
2026-03-26 15:39:31 +03:30
|
|
|
return sensor, created
|