chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

GCPのCloud FunctionsとCloud Schedulerを組み合わせて計測データを定期的にPublish

GCPが提供しているFunctionと、定期実行を実現できるSchedulerを組み合わせて、1分おきにSmart MeterのAPIを叩いて、MQTTでPublishするWebサービスを構築した。以下は参考画面(Functions)

以下は定期実行を可能にするScheduler

構築はしたものの、、このシステムには以下の課題がある

  • スマフォのアプリを開いてもすぐには更新されない(更新が1分周期だから)
  • 日中見ない時でも、Publishが動き続けている(これはあまりに無駄だし、場合によっては無料枠を超えてしまう)
  • システムの登場人物が多すぎて複雑

現在のシステムの登場人物、絵にすると分かりやすいが、スマフォに向けて流れるのみで、スマフォからサーバへの登り経路がない。だから、今欲しいとか、もういらないとかコントロールできない

やりたいことは、スマフォアプリを開いたらすぐに最新値が取れて、しばらくは動いている。だけど、アプリをクローズしたら、サーバ側の更新処理も止まる、そしてシステムはシンプル

そんなシステムにしたかったら、スマフォアプリがMQTTで通信せずに、直接Nature社のREMO WebAPIを叩いたらええやんという感じで、そもそもの出だしのMQTTがダメだったのか?という気になってきた。MQTTを使わず直接接続でいいじゃないかの案

再度考える。。。

  • MQTT自体はプロトコルでしかないので、MQTTが悪いということはない。それをどう使うかが問題
    • とは言え、Nature REMO APIはWebAPIなので、HTTP(S)/MQTTのプロトコル変換は必要になる
  • サーバ代をケチって、常時動作するサーバが存在しないため、定期実行しかできていない(スマフォがPublishしても受けられるサーバがいない)
  • MQTTのブローカはお手軽な無料パブリックサービスを使っていて、GCPと分かれている

GCPにはCloud Pub/Subというのがあるらしく、これを中心に、サーバ側の処理とスマフォ処理がPub/Subで接続できたら構造はシンプルになる。 Cloud Pub/Subがグローバルから叩けるかどうかが不明

調べたら、、Google Cloud IoT Core というサービスがあり、これを使うと、Cloud Pub/Subにブリッジできるらしい。やってることが段々とAWSと変わらなくなってきた。無料を期待してGCPで試行錯誤を続けるのがいいのか、多少のお金を払うの覚悟でAWSを使うのがいいのか。。AWS/GCPいずれの場合もMQTTを喋るにはClient証明書(またはJWT?)が必要で、お手軽接続とはいかない(多分)

■方針
こうなったらハラをくくって、多少お金がかかっても、一旦MQTTで理想形を実現すべく、AWSのIoT Coreを使ってみる。IoT Coreを使うためのデバイス登録やClient証明書の扱いがややこしいが、一旦接続までできれば、AWS IoT Coreのメッセージをトリガーとして、Lambdaを呼び出すこともできるし。。いろいろ作りこみが可能だ(有料だけど)
AWS を使うと以下のようなアーキになるかと。できたらCronのOn/Offもboto3なんかで制御できたらいいのだけど。。詳細不明(Event Bridgeでできるようだ)

全く使いこなせるレベルでないFlutterでいきなりAWS IoT Coreにつなぐのは無謀なので、多少慣れたMicroPythonでAWS IoT Coreにつないでみたい。
最後の大事な所がマスクされているが、、 ESP32 + MicroPythonでAWS IoT Coreに繋ぐTutorial
Connect ESP32 MicroPython to AWS IoT
その他、ESP32 + AWS IoT Core接続例
MicroPython to AWS-IOT - Hackster.io
aws-edukit-micropython-examples/main.py at main · aws-samples/aws-edukit-micropython-examples · GitHub

boto3でCRONを制御するサンプル
Schedule your Lambda functions with boto3 (CRON) | by Johannes Gontrum | Level Up Coding
EventBridge — Boto3 Docs 1.21.42 documentation

MQTTのPublish用にGCP (Google Cloud Platform)を使ってみる->間違ってGoogle Cloud Shellに入れていた

