def set_mail_message(): """ 送信するメールメッセージの設定を行う処理 アラートごとの件名とメッセージを設定する """ mail_cur = common.connect_database_project() # メールの件名を作成する mail_subject = subject_head # メールの本文を作成する mail_body = line_message # メール配信フラグがONになっているデータを取得するSQL sel_mail_sql = "SELECT * FROM m_mail WHERE SEND_FLAG = 'ON';" mail_cur.execute(sel_mail_sql) # メールマスタから取得した、対象のメールアドレス分ループさせる。 for mail_row in mail_cur.fetchall(): # SQLで取得したデータを変数へ格納。IDとフラグは保持しない # mail_id = mail_row[0] # mail_name = mail_row[1] mail_address = mail_row[3] print(mail_address) # 送信対象のメールアドレスにメールを送信する send_mail(mail_address, mail_subject, mail_body)
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_image(): """ 画像が生成されているかチェックする関数 """ global alert_flg global line_message global limit_tbl_item # M_CAMERAに接続するための処理 check_camera_cur = common.connect_database_project() # m_monitorに接続するための処理 check_monitor_cur = common.connect_database_common() sel_camera_sql = "SELECT * FROM M_CAMERA WHERE CAMERA_STATUS = '1';" # 監視対象のプロジェクト名、対象システムを指定して、監視テーブルの値を取得するSQL。monitor_nameのあとにはcam_itemを入れる sel_monitor_sql = "SELECT * FROM m_monitor WHERE system_name = '" + \ common.pj_name + "' AND monitor_name = '" # 監視テーブルの値をOKでUPDATEするSQL upd_ok_sql = "UPDATE m_monitor SET MONITOR_STATUS = 'OK' , CHK_TIMESTAMP = NOW() \ WHERE SYSTEM_ID = '" + common.pj_name + "' AND monitor_name = '" # 監視テーブルの値をNGUPDATEするSQL upd_ng_sql = "UPDATE m_monitor SET MONITOR_STATUS = 'NG' , CHK_TIMESTAMP = NOW() \ WHERE SYSTEM_ID = '" + common.pj_name + "' AND monitor_name = '" # 監視履歴テーブルの値を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( " check_camera_cur.execute(sel_camera_sql) # 取得したカメラ台数分ループし、チェックする for row in check_camera_cur.fetchall(): camera_id = row[0] cam_item = "CAMERA" + format(camera_id) # フォルダの更新日をチェック FILE_TIMESTAMP = datetime.datetime.fromtimestamp( os.path.getmtime(IMAGE_DIR + "/" + format(camera_id) + "/" + format(date_today).replace("-", ""))) # 画像生成が停止しているか判定 if format(FILE_TIMESTAMP) < format(before_5min): # 画像フォルダのタイムスタンプが5分前より古いので画像停止のアラート通知を行う # 監視テーブルの値を取得するSQLに、cam_itemを指定して完成させる sel_monitor_sql = sel_monitor_sql + cam_item + "';" # 監視テーブルの値を取得 check_monitor_cur.execute(sel_monitor_sql) for monitor_row in check_monitor_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" + cam_item + " の画像生成が停止しています。" # INSERT句の生成 ins_ng_sql = ins_ng_sql + sys_id + ", '" + sys_name + \ "', '" + monitor_name + "', 'NG', NOW() )" # システム監視テーブルの更新 upd_ng_sql = upd_ng_sql + cam_item + "';" check_monitor_cur.execute(upd_ng_sql) # 監視履歴テーブルのINSERT check_monitor_cur.execute(ins_ng_sql) check_monitor_cur.close() else: # 監視テーブルの値を取得するSQLに、cam_itemを指定して完成させる sel_monitor_sql = sel_monitor_sql + cam_item + "';" check_monitor_cur.execute(sel_monitor_sql) for monitor_row in check_monitor_cur.fetchall(): monitor_status = monitor_row[3] if monitor_status == "NG": alert_flg = "ON" # アラート通知を"ON"にする(画像生成再開のLINE通知) line_message = line_message + "\n" + cam_item + " の画像生成を再開しました。" # INSERT句の生成 ins_ng_sql = ins_ng_sql + sys_id + ", '" + sys_name + \ "', '" + monitor_name + "', 'NG', NOW() )" # システム監視テーブルの更新(強制的にタイムスタンプを更新) upd_ok_sql = upd_ok_sql + cam_item + "';" check_monitor_cur.execute(upd_ok_sql) # 監視履歴テーブルのINSERT check_monitor_cur.execute(ins_ok_sql) check_monitor_cur.close() # SQLのコミット common.pj_con.commit() common.common_con.commit() # 後処理 check_camera_cur.close() common.pj_con.close() common.common_con.close()
def check_data(data_day, data_time, data_w_temp, data_salinity, data_do): """ 取得した測定値のチェック処理 """ global alert_flg global line_message global limit_tbl_item global current_value # 測定値が直近のものか(10分前と比較)判断、測定が止まっていればアラート通知 day_time = format(data_day) + " " + format(data_time) + ".999999" # SYSTEMの値を取得するSQL sel_sys_sql = "SELECT * FROM m_limit WHERE item = 'SYSTEM';" print("現在:" + str(day_time)) print("10分前:" + str(before_10min)) print("30分前:" + str(before_30min)) # 測定値の時間と、30分前の時間を比較する if format(day_time) <= format(before_30min): # 測定値が最新でない場合、測定停止のアラート通知を行う alert_cur = common.connect_database_project() # SYSTEMの値を更新するSQL upd_sys_sql = "UPDATE m_limit SET flg_sts = 'NG' WHERE item = 'SYSTEM';" alert_cur.execute(sel_sys_sql) for row in alert_cur.fetchall(): limit_tbl_flg = row[4] if limit_tbl_flg == "OK": alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = line_message + "\n測定が停止しています。" # リミットテーブルの更新 alert_cur.execute(upd_sys_sql) # commitしてDBに反映 common.pj_con.commit() alert_cur.close() else: # 測定値が最新の場合、しきい値チェック処理 check_cur = common.connect_database_project() update_cur = common.pj_con.cursor() # しきい値を取得するSQL sel_check_sql = "SELECT * FROM m_limit WHERE item IN ('water_temp', 'salinity', 'do');" # しきい値を取得するSQLの実行 check_cur.execute(sel_check_sql) # しきい値テーブルから取得した値を変数に格納 for row in check_cur.fetchall(): limit_tbl_item = row[1] limit_tbl_max = row[2] limit_tbl_min = row[3] limit_tbl_flg = row[4] # 各項目の測定値をチェック if limit_tbl_item == "water_temp": # 水温 current_value = data_w_temp elif limit_tbl_item == "salinity": # 塩分濃度 current_value = data_salinity elif limit_tbl_item == "do": # 溶存酸素 current_value = data_do else: pass # しきい値のチェックを行う(3回連続で範囲内のときフラグを"OK"に戻す) if (current_value >= limit_tbl_min) and (current_value <= limit_tbl_max): # 正常の範囲内 if limit_tbl_flg == "OK": # フラグの値が"OK"なら何もしない pass elif limit_tbl_flg == "NG": # フラグの値が"NG"なら"1"を立てる limit_tbl_flg = "1" elif limit_tbl_flg == "1": # フラグの値が"1"なら"2"を立てる limit_tbl_flg = "2" elif limit_tbl_flg == "2": # フラグの値が"2"なら"OK"を立て、復旧のLINEメッセージを設定 alert_flg = "ON" # アラート通知を"ON"にする(復旧のLINE通知) limit_tbl_flg = "OK" line_message = set_line_message( line_message) + "が範囲内になりました。" print("範囲内") else: pass elif current_value < limit_tbl_min: # 最低値を下回った場合 if limit_tbl_flg == "OK": # フラグの値が"OK"ならLINEアラート通知(低下) alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = set_line_message( line_message) + "が設定値より低下しました。" print(str(line_message)) else: pass limit_tbl_flg = "NG" # リミットテーブルのフラグに"NG"を立てる elif current_value > limit_tbl_max: # 最大値を上回った場合 if limit_tbl_flg == "OK": # フラグの値が"OK"ならLINEアラート通知(超過) alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = set_line_message( line_message) + "が設定値を超過しました。" print(str(line_message)) else: pass limit_tbl_flg = "NG" # リミットテーブルのフラグに"NG"を立てる # リミットテーブルの更新 upd_limit_sql = "UPDATE m_limit SET flg_sts = '%s' WHERE item = '%s';" % ( limit_tbl_flg, limit_tbl_item) update_cur.execute(upd_limit_sql) # commitしてDBに反映する common.pj_con.commit() print("変数展開したSQL" + upd_limit_sql) # リミットテーブルの更新(測定値、取得再開の判断) check_cur.execute("select * from m_limit where item = 'SYSTEM';") for row in check_cur.fetchall(): limit_tbl_flg = row[4] if limit_tbl_flg == "NG": alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = line_message + "\n計測が再開されました。" print("計測再開") # リミットテーブルの更新 update_sql = "UPDATE m_limit SET flg_sts = 'OK' WHERE item = 'SYSTEM';" update_cur.execute(update_sql) # commitしてDBに反映 common.pj_con.commit() check_cur.close() update_cur.close()
def check_data(data_day, data_time, data_s_temp, data_s_wet, data_s_ec, data_a_temp, data_a_wet): """ 取得した測定値のチェック処理 """ global alert_flg global line_message global limit_tbl_item global current_value # 測定値が直近のものか(10分前と比較)判断、測定が止まっていればアラート通知 day_time = format(data_day) + " " + format(data_time) + ".999999" # SYSTEMの値を取得するSQL sel_sys_sql = "SELECT * FROM limit_tbl WHERE item = 'SYSTEM'" # 測定値の時間と10分前の時間を比較する if format(day_time) <= format(before_10min): # 測定値が最新でない場合、測定停止のアラート通知を行う alert_cur = common.connect_database_project() # SYSTEMの値を更新するSQL upd_sys_sql = "UPDATE limit_tbl SET flg_sts = 'NG' WHERE item = 'SYSTEM'" # SELECTのSQLを実行する alert_cur.execute(sel_sys_sql) for row in alert_cur.fetchall(): limit_tbl_flg = row[4] if limit_tbl_flg == "OK": alert_flg = "ON" # アラート通知をONにする(発生のLINE通知) line_message = line_message + "\n計測が停止しています。" # しきい値テーブルの更新 alert_cur.execute(upd_sys_sql) alert_cur.close() else: # 測定値が最新の場合、しきい値チェック処理 check_cur = common.connect_database_project() update_cur = common.pj_con.cursor() # しきい値を取得するSQL sel_check_sql = "SELECT * FROM limit_tbl WHERE item IN ('SOIL_TEMP','SOIL_WET','AIR_TEMP_1','AIR_WET');" # しきい値を取得するSQLの実行 check_cur.execute(sel_check_sql) # しきい値テーブルから取得した値を変数に格納 for check_row in check_cur.fetchall(): # テーブルの要素を変数に入れる limit_tbl_item = check_row[1] limit_tbl_max = check_row[2] limit_tbl_min = check_row[3] limit_tbl_flg = check_row[4] # 各項目で測定値をチェックする if limit_tbl_item == "SOIL_TEMP": # 土壌温度 current_value = data_s_temp elif limit_tbl_item == "SOIL_WET": # 土壌湿度 current_value = data_s_wet # elif limit_tbl_item == "soil_ec": # 電気伝導度 # current_value = soil_ec elif limit_tbl_item == "AIR_TEMP_1": # 気温 current_value = data_a_temp elif limit_tbl_item == "AIR_WET": # 湿度 current_value = data_a_wet else: pass # しきい値チェック(3回連続で範囲内のときフラグを"OK"に戻す) if (current_value >= limit_tbl_min) and (current_value <= limit_tbl_max): # 正常の範囲内 if limit_tbl_flg == "OK": # フラグの値が"OK"なら何もしない pass elif limit_tbl_flg == "NG": # フラグの値が"NG"なら"1"を立てる limit_tbl_flg = "1" elif limit_tbl_flg == "1": # フラグの値が"1"なら"2"を立てる limit_tbl_flg = "2" elif limit_tbl_flg == "2": # フラグの値が"2"なら"OK"を立て、復旧のLINEメッセージを設定 alert_flg = "ON" # アラート通知を"ON"にする(復旧のLINE通知) limit_tbl_flg = "OK" line_message = set_line_message( line_message) + "が範囲内になりました。" else: pass elif current_value < limit_tbl_min: # 最低値を下回った場合 if limit_tbl_flg == "OK": # フラグの値が"OK"ならLINEアラート通知(低下) alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = set_line_message( line_message) + "が設定値より低下しました。" else: pass limit_tbl_flg = "NG" # しきい値テーブルのフラグに"NG"を立てる elif current_value > limit_tbl_max: # 最大値を上回った場合 if limit_tbl_flg == "OK": # フラグの値が"OK"ならLINEアラート通知(超過) alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = set_line_message( line_message) + "が設定値を超過しました。" else: pass limit_tbl_flg = "NG" # しきい値テーブルのフラグに"NG"を立てる # しきい値テーブルの更新 upd_limit_sql = "UPDATE limit_tbl SET flg_sts = %s WHERE item = %s" update_cur.execute(upd_limit_sql, (limit_tbl_flg, limit_tbl_item)) # しきい値テーブルの更新(測定値、取得再開の判定) check_cur.execute("SELECT * FROM limit_tbl WHERE item = 'SYSTEM';") for check_row in check_cur.fetchall(): limit_tbl_flg = check_row[4] if limit_tbl_flg == "NG": alert_flg = "ON" # アラート通知を"ON"にする(発生のLINE通知) line_message = line_message + "\n計測が再開されました。" # リミットテーブルの更新 update_sql = "UPDATE limit_tbl SET flg_sts = 'OK' WHERE item = 'SYSTEM';" update_cur.execute(update_sql) check_cur.close() update_cur.close()