今更だがM2Xはタイムゾーンに対応していた
M2Xで日本時間をうまく扱えるコードとそうでないコードがあってどこに差があるのかわからず不思議でしかたなかったが、今わかったのでメモ。
pythonのM2Xモジュールのサンプルを見てみる
これの時刻まわりのサンプル部分に
>>> from datetime import datetime >>> device = client.device('188a0afb3adc379706e780a4eafbd153') <m2x.v2.devices.Device at 0x1652fd0> >>> device.post_updates(values={ 'stream1': [ { 'timestamp': datetime.now(), 'value': 100 }, {
と書いてあり、エラーもなく実行できるが9時間前のUTC時刻としてデータが記録されて、グラフ表示も9時間前のデータポイントとして表示される。そんなもんか、と納得していたが、node.jsのM2Xモジュールでアップロードしたデータをグラフで見ると、ちゃんと日本時間で記録されたデータポイントとして表示される。上手くいってるnode.jsの方の時刻指定は以下のような感じである。
var at = new Date().toISOString(); var values = { temperature_enocean: [ { value: message['value']['temperature'], timestamp: at } ], humidity_enocean: [ { value: message['value']['humidity'], timestamp: at } ], enocean_rssi: [ { value: message['dbm'], timestamp: at } ] }; m2x_client.devices.postUpdates( M2X_DEVICE_ID, { values: values }, function(result) { console.log(result); if (result.isError()) { // Stop the update loop if an error occurs. //stopLoop(); console.log(JSON.stringify(response.error())); } } );
つまり、toISOString()でISO8601形式に変換した文字列をセットしている。これをpythonでも真似て
now = datetime.datetime.utcnow().isoformat() m2xDevice.post_updates(values={ 'temperature': [ { 'timestamp': now, 'value': sensor.data.temperature } ], 'humidity': [ { 'timestamp': now, 'value': sensor.data.humidity } ], 'pressure': [ { 'timestamp': now, 'value': sensor.data.pressure } ], 'air_quality_score': [ { 'timestamp': now, 'value': air_quality_score } ] })
とやった所、日本時間でデータを表示できるようになった。下図はisoformat()を追加してから時刻が正常になって9時間分未来に飛んだ様子である。
まとめ
pythonのM2Xモジュールを使っていてデータを日本時間で表示できない場合は、時刻指定でisoformat()を追加すると正常になる。