#!c:\winpython363\python-3.6.3.amd64\python # -*- coding: utf-8 -*- # apache2 サーバー版 # 環境監視システム 経時変化グラフ表示 import cgi import cgitb; cgitb.enable() #エラー情報をブラウザに表示 import sys,io # 日本語処理 windows環境 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 日本語処理 windows環境 import matplotlib matplotlib.use('Agg') # 非GUI backend 描画指定(CGI動作のため必要) import matplotlib.pyplot as plt # グラフ描画用 import matplotlib.dates as mdates # グラフ描画 時間軸用 from matplotlib import ticker # グラフ目盛 刻み設定用 from matplotlib.font_manager import FontProperties # 日本語表示用 fp = FontProperties(fname='d:\web\HGRGE.TTC') # 日本語表示用 from datetime import datetime, timedelta # 日時処理用 import sqlite3 # データベース処理用 import math # 算術関数 #表示用データ loc = ['屋 外', '乾燥庫1', '乾燥庫2', '鉄骨2F', 'ハウス1', '詰 所'] snid = ['00B01EBA', '00B02B96', '00B01E91', '00B02B95', '00B02B94', '00B02B93'] #ブラウザからのクエリー文字列(データ行番号)を受け取る form = cgi.FieldStorage() num = int(form['num'].value) #描画用データ準備 x = [] y1 = [] y2 = [] y3 = [] dmin = datetime.strptime('3000/12/31 23:59', '%Y/%m/%d %H:%M') dmax = datetime.strptime('2000/1/1 0:0', '%Y/%m/%d %H:%M') datm_end = datetime.now() datm_start = datm_end - timedelta(days=20) #データベースよりデータ読み込み conn = sqlite3.connect('D:\web\cgi-bin\envdat.db') curs = conn.cursor() curs.execute('''SELECT *FROM stocks WHERE sid = '%s' ''' % snid[num]) for time, sid, temp, humid in curs.fetchall(): datm = datetime.strptime(time, '%Y/%m/%d %H:%M') if datm >= datm_start and datm <= datm_end and (datm.minute == 0 or datm.minute == 30): # 表示期間外と30分毎以外は読み飛ばす if dmin > datm: dmin = datm if dmax < datm: dmax = datm x.append(datetime.strptime(time, '%Y/%m/%d %H:%M')) # x軸データ y2.append(temp) # y2軸データ(湿度) y1.append(humid) # y1軸データ(温度) ew = 6.108 * 10**(7.5 * temp / (temp + 237.3)) # 飽和水蒸気圧 e = ew * humid / 100 # 水蒸気圧 td = 237.3 * math.log10(6.108 / e) / (math.log10(e / 6.108) - 7.5) # 露点温度 y3.append(td) # y3軸データ(露点) conn.close() #グラフ描画 fig = plt.figure() # 描画エリア定義(x軸はエリア2共通) ax1 = fig.add_axes((0.05, 0.58, 0.94, 0.35)) ax2 = fig.add_axes((0.05, 0.16, 0.94, 0.41), sharex=ax1) # グラフデータ登録 ax1.plot(x,y1, 'b-', lw=1, label='HUMID') # 湿度 ax2.plot(x,y2, 'r-', lw=1, label='TEMP') # 温度 ax2.plot(x,y3, 'c-', lw=1, label='DEW') # 露点 # y軸値範囲 ax1.set_ylim(20, 102) ax2.set_ylim(-15, 45) # ラベル表示設定 ax1.text(dmin+timedelta(days=1),22, '湿度[%]', fontproperties=fp, fontsize=16, color='b') ax2.text(dmin+timedelta(days=1),-14, '温度[℃]' , fontproperties=fp, fontsize=16, color='r') ax2.text(dmin+timedelta(days=5),-14, '露点[℃]' , fontproperties=fp, fontsize=16, color='c') # x軸ラベルの定義 ax1.tick_params(labelbottom = False) # 非表示 # x軸 値ラベルの定義 ax2.set_xticklabels(x, rotation=45, ha='right') # 斜め45度 #locator = mdates.AutoDateLocator() # 自動 locator = mdates.DayLocator() # 日毎 ax2.xaxis.set_major_locator(locator) ax2.xaxis.set_major_locator(ticker.MultipleLocator(2)) # 2日ステップ ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 日付フォーマット # グリッド設定 ax2.xaxis.set_minor_locator(ticker.MultipleLocator(1)) # x軸補助線 1日ステップ ax1.grid(which='both') ax2.grid(which='both') # タイトル表示設定 場所名[センサID] fig.suptitle(loc[num] + ' [' + snid[num] + ']', fontproperties=fp,fontsize=20) #plt.show() #ブラウザへ表示 print('Content-Type: image/png') print() # pngイメージデータを作成して出力(表示) sys.stdout.flush() fig.savefig(sys.stdout.buffer, format='png', dpi=150)