|
@@ -88,7 +88,7 @@ class DBManager():
|
|
|
yield json.loads(line)
|
|
|
|
|
|
@staticmethod
|
|
|
- def _convert_to_dataframe(data, mode=0):
|
|
|
+ def _convert_to_bms(data, mode=0):
|
|
|
CellU = []
|
|
|
CellT = []
|
|
|
OtherT = []
|
|
@@ -108,10 +108,12 @@ class DBManager():
|
|
|
for i in range(OtherT_Num):
|
|
|
CellU.append(data['ffBatteryStatus']['otherTempList'][i])
|
|
|
if mode == 0:
|
|
|
- data_len = 11
|
|
|
+ data_len = 15
|
|
|
|
|
|
data_block = np.array([data['info']['obdTime'],data['ffBatteryStatus']['rssi'],data['ffBatteryStatus']['errorLevel'],data['ffBatteryStatus']['errorCode']
|
|
|
- ,data['ffBatteryStatus']['current'],data['ffBatteryStatus']['voltageInner'],data['ffBatteryStatus']['chargeState'],data['ffBatteryStatus']['heatState']
|
|
|
+ ,data['ffBatteryStatus']['current'],data['ffBatteryStatus']['voltageInner'],data['ffBatteryStatus']['voltageOutter'],
|
|
|
+ data['ffBatteryStatus']['totalOutputState'],data['ffBatteryStatus']['lockedState'],
|
|
|
+ data['ffBatteryStatus']['chargeState'],data['ffBatteryStatus']['heatState'],data['ffBatteryStatus']['cellVoltageDiff']
|
|
|
,data['ffBatteryStatus']['soc'],data['ffBatteryStatus']['soh'],data['ffBatteryStatus']['cellVolBalance']]).reshape(1,data_len)
|
|
|
elif mode == 1:
|
|
|
data_len = 7
|
|
@@ -128,13 +130,14 @@ class DBManager():
|
|
|
def _convert_to_dataframe_Gps(data, mode=0):
|
|
|
if mode == 0:
|
|
|
if data['info']['subType'] == 1:
|
|
|
- data_block = np.array([data['info']['obdTime'],data['ffGps']['satellites'],data['ffGps']['latitude'],data['ffGps']['longitude']
|
|
|
- ,data['ffGps']['altitude'],data['ffGps']['speed']]).reshape(1,6)
|
|
|
+ data_block = np.array([data['info']['obdTime'],data['ffGps']['locationType'], data['ffGps']['satellites'],
|
|
|
+ data['ffGps']['latitude'],data['ffGps']['longitude'],data['ffGps']['speed'],
|
|
|
+ data['ffGps']['altitude'], data['ffGps']['direction']]).reshape(1,8)
|
|
|
df = pd.DataFrame(
|
|
|
- columns=['时间戳','卫星数','纬度','经度','海拔m','速度[km/h]'],data=data_block)
|
|
|
+ columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'],data=data_block)
|
|
|
elif data['info']['subType'] == 2:
|
|
|
df = pd.DataFrame(
|
|
|
- columns=['时间戳','卫星数','纬度','经度','海拔m','速度[km/h]'])
|
|
|
+ columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'])
|
|
|
if mode == 1:
|
|
|
data_block = np.array([data['info']['obdTime'],data['ffGps']['latitude'],data['ffGps']['longitude']
|
|
|
,data['ffGps']['speed'], data['ffGps']['isValid']]).reshape(1,5)
|
|
@@ -144,9 +147,10 @@ class DBManager():
|
|
|
|
|
|
@staticmethod
|
|
|
def _get_data(urls,type_name,mode=0):
|
|
|
- if type_name == 'BMS':
|
|
|
+ if type_name == 'bms':
|
|
|
if mode == 0:
|
|
|
- name_const = ['时间戳','GSM信号','故障等级','故障代码','总电流[A]','总电压[V]','充电状态','加热','SOC[%]','SOH[%]','单体均衡状态']
|
|
|
+ name_const = ['时间戳','GSM信号','故障等级','故障代码','总电流[A]','总电压[V]', '外电压', '总输出状态', '上锁状态', '充电状态','加热状态',
|
|
|
+ '单体压差', 'SOC[%]','SOH[%]','单体均衡状态']
|
|
|
elif mode == 1:
|
|
|
name_const = ['时间戳','GSM信号','总电流[A]','总电压[V]','充电状态','SOC[%]','SOH[%]']
|
|
|
i=0
|
|
@@ -157,11 +161,11 @@ class DBManager():
|
|
|
for line in DBManager._download_json_data(urls):
|
|
|
et = time.time()
|
|
|
if i==0:
|
|
|
- data_blocks,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe(line, mode)
|
|
|
+ data_blocks,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_bms(line, mode)
|
|
|
i+=1
|
|
|
continue
|
|
|
try:
|
|
|
- data_block,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe(line, mode)
|
|
|
+ data_block,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_bms(line, mode)
|
|
|
except:
|
|
|
continue
|
|
|
data_blocks = np.concatenate((data_blocks,data_block),axis=0)
|
|
@@ -178,35 +182,51 @@ class DBManager():
|
|
|
df_all = pd.DataFrame(columns=columns_name,data=data_blocks)
|
|
|
df_all.loc[:,'时间戳'] = df_all.loc[:,'时间戳'].apply(lambda x:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(x)/1000)))
|
|
|
return df_all
|
|
|
- elif type_name =='GPS':
|
|
|
- df_all = pd.DataFrame(columns=['时间戳','纬度','经度','速度[km/h]','有效位'])
|
|
|
+ elif type_name =='gps':
|
|
|
+ if mode == 0:
|
|
|
+ df_all = pd.DataFrame(columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'])
|
|
|
+ elif mode == 1:
|
|
|
+ df_all = pd.DataFrame(columns=['时间戳','纬度','经度','速度[km/h]','有效位'])
|
|
|
for line in DBManager._download_json_data(urls):
|
|
|
df_add = DBManager._convert_to_dataframe_Gps(line, mode)
|
|
|
df_all = df_all.append(df_add,ignore_index=True)
|
|
|
df_all.loc[:,'时间戳'] = df_all.loc[:,'时间戳'].apply(lambda x:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(x)/1000)))
|
|
|
return df_all
|
|
|
|
|
|
- def get_data(self, bms_url='http://172.16.126.13/store/load?dataType=12&limit=0&sn=', gps_url='http://172.16.126.13/store/load?dataType=16&limit=0&sn=',
|
|
|
- sn='', start_time='', end_time='', gps_switch=True, mode=0):
|
|
|
+ def get_data(self, url='http://172.16.126.13/store/load?dataType={}&limit=0&sn={}', sn='', start_time='', end_time='',
|
|
|
+ data_groups=['bms', 'gps']):
|
|
|
'''
|
|
|
获取指定 sn 和起止日期的bms和gps数据.
|
|
|
添加了重试机制。
|
|
|
|
|
|
--------------输入参数------------
|
|
|
- bms_url:bms 数据url, 可采用默认值
|
|
|
- gps_url: gps 数据url, 可采用默认值
|
|
|
+ url:数据获取url, 可采用默认值
|
|
|
sn: str, 电池sn号
|
|
|
start_time: str, 开始时间
|
|
|
end_time: str, 结束时间
|
|
|
- gps_switch: True:获取gps数据; False:不获取gps数据
|
|
|
- mode: 0:正常取数; 1:7255 取数
|
|
|
+ data_groups: 选择需要获取的数据组,可填入多个字符串(默认只获取bms和gps数据)
|
|
|
+ bms: bms数据
|
|
|
+ gps:gps数据
|
|
|
+ system:system数据
|
|
|
+ accum:accum数据
|
|
|
+
|
|
|
|
|
|
--------------输出参数------------
|
|
|
- bms_data: 获取到的bms数据
|
|
|
- gps_data: 获取到的gps数据
|
|
|
+ df_data: {'bms':dataframe, 'gps':dataframe, 'system':dataframe, ;accum':dataframe}
|
|
|
'''
|
|
|
+
|
|
|
+ if len(set(data_groups) - (set(data_groups) and set(['bms', 'gps', 'system', 'accum']))) > 0:
|
|
|
+ raise Exception("data_groups 参数错误")
|
|
|
+
|
|
|
+ # mode: 0:正常取数; 1:7255 取数
|
|
|
+ if sn[0:2] == 'MG' or sn[0:2] == 'UD':
|
|
|
+ mode = 1
|
|
|
+ else:
|
|
|
+ mode = 0
|
|
|
bms_all_data = pd.DataFrame()
|
|
|
gps_all_data = pd.DataFrame()
|
|
|
+ system_all_data = pd.DataFrame()
|
|
|
+ accum_all_data = pd.DataFrame()
|
|
|
maxnum = (datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S") - datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")).days +1
|
|
|
print("### start to get data {} from {} to {}".format(sn, start_time, end_time))
|
|
|
# 为避免chunkEncodingError错误,数据每天获取一次,然后将每天的数据合并,得到最终的数据
|
|
@@ -218,15 +238,27 @@ class DBManager():
|
|
|
break
|
|
|
elif timeto.strftime('%Y-%m-%d %H:%M:%S') > end_time:
|
|
|
timeto = datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
|
|
|
- File_url_bms = bms_url + sn + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
- File_url_gps = gps_url + sn + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
#print('{}_{}_----getting data----'.format(sn, timefrom))
|
|
|
+ bms_data = pd.DataFrame()
|
|
|
+ gps_data = pd.DataFrame()
|
|
|
+ system_data = pd.DataFrame()
|
|
|
+ accum_data = pd.DataFrame()
|
|
|
while True:
|
|
|
try:
|
|
|
print('\r' + "# get data from {} to {}.........".format(str(timefrom), str(timeto)), end=" ")
|
|
|
- bms_data = DBManager._get_data(File_url_bms,'BMS',mode)
|
|
|
- if gps_switch:
|
|
|
- gps_data = DBManager._get_data(File_url_gps,'GPS', mode)
|
|
|
+ for data_group in data_groups:
|
|
|
+ if data_group == 'bms':
|
|
|
+ file_url = url.format(12, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ bms_data = DBManager._get_data(file_url,'bms',mode)
|
|
|
+ if data_group == 'gps':
|
|
|
+ file_url = url.format(16, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ gps_data = DBManager._get_data(file_url,'gps',mode)
|
|
|
+ if data_group == 'system':
|
|
|
+ file_url = url.format(13, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ system_data = DBManager._get_data(file_url,'system',mode)
|
|
|
+ if data_group == 'accum':
|
|
|
+ file_url = url.format(23, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ accum_data = DBManager._get_data(file_url,'accum',mode)
|
|
|
except Exception as e:
|
|
|
if 'Connection broken' in str(e):
|
|
|
continue
|
|
@@ -234,13 +266,17 @@ class DBManager():
|
|
|
raise Exception
|
|
|
else:
|
|
|
bms_all_data = pd.concat([bms_all_data, bms_data], ignore_index=True)
|
|
|
- if gps_switch:
|
|
|
- gps_all_data = pd.concat([gps_all_data, gps_data], ignore_index=True)
|
|
|
+ gps_all_data = pd.concat([gps_all_data, gps_data], ignore_index=True)
|
|
|
+ system_all_data = pd.concat([system_all_data, system_data], ignore_index=True)
|
|
|
+ accum_all_data = pd.concat([accum_all_data, accum_data], ignore_index=True)
|
|
|
+
|
|
|
break
|
|
|
- if not bms_all_data.empty:
|
|
|
- bms_all_data = bms_all_data.reset_index(drop=True)
|
|
|
- if not gps_all_data.empty:
|
|
|
- gps_all_data = gps_all_data.reset_index(drop=True)
|
|
|
- print('all data-getting done, total_count is {} \n'.format(str(len(bms_all_data))))
|
|
|
- return bms_all_data, gps_all_data
|
|
|
+
|
|
|
+ bms_all_data = bms_all_data.reset_index(drop=True)
|
|
|
+ gps_all_data = gps_all_data.reset_index(drop=True)
|
|
|
+ system_all_data = system_all_data.reset_index(drop=True)
|
|
|
+ accum_all_data = accum_all_data.reset_index(drop=True)
|
|
|
+ print('\nall data-getting done, bms_count is {}, gps_count is {}, system_count is {}, accum_count is {} \n'.format(
|
|
|
+ str(len(bms_all_data)), str(len(gps_all_data)), str(len(system_all_data)), str(len(accum_all_data))))
|
|
|
+ return {'bms':bms_all_data, 'gps':gps_all_data, 'system':system_all_data, 'accum':accum_all_data}
|
|
|
|