| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- from json import JSONDecodeError
- import json
- import datetime
- from django.conf import settings
- from kedong.decoration import kedong_deco, PortError
- from smartfarming.models.device import MongoDevice, MongoCBDData, DevicePestWarning
- from smartfarming.models.worm_forecast import MongoCBDphoto
- from smartfarming.models.pest_count import MongoCBDPestWarning
- from smartfarming.models.weather import QXZThresholdWarning, QXZstatus_New, MongoQXZ_Conf
- @kedong_deco(login_required=True)
- def get_cbd_info(request):
- """
- 获取基地绑定设备列表
- 参数:
- device_id 必须 设备编码
- 返回值:
- {
- "data": {
- 'device_id': "1111111111111", 设备id
- 'device_name': "abc", 设备名称
- 'address': "dizhi", 设备地址
- 'uptime': "2022-01-01 12:12", 上报时间
- "upds": 1, 上仓门状态 1打开,0关闭
- "tpl": 5, 低温保护阈值温度
- "dver": "1.0.0", 设备固件版本
- "gs": 0, 通道状态 1落虫,0排水
- "hs": 0, 加热状态 1加热,0正常
- "dnds": 0, 下仓门状态 1打开,0关闭
- "is_online": 0, 在线状态
- "csq": 29, 信号强度
- "tph": 70, 高温保护阈值温度
- "ts": 0 定时模式 0光控,1时控
- "tps": 1 温控状态 1 温控,0 正常
- "lps": 0 光控状态 1 光控,0 正常
- "hrt": 22 加热仓实时温度
- 'img_list': img_list, 图片列表
- 'warning_info': { 警报信息
- "warning_status": 1, 预警类型, 1目标种类预警 2、指定害虫数量预警 3 害虫数量总和预警 4综合预警
- "warning_content": 'xxxxxx" 预警内容
- }
- },
- "errorCode": 0,
- "message": ,
- "formError": {}
- }
- """
- config_dict = settings.CONFIG
- device_id = request.POST.get('device_id', '').strip()
- device_info = MongoDevice.objects.get(device_id=device_id)
- d_id = device_info.id
- device_data = MongoCBDData.objects.filter(device_id=device_id).order_by('-id').first()
- if device_data:
- try:
- device_data = json.loads(device_data.device_data)
- except JSONDecodeError as e:
- device_data = eval(device_data.device_data)
- except:
- raise PortError("device_id", "暂无数据")
- else:
- raise PortError("device_id", "暂无数据")
- device_addr = f'{device_info.province}{device_info.city}{device_info.district}'
- photo_list = MongoCBDphoto.objects.filter(device_id=d_id, photo_status=1).order_by("-id")
- up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
- http_img_url = config_dict["image_url"]["image"]
- img_list = []
- for p in photo_list[:3]:
- img_url = p.indentify_photo
- if not img_url:
- img_url = p.addr
- if not img_url.startswith('http'):
- img_url = http_img_url + img_url
- img_list.append(img_url)
- warning_content = MongoCBDPestWarning.objects.filter(device_id=device_id).order_by("-id").values_list("warning_content", flat=True)
- warning_info = {}
- warning_info['warning_content'] = [i for i in warning_content]
-
- tmp_device_id = device_info.device_id
- device_name = device_info.device_name
- result = {
- 'device_id': tmp_device_id,
- 'device_name': device_name or tmp_device_id,
- 'uptime': up_date.strftime("%Y-%m-%d %H:%M:%S"),
- 'img_list': img_list,
- 'warning_info': warning_info,
- "is_online": device_info.device_status,
- "ts": device_data.get("ts", 1),
- "hs": device_data.get("hs", ""),
- "upds": device_data.get("upds", ""),
- "dnds": device_data.get("dnds", ""),
- "csq": device_data.get("csq", ""),
- "dver": device_data.get("dver", ""),
- "tph": device_data.get("tph", ""),
- "tpl": device_data.get("tpl", ""),
- "tps": device_data.get("tps", ""),
- "lps": device_data.get("lps", ""),
- "hrt": device_data.get("hrt", ""),
- "rps": device_data.get("rps", ""),
- "ds": device_data.get("ds", 1),
- "address": device_addr,
- }
- return result
- @kedong_deco(login_required=True)
- def get_qxz_or_sq_info(request):
- """
- 气象站或者墒情站数据详情接口
- """
- device_id = request.POST.get('device_id', '').strip()
- device_info = MongoDevice.objects.get(device_id=device_id)
- device_addr = f'{device_info.province}{device_info.city}{device_info.district}'
- up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
- warning_queryset = QXZThresholdWarning.objects.filter(device_id=device_id, status=0).order_by("-id")
- warning_info = {}
- try:
- warn = warning_queryset[0]
- warning_info['set_value'] = warn.set_value
- warning_info['current_value'] = warn.current_value
- warning_info['ekey'] = warn.ekey
- warning_info['warning_content'] = warn.warning_content
- except Exception as e:
- pass
- conf, dat = {}, {}
- try:
- qxz_status = QXZstatus_New.objects.filter(device_id=device_id).order_by('-id')[0]
- qxz_conf = MongoQXZ_Conf.objects.get(device_id=device_id)
- for i in range(1, 31):
- k = f'e{i}'
- conf[k] = getattr(qxz_conf, k)
- dat[k] = getattr(qxz_status, k)
- except Exception as e:
- pass
- temp_device_id = device_info.device_id
- device_name = device_info.device_name
- result = {
- 'device_id': temp_device_id,
- 'device_name': device_name or temp_device_id,
- 'address': device_addr,
- 'uptime': up_date.strftime("%Y-%m-%d %H:%M:%S"),
- 'device_status': "在线" if device_info.device_status == 1 else "离线",
- 'warning_info': warning_info,
- 'conf': conf,
- 'dat': dat,
- }
- return result
|