AirconShutdown

SwitchBot API

IFTTT不発事故に起因する2021年版AirconShutdownの善後策。

SwitchBotハブミニ

SwitchBotハブミニ

これまではTwitter経由のIFTTTで家電リモコンSwitchBotを制御していたところ、2022年版IRKitでは直接APIを叩くようにできたので、SwitchBotSwitchBot Open APIを叩くことに。

SwitchBot Open API

https://api.switch-bot.com/v1.0/devices/**<deviceId>**/commands

というRESTエンドポイントに制御データをPOSTする枠組み。****で指定する対象装置は

curl --request GET 'https://api.switch-bot.com/v1.0/devices' \
  --header 'Authorization: 認証トークン' \
  --header 'Content-Type: application/json; charset=utf8'

で一覧を取得できる。なお、認証トークンはSwitchBotをHub経由でAPIから操作するに倣い、SwitchBotアプリの「開発者向けオプション」から取得できる。

ちなみに、エアコンの制御データのパラメータは

deviceType
commandType
Command
command parameter
Description
…となっているので、、エアコン停止用の
{  "command": "setAll", "parameter": "25,1,1,off", "commandType": "command"}

というデータを"switchbot_aircon_off.json"というファイルにして

#!/bin/bash
BASEPATH=$(dirname $0);
SWITCHBOT_API="https://api.switch-bot.com/v1.0"
SWITCHBOT_TOKEN="90edf....3431"
hdr_auth="Authorization:${SWITCHBOT_TOKEN}"
hdr_type="Content-Type: application/json"
# BODY="@${BASEPATH}/switchbot_aircon_off.json"
BODY='{"commandType": "command", "command": "setAll", "parameter": "25,1,1,off"}'
AIRCON_1F="01-2020XXXXXXXX-32"  # 1F
AIRCON_2F="01-2020YYYYYYYY-52"  # 2F
AIRCON_3F="01-2020ZZZZZZZZ-82"  # 3F
for DEVICE_ID in $AIRCON_1F $AIRCON_2F $AIRCON_3F;
do
    URL="${SWITCHBOT_API}/devices/${DEVICE_ID}/commands"
    curl "${URL}" \
         --silent -O /dev/null \
         -H "${hdr_auth}" -H "${hdr_type}" \
         -X POST -d "${BODY}"
done

というスクリプトを回せばエアコン3台が順次停止になる運びだ。

IRKit復活

先日エアコン自動停止不発問題。

IRKit

2016年に購入したIRKit

IFTTTが不発という事で善後策の検討していたのだが、iPhoneで家電を操作できるリモコンデバイス IRKitのアプリが実は直接叩いていて、そのDevice HTTP APIも公開されている事がわかった。

なんと、curlコマンド一発で赤外線データをJSON形式で取得できて、それをまたcurlで送りつければいいらしい。

というわけで、2016年に調達したIRKitを復活。

まずはBonjourを使ってIPアドレスを求める必要があるので、UbuntuではAvahiなツールを使って

yano@GT110b:~$ IRKIT=$(avahi-resolve -n $(avahi-browse -t _irkit._tcp | awk '{print $4"."$6}') | awk '{print $2}');echo ${IRKIT};

てな感じでIPアドレスを調べておく。

それから、IRKitに向けてリモコンボタンを押したあと、curlで

yano@GT110b:~$ curl -H "X-Requested-With: curl" -i "http://$IRKIT/messages"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain
{"format":"raw","freq":38,"data":[843,843,935,843,935,843,,,,,935,787,935]}

てな感じで赤外線データが採れる事を確認。

IRKitの赤外線データはGET応答と引き換えに消去される仕様なので、もう一度IRKitに向けて同じリモコン操作を行い

yano@GT110b:~$ curl -H "X-Requested-With: curl" "http://$IRKIT/messages" --output ${HOME}/IRKit/urusara_off.json

てな感じでボディだけをファイルに保存したあと、

yano@GT110b:~$ curl -i "http://${IRKIT}/messages" -H "X-Requested-With: curl" -d @${HOME}/IRKit/urusara_off.json
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain
yano@GT110b:~$

とする事で、Ubuntuのターミナルからエアコンの停止に成功。

IFTTT不発

トリガー失敗しました

IFTTT

昨日朝エアコン自動停止不発問題。

家電リモコンSwitchBotの両方が発動しなかったという事からも、なんとなくIFTTTが怪しいような気がしてきた。

改めてアクティビティを確認したところ、7時前のイベントではIFTTTのトリガー動作までは動いていたのだが、15時のイベントでは**“Applet failed”**となっていた事がわかった。

やっぱり、クラウドなどの外部のサーバ経由だとそれこそ余計な単一障害点となってしまうので、自宅サーバから直接叩く方法を模索するか。

参照

IFTTT https://ifttt.com/

INTERNET Watch https://internet.watch.impress.co.jp/

Wikipedia https://ja.wikipedia.org/wiki/

ES500逝去

今朝、7時前にアンペアブレーカーが飛んでしまった。

瞬時電流計測値の推移

Twitter

自慢のエアコン自動停止が、まさかの不発だった模様。

スマートメーターのモニタリング、Twitterのアラートが発動し、IFTTTのトリガー動作までは動いていたので、どうやら最後の家電リモコンSwitchBotが発動しなかったっぽい。

配電盤に急いで復旧させたところ、サーバーの方でピーピー音がし始めたので、慌ててサーバーを確認したところ、UPSのアラート音だった。

2016年11月に交換したバッテリー(RBC2J)も2008年7月に調達していたものなので、もはや寿命を全うしているに違いない。ていうか、2004年9月の調達から17年以上稼働し続けているES500自体が寿命かも。

参照

APC Japan https://www.apc.com/jp/ja/

Wikipedia https://ja.wikipedia.org/wiki/

AirconShutdown

先日の電力需要逼迫騒動で再燃した"自動エアコン停止"大作戦。

AirconShutdown発動

TwitterとIFTTT

twurlとの連携は確認できたので、ロガーからUbuntu 20.04にアップデートしたvpstwurlを叩いて、IFTTTをトリガーすることに成功。

参照

@IT https://www.atmarkit.co.jp/

INTERNET Watch https://internet.watch.impress.co.jp/

窓の杜 https://forest.watch.impress.co.jp/

Qiita https://www.moongift.jp/

MOONGIFT https://www.moongift.jp/

GitHub https://github.com/

IFTTT https://ifttt.com/

Wikipedia https://ja.wikipedia.org/wiki/