def init_smtp(): """ smtpの設定処理 """ global smtp global smtp_addr # データベースに格納してあるSMTPの情報を取得する smtp_cur = common.connect_database_project() # 送信元のアドレスはプロジェクトごとに一意であること。 smtp_cur.execute("SELECT * FROM m_smtp_mail;") for smtp_row in smtp_cur.fetchall(): # SQLで取得したSMTPの情報を各変数に分割して格納 smtp_host = smtp_row[1] smtp_port = smtp_row[2] smtp_name = smtp_row[3] smtp_pass = smtp_row[4] smtp_addr = smtp_row[5] # 取得したSMTPの情報をもとにSMTP接続する smtp = smtplib.SMTP(smtp_host, smtp_port) smtp.login(smtp_name, smtp_pass) # 後処理としてクローズ処理を実行する common.close_con_connect(common.pj_con, smtp_cur)
def get_data(): """ 直近の測定値を取得する処理 """ data_cur = common.connect_database_project() # 直近のデータを取得するSQL句の発行 sel_sql = "SELECT * FROM farm ORDER BY desc, time DESC LIMIT 1;" # SQLを実行する data_cur.execute(sel_sql) for row in data_cur.fetchall(): d_day = row[0] d_time = row[1] common.close_con_connect(common.pj_con, data_cur) check_data(d_day, d_time)
def get_data(): """ 測定値テーブルに接続して、測定値を取得する処理 """ data_cur = common.connect_database_project() # 直近のデータを取得するSQL句の発行 sel_sql = "SELECT * FROM data ORDER BY day DESC, time DESC LIMIT 1;" # SQLを実行する data_cur.execute(sel_sql) for row in data_cur.fetchall(): fact_id = row[0] # 工場ID tank_no = row[1] # 水槽ID day_tbl = row[2] # 日付 time_tbl = row[3] # 時刻 water_temp = row[4] # 水温 salinity = row[5] # 塩分濃度 do = row[6] # 溶存酸素 # デバッグ用。取得した値を出力する print("工場ID:" + str(fact_id)) print("水槽ID:" + str(tank_no)) print("日付:" + str(day_tbl)) print("時間:" + str(time_tbl)) print("水温" + str(water_temp)) print("塩分濃度" + str(salinity)) print("溶存酸素" + str(do)) # 後処理 common.close_con_connect(common.pj_con, data_cur) # 測定値チェック処理の呼び出し(引数には取得した測定値を渡す) check_data(day_tbl, time_tbl, water_temp, salinity, do)
def get_data(): """ 測定値テーブルに接続して、測定値を取得する処理 """ data_cur = common.connect_database_project() # 直近のデータを取得するSQL句の発行 sel_sql = "SELECT * FROM farm ORDER BY day DESC, time DESC LIMIT 1;" # SQLの実行 data_cur.execute(sel_sql) for data_row in data_cur.fetchall(): day_tbl = data_row[0] time_tbl = data_row[1] soil_temp = data_row[2] soil_wet = data_row[3] soil_ec = data_row[4] air_temp = data_row[5] air_wet = data_row[6] # デバッグ用。取得した値を出力する print("日付:" + str(day_tbl)) print("時刻:" + str(time_tbl)) print("土壌温度" + str(soil_temp)) print("土壌湿度" + str(soil_wet)) print("土壌電気伝導度" + str(soil_ec)) print("気温" + str(air_temp)) print("湿度" + str(air_wet)) common.close_con_connect(common.pj_con, data_cur) # 測定値チェック処理の呼び出し check_data(day_tbl, time_tbl, soil_temp, soil_wet, soil_ec, air_temp, air_wet)
def check_data(data_day, data_time): """ 測定値が取得できているかチェックする関数 """ global alert_flg global line_message # 共通データベースにアクセスする check_cur = common.connect_database_common() # 監視テーブルから、プロジェクトのデータを取得するSQL sel_sql = "SELECT * FROM m_monitor WHERE system_name = '" + \ common.pj_name + "' AND monitor_name = 'KEISOKU';" # 監視テーブルの値をOKで更新するSQL upd_ok_sql = "UPDATE m_monitor SET MONITOR_STATUS = 'OK' , \ CHK_TIMESTAMP = NOW() WHERE SYSTEM_ID = '" + \ common.pj_name + "' AND monitor_name ='KEISOKU';" upd_ng_sql = "UPDATE m_monitor SET MONITOR_STATUS = 'NG' , \ CHK_TIMESTAMP = NOW() WHERE SYSTEM_ID = '" + \ common.pj_name + "' AND monitor_name ='KEISOKU';" # 監視履歴テーブルの値をOKでINSERTするSQL ins_ok_sql = "INSERT INTO h_monitor ( \ system_id, system_name, monitor_name, monitor_status, check_time) \ VALUES (" # 監視履歴テーブルの値をNGでINSERTするSQL ins_ng_sql = "INSERT INTO h_monitor ( \ system_id, system_name, monitor_name, monitor_status, check_time) \ VALUES( " # 時刻の表示が「05:00:00」でなく「5:00:00」のため桁合わせ if len(format(data_time)) == 7: day_time = format(data_day) + " 0" + format(data_time) + ".999999" else: day_time = format(data_day) + " " + format(data_time) + ".999999" # 測定値が直近のものか(5分前と比較)判断、測定が止まっていればアラート通知 if format(day_time) < format(before_5min): # 古い測定値なので測定停止のアラート通知を行う check_cur.execute(sel_sql) for monitor_row in check_cur.fetchall(): sys_id = monitor_row[0] sys_name = monitor_row[1] monitor_name = monitor_row[2] monitor_status = monitor_row[3] if monitor_status == "OK": alert_flg = "ON" # アラート通知を"ON"にする(計測停止のLINE通知) line_message = line_message + "\n計測が停止しています。" # INSERT句の生成 ins_ng_sql = ins_ng_sql + sys_id + ", '" + sys_name + \ "', '" + monitor_name + "', 'NG', NOW() )" # システム監視テーブルのUPDATE check_cur.execute(upd_ng_sql) # 監視履歴テーブルのINSERT check_cur.execute(ins_ng_sql) else: check_cur.execute(sel_sql) for monitor_row in check_cur.fetchall(): sys_id = monitor_row[0] sys_name = monitor_row[1] monitor_name = monitor_row[2] monitor_status = monitor_row[3] if monitor_status == "NG": alert_flg = "ON" # アラート通知を"ON"にする(計測再開のLINE通知) line_message = line_message + "\n計測を再開しました。" # INSERT句の生成 ins_ok_sql = ins_ok_sql + sys_id + ", '" + sys_name + \ "', '" + monitor_name + "', 'OK', NOW() )" # システム監視テーブルのUPDATE(強制的にタイムスタンプを更新) check_cur.execute(upd_ok_sql) # 監視履歴テーブルのINSERT check_cur.execute(ins_ok_sql) common.close_con_connect(common.common_con, check_cur)