ʍoɹɐɥsのブ口グ

ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็

温度センサの値をブラウザから見れるようにする(4)

f:id:sharow:20150701185535p:plain

20日くらいが過ぎた。データは300kbくらいで、レンスポンスが600ms~700ms程度、まだ許容範囲内か。

変更点はdatetimeからepoch時間に変換するのに結構時間食ってたので、センサーのデータ取得時にepochも記録するようにした。これでjsonデータのレスポンスは2倍速くらいになった。あと、最高気温・平均気温・最低気温をその日の12時にプロットするようにした。こうしてみると、毎日の10分ごとの変化はいらないような気がしてくる。長期的になるほど、細かい変化はそんなに重要ではなくなってくるんだろうな。せいぜい今日と昨日データだけ見れればいい。

いまのところレスポンスを生成する部分はこんなんなってる。

def render_censor(id_idx=0, days=30):
    dev_ids = pickle_stockpile()
    L, max_temp, min_temp, ave_temp = ([], [], [], [])
    getter = operator.itemgetter('temp')
    t0 = time.time()
    for i in load_temp_datas(dev_ids[id_idx], days=days):
        at = i[0]['at'].replace(hour=12, minute=0, second=0)
        epoch = int(time.mktime(at.timetuple()))
        max_temp.append({'epoch': epoch, 'temp': max(map(getter, i))})
        min_temp.append({'epoch': epoch, 'temp': min(map(getter, i))})
        ave_temp.append({'epoch': epoch, 'temp': int(statistics.mean(map(getter, i)))})
        L.append(i)
    L = itertools.chain.from_iterable(reversed(L))
    t1 = time.time()
    def make_elem(key, data):
        values = [[x['epoch'], x['temp']] for x in data]
        return dict(key=key, values=values)
    e0 = make_elem('temperature', L)
    e1 = make_elem('max', max_temp)
    e2 = make_elem('min', min_temp)
    e3 = make_elem('ave', ave_temp)
    t2 = time.time()
    print('  load and stat: {:.1f} ms'.format((t1 - t0) * 1000))
    print('  marge: {:.1f} ms'.format((t2 - t1) * 1000))
    return [e0, e1, e2, e3]

これをbottleでマウントされた関数から読んでる。ここでbottleの文句をいってもしょうがないんだけど、bottleはcontent_typeに'application/json'を渡すとマウントされた関数が返した値をjsonシリアライズしてしまう。なのでreturn json.dumps(data)とかやると、文字列をjsonでさらにシリアライズされたものが返されてしまい、js側のJSONでデシリアライズしてもただの文字列になる、という罠。この仕様、どうですかねぇ・・・。

ところで関係ないけど、最近コレが気になっている。BMP180 気圧センサ(気温センサ付き) 約1200円と、4倍の価格だけど気圧と温度両方が測れるらしい。気温は室内だと外気との乖離があるけど、気圧は室内でも変わらないだろうから、こっちのほうがデータとしてはおもしろい。・・・と思ったけど、気象予報士ではあるまいに、気圧をみてもなにもわからないぞおれ。