device_manage.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. import datetime
  2. import time
  3. from smartfarming.models.device import MongoDevice, MongoSCDData, MongoDeviceType, MongoXYCBData
  4. from kedong.decoration import kedong_deco, PortError
  5. from smartfarming.utils import get_address_by_lntlat, get_weather_info
  6. from smartfarming.models.user import MongoOperateLogs
  7. def operation_log(uid,content,target_id,operation_type,ip):
  8. """
  9. uid 必传 操作者id
  10. content 必传 操作内容
  11. target_id 必传 被操作者id
  12. operation_type 必传 对设备操作0 对用户操作传1
  13. """
  14. if not (uid or content or target_id or operation_type or ip):
  15. raise PortError('log',"日志记录参数缺失")
  16. try:
  17. MongoOperateLogs(addtime=int(time.time()), uid=uid, content=content, target_id=target_id,operation_type=operation_type,ip=ip).save()
  18. except Exception as e:
  19. print("操作日志存储失败", e)
  20. @kedong_deco(login_required=False)
  21. def weathers(request):
  22. """
  23. 天气接口
  24. 参数
  25. lat 必传(str) 纬度
  26. lng 必传(str) 经度
  27. 返回值:
  28. "data": [
  29. {
  30. "id": 1201,
  31. "province": "新疆维吾尔自治区", 省
  32. "city": "克孜勒苏柯尔克孜自治州", 市
  33. "district": "阿克陶县", 县
  34. "lng": "75.945159", 经度
  35. "lat": "39.147079", 纬度
  36. "at": "31", 温度
  37. "ah": "14", 湿度
  38. "upl_time": "2021-10-25 14:39:48", 时间
  39. "win": "东风", 风向
  40. "win_speed": "1级", 风速
  41. "win_meter": "5km/h", 风力
  42. "wea": "多云", 天气
  43. "visibility": "30km", 能见度
  44. "pressure": "863", 压力
  45. "air": "40", 空气
  46. "air_pm25": "19", 空气PM2.5
  47. "air_level": "优", 空气等级
  48. "air_tips": "空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!" 空气说明
  49. }
  50. ],
  51. "params": {
  52. "lat": "039.1850853",
  53. "lng": "075.8749465"
  54. }
  55. }
  56. """
  57. lat = request.POST.get('lat', '')
  58. lng = request.POST.get('lng', '')
  59. device_id = request.POST.get('device_id')
  60. if not lat and not lng:
  61. raise PortError('', '未传经纬度')
  62. province, city, district = "", "", ""
  63. if device_id:
  64. try:
  65. instance = MongoDevice.objects.get(device_id=device_id)
  66. province, city, district = instance.province, instance.city, instance.district
  67. if (not city) and district:
  68. city = district
  69. except Exception as e:
  70. pass
  71. if not (province and city):
  72. province, city, district = get_address_by_lntlat(lng, lat)
  73. result = []
  74. weather_info = get_weather_info(lng, lat)
  75. try:
  76. upl_time = weather_info.get('upl_time')
  77. upl_time = datetime.datetime.fromtimestamp(int(upl_time)).strftime("%Y-%m-%d %H:%M:%S")
  78. except Exception as e:
  79. upl_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  80. result.append({
  81. "province": province,
  82. "city": city,
  83. "district": district,
  84. "lng": lng,
  85. "lat": lat,
  86. "at": weather_info.get('tem', ''),
  87. "ah": weather_info.get('humidity', '%'),
  88. "upl_time": upl_time,
  89. "win": weather_info.get('win', ''),
  90. "win_speed": weather_info.get('win_speed', ''),
  91. "win_meter": weather_info.get('win_meter', ''),
  92. "wea": weather_info.get('wea', ''),
  93. "visibility": weather_info.get('visibility', ''),
  94. "pressure": weather_info.get('pressure', ''),
  95. "air": weather_info.get('air', ''),
  96. "air_pm25": weather_info.get('air_pm25', ''),
  97. "air_level": weather_info.get('air_level', ''),
  98. "air_tips": weather_info.get('air_tips', ''),
  99. })
  100. return result
  101. @kedong_deco(login_required=True)
  102. def scd_gis_info(request):
  103. """
  104. 杀虫灯GIS展示信息
  105. 参数
  106. device_id 必传(str) 设备ID
  107. 返回值:
  108. "data": {
  109. "address": "河南省新乡市原阳县", 设备地址
  110. "uptime": "2022-01-02 12:12:12", 最新上传时间
  111. "device_name": "xxxxxx", 设备名称
  112. "device_id":"xxxxxxxxxxx", 设备ID
  113. 'device_status': "在线", 设备状态
  114. "at": "30", 温度
  115. "ah": "50", 湿度
  116. "ws_status": "待机", 工作状态
  117. "rps_status": "正常", 雨控状态
  118. "tt": "4", 定时时长
  119. "ct": "0", 电击次数
  120. "csq": "0" 信号强度
  121. }
  122. """
  123. device_id = request.POST.get('device_id')
  124. try:
  125. device_info = MongoDevice.objects.get(device_id=device_id)
  126. except Exception as e:
  127. raise PortError("device_id", "设备id参数异常")
  128. device_name = device_info.device_name
  129. if not device_name:
  130. device_name = MongoDeviceType.objects.get(id=4).type_name
  131. up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
  132. try:
  133. queryset = MongoSCDData.objects.filter(device_id=device_info.id).order_by('-id')[0]
  134. data_info = eval(queryset.device_data)
  135. except Exception as e:
  136. data_info = {}
  137. ws = data_info.get('ws', '0')
  138. ws_status = "待机"
  139. if ws == "1":
  140. ws_status = "工作"
  141. elif ws == "2":
  142. ws_status = "充电"
  143. tt = data_info.get('tt', '0')
  144. if tt == '0':
  145. tt = '常亮'
  146. rps_status = "正常" if data_info.get("rps", "0") == "0" else "保护"
  147. data = {
  148. "address": f"{device_info.province}{device_info.city}{device_info.district}",
  149. "uptime": up_date.strftime("%Y-%m-%d %H:%M:%S"),
  150. "device_name": device_name,
  151. "device_id": device_info.device_id,
  152. 'device_status': "在线" if device_info.device_status == 1 else "离线",
  153. "ws_status": ws_status,
  154. "rps_status": rps_status,
  155. "tt": tt,
  156. "at": data_info.get('at', ''),
  157. "ah": data_info.get('ah', ''),
  158. "ct": data_info.get('ct', '0'),
  159. "csq": data_info.get('csq', '0')
  160. }
  161. return data
  162. @kedong_deco(login_required=True)
  163. def xycb_gis_info(request):
  164. """
  165. 性诱测报GIS展示信息
  166. 参数
  167. device_id 必传(str) 设备ID
  168. 返回值:
  169. "data": {
  170. "address": "河南省新乡市原阳县", 设备地址
  171. "uptime": "2022-01-02 12:12:12", 最新上传时间
  172. "device_name": "xxxxxx", 设备名称
  173. "device_id":"xxxxxxxxxxx", 设备ID
  174. 'device_status': "在线", 设备状态
  175. "at": "30", 温度
  176. "ah": "50", 湿度
  177. "ws_status": "待机", 工作状态
  178. "cs_status": "非充电", 充电状态
  179. "bs_status": "正常", 电池状态
  180. "infr_ct": "0", 击虫次数
  181. "csq": "0" 信号强度
  182. }
  183. """
  184. device_id = request.POST.get('device_id')
  185. try:
  186. device_info = MongoDevice.objects.get(device_id=device_id)
  187. except Exception as e:
  188. raise PortError("device_id", "设备id参数异常")
  189. device_name = device_info.device_name
  190. if not device_name:
  191. device_name = MongoDeviceType.objects.get(id=4).type_name
  192. up_date = datetime.datetime.utcfromtimestamp(device_info.uptime)
  193. try:
  194. queryset = MongoXYCBData.objects.filter(device_id=device_info.id).order_by('-id')[0]
  195. data_info = eval(queryset.device_data)
  196. except Exception as e:
  197. data_info = {}
  198. ws = data_info.get('ws', '0')
  199. ws_status = "待机"
  200. if ws == "1":
  201. ws_status = "工作"
  202. elif ws == "2":
  203. ws_status = "充电"
  204. bs = data_info.get('bs', '0')
  205. bs_status = '正常'
  206. if bs == '1':
  207. bs_status = '欠压'
  208. elif bs == '2':
  209. bs_status = '过压'
  210. cs_status = '非充电' if data_info.get('cs', '0') == '0' else '充电'
  211. data = {
  212. "address": f"{device_info.province}{device_info.city}{device_info.district}",
  213. "uptime": up_date.strftime("%Y-%m-%d %H:%M:%S"),
  214. "device_name": device_name,
  215. "device_id": device_info.device_id,
  216. 'device_status': "在线" if device_info.device_status == 1 else "离线",
  217. "at": data_info.get('at', ''),
  218. "ah": data_info.get('ah', ''),
  219. "ws_status": ws_status,
  220. "cs_status": cs_status,
  221. "bs_status": bs_status,
  222. "infr_ct": data_info.get('infr_ct', '0'),
  223. "csq": data_info.get('csq')
  224. }
  225. return data
  226. @kedong_deco(login_required=True)
  227. def get_spore_time(request):
  228. """
  229. 获取孢子仪载玻片/培养夜时间
  230. 获取性诱设备优芯
  231. 参数:
  232. device_type_id 必传 设备类型 7孢子仪 4性诱设备
  233. d_id 必传 设备自增id
  234. 返回:
  235. glass_slide_time 载玻片更换时间
  236. cultivate_time 培养液更换时间
  237. """
  238. post_info = request.POST
  239. device_type_id = post_info.get("device_type_id", '')
  240. d_id = post_info.get("d_id", '')
  241. if not d_id:
  242. raise PortError('d_id', "参数缺失")
  243. if not device_type_id:
  244. raise PortError('device_type_id',"参数缺失")
  245. devices = MongoDevice.objects.get(id=d_id, device_type_id=device_type_id)
  246. if int(device_type_id) == 7:
  247. glass_slide_time = devices.glass_slide_time
  248. cultivate_time = devices.cultivate_time
  249. if glass_slide_time == 0 or cultivate_time == 0:
  250. glass_slide_time = ""
  251. cultivate_time = ""
  252. return {
  253. "glass_slide_time":glass_slide_time,
  254. "cultivate_time":cultivate_time,
  255. }
  256. elif int(device_type_id) == 4:
  257. decoy = devices.decoy
  258. return {
  259. "decoy":decoy
  260. }
  261. @kedong_deco(login_required=True)
  262. def updata_spore_time(request):
  263. """
  264. 更新孢子仪载玻片/培养夜时间
  265. 更新性诱设备诱芯
  266. 参数:
  267. device_type_id 必传 设备类型 7孢子仪 4性诱设备
  268. d_id 必传 设备自增id
  269. glass_slide_time 必传 载玻片更换时间
  270. cultivate_time 必传 培养液更换时间
  271. decoy 必传 性诱设备诱芯
  272. """
  273. myuid = request.myuser.uid
  274. user_type = request.user_type
  275. post_info = request.POST
  276. device_type_id = post_info.get("device_type_id", '')
  277. d_id = post_info.get("d_id", '')
  278. glass_slide_time = post_info.get("glass_slide_time", '')
  279. cultivate_time = post_info.get("cultivate_time", '')
  280. decoy = post_info.get("decoy", '')
  281. if not d_id:
  282. raise PortError('d_id', "参数缺失")
  283. if not device_type_id:
  284. raise PortError('device_type_id',"参数缺失")
  285. try:
  286. devices = MongoDevice.objects.get(id=d_id)
  287. except:
  288. raise PortError('',"未找到此设备")
  289. if int(device_type_id) == 7:
  290. devices.glass_slide_time = glass_slide_time
  291. devices.cultivate_time = cultivate_time
  292. devices.save()
  293. content = "更新孢子仪,载玻片时间:%s,培养夜时间:%s"
  294. operation_log(myuid, content % (glass_slide_time, cultivate_time), devices.device_id, 0, request.ip)
  295. elif int(device_type_id) == 4:
  296. if not decoy:
  297. raise PortError('decoy',"参数缺失")
  298. devices.decoy = decoy
  299. devices.save()
  300. content = "更新性诱设备诱芯:%s"
  301. operation_log(myuid, content % decoy, devices.device_id, 0, request.ip)
  302. return True