ブログ

κυσο βλογ

M2Xで日本時間を扱う

今更だがM2Xはタイムゾーンに対応していた

M2Xで日本時間をうまく扱えるコードとそうでないコードがあってどこに差があるのかわからず不思議でしかたなかったが、今わかったのでメモ。

pythonのM2Xモジュールのサンプルを見てみる

github.com

これの時刻まわりのサンプル部分に

>>> 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時間分未来に飛んだ様子である。
f:id:XX-Prime:20180709214810p:plain

まとめ

pythonのM2Xモジュールを使っていてデータを日本時間で表示できない場合は、時刻指定でisoformat()を追加すると正常になる。