IRKit

IRKit再改修

最近auひかり方面のルーターASUS RT-AX3000からDHCPでアドレスが降ってこないケースが目立つようになってきたので、年明けのルーター交換を視野にIR受信結果のアップロードを首絞めしたIRKitのWiFi接続先も変えておこうかな、とRESETスイッチを長押ししてファクトリーリセット

IRKitのサービスを終了しました。 2022-12-10追記

IRKitサービス終了しました - maaash.jp

…したところ、iPhoneアプリからのWiFi接続設定を行っても**“インターネットに接続してください”**と表示されて、何度やっても設定できなくなった。

「しまったー、ここでもIRKitサービス終了が効いているのか…」と思ったが"あとの祭り"というやつだ。

大晦日夕方の失態に軽く焦りつつ、どうしたもんかとDevice HTTP APIを眺めたところ、curlで"POST /wifi"すれば設定できるという事はわかった。

ただ、SSIDなどをシリアライズするのもちょっと面倒なので、それならファームウェアを直接書き換える方が早いかも?と思ってIRKit.inoを確認したところ、connect関数の

309 if (keys.isWifiCredentialsSet()) { 310 if (config::ledFeedback < config::LED_OFF) { 311 color.setLedColor( 0, 1, 0, FullColorLed::BLINK_THEN_ON ); // green blink: connecting 312 } 313 314 gs.join(keys.getSecurity(), 315 keys.getSSID(), 316 keys.getPassword()); 315 }

あたりのgs.joinでWiFi接続しているのが確認できたので、単刀直入にgs.joinの引数をハードコードしてしまおうかと思ったのだが、isWifiCredentialsSetなどkeysクラスの実装を眺めてみるとそれだけでは済まないような気がしてきた。

代わりにkeys.set関数でSSIDなどをEEPROMに書き込む方向で試行錯誤してみたところ、これでも問題無くWiFi接続できたので、結局RESETスイッチ長押し契機のlong_pressed関数でkeys.setするように改修。

device/firmware at settings-led-cloudからの差分は以下の通り。

$ git -b diff diff –git a/firmware/src/IRKit/IRKit.ino b/firmware/src/IRKit/IRKit.ino index 2351b59..81a6614 100644 — a/firmware/src/IRKit/IRKit.ino +++ b/firmware/src/IRKit/IRKit.ino @@ -169,6 +169,12 @@ void long_pressed() { color.setLedColor( 1, 0, 0, FullColorLed::ALWAYS_ON ); // red: error keys.clear(); +#ifndef CLOUD_CONTROL

IRKit改修

先日、不調が確認されたIRKit。

IRKitのサービスを終了しました。 2022-12-10追記

IRKitサービス終了しました - maaash.jp

症状としては

どうやら自動制御系のIRKitの操作ではなく、通常のリモコン操作がトリガーになっているようなので、IR受信→学習で落ちているような印象。

と書いたとおりなのだが、時期的にIRKitサービス終了と重なることに気づいた。

試しに ping しても

ping: unknown host deviceapi.getirkit.com

となる。

6月のLAN対応で適用したdevice/firmware at settings-led-cloudはコメントに

this option: the device won’t send regular polling requests to the cloud server.

と書いてある通り、「irkit_http_loopでAPIサーバに繋がらなくても起動する」ようにした改造版。ブログにも

サーバに接続しているIRKitの数を見てもそれらを通して赤外線信号を送っている人の数を見ても、0ではありませんが、そろそろ良いかな、という頃合いです。

と書かれているとおり、「IR受信→学習結果のアップロード」でもAPIサーバに赤外線信号を送っていて、それが送信エラーになった為にRebootしている可能性がある。

IRKit.inoを確認したところ、on_ir_receiveからirkit_httpclient_post_messagesを呼んでいるが、それが送信エラー時にwifi_hardware_resetが叩いている事がわかったので、on_ir_receiveでirkit_httpclient_post_messagesを呼ばないように改修。

config::useCloudControl自体見る必要もなくなったので、当該箇所を#ifdef CLOUD_CONTROLで無効化したdevice/firmware at settings-led-cloudからの差分は以下の通り。

$ git -b diff diff –git a/firmware/src/IRKit/GSwifi.cpp b/firmware/src/IRKit/GSwifi.cpp index b6ed100..97713bf 100644 — a/firmware/src/IRKit/GSwifi.cpp +++ b/firmware/src/IRKit/GSwifi.cpp @@ -1093,7 +1093,7 @@ int8_t GSwifi::startLimitedAP () { command(PB(“AT+NSET=192.168.1.1,255.255.255.0,192.168.1.1”,1), GSCOMMANDMODE_NORMAL); // password area overwritten in factory

IRKit不調

6月にLAN対応した後も引き続きリビングで活用中のIRKit。

IRKit

2016年に購入したIRKit

ここ数日、気づいたら緑LEDが点滅してRebootしている挙動が目についてきた。

どうやら自動制御系のIRKitの操作ではなく、通常のリモコン操作がトリガーになっているようなので、IR受信→学習で落ちているような印象。

IRKitも2016年に調達して6年以上が経過。

ぼちぼち寿命だとすると、潔くNature Remo miniに置き換えるしかないかなーと思ってたのだが、ESP-WROOM-02でミニマルなIRKitクローンを作るという手があったとは。

参照

Eleclog. https://eleclog.quitsq.com/

AkiCart https://aki.prioris.jp/

IRKit http://getirkit.com/

maaash.jp https://maaash.jp/

ICT備忘録 http://category7.blog.fc2.com/

GitHub https://github.com/

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

IRKit独立

2014年1月から12800台が生産され、2017年11月25日に完売したIRKitだが、なんと4月にサービス終了の案内が出ていた事に気づいた。

IRKit

2016年に購入したIRKit

2016年に調達した手元のIRKitも3月に復活したばかりだが、最初にサーバに接続してからでないと**“Device HTTP API"すら使えなくなる**という事で、打つ手なし。

と思いきや、

幸いにもIRKitのファームウェアはオープンソースであり、この問題を解決してくれた方がいらっしゃいます。 こちらのpull request https://github.com/irkit/device/pull/6 を書き込むと useCloudControl という設定をfalseにしてビルドすることで、サーバに接続する機能を停止します。この時ローカルネットワークは使えます。

という救済策が案内されていたので、早速GitHub - acourreges/device からファームウェアを入手してファームアップにトライ。

出荷時に設定されるWi-Fiアクセスポイントのパスワードとバージョン情報を適当に設定して、arduino-1.8.10でアップロード。

しかし、IRKitは再起動しても一向にLEDが赤明滅にならず。青点灯して消灯となってしまったのでRebootを繰り返しているものと思っていたのだが、アクセスポイントの接続状態をチェックしたところ以前の設定通り自宅のWiFiに繋がっていることが判明。pingでも応答があるし、curlにも従前通り反応。レスポンスヘッダのServer行で出力されるバージョンでもファームアップできていることが確認できた。

というわけで、自宅のWiFi接続情報が消えてなかったので、ファームアップしてもファクトリーリセットではないという事らしい。

ただavahi-browseに反応しなくなっていたので、setupMDNSだけはuseCloudControlの設定に依らず効くように変更し、最終的に変更点は以下の通り。

yano@GT110b:~/IRKit$ git clone https://github.com/acourreges/device.git
yano@GT110b:~/IRKit$ cd ~/IRKit/device
yano@GT110b:~/IRKit/device$ vi firmware/src/IRKit/GSwifi.cpp firmware/src/IRKit/IRKit.ino firmware/src/IRKit/cert.h
yano@GT110b:~/IRKit/device$ git diff -b
diff --git a/firmware/src/IRKit/GSwifi.cpp b/firmware/src/IRKit/GSwifi.cpp
index b6ed100..97713bf 100644
--- a/firmware/src/IRKit/GSwifi.cpp
+++ b/firmware/src/IRKit/GSwifi.cpp
@@ -1093,7 +1093,7 @@ int8_t GSwifi::startLimitedAP () {
     command(PB("AT+NSET=192.168.1.1,255.255.255.0,192.168.1.1",1), GSCOMMANDMODE_NORMAL);
     // password area overwritten in factory
-    cmd = PB("AT+WPAPSK=IRKitXXXX,XXXXXXXXXX",1);
+    cmd = PB("AT+WPAPSK=IRKit41D9,2041357304",1);
     strcpy( cmd+10, hostname() );
     cmd[19] = ',';
     command(cmd, GSCOMMANDMODE_NORMAL, GS_TIMEOUT_LONG);
diff --git a/firmware/src/IRKit/IRKit.ino b/firmware/src/IRKit/IRKit.ino
index 2351b59..1342f0a 100644
--- a/firmware/src/IRKit/IRKit.ino
+++ b/firmware/src/IRKit/IRKit.ino
@@ -315,14 +315,14 @@ void connect() {
     if (gs.isListening()) {
+        // start mDNS
+        gs.setupMDNS();
+
         if (!config::useCloudControl) {
             // No WAN access, we don't need to validate key, we're ready.
             IR_state( IR_IDLE );
             on_irkit_ready();
         } else {
-            // start mDNS
-            gs.setupMDNS();
-
             if (keys.isAPIKeySet() && ! keys.isValid()) {
                 irkit_httpclient_post_door();
             }
diff --git a/firmware/src/IRKit/cert.h b/firmware/src/IRKit/cert.h
index cf6dcb3..01fc839 100644
--- a/firmware/src/IRKit/cert.h
+++ b/firmware/src/IRKit/cert.h
@@ -20,7 +20,7 @@
 #include "GSwifi_const.h"
 // deviceapi.getirkit.com
-prog_uchar der[] PROGMEM = {
+const char der[] PROGMEM = {
     ESCAPE, 'W',
     0x30, 0x82, 0x2, 0xed, 0x30, 0x82, 0x2, 0x56,
     0xa0, 0x3, 0x2, 0x1, 0x2, 0x2, 0x9, 0x0,
diff --git a/firmware/src/IRKit/config.h b/firmware/src/IRKit/config.h
index 2888117..89fa3f6 100644
--- a/firmware/src/IRKit/config.h
+++ b/firmware/src/IRKit/config.h
@@ -31,13 +31,13 @@ namespace config {
     } LedFeedbackProfile;
     // Defines what kind of LED profile you want.
-    const LedFeedbackProfile ledFeedback = LED_QUIET;
+    const LedFeedbackProfile ledFeedback = LED_VERBOSE;
     // Enables/disables cloud-control through the "deviceapi.getirkit.com" server.
     // If you use your IRKit device exclusively over your LAN, you can disable
     // this option: the device won't send regular polling requests to the cloud server.
     // This also lets you setup your device without internet access (no need for a valid device key).
-    const bool useCloudControl = true;
+    const bool useCloudControl = false;
 }
yano@GT110b:~/IRKit/device$

サーバに接続しなくなるとiOSやAndroidのアプリも使えなくなるかと思いきや、同一LAN配下であればそのまま使えるようだ。

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のターミナルからエアコンの停止に成功。

IRKit

先日書いたiPhoneで家電を操作できるリモコンデバイス IRKitを入手。

フットプリントはカードサイズ

IRKit

iPhoneにアプリIRKitシンプルリモコンをインストールして起動したところ「USB繋げ」と言われて面喰らったが、要は電源を供給しろという事だった。元々電源ユニットが付いてなかった事にもようやく気付いたよ。

この手の小型機器で最も面倒なのが「WiFi接続設定」だが、iPhoneアプリがその時点で繋がっている自宅WiFiのBSSIDを拾ってくれるので「パスワード」か「プリシェアードキー」を入力。一時的にAPモードになっているIRKitのWiFi(“IRKit~“で始まるBSSID)にiPhoneを繋げば先ほどの「WiFi接続設定」が投入され、IRKitはSTAモードに切り替わり自動的に「自宅WiFi」に接続する。

最初のうちはうまく接続できず「緑点滅」から数秒で「赤点滅」に戻ってしまっていたのだが、PLANEX MZK-1200DHPではなくAtrem WG1200HPには繋がったので、PLANEX MZK-1200DHPでもTKIPを有効にしたところ解決したようだ。

そう言えば、

エアコンの電源は1つのボタンでON/OFFする"トグル動作"なので、エアコンを使っていないのにブレーカーが落ちそうな状況になった際にエアコンの電源が入って自爆してしまう心配がある

と書いていたが、我が家の「うるるとさらら」2010年モデル Rシリーズ AN71LRPも思惑通りON/OFFは別信号で、上記の心配は杞憂に終わったよ。

参照

Engadget Japanese http://japanese.engadget.com/

ワテのブログ http://watenoblog.blogspot.com/

hagino3000 - Qiita http://qiita.com/hagino3000/

IRKit http://getirkit.com/

ダイキン工業株式会社 http://www.daikin.co.jp/

Amazon.co.jp https://www.amazon.co.jp/