11from collections import defaultdict
22from datetime import datetime
3-
3+ import matplotlib . pyplot as plt
44import pandas
55import requests
66from flask import json
7+ from matplotlib .font_manager import FontProperties
78
89
910def url ():
1011 return 'http://123.139.89.242:60000/api/rxframes'
1112
1213
13-
1414def params_generate (_page , _perPage , _sortDir , _sortField ):
1515 params = []
1616 params .append (['_page' , _page ])
@@ -20,30 +20,82 @@ def params_generate(_page, _perPage, _sortDir, _sortField):
2020 print (params )
2121 return params
2222
23- def generate_table ():
23+
24+ def parse_time (time_str ):
25+ try :
26+ return datetime .strptime (time_str , '%Y-%m-%dT%H:%M:%S.%fZ' )
27+ except ValueError :
28+ return datetime .strptime (time_str , '%Y-%m-%dT%H:%M:%SZ' )
29+
30+
31+ def generate_table (only_warn = '否' ):
32+ print (only_warn )
2433 headers = {
2534 'Authorization' : 'Digest username="admin", realm="lorawan-server", nonce="1926482c41e2ef6920550754dd337b9d", uri="/api/rxframes?_page=1&_perPage=30&_sortDir=DESC&_sortField=datetime", response="49f64634dce3c378e78113455f32ecb4"'
2635 }
27- response = requests .get (url (), headers = headers , params = params_generate (1 , 30 , 'DESC' , 'datetime' ))
28- data = json .loads (response .content )
36+ response = requests .get (url (), headers = headers , params = params_generate (1 , 1000 , 'DESC' , 'datetime' ))
37+ response_data = json .loads (response .content )
2938
3039 # 创建一个字典对象,以devaddr作为key,默认值为一个空列表
3140 grouped_data = {}
3241
3342 # 遍历原始列表中的元素,将每个元素添加到它对应的devaddr的列表中
34- for item in data :
35- item ['datetime' ] = datetime . strptime (item ['datetime' ], "%Y-%m-%dT%H:%M:%S.%fZ" )
43+ for item in response_data :
44+ item ['datetime' ] = parse_time (item ['datetime' ])
3645 if item ['devaddr' ] not in grouped_data :
37- grouped_data [item ['devaddr' ]]= []
46+ grouped_data [item ['devaddr' ]] = []
3847 grouped_data [item ['devaddr' ]].append (item )
3948
4049 # 对每个devaddr的列表按照datetime从新到旧排序
4150 for devaddr in grouped_data :
4251 grouped_data [devaddr ].sort (key = lambda x : x ['datetime' ], reverse = True )
4352
44- result = []
53+ result = []
4554 for key in grouped_data :
46- item = grouped_data .get (key )[0 ]
47- result .append ([item ['devaddr' ],item ['datetime' ]])
55+ try :
56+ item = grouped_data .get (key )[0 ]
57+ data = item ['data' ]
58+ last_eight = data [- 8 :]
59+ TH = int (str (last_eight [0 :2 ]), 16 )
60+ TL = int (str (last_eight [2 :4 ]), 16 )
61+ HH = int (str (last_eight [4 :6 ]), 16 )
62+ HL = int (str (last_eight [6 :8 ]), 16 )
63+
64+ tem = ((TH & 7 ) * 256 + TL ) * 0.0625
65+ hum = ((HH & 3 ) * 256 + HL ) / 10
66+ warn = False
67+ if tem > 35 :
68+ warn = True
69+ if only_warn == '否' or warn == True :
70+ result .append ([item ['devaddr' ], item ['datetime' ], tem , hum , warn ])
71+
72+ except :
73+ pass
74+
75+ return pandas .DataFrame (result , columns = ['devaddr' , '时间' , '温度' , '湿度' , '是否报警' ]).to_html ()
76+
77+ def draw ():
78+ # 假设数据在这个列表中
79+ data = [
80+ {'时间' : '2021-01-01' , '温度' : 10 },
81+ {'时间' : '2021-01-02' , '温度' : 11 },
82+ {'时间' : '2021-01-03' , '温度' : 12 },
83+ {'时间' : '2021-01-04' , '温度' : 13 },
84+ {'时间' : '2021-01-05' , '温度' : 12 },
85+ ]
86+
87+ # 将时间和温度分别保存到两个列表中
88+ time_list = [d ['时间' ] for d in data ]
89+ temperature_list = [d ['温度' ] for d in data ]
90+
91+ # 画图
92+ fig , ax = plt .subplots ()
93+ ax .plot (time_list , temperature_list )
94+ ax .set (xlabel = 'datetime' , ylabel = '温度' , title = '温度变化折线图' )
95+ ax .grid ()
96+
97+ # 将绘制的图形保存到文件中
98+ fig .savefig ("temperature.png" )
4899
49- return pandas .DataFrame (result , columns = ['devaddr' ,'datetime' ]).to_html ()
100+ if __name__ == "__main__" :
101+ draw ()
0 commit comments