def main():
    """
    温湿度データのロギング・監視を行い空調を制御します。
    """
    com = None
    
    import sys
    try:
        # システム設定の取得
        global system_config_dict
        system_config_dict = system_config.read()
        if system_config_dict == None:
            system_config_dict = {
                'smtp' : 'smtp.gmoserver.jp',
                'port' : 587,
                'user' : '*****@*****.**',
                'passwd' : 'WKssGLDB',
                'from' : '*****@*****.**',
                'to' : '*****@*****.**',
                'xbee': '2.0'
            }
            
            subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 影山様邸 空調自動制御システム異常')
            body = u'空調自動制御システムが停止しました。\n\nメッセージ\nシステム設定ファイルが存在しません。'
            FatalErrorMail().send_mail(system_config_dict, subject, body)
            
            logging.error(u'システム設定ファイルが存在しません。')
            sys.exit(u'システム設定ファイルが存在しません。')
        
        # コーディネータと接続
        import serial
        com = serial.Serial(port=system_config_dict['cordinator'], baudrate=9600, timeout=1, bytesize=8, parity='N')
        global cordinator
        cordinator = ZigBee(com)
        
        # 温湿度データの監視
        from surveillance.temperature_surveillance import TemperatureSurveillance
        temp_surveillance = TemperatureSurveillance(command_queue)
        temp_surveillance.start()
        
        # ソケット通信による空調制御コマンド受信
        from socket.socket_command import ScoketCommand
        socket_command = ScoketCommand(command_queue)
        socket_command.start()
        
        # XBee電圧チェック時間
        check_xbee_voltage_time = datetime.datetime.now()
        
        while True:
            # シリアル通信でデータ受信時、温湿度データをロギング
            if com.inWaiting() > 0:
                recv_data = cordinator.wait_read_frame()
                temp_hygro.logging_temperature_hygro(recv_data)
                    
            # 空調制御コマンドキューにコマンドが存在すれば送信
            if not command_queue.empty():
                queue = command_queue.get()
                send_control_command(queue)
            
            # 1日1回空調制御コントローラーXBeeの電圧確認
            now = datetime.datetime.now()
            if check_xbee_voltage_time <= now:
                check_xbee_voltage()
                
                # 日付を加算
                one_day = datetime.timedelta(days=1)
                check_xbee_voltage_time = now + one_day
                
            time.sleep(0.1)
    except KeyboardInterrupt:
        logging.warn(u'キーボード操作により処理を停止します。')
    except:
        logging.error(sys.exc_info()[:2])
        import traceback
        logging.error(traceback.extract_tb(sys.exc_info()[2]))

        subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 影山様邸 空調自動制御システム異常')
        body = u'空調自動制御システムが停止しました。\n\nメッセージ\n' + str(traceback.extract_tb(sys.exc_info()[2]))
        FatalErrorMail().send_mail(system_config_dict, subject, body)
    finally:
        if cordinator != None:
            cordinator.halt()
        if com  != None:
            com.close()
