main.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. __author__ = 'lmstack'
  2. #coding=utf-8
  3. import os
  4. import datetime
  5. import pandas as pd
  6. from LIB.BACKEND import DBManager, Log
  7. from sqlalchemy import create_engine
  8. from sqlalchemy.orm import sessionmaker
  9. import soc_version_20220812
  10. import time, datetime
  11. import traceback
  12. from LIB.MIDDLE.CellStateEstimation.Common import log
  13. from LIB.MIDDLE.CellStateEstimation.BatDiag.V1_0_0 import CBMSBatDiag
  14. from LIB.MIDDLE.CellStateEstimation.Common.V1_0_1 import DBDownload
  15. from urllib import parse
  16. import pymysql
  17. import pdb
  18. from apscheduler.schedulers.blocking import BlockingScheduler
  19. import datacompy
  20. import logging
  21. import multiprocessing
  22. #...................................电池包SOC计算......................................................................................................................
  23. def SOC_cal():
  24. start=time.time()
  25. now_time=datetime.datetime.now()
  26. start_time=now_time-datetime.timedelta(seconds=300)
  27. start_time=start_time.strftime('%Y-%m-%d %H:%M:%S')
  28. end_time=now_time.strftime('%Y-%m-%d %H:%M:%S')
  29. #数据库配置
  30. host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
  31. port=3306
  32. db='safety_platform'
  33. user='qx_read'
  34. password='Qx@123456'
  35. db_res_engine = create_engine(
  36. "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
  37. user, parse.quote_plus(password), host, port, db
  38. ))
  39. for i in range(0, len(df_sn)):
  40. factory = "骑享"
  41. sn = df_sn.loc[i, 'sn']
  42. try:
  43. if df_sn.loc[i, 'imei'][5:9] == 'N640':
  44. celltype=1 #6040三元电芯
  45. elif df_sn.loc[i, 'imei'][5:9] == 'N440':
  46. celltype=2 #4840三元电芯
  47. elif df_sn.loc[i, 'imei'][5:9] == 'L660':
  48. celltype=99 # 6060锂电芯
  49. elif df_sn.loc[i, 'imei'][3:5] == 'LX' and df_sn.loc[i, 'imei'][5:9] == 'N750':
  50. celltype=3 #力信 50ah三元电芯
  51. elif df_sn.loc[i, 'imei'][3:5] == 'CL' and df_sn.loc[i, 'imei'][5:9] == 'N750':
  52. celltype=4 #CATL 50ah三元电芯
  53. elif df_sn.loc[i, 'imei'][3:9] == 'CLL128':
  54. celltype=100 # 重卡
  55. factory = "金茂换电"
  56. elif df_sn.loc[i, 'imei'][0:6] == 'SPFPFL':
  57. celltype=200#储能电站
  58. factory = "平峰"
  59. else:
  60. logger.info("pid-{} celltype-{} SN: {} SKIP!".format(os.getpid(), "未知", sn))
  61. continue
  62. logger.info("pid-{} celltype-{} SN: {} START!".format(os.getpid(), celltype, sn))
  63. #读取原始数据库数据........................................................................................................................................................
  64. dbManager = DBManager.DBManager()
  65. df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms'])
  66. df_bms = df_data['bms']
  67. #电池诊断................................................................................................................................................................
  68. if not df_bms.empty:
  69. SOC_result=soc_version_20220812.soc_test(sn,df_bms)
  70. SOC_result.columns=['sn','soc','time']
  71. SOC_result.reset_index(inplace=True,drop=True)
  72. print(SOC_result)
  73. #新增故障筛选并存入数据库.....................................................................
  74. if not SOC_result.empty: #新增写入数据库
  75. SOC_result.to_sql('pingfeng_soc_cal',con=db_res_engine, if_exists='append',index=False)
  76. end=time.time()
  77. print(end-start)
  78. except Exception as e:
  79. logger.warning(e)
  80. logger.error(traceback.format_exc)
  81. logger.error(u"{} :{},{} 任务运行错误\n".format(sn,start_time,end_time), exc_info=True)
  82. if __name__ == "__main__":
  83. # 时间设置
  84. # now_time = datetime.datetime.now()
  85. # pre_time = now_time + dateutil.relativedelta.relativedelta(days=-1)# 前一日
  86. # end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d 00:00:00")
  87. # start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d 00:00:00")
  88. history_run_flag = False # 历史数据运行标志
  89. def get_sn():
  90. global df_sn
  91. # # 更新sn列表
  92. host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
  93. port=3306
  94. db='qixiang_oss'
  95. user='qixiang_oss'
  96. password='Qixiang2021'
  97. conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
  98. cursor = conn.cursor()
  99. cursor.execute("select sn, imei, add_time from app_device where status in (1,2,3)")
  100. res = cursor.fetchall()
  101. df_sn = pd.DataFrame(res, columns=['sn', 'imei', 'add_time'])
  102. df_sn = df_sn[df_sn['sn'].str.contains('SPFPFL')]
  103. #df_sn = df_sn[df_sn['sn'].str.contains('PK500A20100000941')]
  104. df_sn = df_sn.reset_index(drop=True)
  105. #conn.close();
  106. # # 数据库配置
  107. # host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
  108. # port = 3306
  109. # user = 'qx_cas'
  110. # password = parse.quote_plus('Qx@123456')
  111. # database = 'qx_cas'
  112. # db_engine = create_engine(
  113. # "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
  114. # user, password, host, port, database
  115. # ))
  116. # DbSession = sessionmaker(bind=db_engine)
  117. # # 运行历史数据配置
  118. # df_first_data_time = pd.read_sql("select * from bat_first_data_time", db_engine)
  119. # 日志配置
  120. now_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(":","_")
  121. log_path = 'log/' + now_str
  122. if not os.path.exists(log_path):
  123. os.makedirs(log_path)
  124. log = Log.Mylog(log_name='batDiag', log_level = 'info')
  125. log.set_file_hl(file_name='{}/info.log'.format(log_path), log_level='info', size=1024* 1024 * 100)
  126. log.set_file_hl(file_name='{}/error.log'.format(log_path), log_level='error', size=1024* 1024 * 100)
  127. logger = log.get_logger()
  128. logger.info("pid is {}".format(os.getpid()))
  129. # # 算法参数
  130. # host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
  131. # port=3306
  132. # db='safety_platform'
  133. # user='qx_read'
  134. # password=parse.quote_plus('Qx@123456')
  135. # tablename='all_fault_info'
  136. # db_res_engine = create_engine(
  137. # "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
  138. # user, password, host, port, db
  139. # ))
  140. #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取................
  141. # print("select start_time, end_time, product_id, code, level, info, advice, factory from {}".format(tablename))
  142. # result=pd.read_sql("select start_time, end_time, product_id, code, level, info, advice from all_fault_info where factory = '{}'".format('骑享'), db_res_engine)
  143. # result = result[['start_time', 'end_time', 'product_id', 'code', 'level', 'info', 'advice']]
  144. # df_diag_ram=result[(result['end_time']=='0000-00-00 00:00:00') & (result['code']==119)]
  145. df_bms_ram=pd.DataFrame(columns=['time', 'sn', 'packvolt', 'cellvolt', 'celltemp'])
  146. get_sn()
  147. SOC_cal()
  148. #定时任务.......................................................................................................................................................................
  149. scheduler = BlockingScheduler()
  150. scheduler.add_job(get_sn, 'interval', days=1, id='get_sn')
  151. scheduler.add_job(SOC_cal, 'interval', seconds=300, id='SOC_cal')
  152. try:
  153. scheduler.start()
  154. except Exception as e:
  155. scheduler.shutdown()
  156. logger.error(str(e))