YANO's digital garage

Copyright ©YANO All rights reserved. https://www.bravotouring.com/~yano/

Last-modified: 2024-03-20 (水)


[一語一絵/IT系]

IRKit改修 / 2022-12-25 (日)

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

IRKitのサービスを終了しました。 2022-12-10追記
[External]IRKitサービス終了しました - maaash.jp

症状としては

どうやら自動制御系のIRKitの操作ではなく、通常のリモコン操作がトリガーになっているようなので、IR受信→学習で落ちているような印象。
と書いたとおりなのだが、時期的に[External]IRKitサービス終了と重なることに気づいた。

試しに ping しても

ping: unknown host deviceapi.getirkit.com
となる。

6月のLAN対応で適用した[External]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で無効化した[External]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
-    cmd = PB("AT+WPAPSK=IRKitXXXX,XXXXXXXXXX",1);
+    cmd = PB("AT+WPAPSK=IRKit41D9,工場出荷時パスワード",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..870532f 100644
--- a/firmware/src/IRKit/IRKit.ino
+++ b/firmware/src/IRKit/IRKit.ino
@@ -234,6 +234,7 @@ void on_ir_receive() {
             IRLOG_PRINTLN("!E31");
             return;
         }
+#ifdef CLOUD_CONTROL
         int8_t cid = irkit_httpclient_post_messages();
         if (cid >= 0) {
             if (config::ledFeedback <= config::LED_QUIET) {
@@ -243,6 +244,14 @@ void on_ir_receive() {
                 color.off();
             }
         }
+#else // CLOUD_CONTROL
+        if (config::ledFeedback <= config::LED_QUIET) {
+            FullColorLed::LightMode lightMode = (config::ledFeedback == config::LED_VERBOSE)? FullColorLed::BLINK_THEN_ON : FullColorLed::BLINK_THEN_OFF;
+            color.setLedColor( 0, 0, 1, lightMode, 1 ); // received: blue blink for 1sec
+        } else {
+            color.off();
+        }
+#endif // CLOUD_CONTROL
     }
}

@@ -315,6 +324,7 @@ void connect() {

     if (gs.isListening()) {

+#ifdef CLOUD_CONTROL
         if (!config::useCloudControl) {
             // No WAN access, we don't need to validate key, we're ready.
             IR_state( IR_IDLE );
@@ -332,6 +342,14 @@ void connect() {
                 on_irkit_ready();
             }
         }
+#else // CLOUD_CONTROL
+        // start mDNS
+        gs.setupMDNS();
+
+        // No WAN access, we don't need to validate key, we're ready.
+        IR_state( IR_IDLE );
+        on_irkit_ready();
+#endif // CLOUD_CONTROL
     }
     else {
         keys.dump();

diff --git a/firmware/src/IRKit/IRKitHTTPHandler.cpp b/firmware/src/IRKit/IRKitHTTPHandler.cpp
index a3dd2ce..69da8e0 100644
--- a/firmware/src/IRKit/IRKitHTTPHandler.cpp
+++ b/firmware/src/IRKit/IRKitHTTPHandler.cpp
@@ -482,6 +482,7 @@ void irkit_http_on_timer() {

void irkit_http_loop() {

+#ifdef CLOUD_CONTROL
     if (!config::useCloudControl) {
         // Cloud control is currently disabled. No polling loop.
         return;
@@ -513,4 +514,7 @@ void irkit_http_loop() {
     if (TIMER_FIRED(suspend_polling_timer)) {
         TIMER_STOP(suspend_polling_timer);
     }
+#else // CLOUD_CONTROL
+     // Cloud control is currently disabled. No polling loop.
+#endif // CLOUD_CONTROL
}
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;

}

【参照】
●Eleclog. https://eleclog.quitsq.com/
ミニマルなIRKitクローンを作ってiOSから家電を制御する 2016年9月20日
●AkiCart https://aki.prioris.jp/
ESP-WROOM-02でミニマルなIRKitクローンを作る
●IRKit http://getirkit.com/
Device HTTP API
Internet HTTP API
●maaash.jp https://maaash.jp/
IRKit Internet HTTP APIと販売開始に向けて 2014年1月
IRKitリリース!そして再入荷予定について 2014年1月
IRKitの脆弱性とファームウェアアップデートのお願い 2015年9月
Nature RemoのKickstarterを開始しました 2016年5月
IRKitサービス終了(そろそろ) 2022年4月23日 【2022年12月10日追記】
●ICT備忘録 http://category7.blog.fc2.com/
IRKit の LEDの光 と Cloud Serverへのアクセス をオフにしてみた。 2015年8月15日
●GitHub https://github.com/
IRKit
irkit/device: Infrared-WiFi-HTTP bidirectional proxy device
acourreges/device: Infrared-WiFi-HTTP bidirectional proxy device
●Wikipedia https://ja.wikipedia.org/wiki/
Arduino
マルチキャストDNS
Bonjour