久しぶりにGoogle Cloud Serviceに行ってみた。今は、GCPとしていろんなサービスが統合?されていて、PaaSはApp Engine、Iaasは Compute Engineと2系統用意されている。App EngineはPaaSのため使い方が特殊なので、VMとしてマシンを貸してもらえるCompute Engineの方がインストールやカスタマイズも楽。e2-micro VM インスタンス(USリージョン)で、データ量が1 GB 以下なら無料で使えるらしい。稼働中のリソースをよく見ておかないと、足が出るかもしれない。
Compute Engineに入って、普通にpipで追加パッケージ等を入れてみたら、MQTT Publishスクリプトが動いた。定期実行させたいので、cronで1分周期で設定してみる。勝手にインスタンスタイプは上がらないと思うのだが。。
cronを書いたが動かない。cron自体がサービスとして走っていないようなので、、場当たり的だが以下でcronを起動

sudo /etc/init.d/cron start

以下のような書式で毎分APIを叩いてMQTTポストするスクリプトをCRONで起動

* * * * * /home/xx your_id xxxx/lang/py/smartmeter/nature_api.py >> /var/log/api_log.txt 2>&1

この状態でも1分単位で画面が更新されるだけなので、できたら、スマフォから更新リクエストを出すとMQTTで返事してくれるようにもしたい。(スマフォでアプリを起動して更新されるまで1分待つというのは今の時代に考えられない)
一定周期やリクエストに応じて何か処理をするためには、Google Cloud Functionを使う方がいいのかも。Pub/Subをトリガーとして、あらかじめ定義したFunctionを起動できるらしい。

画面の上にCloud Shellとあったので、そこからVM(Compute Engine)に入れるのかと思って、上記の操作をしてリリースしたつもりになっていた*1。Compute Engineにいって、VMが本当にアメリカだろうかと確認しようとしたが、VMがない。だったらさっきログインしてたのは何?と思うと、あれはメンテナンス用に用意されているGoogle Cloud Shellというまた別のサービスらしかった。だとすると、Compute EngineのVMに加え、CloudShellというメンテナンス用のVMも使えるということで、これはなんというリッチなサービスなんだろうかと感心した。
なお、Cloud Shellは普段は止まっているらしいので、そこでCRON走らせてもログアウトしてしばらくすると停止するのだろう。

*1:リージョンもインスタンスタイプも指定しないのが少し不思議だったが

Flutterで作ったスマートメータ表示アプリと接続

前回試作したスマートメータ表示アプリのTopicを修正して、MQTTブローカから正しく情報を取れるように改修した。一応動いている。画面は以下

WebAPI -> MQTT Publishはサーバが手当できていないので、ラズパイで動かしている(テスト期間中のみ)

不満な点(要改善点)

  1. 画面切り替えたりすると接続が切れる。手動で再接続する必要あり。面倒。→自動で接続するようにしたい
  2. 画面表示したら最新の値をすぐに見たいが、MQTTによる送信は1分周期、最長1分待たないと最新の値が分からない→更新ボタンが欲しい
  3. 計測時刻がUTCなので、JSTに変換必要→ロケールJSTに変換できるだろう。多分

分かった事
自分のスマフォはすぐに画面が暗くなるし、sleepモードというのか待機画面になる。だから、ずっと表示させるようにはなっていない。ずっと表示するように実装で可能なのかもしれないが。さっと見たいのに、MQTTだと待つのが面倒。また、ずっと見るようなものではない。更新も1分周期だし、ワクワクするような変化がないから飽きる(アプリから省エネアドバイスや分析情報を提示されないと、画面を見ていても面白くない)。

次は常時表示に向けて、ESP32/M5 Stick+サーボでアナログ的なメータを作りたい。

■追記
pythonanywareでnature remo APIからデータを取ってきて、MQTTブローカにPublishするスクリプトを動かそうかと思ったが、無料ライセンスでは、接続できるホストに制限がかかっていてnature remoのAPIには到達できなさそうであった。だから、、他のホスティングを使う必要あり

Nature Remo Eの計測データをWebAPIで取ってMQTTでPublishする