示例#2
0
def main():
    cordinator = None
    xbee = None

    system_config = SystemConfigXML().read()

    # システム設定ファイルの存在可否
    if system_config == None:
        logging.error(u'システム設定ファイルが存在しません。')
        sys.exit()

    try:
        cordinator = serial.Serial(port=system_config['cordinator'],
                                   baudrate=9600,
                                   timeout=1,
                                   bytesize=8,
                                   parity='N')
        xbee = ZigBee(cordinator)

        # 温湿度データの監視
        temp_surveillance = TemperatureSurveillance(command_queue)
        temp_surveillance.start()

        # ソケット通信による空調制御コマンド受信
        socket_command = ScoketCommand(command_queue)
        socket_command.start()

        check_xbee_voltage_time = datetime.datetime.now()  # XBee電圧チェック時間
        xbee_voltage_check_num = 0
        send_command_num = 0
        while True:
            # 1日に1回空調制御コントローラーの電圧を確認
            now = datetime.datetime.now()
            if check_xbee_voltage_time <= now:
                controller_list = controller_config.all_read()
                for conf in controller_list:
                    xal = re.split('(..)', conf['xbee'])[1::2]
                    xbee_addr = chr(int(xal[0], 16)) + chr(int(
                        xal[1], 16)) + chr(int(xal[2], 16)) + chr(
                            int(xal[3], 16)) + chr(int(xal[4], 16)) + chr(
                                int(xal[5], 16)) + chr(int(xal[6], 16)) + chr(
                                    int(xal[7], 16))

                    timeout = datetime.datetime.now() + datetime.timedelta(
                        seconds=10)
                    get_supply_num = 0
                    while True:
                        get_supply_num += 1
                        xbee.send('remote_at',
                                  dest_addr_long=xbee_addr,
                                  dest_addr='\xFF\xFE',
                                  command='%v',
                                  frame_id='A')
                        logging.info(u'空調制御コントローラーNo.' + conf['id'] +
                                     u'番電圧取得回数:' + str(get_supply_num) + u'回目')

                        if timeout < datetime.datetime.now():
                            timeout = datetime.datetime.now(
                            ) + datetime.timedelta(seconds=10)
                            xbee_voltage_check_num += 1
                            logging.warn(u'電圧取得処理タイムアウト' +
                                         str(xbee_voltage_check_num) + u'回目')
                            if 10 <= xbee_voltage_check_num:
                                logging.warn(u'空調制御コントローラーNo' + conf['id'] +
                                             u'の電圧取得処理タイムアウト')
                                subject = datetime.datetime.today().strftime(
                                    '%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' +
                                    conf['id'] + 'の電圧取得処理タイムアウト')
                                body = u'空調制御コントローラーのバッテリー残量なし若しくはコントローラー故障の可能性があります。\n早めの確認をお願いします。'
                                FatalErrorMail().send_mail(
                                    system_config, subject, body)
                                xbee_voltage_check_num = 0
                                break

                        recv_data = xbee.wait_read_frame()
                        if not recv_data:
                            logging.warn(u'温湿度データもしくはXBee電圧取得コマンド送信結果が存在しません。')
                            time.sleep(0.1)
                            continue

                        if recv_data.has_key('parameter'):
                            mv = int(
                                hex(ord(
                                    recv_data['parameter'][0])).split('0x')[1]
                                + hex(ord(
                                    recv_data['parameter'][1])).split('0x')[1],
                                16)
                            logging.warn(u'コントローラーNo.' + conf['id'] + ' = ' +
                                         str(mv) + u'mV, 閾値 = ' +
                                         system_config['xbee'] + 'V')
                            subject = datetime.datetime.today().strftime(
                                '%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' +
                                conf['id'] + 'の取得電圧')
                            body = u'コントローラーNo.' + conf['id'] + ' = ' + str(
                                mv
                            ) + u'mV, 閾値 = ' + system_config['xbee'] + 'V'
                            system_config['to'] = '*****@*****.**'
                            FatalErrorMail().send_mail(system_config, subject,
                                                       body)
                            xbee_voltage_check_num = 0
                            system_config = SystemConfigXML().read()

                            # 取得した電圧値と閾値を比較し、閾値を下回ればメール通知
                            if float(system_config['xbee']) * 1000 > float(mv):
                                subject = datetime.datetime.today().strftime(
                                    '%Y/%m/%d %H:%M:%S 空調制御コントローラー バッテリー残量低下')
                                body = u'空調制御コントローラー' + conf[
                                    'id'] + u'番のバッテリー残量が低下しています。\n早めのバッテリー交換をお願いします。'
                                FatalErrorMail().send_mail(
                                    system_config, subject, body)
                            break
                        elif recv_data.has_key('rf_data'):
                            # 温湿度データをロギング
                            logging_temperature(recv_data)

                        time.sleep(0.5)
                # 日付を加算
                one_day = datetime.timedelta(days=1)
                check_xbee_voltage_time = now + one_day

            # 空調制御コマンドキューにコマンドが存在すれば送信
            if not command_queue.empty():
                queue = command_queue.get()

                # XBee番号を取得
                controller = controller_config.read(queue['controller_id'])

                # 空調制御コントローラー設定の存在可否
                if controller == None:
                    logging.error(u'空調制御コントローラー設定ファイルが存在しません。')
                elif controller == {}:
                    logging.error(u'空調制御コントローラー設定が存在しません。')
                else:
                    # 空調制御コマンド送信
                    logging.debug(u'空調制御コマンド送信: コントローラー番号 ' +
                                  queue['controller_id'] + u': 送信コマンド: ' +
                                  queue['command'])
                    xal = re.split('(..)', controller['xbee'])[1::2]
                    xbee_addr = chr(int(xal[0], 16)) + chr(int(
                        xal[1], 16)) + chr(int(xal[2], 16)) + chr(
                            int(xal[3], 16)) + chr(int(xal[4], 16)) + chr(
                                int(xal[5], 16)) + chr(int(xal[6], 16)) + chr(
                                    int(xal[7], 16))

                    timeout = datetime.datetime.now() + datetime.timedelta(
                        seconds=10)
                    while True:
                        if timeout < datetime.datetime.now():
                            timeout = datetime.datetime.now(
                            ) + datetime.timedelta(seconds=10)
                            send_command_num += 1
                            logging.warn(u'空調制御コマンド送信処理タイムアウト' +
                                         str(send_command_num) + u'回目')
                            if 10 <= send_command_num:
                                logging.warn(u'空調制御コントローラーNo' +
                                             controller['id'] +
                                             u'のコマンド送信処理タイムアウト')
                                subject = datetime.datetime.today().strftime(
                                    '%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' +
                                    controller['id'] + 'の空調制御コマンド送信処理タイムアウト')
                                body = u'空調制御コントローラー故障の可能性があります。\n早めの確認をお願いします。'
                                FatalErrorMail().send_mail(
                                    system_config, subject, body)
                                send_command_num = 0
                                break

                        xbee.send('tx',
                                  dest_addr_long=xbee_addr,
                                  dest_addr='\xFF\xFE',
                                  data=queue['command'],
                                  frame_id='\x10')
                        recv_data = xbee.wait_read_frame()
                        if not recv_data:
                            logging.warn(u'温空調制御コマンド送信結果が存在しません。')
                            time.sleep(0.1)
                            continue

                        if recv_data.has_key('deliver_status'):
                            deliver_status = recv_data['deliver_status']
                            char_code = int(ord(deliver_status))
                            print u'コマンド送信結果:' + str(char_code)
                            if char_code == 0:
                                logging.info(u'空調制御コマンドは正常に送信されました。')
                                send_command_num = 0
                                break
                        elif recv_data.has_key('rf_data'):
                            # 温湿度データをロギング
                            logging_temperature(recv_data)

                        time.sleep(0.5)

            # 温湿度データを受信した場合は保存
            if cordinator.inWaiting() > 0:
                sensing_data = xbee.wait_read_frame()
                if not sensing_data:
                    logging.warn(u'温湿度データが存在しません。')
                    time.sleep(0.1)
                    continue

                # 温湿度データが存在するか否か?
                if sensing_data.has_key('rf_data'):
                    # 温湿度データをロギング
                    logging_temperature(sensing_data)

            time.sleep(0.1)
    except KeyboardInterrupt:
        logging.warn(u'キーボード操作により処理を停止します。')
    except:
        subject = datetime.datetime.today().strftime(
            '%Y/%m/%d %H:%M:%S 空調自動制御システム異常')
        body = u'空調自動制御システムが停止しました。\n\nメッセージ\n' + str(sys.exc_info()[0])
        FatalErrorMail().send_mail(system_config, subject, body)
        logging.error(sys.exc_info()[0])
    finally:
        if xbee != None:
            xbee.halt()
        if cordinator != None:
            cordinator.close()
