ブログ

κυσο βλογ

M2X無料アカウントが停止するのでデータをエクスポートする

M2X無料アカウント停止

メールを見逃していたが、日本時間で2020/04/16 02:00 にM2Xの無料アカウントが停止される。2020/02/15にそのメールが着ていたが、件名からはそのような重大なメールであることがわからず読んでいなかった。

データエクスポート

  1. データエクスポートコマンド発行→ジョブID発行
  2. ジョブIDでジョブ状態を確認
  3. ジョブ終了でデータエクスポート用URLが表示されるのでwebブラウザなどでダウンロード

という流れになる。

適当なLinuxホストにログインして(今回はWSLを利用)データエクスポートコマンドをcurlで実行する。devices/以降はデバイスID、X-M2X-KEY:にはデバイスAPIキーを指定する。

curl -i "https://api-m2x.att.com/v2/devices/<DEVICE-ID>/values/export.csv" -H "X-M2X-KEY: <DEVICE-API-KEY>"

次のような応答でエクスポートジョブが受理されたことがわかる。

HTTP/1.1 202 Accepted
Content-Type: application/json; charset=UTF-8
Location: https://api-m2x.att.com/v2/jobs/<JOB-ID>
X-M2X-VERSION: v2.112.2
Vary: Accept-Encoding
X-RateLimit-Limit: 25
X-RateLimit-Remaining: 24
X-RateLimit-Reset: 1586865919
Content-Length: 21

{"status":"accepted"}

最後のacceptedで受理がわかり、ジョブ確認用のURLがLocation:の次に表示されている。

エクスポートジョブの状態を以下のコマンドで確認する。ここで指定するjobs/以降のIDは上のジョブ確認用のIDで、X-M2X-KEY:にはデバイスキーではなくマスターAPIキーを指定する。マスターAPIキーはアカウント設定からMaster Keyで確認できる。

curl -i "https://api-m2x.att.com/v2/jobs/<JOB-ID>" -H "X-M2X-KEY: <MASTER-API-KEY>"
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
X-M2X-VERSION: v2.112.2
Vary: Accept-Encoding
X-RateLimit-Limit: 25
X-RateLimit-Remaining: 24
X-RateLimit-Reset: 1586866332
Content-Length: 220

{"id":"<job-id>","state":"working","output":null,"errors":null,"started":"2020-04-14T12:05:18.160Z","finished":null,"created":"2020-04-14T12:05:17.996Z","updated":"2020-04-14T12:05:18.160Z"}

まだstateはworkingなのでエクスポートジョブが実行中である。データサイズにもよるが、数分後にもう一度ジョブ確認のコマンドを発行すると、今度は以下のような応答が得られる。

{"id":"<job-id>","state":"complete","output":null,"errors":null,"started":"2020-04-14T12:05:18.160Z","finished":"2020-04-14T12:23:13.818Z","created":"2020-04-14T12:05:17.996Z","updated":"2020-04-14T12:23:13.819Z","result":{"url":"http://export.m2x.sl.attcompute.com/<DEVICE-ID>%20-%20<DEVICE-NAME>%20-%202020-04-14T12:22:53.270Z.csv"}}

url:以降に、csvフォーマットのファイルダウンロードURLが書かれているので、これをコピーしてwebブラウザなどでダウンロードする。もちろんcurlでダウンロードしても良いが、webブラウザのほうが進捗がわかりやすい。

M2Xからの移行先は

どこがいいだろうか?

買い占め行動(買いあさり)

原書房「民間防衛」
35ページ

一たび輸入がとまったとなれば、買いあさりが行われやすい。
この買いあさりは、すべての人が充分な資金力を持っているわけではないから、
反社会的な行動として、これを非難しないわけにはいかない
さらにまた、買いあさりが起これば、流通機構に平常以上の負担がかかるので、
日常生活用品の供給が困難になり、ひいては国内の在庫品の分配が不公平になる
このような買いあさりに加わることは、自分の社会連帯意識の低さ、
つまり、自分勝手なことをしたのでは社会が成り立たないという意識が欠けていることを、
暴露するだけでなく、自分が有事の際の備え、貯えを怠っていたことを証明するにほかならない

台風による気圧変化の記録

台風19号による気圧変化を二箇所で比較する

BME680で二箇所の環境データをM2Xに記録し続けている。今回の台風19号について気圧変化をメモしておく。

埼玉県鴻巣市の気圧グラフ

台風の目がかなり近くを通過したので、気圧変化は尖点を持つ特徴的なものになった。

f:id:XX-Prime:20191013173650p:plain
埼玉県鴻巣市 台風19号 気圧変化

最低気圧は971.9hPaであった。

滋賀県大津市の気圧グラフ

目はだいぶ遠くを通ったので、尖点を持たないグラフになった。

f:id:XX-Prime:20191013174108p:plain
滋賀県大津市 台風19号 気圧変化

最低気圧は976.4hPaであった。

二箇所のグラフの時間的なズレを見ると台風のだいたいの速度を概算できる。面倒なんでやらないけど。

switchbot カーテン

カーテン自動開閉マッシーン

switchbotがまた面白い製品を出すようだ。

ks.switch-bot.com

段差も越えて動く

f:id:XX-Prime:20191013205305g:plain
rail moving

日本で一般的な角型カーテンレールで動作するか?

たぶん問題ない。

カーテン以外の用途

レールなら割と何でもよさそうなので、別にカーテンだけに用途を絞る必要もなかろう。1次元的な動作を必要とする、自動化したい用途に一般的に使えるはずだ。本体にフックのような構造があると色々なモノを引っ掛けられるので便利だが、画像を見る限りそのようなものは無いので自分で何とかすればOKだろう。ある程度パワーがあるなら、2つ組み合わせて洗濯物を自動的に取り込む機構もかんたんに作れそう。

まとめ

買う。カーテン以外の用途を見つけたい。IoTのデモとかで、コレをつかっておバカで派手なモノを作る輩が現れるのが目に浮かぶ・・・。

M2Xの調子が悪い

珍しくM2Xのサーバが落ちている

f:id:XX-Prime:20191005131241p:plain
M2X_down
ほとんど落ちないM2Xのサーバが珍しく停止しているのでメモ。

M2X状態モニタを見る

上の画像でリンクがある、M2X状態モニタにアクセスしてみると、現在の状態とインシデントログを見ることができる。

f:id:XX-Prime:20191005131953p:plain
status-m2x.att.com
こういうながーいスクリーンキャプチャは、chromeのデフォルト機能でできることを今知った。参考リンク
requlog.com

2019年10月3日に障害が発生して一旦収まったものの、問題は悪化しているようだ。
現時点でレスポンスタイムが0に見えるのは、単にサーバが機能していないからである。

まとめ

珍しいこともあるもんだ。
複数サイトへのデータアップロードをしておけばよかった。
今はどのあたりのサイトがいいんだろうか。
M2Xが落ちるという想定はしていなかった。

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()を追加すると正常になる。