Nature Remo Eとスマフォアプリ(電力メータ)との連携はMQTTで繋ぐことにしているので、Nature Remo Eの計測データをWebAPIで取ってMQTTでPublishするコードをPythonで作成。MQTTのPublishが非同期なのかどうかわかっておらず、Publish完了を待たずにプログラムを終わっていいのか不明。だけどまぁこれで動いている。

#!/usr/bin/python3
import json
import requests
import paho.mqtt.client as paho

URL = "https://api.nature.global/1/appliances"
TOKEN = "R6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkis"

smartmeter_instantaneous = None

def on_publish(client, userdata, result):
    print("message published \n")
    pass

#
# get measurement data  via Nature Remo WebAPI
#

headers = {'Authorization' : 'Bearer '+TOKEN }
r = requests.get(URL, headers=headers)

if r.status_code == 200:
  appliances = r.json()
  for property in appliances[0]["smart_meter"]["echonetlite_properties"]:
      if property['epc'] == 231:
         smartmeter_instantaneous = property
         break

# for log
if smartmeter_instantaneous:
  print(smartmeter_instantaneous)

#
# publish data to MQTT Broker (mosquitto)
#

MQTT_BROKER = 'test.mosquitto.org'
MQTT_PORT = 1883
TOPIC = 'house0001/smartmeter/report'
CLIENT = "report_0001"

if smartmeter_instantaneous:
    client = paho.Client(CLIENT)
    client.on_publish = on_publish
    client.connect(MQTT_BROKER, MQTT_PORT)
    ret = client.publish(TOPIC, json.dumps(smartmeter_instantaneous))
    print("publish")
    print(ret)

PublishされたのをMQTT Clientツールで確認

flutterで作成したスマートメータ表示アプリのTopicを変えたら表示できるはず。。ただ、取得時刻がUTCなので、JSTに変換が必要だ。

Nature Remo Cloud API
Nature Inc. | Nature Developer Page

FlutterでMQTT通信させてスマートメータの瞬時値を表示する

Nature Remo E を使って自宅のスマートメータの瞬時値・積算値が取れるようになった。Nature社のサーバにWebAPIで要求を出すとスマートメータの値を取得することができる。ESP32やらM5StickC等を使って、瞬時値が液晶に表示されたり、閾値による監視をやりたい。アプローチはESP32 + MicroPythonなのかもしれないが、、どうしてもFlutter + MQTTでスマートメータの値をリアルタイムで取りたかったので、スマフォアプリを試作してみた。まだ細かい所を作りこむ必要があるけど、MQTTにSubscribeして、電力データがPublishされるとゲージが動くサンプルまではできた。

電力データをMQTT ブローカに投げる所がまだできていないので、MQTTツールでPublishしてテスト

Nature社のWebAPIはMQTTではないので(当たり前ですが)、どこかのクラウドサーバ上で、Nature社のAPIを叩いて瞬時値を取ってきて、MQTTブローカにPublishする必要がある。AWSのLambdaでやってもいいけど有料なので、どこか無料のホスティングがないかと思案中*1

スマフォからNature社のWebAPIに直接アクセスるのもありですが、スマフォアプリはMQTT Clientとして作っておけば、topicさえ変えればいろんな計測データを汎用的に扱えるのではと思ったので。

■参考URL
mqtt_client/mqtt_server_client.dart at master · shamblett/mqtt_client · GitHub

*1:Google Apps ScriptでCRONを走らせられて、Google ColaboratoryではPythonが走らせられるらしい。2つを連携させると、定期的にAPIを叩いて、MQTTでPublishできそうな気がする

Nature Remo E liteを買ってスマートメータの値を表示

自宅の電気メータがアナログなやつからスマートメータに置き換わったので、瞬時値や積算値を見てみたいと思い、Nature Remo E lite(以降、Remo E)を購入した。これで測れるのは、スマートメータの値(コンセントの合計)で、分岐回路ではない。どれが電気をどれぐらい食ってるのか分からないので、コンセントごとに測れるようにワットモニターも買った。

外観は以下のように白い円筒形のデザイン