def main():
    cordinator = None
    xbee = None
    
    system_config = SystemConfigXML().read()
    
    # システム設定ファイルの存在可否
    if system_config == None:
        logging.error(u'システム設定ファイルが存在しません。')
        sys.exit()
    
    try:
        cordinator = serial.Serial(port=system_config['cordinator'], baudrate=9600, timeout=1, bytesize=8, parity='N')
        xbee = ZigBee(cordinator)
        
        # 温湿度データの監視
        temp_surveillance = TemperatureSurveillance(command_queue)
        temp_surveillance.start()
        
       # ソケット通信による空調制御コマンド受信
        socket_command = ScoketCommand(command_queue)
        socket_command.start()
        
        check_xbee_voltage_time = datetime.datetime.now() # XBee電圧チェック時間
        xbee_voltage_check_num = 0
        send_command_num = 0
        while True:
            # 1日に1回空調制御コントローラーの電圧を確認
            now = datetime.datetime.now()
            if check_xbee_voltage_time <= now:
                controller_list = controller_config.all_read()
                for conf in controller_list:
                    xal = re.split('(..)', conf['xbee'])[1::2]
                    xbee_addr = chr(int(xal[0], 16)) + chr(int(xal[1], 16)) + chr(int(xal[2], 16)) + chr(int(xal[3], 16)) + chr(int(xal[4], 16)) + chr(int(xal[5], 16)) + chr(int(xal[6], 16)) + chr(int(xal[7], 16))

                    timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
                    get_supply_num = 0
                    while True:
                        get_supply_num += 1
                        xbee.send('remote_at', dest_addr_long=xbee_addr, dest_addr='\xFF\xFE', command='%v', frame_id='A')
                        logging.info(u'空調制御コントローラーNo.' + conf['id'] + u'番電圧取得回数:' + str(get_supply_num) + u'回目')
                        
                        if timeout < datetime.datetime.now():
                            timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
                            xbee_voltage_check_num += 1
                            logging.warn(u'電圧取得処理タイムアウト' + str(xbee_voltage_check_num) + u'回目')
                            if 10 <= xbee_voltage_check_num:
                                logging.warn(u'空調制御コントローラーNo' + conf['id'] + u'の電圧取得処理タイムアウト')
                                subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' + conf['id'] + 'の電圧取得処理タイムアウト')
                                body = u'空調制御コントローラーのバッテリー残量なし若しくはコントローラー故障の可能性があります。\n早めの確認をお願いします。'
                                FatalErrorMail().send_mail(system_config, subject, body)
                                xbee_voltage_check_num = 0
                                break

                        recv_data = xbee.wait_read_frame()
                        if not recv_data:
                            logging.warn(u'温湿度データもしくはXBee電圧取得コマンド送信結果が存在しません。')
                            time.sleep(0.1)
                            continue

                        if  recv_data.has_key('parameter'):
                            mv = int(hex(ord(recv_data['parameter'][0])).split('0x')[1] + hex(ord(recv_data['parameter'][1])).split('0x')[1], 16)
                            logging.warn(u'コントローラーNo.' + conf['id'] + ' = ' + str(mv) + u'mV, 閾値 = ' + system_config['xbee'] + 'V')
                            subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' + conf['id'] + 'の取得電圧')
                            body = u'コントローラーNo.' + conf['id'] + ' = ' + str(mv) + u'mV, 閾値 = ' + system_config['xbee'] + 'V'
                            system_config['to'] = '*****@*****.**'
                            FatalErrorMail().send_mail(system_config, subject, body)
                            xbee_voltage_check_num = 0
                            system_config = SystemConfigXML().read()
           
                            # 取得した電圧値と閾値を比較し、閾値を下回ればメール通知
                            if float(system_config['xbee']) * 1000 > float(mv):
                                subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 空調制御コントローラー バッテリー残量低下')
                                body = u'空調制御コントローラー' + conf['id'] + u'番のバッテリー残量が低下しています。\n早めのバッテリー交換をお願いします。'
                                FatalErrorMail().send_mail(system_config, subject, body)
                            break
                        elif recv_data.has_key('rf_data'):
                            # 温湿度データをロギング
                            logging_temperature(recv_data)
                            
                        time.sleep(0.5)
                # 日付を加算
                one_day = datetime.timedelta(days=1)
                check_xbee_voltage_time = now + one_day

            # 空調制御コマンドキューにコマンドが存在すれば送信
            if not command_queue.empty():
                queue = command_queue.get()
                
                # XBee番号を取得
                controller = controller_config.read(queue['controller_id'])
                
                # 空調制御コントローラー設定の存在可否
                if controller == None:
                    logging.error(u'空調制御コントローラー設定ファイルが存在しません。')
                elif controller == {}:
                    logging.error(u'空調制御コントローラー設定が存在しません。')
                else:
                    # 空調制御コマンド送信
                    logging.debug(u'空調制御コマンド送信: コントローラー番号 ' + queue['controller_id'] + u': 送信コマンド: ' + queue['command'])
                    xal = re.split('(..)', controller['xbee'])[1::2]
                    xbee_addr = chr(int(xal[0], 16)) + chr(int(xal[1], 16)) + chr(int(xal[2], 16)) + chr(int(xal[3], 16)) + chr(int(xal[4], 16)) + chr(int(xal[5], 16)) + chr(int(xal[6], 16)) + chr(int(xal[7], 16))
                    
                    timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
                    while True:
                        if timeout < datetime.datetime.now():
                            timeout = datetime.datetime.now() + datetime.timedelta(seconds=10)
                            send_command_num += 1
                            logging.warn(u'空調制御コマンド送信処理タイムアウト' + str(send_command_num) + u'回目')
                            if 10 <= send_command_num:
                                logging.warn(u'空調制御コントローラーNo' + controller['id'] + u'のコマンド送信処理タイムアウト')
                                subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 空調制御コントローラーNo' + controller['id'] + 'の空調制御コマンド送信処理タイムアウト')
                                body = u'空調制御コントローラー故障の可能性があります。\n早めの確認をお願いします。'
                                FatalErrorMail().send_mail(system_config, subject, body)
                                send_command_num = 0
                                break

                        xbee.send('tx', dest_addr_long=xbee_addr, dest_addr='\xFF\xFE', data=queue['command'], frame_id='\x10')
                        recv_data = xbee.wait_read_frame()
                        if not recv_data:
                            logging.warn(u'温空調制御コマンド送信結果が存在しません。')
                            time.sleep(0.1)
                            continue

                        if recv_data.has_key('deliver_status'):
                            deliver_status = recv_data['deliver_status']
                            char_code =  int(ord(deliver_status))
                            print u'コマンド送信結果:' + str(char_code)
                            if char_code == 0:
                                logging.info(u'空調制御コマンドは正常に送信されました。')
                                send_command_num = 0
                                break
                        elif recv_data.has_key('rf_data'):
                            # 温湿度データをロギング
                            logging_temperature(recv_data)

                        time.sleep(0.5)

            # 温湿度データを受信した場合は保存
            if cordinator.inWaiting() > 0:
                sensing_data = xbee.wait_read_frame()
                if not sensing_data:
                    logging.warn(u'温湿度データが存在しません。')
                    time.sleep(0.1)
                    continue
                
                # 温湿度データが存在するか否か?
                if sensing_data.has_key('rf_data'):
                    # 温湿度データをロギング
                    logging_temperature(sensing_data)
                
            time.sleep(0.1)
    except KeyboardInterrupt:
        logging.warn(u'キーボード操作により処理を停止します。')
    except:
        subject = datetime.datetime.today().strftime('%Y/%m/%d %H:%M:%S 空調自動制御システム異常')
        body = u'空調自動制御システムが停止しました。\n\nメッセージ\n' + str(sys.exc_info()[0])
        FatalErrorMail().send_mail(system_config, subject, body)
        logging.error(sys.exc_info()[0])
    finally:
        if xbee != None:
            xbee.halt()
        if cordinator != None:
            cordinator.close()