YANO's digital garage

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

Last-modified: 2023-01-25 (水)


[一語一絵/IT系]

IRKit再改修 / 2022-12-31 (土)

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

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

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

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

大晦日夕方の失態に軽く焦りつつ、どうしたもんかと[External]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するように改修。

[External]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
+    keys.set(GSSECURITY_WPA2_PSK,
+             PB("SSID",1),
+             PB("PASSWORD",2));
+/*  keys.setKey(P("5284CF0D43994784897ECAB3D9935498")); */
+#endif // CLOUD_CONTROL
     keys.save();
     software_reset();
}

年越し前にミスを帳消しにできて良かった。

【参照】
●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


[一語一絵/IT系]

OM-5 / 2022-12-29 (木)

新ブランド名「OM SYSTEM」を発表した[External]オリンパス改め[External]OMデジタルソリューションズ

OM SYSTEMロゴの「OM-5」登場 ちょっと地味だけど基本性能の高い手頃な一眼カメラ
[External]ITmedia NEWSより

2月に発表したOM-1に続いて[External]“OM SYSTEM”ロゴをペンタ部に冠した「OM SYSTEM OM-5」が発売された。

ペンタ部のロゴが「OLYMPUS」でなくなったのが残念。

【参照】
●デジカメ Watch https://dc.watch.impress.co.jp/
オリンパスとパナソニック、「マイクロフォーサーズシステム」規格を発表 2008年8月5日
オリンパス、映像事業を分社・譲渡 2020年6月24日
オリンパス、同社カメラ製品の今後についてコメント 2020年6月26日
オリンパス、映像事業譲渡の正式契約を締結 2020年9月30日
「OM SYSTEM」が目指す姿とは。“OLYMPUS”ブランド変更の理由を聞いた 2021年11月1日
OMDS、“オリンパス”に替わる新ブランド名「OM SYSTEM」発表 2021年10月27日
OMデジタルソリューションズ、「新たなカメラ開発の最終段階」にあると発表 2021年10月27日
OMDSのフラッグシップ1号機「OM SYSTEM OM-1」3月発売。27.3万円 2022年2月15日
イメージセンサー&画像処理エンジン一新で大きく進化……「OM SYSTEM OM-1」レビュー 2022年2月28日
OM SYSTEMフラッグシップ「OM-1」の発売日が3月18日に決定 2022年3月1日
“OM SYSTEM”ロゴをペンタ部に冠した「OM SYSTEM OM-5」。11月発売 2022年10月26日
特別企画:軽快なボディで挑む先進の山岳風景…OM SYSTEM OM-5 2022年12月23日
●ITmedia NEWS https://www.itmedia.co.jp/news/
どうなるオリンパスのカメラ事業 「PEN」「OM-D」の技術と強み 2020年7月2日
オリンパスの映像新会社は「OMデジタルソリューションズ」 来年1月、投資ファンドに譲渡 2020年10月1日
オリンパス、映像事業の譲渡完了 開発や販売も八王子本社に集約 2021年1月5日
デジカメ黎明期をけん引したオリンパス 浮いたり沈んだりの25年史 2021年1月20日
原点に立ち返った“オリンパスPEN” 誰もが軽快に写真を楽しめる「E-P7」 2021年7月29日
50年ぶりの「OM-1」は王道進化を遂げたOM-Dだった 2022年2月17日
21世紀の「OM-1」は画質が良くてAFもすごく速くなっていた 2022年3月30日
OM SYSTEMロゴの「OM-5」登場 ちょっと地味だけど基本性能の高い手頃な一眼カメラ 2022年12月29日
●OM SYSTEMブランドサイト https://omsystem.com/ja-jp/
OM-1
OM-5
●OMデジタルソリューションズ株式会社 https://om-digitalsolutions.com/ja/
●Wikipedia https://ja.wikipedia.org/wiki/
オリンパス
OMデジタルソリューションズ
マイクロフォーサーズシステム


[一語一絵]

XT250Xバッテリー交換 / 2022-12-27 (火)

週1でやってたXT250Xの始動が怪しくなってきた。

oriental ZGX5L-BS
oriental バッテリー ZGX5L-BS

[External]MOTOPOWER MP00205Bを繋いでトリクル充電していたのだが、切り離すとセルスターターの勢いが完全に失われてしまうので、どうやらバッテリーが寿命のようだ。

XT250Xの現バッテリーはFURUKAWAのFTZ7Sであることを確認し、いつもの[External]オリエンタルを直撃してFTZ7S互換の「ZGX5L-BS」を調達。価格は3,080円也。

今年2月に逝去したES500もついでに回収してもらえて良かった。

【参照】
●株式会社オリエンタル http://www.orientalbattery.com/
ZGX5L-BS (互換品番5L-BS) AGMゲル密閉型バイクバッテリー互換バッテリーYTZ7S YTZ6
●MOTOPOWER DIRECT https://motopowers.com/
MOTOPOWER MP00205B 12V 1000mA Fully Automatic Battery Charger/Maintainer
●Wikipedia https://ja.wikipedia.org/wiki/
鉛蓄電池


[一語一絵/IT系]

Dyson Zone / 2022-12-26 (月)

【本田雅一のAVTrends】空気洗浄ヘッドフォン「Dyson Zone」が目指す場所と現在位置
[External]AV Watch記事より

空気清浄機能付きのヘッドフォン、という斜め上から攻めてきたダイソン。

ストリーマー技術を誇るダイキンかと思ったが、そういう観点ではプラズマクラスターのシャープやナノイーのPanasonicが出てきてもおかしくない。

ノイズキャンセリングに続いて、微小粒子状物質(PM2.5)やウィルスキャンセリング、というジャンルが確立する余地はあるのかもな。

【参照】
●AV Watch https://av.watch.impress.co.jp/
ダイソン、空気清浄できるANCヘッドフォン「Dyson Zone」海外発表 2022年3月30日
ダイソン空気清浄ヘッドフォン「Dyson Zone」全仕様公開 2022年12月8日
【本田雅一のAVTrends】空気洗浄ヘッドフォン「Dyson Zone」が目指す場所と現在位置 2022年12月26日
●Wikipedia http://ja.wikipedia.org/wiki/
空気清浄機
ヘッドフォン
ダイソン (企業)


[一語一絵/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