Remo Eは表示機能がないので、スマフォにアプリを入れて表示することになる。セットアップはBLEでやるのだけど、表示はNature社のサーバに接続して表示される。だから、、スマフォが直接 Remo Eと繋がるのではなく、以下の形態でデータが表示される(出かけた先からでも自宅の電気使用量が確認可能)

Remo E--->Nature社サーバ<----スマフォアプリ

以下はスマフォアプリを使って自宅のスマートメータの値を表示したところ

で、、自分で好き勝手に見たい人のために、WebAPIが提供されていて、アカウントを作ってToken を発行するとWebAPIが使えるようになる。この辺りはいろんな人が書いているので、それを見れば分かると思う。自分も同じようにやってみて、サクッとAPIが動いた。機器情報取得API

curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -H "Authorization: Bearer R6mUxxxxxxxxxxM2kis" | jq

で情報を取得することで、以下の様にスマートメータの情報が取得できる。

[
  {
    "id": "978d1f50-0175-4825-9b10-13dxxxxxxx5f",
    "device": {
      "name": "Remo E lite",
      "id": "178284d7-7734-4df0-a758-17dxxxxxxx45",
      "created_at": "2022-04-15T04:38:04Z",
      "updated_at": "2022-04-15T04:38:34Z",
      "mac_address": "c4:dd:57:xx:xx:xx",
      "bt_mac_address": "c4:dd:57:xx:xx:xx",
      "serial_number": "4W1xxxxxxxxxxxx38",
      "firmware_version": "Remo-E-lite/1.3.12",
      "temperature_offset": 0,
      "humidity_offset": 0
    },
    "model": {
      "id": "7f3de26b-0afa-44fe-8680-7cxxxxxx15",
      "manufacturer": "",
      "name": "Smart Meter",
      "image": "ico_smartmeter"
    },
    "type": "EL_SMART_METER",
    "nickname": "スマートメーター",
    "image": "ico_smartmeter",
  *略*
        {
          "name": "measured_instantaneous",      <<<<瞬時値
          "epc": 231,
          "val": "340",        <<<<<<<   340W
          "updated_at": "2022-04-15T05:25:02Z"
        }
      ]
    }
  }
]

epcという表現からわかるように、ECHONET Liteのプロパティとして表現される。詳細な仕様もECHONET Lite の機器仕様書で分からるはずと。
以下は運用中の画面、上下に配置されていると、Remo Eの計測結果が下の画面に表示されているように思うかもしれませんが、下の装置は、コンセントの使用電気量を測るだけのワットモニターです。

ノートPC(Let's Note CF-F10)に電源供給していますが、撮影した時点で約40W消費しています。

別の装置ですが、スマートメータの積算値が表示できていて、これで見ると、今日は二人がE-Workでしたが、日中の電気使用量が昨日より上がってるのが分かる。しかも18時には極端に跳ね上がっている。これは晩飯の準備だから?

まずは、目立って電気を使いそうな家電(ドライヤー、電気ポット、電子レンジ)等をコンセントの計測値とスマートメータの瞬時値の両方で比較しながら、どれが電気を食っているのか、また、省電力で過ごせた日と、電気使った日で何が違うのか等を調べたい。

■参考URL
Nature Inc. | Nature Developer Page

一部で話題のハトバースに行ってみた

一部で話題のハトバースに行ってみた。入場者数に制限があるそうだが、たまたま入れた。入ってみたら自分はハトになっていて、あちこちを歩き回る。ジャンプはできるけど、飛び回ることはできないようなので、基本歩く。飛んだ時にクックルーと鳴くのだ。周りのハトからも鳴き声が聞こえる。コミュニケーション手段は、この鳴き声なのだが、鳴き分けもできないので、隣のハトが何を言いたいのかは分からない。

確かに、コミュニケーションしなくてはというストレスがないメタバースだからストレスフリーだった。だけど、やることがない。ロッジの中に入ってみたけど。それ以上やることがない。ある程度まともな?仮想空間に入ったのは初めてだった*1

ハトバース(HATOVERSE)公式サイト | ハトジャンプ【公式サイト】

*1:某学会発表をバーチャル空間で聴講したこともあったが、自分のハードがショボいせいか、なかなか辛い体験だった