device.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from json import JSONDecodeError
  2. import json
  3. import datetime
  4. from django.conf import settings
  5. from kedong.decoration import kedong_deco, PortError
  6. from smartfarming.models.device import MongoDevice, MongoCBDData, DevicePestWarning
  7. from smartfarming.models.worm_forecast import MongoCBDphoto
  8. from smartfarming.models.pest_count import MongoCBDPestWarning
  9. from smartfarming.models.weather import QXZThresholdWarning, QXZstatus_New, MongoQXZ_Conf
  10. @kedong_deco(login_required=True)
  11. def get_cbd_info(request):
  12. """
  13. 获取基地绑定设备列表
  14. 参数:
  15. device_id 必须 设备编码
  16. 返回值:
  17. {
  18. "data": {
  19. 'device_id': "1111111111111", 设备id
  20. 'device_name': "abc", 设备名称
  21. 'address': "dizhi", 设备地址
  22. 'uptime': "2022-01-01 12:12", 上报时间
  23. "upds": 1, 上仓门状态 1打开,0关闭
  24. "tpl": 5, 低温保护阈值温度
  25. "dver": "1.0.0", 设备固件版本
  26. "gs": 0, 通道状态 1落虫,0排水
  27. "hs": 0, 加热状态 1加热,0正常
  28. "dnds": 0, 下仓门状态 1打开,0关闭
  29. "is_online": 0, 在线状态
  30. "csq": 29, 信号强度
  31. "tph": 70, 高温保护阈值温度
  32. "ts": 0 定时模式 0光控,1时控
  33. "tps": 1 温控状态 1 温控,0 正常
  34. "lps": 0 光控状态 1 光控,0 正常
  35. "hrt": 22 加热仓实时温度
  36. 'img_list': img_list, 图片列表
  37. 'warning_info': { 警报信息
  38. "warning_status": 1, 预警类型, 1目标种类预警 2、指定害虫数量预警 3 害虫数量总和预警 4综合预警
  39. "warning_content": 'xxxxxx" 预警内容
  40. }
  41. },
  42. "errorCode": 0,
  43. "message": ,
  44. "formError": {}
  45. }
  46. """
  47. config_dict = settings.CONFIG
  48. device_id = request.POST.get('device_id', '').strip()
  49. device_info = MongoDevice.objects.get(device_id=device_id)
  50. d_id = device_info.id
  51. device_data = MongoCBDData.objects.filter(device_id=device_id).order_by('-id').first()
  52. if device_data:
  53. try:
  54. device_data = json.loads(device_data.device_data)
  55. except JSONDecodeError as e:
  56. device_data = eval(device_data.device_data)
  57. except:
  58. raise PortError("device_id", "暂无数据")
  59. else:
  60. raise PortError("device_id", "暂无数据")
  61. device_addr = f'{device_info.province}{device_info.city}{device_info.district}'
  62. photo_list = MongoCBDphoto.objects.filter(device_id=d_id, photo_status=1).order_by("-id")
  63. up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
  64. http_img_url = config_dict["image_url"]["image"]
  65. img_list = []
  66. for p in photo_list[:3]:
  67. img_url = p.indentify_photo
  68. if not img_url:
  69. img_url = p.addr
  70. if not img_url.startswith('http'):
  71. img_url = http_img_url + img_url
  72. img_list.append(img_url)
  73. warning_content = MongoCBDPestWarning.objects.filter(device_id=device_id).order_by("-id").values_list("warning_content", flat=True)
  74. warning_info = {}
  75. warning_info['warning_content'] = [i for i in warning_content]
  76. tmp_device_id = device_info.device_id
  77. device_name = device_info.device_name
  78. result = {
  79. 'device_id': tmp_device_id,
  80. 'device_name': device_name or tmp_device_id,
  81. 'uptime': up_date.strftime("%Y-%m-%d %H:%M:%S"),
  82. 'img_list': img_list,
  83. 'warning_info': warning_info,
  84. "is_online": device_info.device_status,
  85. "ts": device_data.get("ts", 1),
  86. "hs": device_data.get("hs", ""),
  87. "upds": device_data.get("upds", ""),
  88. "dnds": device_data.get("dnds", ""),
  89. "csq": device_data.get("csq", ""),
  90. "dver": device_data.get("dver", ""),
  91. "tph": device_data.get("tph", ""),
  92. "tpl": device_data.get("tpl", ""),
  93. "tps": device_data.get("tps", ""),
  94. "lps": device_data.get("lps", ""),
  95. "hrt": device_data.get("hrt", ""),
  96. "rps": device_data.get("rps", ""),
  97. "ds": device_data.get("ds", 1),
  98. "address": device_addr,
  99. }
  100. return result
  101. @kedong_deco(login_required=True)
  102. def get_qxz_or_sq_info(request):
  103. """
  104. 气象站或者墒情站数据详情接口
  105. """
  106. device_id = request.POST.get('device_id', '').strip()
  107. device_info = MongoDevice.objects.get(device_id=device_id)
  108. device_addr = f'{device_info.province}{device_info.city}{device_info.district}'
  109. up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
  110. warning_queryset = QXZThresholdWarning.objects.filter(device_id=device_id, status=0).order_by("-id")
  111. warning_info = {}
  112. try:
  113. warn = warning_queryset[0]
  114. warning_info['set_value'] = warn.set_value
  115. warning_info['current_value'] = warn.current_value
  116. warning_info['ekey'] = warn.ekey
  117. warning_info['warning_content'] = warn.warning_content
  118. except Exception as e:
  119. pass
  120. conf, dat = {}, {}
  121. try:
  122. qxz_status = QXZstatus_New.objects.filter(device_id=device_id).order_by('-id')[0]
  123. qxz_conf = MongoQXZ_Conf.objects.get(device_id=device_id)
  124. for i in range(1, 31):
  125. k = f'e{i}'
  126. conf[k] = getattr(qxz_conf, k)
  127. dat[k] = getattr(qxz_status, k)
  128. except Exception as e:
  129. pass
  130. temp_device_id = device_info.device_id
  131. device_name = device_info.device_name
  132. result = {
  133. 'device_id': temp_device_id,
  134. 'device_name': device_name or temp_device_id,
  135. 'address': device_addr,
  136. 'uptime': up_date.strftime("%Y-%m-%d %H:%M:%S"),
  137. 'device_status': "在线" if device_info.device_status == 1 else "离线",
  138. 'warning_info': warning_info,
  139. 'conf': conf,
  140. 'dat': dat,
  141. }
  142. return result