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 .models import Mosquito, MosqPost, Org, DeviceInfo, WeatherStationInfo
|
||||
|
||||
|
||||
class MosquitoAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'device_id', 'region')
|
||||
list_filter = ('name', 'device_id', 'region')
|
||||
ordering = ('name', 'region')
|
||||
from .models import MosqPost, Org, DeviceInfo, WeatherStationInfo
|
||||
|
||||
|
||||
class MosqPostAdmin(admin.ModelAdmin):
|
||||
list_display = ('mosq', 'led', 'energy', 'time')
|
||||
list_filter = ('mosq', 'time')
|
||||
ordering = ['time']
|
||||
list_display = ('device_id', 'count', 'create_time')
|
||||
list_filter = ('device_id', 'create_time')
|
||||
ordering = ['create_time']
|
||||
|
||||
|
||||
class DeviceAdmin(admin.ModelAdmin):
|
||||
|
@ -32,7 +26,6 @@ class WeatherStationAdmin(admin.ModelAdmin):
|
|||
ordering = ['device_id']
|
||||
|
||||
|
||||
admin.site.register(Mosquito, MosquitoAdmin)
|
||||
admin.site.register(MosqPost, MosqPostAdmin)
|
||||
admin.site.register(DeviceInfo, DeviceAdmin)
|
||||
admin.site.register(Org, OrgAdmin)
|
||||
|
|
|
@ -3,21 +3,10 @@ from typing import Optional
|
|||
from django.db.models import Q, Min, Max
|
||||
from rest_framework import serializers
|
||||
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
|
||||
|
||||
|
||||
class MosqListSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Mosquito
|
||||
fields = [
|
||||
'name',
|
||||
'device_id',
|
||||
'region'
|
||||
]
|
||||
|
||||
|
||||
class MosqPostListSerializer(serializers.ModelSerializer):
|
||||
smart_push = SmartPushListSerializer(read_only=True)
|
||||
region = serializers.SerializerMethodField()
|
||||
|
@ -53,12 +42,6 @@ class DeviceTempLogSerializer(serializers.ModelSerializer):
|
|||
return obj.last_time.strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
|
||||
class DeviceSourceException(Exception):
|
||||
"""
|
||||
source should be counter | mosquito
|
||||
"""
|
||||
|
||||
|
||||
class WeatherLogBaseSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = WeatherLog
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
from django.urls import path, re_path
|
||||
from .views import (
|
||||
MosquitoListAPIView,
|
||||
MosquitoPostListAPIView,
|
||||
DeviceTempLogListAPIView,
|
||||
WeatherLogListAPIView,
|
||||
|
@ -12,7 +11,6 @@ from .views import (
|
|||
|
||||
app_name = 'mosq-api'
|
||||
urlpatterns = [
|
||||
path('', MosquitoListAPIView.as_view(), name='list'),
|
||||
path('post/', MosquitoPostListAPIView.as_view(), name='post'),
|
||||
path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'),
|
||||
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 django.db.models import Q
|
||||
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 (
|
||||
PostLimitOffsetPagination,
|
||||
DeviceLogHistoryPagination,
|
||||
|
@ -30,7 +30,6 @@ from .pagination import (
|
|||
WeatherStationInfoPagination,
|
||||
)
|
||||
from .serializers import (
|
||||
MosqListSerializer,
|
||||
MosqPostListSerializer,
|
||||
DeviceTempLogSerializer,
|
||||
WeatherLogSerializer,
|
||||
|
@ -48,25 +47,6 @@ class DeviceLogPagination(PageNumberPagination):
|
|||
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):
|
||||
serializer_class = MosqPostListSerializer
|
||||
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.utils.timezone import datetime
|
||||
from django.contrib.contenttypes.fields import GenericRelation
|
||||
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):
|
||||
smart_push = models.ForeignKey(SmartPush, on_delete='PROTECT')
|
||||
mosq = models.ForeignKey(Mosquito, verbose_name='灭蚊灯', on_delete='PROTECT')
|
||||
led = models.PositiveIntegerField(verbose_name='灭蚊数')
|
||||
energy = models.PositiveIntegerField(verbose_name='电量')
|
||||
# signal = models.IntegerField(verbose_name='信号')
|
||||
# coordinate = models.CharField(max_length=100, verbose_name='坐标')
|
||||
time = models.DateTimeField(auto_now=False, auto_now_add=True)
|
||||
device_id = models.CharField(max_length=100, unique=True, verbose_name='设备ID')
|
||||
count = models.PositiveIntegerField(verbose_name="灭蚊数量")
|
||||
load = models.CharField(max_length=100, blank=True, null=True, verbose_name='负载电压电流功率')
|
||||
storage_battery = models.CharField(max_length=100, blank=True, null=True, verbose_name='电池电压电流功率')
|
||||
solar_panels = models.CharField(max_length=100, blank=True, null=True, verbose_name='太阳能电压电流功率')
|
||||
ac_power = models.CharField(max_length=100, blank=True, null=True, verbose_name='AC电压电流功率')
|
||||
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:
|
||||
verbose_name = '灭蚊数据'
|
||||
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):
|
||||
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