Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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()
Пример #7
0
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()
Пример #8
0
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()