Archive: 2022/12/25

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
- 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;

}