chore: 清理无用 view,初始化 mosqpost 表,存放mqtt数据
This commit is contained in:
parent
0af4b65fbb
commit
369fbd4fa4
|
@ -1,38 +0,0 @@
|
||||||
import paho.mqtt.client as mqtt
|
|
||||||
|
|
||||||
# MQTT 配置
|
|
||||||
MQTT_BROKER = "8.217.112.255"
|
|
||||||
MQTT_PORT = 1883
|
|
||||||
|
|
||||||
|
|
||||||
# 当我们从MQTT服务器接收到消息时调用此函数
|
|
||||||
def on_message(client, userdata, message):
|
|
||||||
# 提取消息的主题
|
|
||||||
topic = message.topic
|
|
||||||
print(f"Message received on topic: {topic}")
|
|
||||||
|
|
||||||
# 从主题中解析 device_id
|
|
||||||
# 假定主题格式为: "solarmosquitolamp/devices/{device_id}/data" 或 "state"
|
|
||||||
topic_parts = topic.split('/')
|
|
||||||
device_id = topic_parts[2]
|
|
||||||
|
|
||||||
# 将消息打印到控制台(或处理数据,例如存入数据库)
|
|
||||||
print(f"Device ID: {device_id}")
|
|
||||||
payload = message.payload.decode('utf-8')
|
|
||||||
print(f"Message Payload: {payload}")
|
|
||||||
|
|
||||||
# 根据device_id和payload处理数据库的记录...
|
|
||||||
|
|
||||||
|
|
||||||
# 初始化MQTT客户端
|
|
||||||
client = mqtt.Client()
|
|
||||||
client.on_message = on_message
|
|
||||||
|
|
||||||
client.connect(MQTT_BROKER, MQTT_PORT, 60)
|
|
||||||
|
|
||||||
# 订阅所有设备的主题
|
|
||||||
client.subscribe("solarmosquitolamp/devices/+/data")
|
|
||||||
client.subscribe("solarmosquitolamp/devices/+/state")
|
|
||||||
|
|
||||||
# 开始MQTT客户端
|
|
||||||
client.loop_forever()
|
|
|
@ -1,17 +1,11 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Mosquito, MosqPost, Org, DeviceInfo, WeatherStationInfo
|
from .models import MosqPost, Org, DeviceInfo, WeatherStationInfo
|
||||||
|
|
||||||
|
|
||||||
class MosquitoAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ('name', 'device_id', 'region')
|
|
||||||
list_filter = ('name', 'device_id', 'region')
|
|
||||||
ordering = ('name', 'region')
|
|
||||||
|
|
||||||
|
|
||||||
class MosqPostAdmin(admin.ModelAdmin):
|
class MosqPostAdmin(admin.ModelAdmin):
|
||||||
list_display = ('mosq', 'led', 'energy', 'time')
|
list_display = ('device_id', 'count', 'create_time')
|
||||||
list_filter = ('mosq', 'time')
|
list_filter = ('device_id', 'create_time')
|
||||||
ordering = ['time']
|
ordering = ['create_time']
|
||||||
|
|
||||||
|
|
||||||
class DeviceAdmin(admin.ModelAdmin):
|
class DeviceAdmin(admin.ModelAdmin):
|
||||||
|
@ -32,7 +26,6 @@ class WeatherStationAdmin(admin.ModelAdmin):
|
||||||
ordering = ['device_id']
|
ordering = ['device_id']
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Mosquito, MosquitoAdmin)
|
|
||||||
admin.site.register(MosqPost, MosqPostAdmin)
|
admin.site.register(MosqPost, MosqPostAdmin)
|
||||||
admin.site.register(DeviceInfo, DeviceAdmin)
|
admin.site.register(DeviceInfo, DeviceAdmin)
|
||||||
admin.site.register(Org, OrgAdmin)
|
admin.site.register(Org, OrgAdmin)
|
||||||
|
|
|
@ -3,21 +3,10 @@ from typing import Optional
|
||||||
from django.db.models import Q, Min, Max
|
from django.db.models import Q, Min, Max
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from mosquito.models import Mosquito, MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
|
from mosquito.models import MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
|
||||||
from smart.api.serializers import SmartPushListSerializer
|
from smart.api.serializers import SmartPushListSerializer
|
||||||
|
|
||||||
|
|
||||||
class MosqListSerializer(serializers.ModelSerializer):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Mosquito
|
|
||||||
fields = [
|
|
||||||
'name',
|
|
||||||
'device_id',
|
|
||||||
'region'
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class MosqPostListSerializer(serializers.ModelSerializer):
|
class MosqPostListSerializer(serializers.ModelSerializer):
|
||||||
smart_push = SmartPushListSerializer(read_only=True)
|
smart_push = SmartPushListSerializer(read_only=True)
|
||||||
region = serializers.SerializerMethodField()
|
region = serializers.SerializerMethodField()
|
||||||
|
@ -53,12 +42,6 @@ class DeviceTempLogSerializer(serializers.ModelSerializer):
|
||||||
return obj.last_time.strftime('%Y-%m-%d %H:%M:%S')
|
return obj.last_time.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
|
||||||
class DeviceSourceException(Exception):
|
|
||||||
"""
|
|
||||||
source should be counter | mosquito
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class WeatherLogBaseSerializer(serializers.ModelSerializer):
|
class WeatherLogBaseSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WeatherLog
|
model = WeatherLog
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
from django.urls import path, re_path
|
from django.urls import path, re_path
|
||||||
from .views import (
|
from .views import (
|
||||||
MosquitoListAPIView,
|
|
||||||
MosquitoPostListAPIView,
|
MosquitoPostListAPIView,
|
||||||
DeviceTempLogListAPIView,
|
DeviceTempLogListAPIView,
|
||||||
WeatherLogListAPIView,
|
WeatherLogListAPIView,
|
||||||
|
@ -12,7 +11,6 @@ from .views import (
|
||||||
|
|
||||||
app_name = 'mosq-api'
|
app_name = 'mosq-api'
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', MosquitoListAPIView.as_view(), name='list'),
|
|
||||||
path('post/', MosquitoPostListAPIView.as_view(), name='post'),
|
path('post/', MosquitoPostListAPIView.as_view(), name='post'),
|
||||||
path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'),
|
path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'),
|
||||||
path('weather/', WeatherLogListAPIView.as_view(), name='weather-log'),
|
path('weather/', WeatherLogListAPIView.as_view(), name='weather-log'),
|
||||||
|
|
|
@ -21,7 +21,7 @@ from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.filters import SearchFilter, OrderingFilter
|
from rest_framework.filters import SearchFilter, OrderingFilter
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from counter.mixins.role import RoleMixin, DeviceListMixin, WeatherStationListMixin
|
from counter.mixins.role import RoleMixin, DeviceListMixin, WeatherStationListMixin
|
||||||
from ..models import Mosquito, MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
|
from ..models import MosqPost, DeviceTempLog, WeatherLog, WeatherStationInfo, DeviceInfo
|
||||||
from .pagination import (
|
from .pagination import (
|
||||||
PostLimitOffsetPagination,
|
PostLimitOffsetPagination,
|
||||||
DeviceLogHistoryPagination,
|
DeviceLogHistoryPagination,
|
||||||
|
@ -30,7 +30,6 @@ from .pagination import (
|
||||||
WeatherStationInfoPagination,
|
WeatherStationInfoPagination,
|
||||||
)
|
)
|
||||||
from .serializers import (
|
from .serializers import (
|
||||||
MosqListSerializer,
|
|
||||||
MosqPostListSerializer,
|
MosqPostListSerializer,
|
||||||
DeviceTempLogSerializer,
|
DeviceTempLogSerializer,
|
||||||
WeatherLogSerializer,
|
WeatherLogSerializer,
|
||||||
|
@ -48,25 +47,6 @@ class DeviceLogPagination(PageNumberPagination):
|
||||||
max_page_size = 1000
|
max_page_size = 1000
|
||||||
|
|
||||||
|
|
||||||
class MosquitoListAPIView(ListAPIView):
|
|
||||||
serializer_class = MosqListSerializer
|
|
||||||
permission_classes = [IsAuthenticated]
|
|
||||||
filter_backends = [SearchFilter, OrderingFilter]
|
|
||||||
pagination_class = PostLimitOffsetPagination
|
|
||||||
search_fields = ['name', 'device_id', 'region']
|
|
||||||
|
|
||||||
def get_queryset(self, *args, **kwargs):
|
|
||||||
queryset_list = Mosquito.objects.all()
|
|
||||||
query = self.request.GET.get('q')
|
|
||||||
if query:
|
|
||||||
queryset_list = queryset_list.filter(
|
|
||||||
Q(name__icontains=query) |
|
|
||||||
Q(device_id__icontains=query) |
|
|
||||||
Q(region__icontains=query)
|
|
||||||
).distinct()
|
|
||||||
return queryset_list
|
|
||||||
|
|
||||||
|
|
||||||
class MosquitoPostListAPIView(ListAPIView):
|
class MosquitoPostListAPIView(ListAPIView):
|
||||||
serializer_class = MosqPostListSerializer
|
serializer_class = MosqPostListSerializer
|
||||||
permission_classes = [IsAuthenticated, ]
|
permission_classes = [IsAuthenticated, ]
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
# Generated by Django 2.2.4 on 2024-03-14 15:45
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mosquito', '0025_auto_20240306_1531'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='mosqpost',
|
||||||
|
options={'verbose_name': '灭蚊灯数据', 'verbose_name_plural': '灭蚊灯数据'},
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='energy',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='led',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='mosq',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='smart_push',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='time',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='ac_power',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='AC电压电流功率'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='count',
|
||||||
|
field=models.PositiveIntegerField(default=0, verbose_name='灭蚊数量'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='create_time',
|
||||||
|
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='dc_power',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='DC电压电流功率'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='device_id',
|
||||||
|
field=models.CharField(default='', max_length=100, unique=True, verbose_name='设备ID'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='load',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='负载电压电流功率'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='solar_panels',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='太阳能电压电流功率'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='storage_battery',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='电池电压电流功率'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mosqpost',
|
||||||
|
name='update_time',
|
||||||
|
field=models.DateTimeField(auto_now=True, null=True, verbose_name='更新时间'),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='Mosquito',
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,48 +1,22 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.timezone import datetime
|
|
||||||
from django.contrib.contenttypes.fields import GenericRelation
|
|
||||||
from smart.models import SmartModule, SmartPush
|
from smart.models import SmartModule, SmartPush
|
||||||
|
|
||||||
|
|
||||||
class Mosquito(models.Model):
|
|
||||||
name = models.CharField(max_length=100, verbose_name='设备名称')
|
|
||||||
device_id = models.CharField(max_length=100, verbose_name='设备ID')
|
|
||||||
region = models.CharField(max_length=50, verbose_name='区域')
|
|
||||||
smart_module = GenericRelation(SmartModule)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = '灭蚊灯'
|
|
||||||
verbose_name_plural = verbose_name
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
def get_absolute_url(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_api_url(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MosqPost(models.Model):
|
class MosqPost(models.Model):
|
||||||
smart_push = models.ForeignKey(SmartPush, on_delete='PROTECT')
|
device_id = models.CharField(max_length=100, unique=True, verbose_name='设备ID')
|
||||||
mosq = models.ForeignKey(Mosquito, verbose_name='灭蚊灯', on_delete='PROTECT')
|
count = models.PositiveIntegerField(verbose_name="灭蚊数量")
|
||||||
led = models.PositiveIntegerField(verbose_name='灭蚊数')
|
load = models.CharField(max_length=100, blank=True, null=True, verbose_name='负载电压电流功率')
|
||||||
energy = models.PositiveIntegerField(verbose_name='电量')
|
storage_battery = models.CharField(max_length=100, blank=True, null=True, verbose_name='电池电压电流功率')
|
||||||
# signal = models.IntegerField(verbose_name='信号')
|
solar_panels = models.CharField(max_length=100, blank=True, null=True, verbose_name='太阳能电压电流功率')
|
||||||
# coordinate = models.CharField(max_length=100, verbose_name='坐标')
|
ac_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='AC电压电流功率')
|
||||||
time = models.DateTimeField(auto_now=False, auto_now_add=True)
|
dc_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='DC电压电流功率')
|
||||||
|
create_time = models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name='创建时间')
|
||||||
|
update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name='更新时间')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '灭蚊数据'
|
verbose_name = '灭蚊灯数据'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return '{0}: {1}'.format(self.mosq.name, self.led)
|
|
||||||
|
|
||||||
def get_api_url(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MosqPostStatistic(models.Model):
|
class MosqPostStatistic(models.Model):
|
||||||
total = models.PositiveIntegerField(verbose_name='总数')
|
total = models.PositiveIntegerField(verbose_name='总数')
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
from mosquito.models import LO
|
||||||
|
|
||||||
|
# MQTT 配置
|
||||||
|
MQTT_BROKER = "8.217.112.255"
|
||||||
|
MQTT_PORT = 1883
|
||||||
|
|
||||||
|
|
||||||
|
# 当我们从MQTT服务器接收到消息时调用此函数
|
||||||
|
def on_message(client, userdata, message):
|
||||||
|
# 提取消息的主题
|
||||||
|
topic = message.topic
|
||||||
|
print(f"Message received on topic: {topic}")
|
||||||
|
|
||||||
|
# 从主题中解析 device_id
|
||||||
|
# 假定主题格式为: "solarmosquitolamp/devices/{device_id}/data" 或 "state"
|
||||||
|
topic_parts = topic.split('/')
|
||||||
|
device_id = topic_parts[2]
|
||||||
|
|
||||||
|
# 将消息打印到控制台(或处理数据,例如存入数据库)
|
||||||
|
print(f"Device ID: {device_id}")
|
||||||
|
payload = message.payload.decode('utf-8')
|
||||||
|
print(f"Message Payload: {payload}")
|
||||||
|
|
||||||
|
# 根据device_id和payload处理数据库的记录...
|
||||||
|
|
||||||
|
|
||||||
|
# 初始化MQTT客户端
|
||||||
|
client = mqtt.Client()
|
||||||
|
client.on_message = on_message
|
||||||
|
|
||||||
|
client.connect(MQTT_BROKER, MQTT_PORT, 60)
|
||||||
|
|
||||||
|
# 订阅所有设备的主题
|
||||||
|
client.subscribe("solarmosquitolamp/devices/+/data")
|
||||||
|
client.subscribe("solarmosquitolamp/devices/+/state")
|
||||||
|
|
||||||
|
# 开始MQTT客户端
|
||||||
|
client.loop_forever()
|
Loading…
Reference in New Issue