feat: mobile device 接口新增 led 状态与健康信息

This commit is contained in:
xianfx 2024-03-07 00:15:12 +08:00
parent 82cfc846c7
commit 409aa8a441
3 changed files with 63 additions and 8 deletions

View File

@ -1,9 +1,25 @@
import pytz
from enum import Enum
from typing import Optional from typing import Optional
from django.utils.timezone import datetime
from rest_framework import serializers from rest_framework import serializers
from counter.models import DeviceCount, DeviceInfo from counter.models import DeviceCount, DeviceInfo
from mosquito.models import DeviceInfo as MosquitoDeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo
class LedHealthStatus(Enum):
Good = '良好'
General = '一般'
Bad = '较差'
Unknown = '未知'
def __repr__(self):
return self.value
def __str__(self):
return self.value
class DeviceInfoMobileSerializer(serializers.ModelSerializer): class DeviceInfoMobileSerializer(serializers.ModelSerializer):
device_name = serializers.SerializerMethodField() device_name = serializers.SerializerMethodField()
status = serializers.SerializerMethodField() status = serializers.SerializerMethodField()
@ -12,6 +28,8 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
vol = serializers.SerializerMethodField() vol = serializers.SerializerMethodField()
coordinate = serializers.SerializerMethodField() coordinate = serializers.SerializerMethodField()
location = serializers.SerializerMethodField() location = serializers.SerializerMethodField()
led_status = serializers.SerializerMethodField()
led_health = serializers.SerializerMethodField()
class Meta: class Meta:
model = DeviceInfo model = DeviceInfo
@ -22,6 +40,8 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
'count', 'count',
'csq', 'csq',
'vol', 'vol',
'led_status',
'led_health',
'coordinate', 'coordinate',
'location', 'location',
] ]
@ -29,14 +49,14 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.latest = None self.latest = None
self.cur_device = None self.mosq_device = None
self.counter_device = None self.counter_device = None
def get_device_name(self, obj) -> Optional[str]: def get_device_name(self, obj) -> Optional[str]:
qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id)
if qs.count() > 0: if qs.count() > 0:
device = qs.first() device = qs.first()
self.cur_device = device self.mosq_device = device
return device.device_name return device.device_name
return None return None
@ -44,20 +64,20 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
return obj.online return obj.online
def get_coordinate(self, obj): def get_coordinate(self, obj):
if self.cur_device: if self.mosq_device:
lon, lat = [self.cur_device.longitude, self.cur_device.latitude] lon, lat = [self.mosq_device.longitude, self.mosq_device.latitude]
if lon and lat: if lon and lat:
return [lon, lat] return [lon, lat]
return None return None
def get_location(self, obj): def get_location(self, obj):
if self.cur_device: if self.mosq_device:
return self.cur_device.location return self.mosq_device.location
return None return None
def get_count(self, obj): def get_count(self, obj):
device = DeviceCount.objects.filter( device = DeviceCount.objects.filter(
device_id=self.cur_device.device_id).order_by('-data_time').first() device_id=self.mosq_device.device_id).order_by('-data_time').first()
if device: if device:
self.counter_device = device self.counter_device = device
return device.count return device.count
@ -72,3 +92,20 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
if self.counter_device: if self.counter_device:
return self.counter_device.vol return self.counter_device.vol
return None return None
def get_led_status(self, obj):
if self.mosq_device:
return self.mosq_device.led_status
return None
def get_led_health(self, obj):
if self.mosq_device:
diff = datetime.now(tz=pytz.timezone('UTC')) - self.mosq_device.launch_time
hours = diff.days * 24 + int(diff.seconds / 3600)
rate = hours / self.mosq_device.led_lifetime
if rate <= 0.3:
return LedHealthStatus.Good.value
if 0.3 < rate <= 0.6:
return LedHealthStatus.General.value
return LedHealthStatus.Bad.value
return LedHealthStatus.Unknown.value

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2024-03-06 15:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mosquito', '0024_auto_20240303_1255'),
]
operations = [
migrations.AlterField(
model_name='deviceinfo',
name='led_lifetime',
field=models.PositiveIntegerField(default=30000, verbose_name='LED 寿命'),
),
]

View File

@ -101,7 +101,7 @@ class DeviceInfo(models.Model):
latitude = models.FloatField(blank=True, null=True, verbose_name='维度') latitude = models.FloatField(blank=True, null=True, verbose_name='维度')
location = models.CharField(max_length=100, blank=True, null=True, verbose_name='地理位置') location = models.CharField(max_length=100, blank=True, null=True, verbose_name='地理位置')
led_status = models.CharField(max_length=10, choices=LED_CHOICE, default='off', verbose_name='LED 状态') led_status = models.CharField(max_length=10, choices=LED_CHOICE, default='off', verbose_name='LED 状态')
led_lifetime = models.PositiveIntegerField(default=10000, verbose_name='LED 寿命') led_lifetime = models.PositiveIntegerField(default=30000, verbose_name='LED 寿命')
launch_time = models.DateTimeField(blank=True, null=True, verbose_name='第一次启动时间') launch_time = models.DateTimeField(blank=True, null=True, verbose_name='第一次启动时间')
# 太阳能 # 太阳能