weather.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. # -*- coding:utf-8 -*-
  2. # @Time : 2020/5/22 2:22 下午
  3. # @Author : Creat by Han
  4. import json
  5. import copy
  6. import datetime
  7. import time
  8. import os
  9. import requests
  10. from django.forms.models import model_to_dict
  11. from django.db.models import Q
  12. from django.conf import settings
  13. from kedong.decoration import kedong_deco, PortError
  14. from smartfarming.models.device import MongoDevice
  15. from smartfarming.models.weather import MongoQXZ_Base_Info, QXZdata_New, MongoQXZ_Conf, QXZstatus_New
  16. from smartfarming.api.views.weather.all_dict import qxz_dict
  17. config_dict = settings.CONFIG
  18. @kedong_deco(login_required=True)
  19. def qxz_page(request):
  20. """
  21. 气象设备列表接口 :
  22. 参数:
  23. page 非必传(num) 页码,默认为1
  24. device_id 非必传(str) 设备号
  25. device_status 非必传(str) 在线状态 1在线 0离线
  26. device_name 非必传(str) 设备名称
  27. device_type 非必传(str) 5气象站 8墒情站
  28. 返回值:
  29. {
  30. "data": {
  31. "ids": [
  32. {
  33. "d_id":"", 设备数据库ID
  34. "equip_name":"", 设备名称
  35. "equip_id":12313456, 设备ID
  36. "is_online":1, 在线状态 1在线 0离线
  37. "rssi":10, 信号强度
  38. "volt":22, 电压
  39. "lng":113, 经度
  40. "lat":113, 纬度
  41. "off_time":"" 离线时间
  42. "address":"" 设备地址
  43. "device_expire_time": 1234444 设备到期时间
  44. "device_expire": # 设备状态 0未到期,1已到期,2即将到期
  45. "device_expire_days": 到期天数
  46. }
  47. ],
  48. "nums": 0 设备总数
  49. },
  50. "formError": {},
  51. "errorCode": 0,
  52. "message": "",
  53. "params": {}
  54. }
  55. """
  56. device_id = request.POST.get("device_id")
  57. device_status = request.POST.get("device_status")
  58. device_name = request.POST.get("device_name")
  59. page = request.POST.get("page","")
  60. page_size = request.POST.get("page_size","")
  61. device_type = request.POST.get("device_type","5")
  62. if not page and not page_size:
  63. page = 1
  64. page_size = 8
  65. else:
  66. if not page.isdigit() and not page_size.isdigit():
  67. raise PortError("","字段类型有误")
  68. else:
  69. page = int(page)
  70. page_size = int(page_size)
  71. if device_type not in ("5","8"):
  72. raise PortError("","参数超出范围")
  73. devices = MongoDevice.objects.filter(device_type_id=device_type).order_by('-device_status', '-uptime')
  74. #设备状态查询
  75. if device_status:
  76. devices = devices.filter(device_status=int(device_status))
  77. #设备号查询
  78. if device_id:
  79. devices = devices.filter(Q(device_id__icontains=device_id) | Q(device_name__icontains=device_id))
  80. #设备名称查询
  81. if device_name:
  82. devices = devices.filter(device_name__icontains=device_name)
  83. date = []
  84. nums = devices.count()
  85. result = devices[(page_size*(page-1)):(page*page_size)]
  86. result_device_id_list = [item.device_id for item in result]
  87. qxz_base_dict = {item.device_id: item for item in MongoQXZ_Base_Info.objects.filter(device_id__in=result_device_id_list)}
  88. for i in result:
  89. try:
  90. qxz_base = qxz_base_dict[i.device_id]
  91. rssi = qxz_base.rssi
  92. volt = qxz_base.volt
  93. except:
  94. rssi = ""
  95. volt = ""
  96. lng = i.lng
  97. lat = i.lat
  98. address = i.province+i.city+i.district
  99. is_online = i.device_status
  100. uptime = i.uptime
  101. date.append({
  102. "d_id":i.id,
  103. "equip_name":i.device_name,
  104. "equip_id":i.device_id,
  105. "volt":volt,
  106. "rssi":rssi,
  107. "lng":lng,
  108. "lat":lat,
  109. "address":address,
  110. "is_online":is_online,
  111. "uptime":uptime,
  112. })
  113. data = {'ids':date, 'nums': nums}
  114. return data
  115. @kedong_deco(login_required=True)
  116. def qxz_detail(request):
  117. """
  118. 气象历史数据接口 :
  119. 参数:
  120. device_id 必传(string)
  121. page 非必传(num) 页码,默认为1
  122. start_time 非必传(string 时间戳) 开始时间 (用于时间搜索)
  123. end_time 非必传(string 时间戳) 结束时间 (用于时间搜索)
  124. 返回值:
  125. {
  126. "data": {
  127. "conf": {
  128. "e1":x.e1,"e2":x.e2,"e3":x.e3,"e4":x.e4,"e5":x.e5,
  129. "e6":x.e6,"e7":x.e7,"e8":x.e8,"e9":x.e9,"e10":x.e10,
  130. "e11":x.e11,"e12":x.e12,"e13":x.e13,"e14":x.e14,
  131. "e15":x.e15,"e16":x.e16,"e17":x.e17,"e18":x.e18,
  132. "e19":x.e19,"e20":x.e20,"e21":x.e21,"e22":x.e22,
  133. "e23":x.e23,"e24":x.e24,"e25":x.e25,"e26":x.e26,
  134. "e27":x.e27,"e28":x.e28,"e29":x.e29,"e30":x.e30
  135. },
  136. "nums": 0,
  137. "rainFall": 1 气象设备是否具有日雨量累计因子,有返回1,无返回0
  138. "data": [
  139. {
  140. "e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  141. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  142. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  143. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  144. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  145. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  146. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30,
  147. "upl_time":qxz_list.upl_time.strftime('%Y-%m-%d %H:%M:%S')
  148. },
  149. {
  150. "e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  151. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  152. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  153. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  154. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  155. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  156. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30,
  157. "upl_time":qxz_list.upl_time.strftime('%Y-%m-%d %H:%M:%S')
  158. },...
  159. ]
  160. }
  161. "params": {},
  162. "formError": {},
  163. "errorCode": 0,
  164. "message": "",
  165. }
  166. """
  167. f_tbegin = request.POST.get('start_time')
  168. f_tend = request.POST.get('end_time')
  169. device_id = request.POST.get("device_id")
  170. try:
  171. device = MongoDevice.objects.get(device_id=device_id)
  172. device_expire = device.device_expire
  173. device_expire_time = device.device_expire_time
  174. except:
  175. raise PortError('device_id',"暂无此设备")
  176. qxz_list = QXZdata_New.objects.filter(device_id=device_id)
  177. myuser_type = request.user_type
  178. if not myuser_type == 1 and not myuser_type == 5:
  179. if f_tbegin and int(f_tend) > int(device_expire_time):
  180. f_tend = device_expire_time
  181. if f_tbegin and f_tend:
  182. qxz_list =qxz_list.filter(uptime__range=(int(f_tbegin),int(f_tend))).order_by('-id')
  183. page = int(request.POST.get('page',1))
  184. data = []
  185. nums = qxz_list.count()
  186. conf = {}
  187. if nums:
  188. for i in qxz_list[(10*(page-1)):(page*10)]:
  189. dat = {}
  190. for e in range(1, 31):
  191. k = f'e{e}'
  192. v = getattr(i, k)
  193. dat[k] = v or ""
  194. data.append({"dat": dat, "time": i.uptime})
  195. try:
  196. x = MongoQXZ_Conf.objects.get(device_id=device_id)
  197. conf = {}
  198. for e in range(1, 31):
  199. k = f'e{e}'
  200. v = getattr(x, k)
  201. conf[k] = v or ""
  202. except Exception as e:
  203. conf = {}
  204. rainFall = 0
  205. for factor in conf.values():
  206. if factor == "降雨量累计#mm":
  207. rainFall = 1
  208. break
  209. data1 = {"data":data,"nums":nums,"conf":conf,"rainFall":rainFall}
  210. return data1
  211. @kedong_deco(login_required=True)
  212. def qxz_status(request):
  213. """
  214. 气象详情接口 :
  215. 参数:
  216. device_id 必传(string)
  217. 返回值:
  218. {
  219. "data": {
  220. 'dat':{
  221. "e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  222. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  223. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  224. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  225. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  226. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  227. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30,
  228. "upl_time":qxz_list.upl_time.strftime('%Y-%m-%d %H:%M:%S')
  229. },
  230. 'conf':{
  231. "e1":x.e1,"e2":x.e2,"e3":x.e3,"e4":x.e4,"e5":x.e5,
  232. "e6":x.e6,"e7":x.e7,"e8":x.e8,"e9":x.e9,"e10":x.e10,
  233. "e11":x.e11,"e12":x.e12,"e13":x.e13,"e14":x.e14,
  234. "e15":x.e15,"e16":x.e16,"e17":x.e17,"e18":x.e18,
  235. "e19":x.e19,"e20":x.e20,"e21":x.e21,"e22":x.e22,
  236. "e23":x.e23,"e24":x.e24,"e25":x.e25,"e26":x.e26,
  237. "e27":x.e27,"e28":x.e28,"e29":x.e29,"e30":x.e30
  238. },
  239. "led":0, 0 无led点阵屏功能 1 有led点阵屏功能
  240. "ledinfo":"点阵屏内容"
  241. },
  242. "errorCode": 0,
  243. "message": "",
  244. "formError": {}
  245. }
  246. """
  247. e_id = request.POST.get("device_id")
  248. if not e_id:
  249. raise PortError("","参数缺失")
  250. qxz_list = QXZstatus_New.objects.filter(device_id=e_id).first()
  251. if not qxz_list:
  252. raise PortError("","未找到此设备")
  253. data = []
  254. dat = {"e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  255. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  256. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  257. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  258. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  259. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  260. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30, "uptime":qxz_list.uptime}
  261. try:
  262. x = MongoQXZ_Conf.objects.get(device_id=e_id)
  263. conf = {"e1":x.e1,"e2":x.e2,"e3":x.e3,"e4":x.e4,"e5":x.e5,
  264. "e6":x.e6,"e7":x.e7,"e8":x.e8,"e9":x.e9,"e10":x.e10,
  265. "e11":x.e11,"e12":x.e12,"e13":x.e13,"e14":x.e14,
  266. "e15":x.e15,"e16":x.e16,"e17":x.e17,"e18":x.e18,
  267. "e19":x.e19,"e20":x.e20,"e21":x.e21,"e22":x.e22,
  268. "e23":x.e23,"e24":x.e24,"e25":x.e25,"e26":x.e26,
  269. "e27":x.e27,"e28":x.e28,"e29":x.e29,"e30":x.e30}
  270. except:
  271. conf = {}
  272. try:
  273. led = MongoQXZ_Base_Info.objects.get(device_id=e_id).led
  274. except:
  275. led = "0"
  276. try:
  277. ledinfo = MongoQXZ_Base_Info.objects.get(device_id=e_id).ledinfo
  278. except:
  279. ledinfo = ""
  280. data = {'dat':dat,'conf':conf, "led":led,"ledinfo":ledinfo}
  281. return data
  282. @kedong_deco(login_required=True)
  283. def qxz_data_chart(request):
  284. """
  285. 气象折线图接口 :
  286. 参数:
  287. device_id 必传(string)
  288. begin 必传(string 时间戳) 开始时间 (用于时间搜索) 默认近一个月
  289. end 非必传(string 时间戳) 结束时间 (用于时间搜索)
  290. 返回值:
  291. {
  292. "data": {
  293. "conf": {
  294. "e1":x.e1,"e2":x.e2,"e3":x.e3,"e4":x.e4,"e5":x.e5,
  295. "e6":x.e6,"e7":x.e7,"e8":x.e8,"e9":x.e9,"e10":x.e10,
  296. "e11":x.e11,"e12":x.e12,"e13":x.e13,"e14":x.e14,
  297. "e15":x.e15,"e16":x.e16,"e17":x.e17,"e18":x.e18,
  298. "e19":x.e19,"e20":x.e20,"e21":x.e21,"e22":x.e22,
  299. "e23":x.e23,"e24":x.e24,"e25":x.e25,"e26":x.e26,
  300. "e27":x.e27,"e28":x.e28,"e29":x.e29,"e30":x.e30
  301. },
  302. "nums": 0,
  303. "data": [
  304. {
  305. "e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  306. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  307. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  308. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  309. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  310. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  311. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30,
  312. "upl_time":qxz_list.upl_time.strftime('%Y-%m-%d %H:%M:%S')
  313. },
  314. {
  315. "e1":qxz_list.e1,"e2":qxz_list.e2,"e3":qxz_list.e3,"e4":qxz_list.e4,"e5":qxz_list.e5,
  316. "e6":qxz_list.e6,"e7":qxz_list.e7,"e8":qxz_list.e8,"e9":qxz_list.e9,"e10":qxz_list.e10,
  317. "e11":qxz_list.e11,"e12":qxz_list.e12,"e13":qxz_list.e13,"e14":qxz_list.e14,
  318. "e15":qxz_list.e15,"e16":qxz_list.e16,"e17":qxz_list.e17,"e18":qxz_list.e18,
  319. "e19":qxz_list.e19,"e20":qxz_list.e20,"e21":qxz_list.e21,"e22":qxz_list.e22,
  320. "e23":qxz_list.e23,"e24":qxz_list.e24,"e25":qxz_list.e25,"e26":qxz_list.e26,
  321. "e27":qxz_list.e27,"e28":qxz_list.e28,"e29":qxz_list.e29,"e30":qxz_list.e30,
  322. "upl_time":qxz_list.upl_time.strftime('%Y-%m-%d %H:%M:%S')
  323. },...
  324. ]
  325. }
  326. "params": {},
  327. "formError": {},
  328. "errorCode": 0,
  329. "message": "",
  330. }
  331. """
  332. device_id = request.POST.get("device_id")
  333. data = []
  334. f_tbegin = request.POST.get('begin')
  335. f_tend = request.POST.get('end')
  336. try:
  337. device = MongoDevice.objects.get(device_id=device_id)
  338. device_expire = device.device_expire
  339. device_expire_time = device.device_expire_time
  340. except:
  341. raise PortError('device_id',"暂无此设备")
  342. qxz_list = QXZdata_New.objects.filter(device_id=device_id)
  343. myuser_type = request.user_type
  344. if not myuser_type == 1 and not myuser_type == 5:
  345. if f_tbegin and int(f_tend) > int(device_expire_time):
  346. f_tend = device_expire_time
  347. if f_tbegin and f_tend:
  348. qxz_list =qxz_list.filter(uptime__range=(int(f_tbegin),int(f_tend))).order_by('-id')
  349. conf = {}
  350. for i in qxz_list:
  351. data.append({"dat":{"e1":i.e1,"e2":i.e2,"e3":i.e3,"e4":i.e4,"e5":i.e5,
  352. "e6":i.e6,"e7":i.e7,"e8":i.e8,"e9":i.e9,"e10":i.e10,
  353. "e11":i.e11,"e12":i.e12,"e13":i.e13,"e14":i.e14,
  354. "e15":i.e15,"e16":i.e16,"e17":i.e17,"e18":i.e18,
  355. "e19":i.e19,"e20":i.e20,"e21":i.e21,"e22":i.e22,
  356. "e23":i.e23,"e24":i.e24,"e25":i.e25,"e26":i.e26,
  357. "e27":i.e27,"e28":i.e28,"e29":i.e29,"e30":i.e30},
  358. "time":i.uptime})
  359. try:
  360. x = MongoQXZ_Conf.objects.get(device_id=device_id)
  361. conf = {"e1":x.e1,"e2":x.e2,"e3":x.e3,"e4":x.e4,"e5":x.e5,
  362. "e6":x.e6,"e7":x.e7,"e8":x.e8,"e9":x.e9,"e10":x.e10,
  363. "e11":x.e11,"e12":x.e12,"e13":x.e13,"e14":x.e14,
  364. "e15":x.e15,"e16":x.e16,"e17":x.e17,"e18":x.e18,
  365. "e19":x.e19,"e20":x.e20,"e21":x.e21,"e22":x.e22,
  366. "e23":x.e23,"e24":x.e24,"e25":x.e25,"e26":x.e26,
  367. "e27":x.e27,"e28":x.e28,"e29":x.e29,"e30":x.e30}
  368. except:
  369. conf = {}
  370. data1 = {"data":data,"conf":conf}
  371. return data1