#!/usr/bin/python3 # 環境監視システム # PIC親機からシリアルで送られてくる全センサの収集データをデータ渡し用のファイルに書き込む # データベース(sqlite3)に10分毎に記録する import serial # シリアルポートライブラリ from datetime import datetime # 日時処理ライブラリ import sqlite3 # データベース用ライブラリ con=serial.Serial('com4', 9600, timeout=15) # シリアルポート インスタンス windows用 print (con.portstr) # シリアルポート コネクション表示 str=[""] * 10 # センサ10個分のバッファ t15 = 0 # データ受信 失敗判断用カウンタ old = '' # 日時保存用 while 1: s=con.readline() # デリミタまで1行 シリアル受信 if s == '': # センサータイムアウト(PICは空データ送信) if t15 < 40: # センサータイムアウトが10分未満なら t15 += 1 # print("センサデータ受信失敗 %3d[s]" % (t15 * 15)) else: # 受信失敗が10分経過したら t15 = 0 f = open("D:\web\cgi-bin\env_dat.txt", "w", encoding="utf-8") f.write("") # データ渡し用ファイルを空に f.close() continue # 受信データ処理 # print (s) cs = s.decode('utf-8') # 1行分データ整形(デリミタ削除) try: n = int(cs) # 有効データ数(センサ数)を数値に変換 except: # print("数値変換エラー") continue # 数値変換に失敗(数値ではない)処理ループの先頭に戻る # 有効データをファイルに保存 i = 0 while i < n: # 受信データの判定ループ s=con.readline() # 1行(センサー1個分のデータ)読み込み # print (s) cs = s.decode('utf-8') # データを整形(デリミタ削除) str[i] = cs # バッファに格納 i += 1 f = open("D:\web\cgi-bin\env_dat.txt", "w", encoding="utf-8") # データ渡し用ファイルオープン i = 0 while i < n: # print (str[i]) f.write(str[i]) # ファイル保存 i += 1 f.close() # 10分ごとの環境データを日時とともにデーターベースに保存 now = datetime.now().strftime('%Y/%m/%d %H:%M') # 現在の日時を文字列型に変換 if old != now and now[15] == '0': # 10分単位か # if old != now: # 1分単位 old = now conn = sqlite3.connect('D:\web\cgi-bin\envdat.db') # データベースファイルオープン curs = conn.cursor() for i in range(n): rdt = (str[i].strip()).split(',') # 空白を削除しリスト形式に変換 # print (rdt[0]+'/') try: # テーブルに1レコード保存 curs.execute('''INSERT INTO stocks VALUES(?, ?, ?, ?)''', (now,rdt[0],float(rdt[1]),int(rdt[2]))) except: # 新規の時はテーブルを作成して保存 curs.execute('''CREATE TABLE stocks (time text, sid text, temp real, humid int)''') curs.execute('''INSERT INTO stocks VALUES(?, ?, ?, ?)''', (now,rdt[0],float(rdt[1]),int(rdt[2]))) conn.commit() conn.close()