AndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPにTermuxをインストールして各種サーバを走らせてやろうという話。
常時起動状態を確保
リモコンで表面上電源を切った状態では実際には電源は落ちておらず,現にGoogle Castのキャスティングを他のスマホなどからすることができる。なのでいわば「根本から」電源を絶たれでもしない限りサーバとして使うことに支障はまったくない。Wake-On-LANでなんとかなるか,スマートプラグを利用して外からコントロールするか,などとちょっと考えたがそんな必要は全くなかった(当たり前?)。
ただし,テストしていると少なくともアプリレベルでは固まってしまうことがある。現在は完全に電源を落として入れ直すことで再起動させて問題を解消させている。ところが最終的にAmigo 7xJPは他人様のお宅に収まって,そのときには私が簡単に手動で再起動させることはできなくなる。そこでそういう状況になっても遠隔で強制的に再起動できるよう,保険の意味でスマートプラグを介して電源供給しておくようにするのは賢明なことかもしれない。
固まるアプリは具体的には今のところホームアプリ(ランチャーアプリ)。NewPipeアプリでYouTubeビデオを再生して,ホーム画面に戻ることで再生をバックグラウンドで継続させる。その一定時間後,スクリーンセーバのフォトフレームアプリが起動する。その後リモコンのホームボタンを押すと,真っ黒な画面になってうんともすんともいわなくなる,といった具合。 ⇦ “Termux環境下でアプリを強制終了” で限定的に対処。
さらに,起動時にmicroSDカードを認識しなかったことが一度あった。理由は全く不明。ひょっとして暑かったから?
Termux関係のアプリのインストール法
Google Play StoreにあるTermuxアプリには以下のような注釈が付けられている。したがって,Termux本体含め関係アプリは全てF-Droid から入手する必要がある。
NOTE: Updates over Google Play is currently halted due to technical reasons. In the meantime, see https://github.com/termux/termux-app#installation for alternative installation sources.
“Termux Google Play – Termux Wiki” にもう少し詳しい背景の説明あり。
Termux:APIはアプリをインストールするだけではダメで,以下のようにtermux-apiをインストールする必要がある。
pkg install termux-api
最初Play Store版をインストールして起動してみたところ, “unable to install the bootstrap packages” というエラーが出た。 “termux was unable to install the bootstrap packages” when I open Termux · Issue #1761 · termux/termux-packages · GitHub” にあるように内部ストレージに移動することで解消。これはうかつなことに「どんなアプリも強制的に外部ストレージにインストールできるようにする」という開発者オプションをオンにしていたせいかもしれない。
サービスが自動起動しない
“Remote Access – Termux Wiki” を参照にOpenSSHをインストール。使用ポートはSSH標準の22ではなく8022。ユーザ名は user でOK。
Termux:Bootアプリをインストールししかるべき設定をすることで,Amigo 7xJPの起動時にsshdが自動起動して欲しい。しかし何をどうしてもうまくいかない。Termux-servicesを使う方法は試していない。
“Not executing script at boot · Issue #5 · termux/termux-boot · GitHub” なんか見ると同じ問題に苦しんでいる人は多そうだ。ここの投稿の中で,デーモンが勝手に殺されている,自動起動スクリプトではnohupの使用が有効(nohup のマニュアル),電力消費の最適化を外す,の3投稿が本質的のように思えた。
それぞれに対応した対策を全てやってみたがうまく行かない。で数時間潰した後,Termux:Bootアプリがなぜか外部ストレージにインストールされていたことに気づいて,それを内部ストレージに移したら(図)sshdが自動起動するようになった。上に述べたように外部ストレージのインストールを強制的に可能にしてた結果なのだろうか。それをオフにした後,Termux:Bootアプリをアンインストールして,その後再度インストールしたはずなのに…。
ちなみにこの後Termux:Bootアプリを外部ストレージに移すことはできなくなった。つまりTermux:Bootアプリ自身は「内部ストレージにインストール必須」と指定してたってことか。Termuxでのストレージの扱い全般については “Internal and external storage – Termux Wiki” 参照。
これで自動起動問題にはケリがついたかと言うと残念ながらそうではなく,後でインストールしたNode-REDの自動起動にはまだ成功していない。
なお,電力消費の最適化の対象から外すには,設定メニュー → Apps → Special app access → Energy optimization でアプリごとにトグルできる。アプリの自動起動を許可・不許可する設定は見つけられていない。
Bluetoothをサポートしていない
驚いたことにTermuxはBLEをはじめBluetoothを全くサポートしていない。
その他サーバのインストール
“Install Home Assistant, Mosquitto broker and Node-Red on android – Share your Projects! – Home Assistant Community” には自分でやりたいこととかなり重複なる内容。
Node-RED
“Running on Android : Node-RED” に従いNode-REDのインストール。Android専用で,Androidに特化したカスタムノードつきのNode-RED処理系RedMobileがあるというのは知っていたし,そちらの方がTermuxのNode-REDより軽いという人がいるというのも知っていたが,以下の理由でTermux版を選んだ:
- TermuxはLinuxに準拠しているので,そのNode-REDの方がなにかにつけ手間がかからないであろう。
- RedMobileはパレットマネジャが使えない。
- RedMobileは自身からはNPMモジュールを自由にインストールできない。Node.js上でNPMモジュールを読み込んだ後RedMobileが読み込める形に変換するという手続きが必要で大変。
- RedMobileが用意しているAndroidに特化したカスタムノードは,大半がAndroidスマホのセンサーに関するもので,スマホ上で使うのには意味があっても,Amigo 7xJPのような据え置き型Android TV機器にはそもそも意味がない。
- Node-REDだけでなくNode.jsも直接使うかもしれないが,本来Node-REDはNode.jsに基づいているので,Termuxであれば特に何もインストールしたりする必要がない。Android特化版Node.jsだとRedMobileとは別途インストールすることになり重複が起こる。
ただ,なぜか自動起動が成功していない。Sshdはできたのに…。まだこの問題は解決できていない。⇐ 下に引用したコメントを参照し自動起動スクリプトを変えたら成功。ただしtermux-fix-shebang コマンドはアーギュメントのファイル内容を直接変えてしまうので,1度だけ実行すればよく,自動起動スクリプトの中で何度も実行する必要はない。 “Differences from Linux – Termux Wiki” によれば最近のTermuxでは, Termux-execのおかげで,特にtermux-fix-shebang コマンドを実行する必要はないように読めるのだがそうではないのだろうか。
Node-REDのFAQに “Starting Node-RED on boot : Node-RED” があるが,これもしっかり理解し試していない。もっとも,sshできるのなら,それで接続してからそのターミナルからNode-REDを起動するのは,手作業とはいえ,Amigo 7xJPで極めて不便な文字入力をしながらやることに比べれば格段に楽。
“Install Home Assistant, Mosquitto broker and Node-Red on android – Share your Projects! – Home Assistant Community” に以下のコメントがある(イタリックは私):
Now for your problem of starting node-red i found that you can use Termux:Boot. Add this in your start-sshd file and reboot phone.
termux-wake-lock # seems fine
termux-fix-shebang $(which node-red)
node-red --node-args="--max-old-space-size=128"
sshdpm2 startup don’t work on android. pm2 resurrect restores applications saved with pm2 save but only when you open termux. Use Termux:Boot to solve your problem. Than you don’t need to open Termux UI.
少なくとも “Starting Node-RED on boot : Node-RED” で勧められていたpm2が使えないとわかっただけでも意味がある。
“Securing Node-RED : Node-RED” もやらないと。以前Oracleの無料VPSサービスでNode-REDを使えるようにしたときの記録が参考になるかも。 “Settings.js Termux in android – General – Node-RED Forum” によれば settings.js があるべきなのは/data/data/com.termux/files/home/.node-red.
Node-REDを使って実現したいことの例
- XiaomiのBLEセンサーのアクセス。特にスマート温湿度計LYWSD03MMC。
- “TuyAPIを使ったNode-REDでのTuya機器の制御に再挑戦…が断念” で断念したTuyAPIを使ったTuya IoT機器のローカル制御。特にTuyaがOEM提供した電力計機能つきのスマートプラグのコントロール。
その他今後試してみたいサーバ
- MQTTブローカ
- Scrypted
「TermuxをAndroidTV準拠ストリーミング・メディア・プレーヤAmigo 7xJPで」への9件のフィードバック