古い Android スマホをサーバにする:Termux

定番の Termux

うちで使ってみたのは SHARP の AQUOS R3、Android11 なスマホ。

普通に Play ストアからインストールできる。
サクッと導入しちゃえばいいと思うよ。

ちょっと前までは「Play ストア版は古いままで更新されていない」という状態だったけど、2026年2月11日に更新された。

これが F-Droid 版と全く同じではない可能性は大きいけど、ざっくり使ってみた感じでは問題ない。

ただし、Google 側のポリシーに従ってアプリを作るってのはなかなか大変みたいで、Play ストア版は何かしらできないことがあると思った方が良いかな。
その時は F-Droid 版をインストールすればいい。
F-Droid 版というのは Play ストアからのインストールではなく APK ファイルを持ってきて導入するパターン。
個人的にはそこまで弄るつもりはないのでサクッと試せる Play ストア版。

APK ファイルからのインストールに抵抗のない人は F-Droid 版の方が後々いいかもね。
(それでもうちは Play ストア版でいってみるよ)

※実際に使ってみてわかったけど、Play ストア版か F-Driod 版か、という違いよりも「うちのスマホ、root 取れないやつだ…」
 というroot 奪取不可、という点の方が影響大。
 Play ストア版か F-Droid 版かどちらにするか、も大事かもだけど、「そのスマホ root 獲れる?」の方が大事だわ…

Termux でできそうなことできなさそうなこと

WSL や仮想マシンとは違い、Android のカーネル上で動くアプリみたいなものなので結構制限はありそう。
root 取ってないスマホだとユーザー権限でしか動かなそうだし、ハードウェア側を直接操作しようということも無理でしょう。
それでも、Nginx や Python が動くようなので、それなりに遊べると思う。

※追記
カメラやセンサー、電話機能、SMSなど、そこそこの機能が「他のアプリからは触らせない」という Android のセキュリティポリシーによって使えない。(そもそも root も取れてないしね)
Termux が最前面にある(Focusを持ってる)状態じゃないと機能しないものもある。
メッセージのポップアップ=toastとか。
とはいえ、個人的に必要なNginx、PHP、mariadb、Python、MediaMtx、通知機能、音量調整、しゃべらせる、あたりは問題ないので、とてもとても満足中。

よく使うものを導入

SSH で繋げる

さすがにスマホのソフトウェアキーボードじゃやりにくいからね。

$ pkg update
$ pkg install openssh

$ passwd
 New password:
 Retype new password:

$ sshd
$ whoami
 ux_axxx

$ ifconfig
 lo:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 wlan0:xxxxxxxxxxxxxxxxxxxxxxxxxxxx

whoami コマンドで「今ログインしているユーザー名」がわかる。
Termux は Android 上で動いていることもあり、ユーザー名を自由に決められるわけではないので、このコマンドで「今、自分は誰なのか」を確認する。

そして、「ip a」も使えない。MAC アドレスを外部ツールが勝手に読めないようにしているのだとかで。
けど、「ifconfig」なら動くので、これで今繋がっている WiFi 上での IP アドレスが確認できる。

クライアントから接続する際にはポート番号が 8022 になっているので注意。

Pythonのインストール

よっぽど古い機種じゃない限りスマホのほうがラズパイよりも速いはず。
となると、Python もまぁまぁ快適よね、きっと。

$ pkg install python

とりあえずこれだけでOK

$ python -V
Python 3.13.13

といった感じでバージョン確認できれば OK

Nginx と PHP ついでに mariadb もインストールしちゃえ

簡単。以下3行をまずは実行。

pkg install nginx
pkg install php-fpm
pkg install mariadb

Nginx の config ファイルは以下にあるので、ちょこっと修正。
/data/data/com.termux/files/usr/etc/nginx/nginx.conf

修正するのは実行ユーザーと PHP の設定部分。
ユーザー名は whoami コマンドを実行したときに表示されるユーザー名にしておく。

#user nobody;
user ux_axxx;

        location ~ \.php$ {
            root           /data/data/com.termux/files/usr/share/nginx/html;
        #    fastcgi_pass   127.0.0.1:9000;
            fastcgi_pass   unix:/data/data/com.termux/files/usr/var/run/php-fpm.sock;
            fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

また、PHP を使えるように下記も編集。
user と group はコメントアウトし、listen を変更。
$PREFIX/etc/php-fpm.d/www.conf

;user = nobody
;group = nobody
listen = /data/data/com.termux/files/usr/var/run/php-fpm.sock

まだちょっとあって面倒で、これも編集。
$PREFIX/etc/php-fpm.conf

pid = run/php-fpm.pid
error_log = log/php-fpm.log

最後に、php.ini ファイルが存在しないので作る。
$PREFIX/etc/php/php.ini

opcache.enable=0
opcache.enable_cli=0

最後の php.ini にたどり着くまでが大変だった…
Android は 10 以降でいろいろセキュリティが厳しくなったみたいで、そのまま実行するとパーミッションで弾かれる。
外部プログラムが勝手な動作をしないように見張られてるって感じかな。

なので、php.ini を追加してあげないとダメだった。


さて、ようやくここまでで Nginx と php の実行。
どっちも自動では立ち上がってないはずだけど、以下のようにしてプロセスをいったん切る。
その後、念のため設定ファイルの確認をして、Nginx を起動する。

$ pkill nginx
$ pkill php-fpm
$ php-fpm
$ nginx

これで <? phpinfo(); ?> みたいに試せばちゃんと表示されるはず…

尚、Nginx もポート番号に注意。
8080 になってる。

sshd、Nginx&php-fpm、mediamtx 等を Termux 起動と同時に立ち上げる

ここまででいくつかのサービスがインストール、設定でき、実行されている。
が、Termux を再起動すると、これらは手動で起動しなければならない…なんてバカげてるよね。

Linux なら systemctrl というものを使って、Linux が起動したら目的のサービスを自動的に起動する、なんてことができる。
ただ、Termux は通常の Linux 環境と違って systemctrl が使えない。
なので、termux-service というものを使うそうな。

termux-service のインストール

$ pkg install termux-services

まぁ、インストールはこれだけだね。
大事なのは「サービスを起動させるためのスクリプト」だから。

そして、いくつかはすでに自動起動用のスクリプトがあらかじめ作られていた。
今回、足らなかったのは mediamtx 起動用なので、それを例にして以下に続ける。

自動起動スクリプトの作成

スクリプトの場所は $PREFIX/var/service/
その後にサービス名となるディレクトリを作成し、その中に run というスクリプトファイルを作成する。

$ mkdir $PREFIX/var/service/mediamtx
$ vi $PREFIX/var/service/mediamtx/run

$PREFIX/var/service/mediamtx/run の内容は以下。

#!/data/data/com.termux/files/usr/bin/sh
cd ~/mediamtx
exec ./mediamtx 2>&1

1行目のシバン(おまじない)は必須。

その後、このファイルに実行権限を与え、sv-enable コマンドを使って起動時に実行するよう設定する。

$ chmod +x $PREFIX/var/service/mediamtx/run
$ sv-enable mediamtx

これで Termux の起動と同時にいろいろ立ち上がってくる。

実際にちゃんと起動しているかどうかはこんな感じで判断できる。

$ sv status mediamtx
run: mediamtx: (pid 4608) 418s

termux-services(sv) によるログの記録

デバッグだったりなんなりでログを見たいなんてことは多々ある。
logcat というコマンドでリアルタイムにログを流しておくことはできるけど、いろいろなログがダラダラ流れる。
ここでは mediamtx のログだけを見たいので、それを記録するように追加設定。

まずはログ作成スクリプトを作る。

といっても、実行用のスクリプト run と同じディレクトリに log というディレクトリを追加して、その log ディレクトリ下にさらに run というファイルを作成すればOK

$ mkdir $PREFIX/var/service/mediamtx/log
$ vi $PREFIX/var/service/mediamtx/log/run

run の内容は以下の通り。

#!/data/data/com.termux/files/usr/bin/sh
exec svlogd -tt $PREFIX/var/log/sv/mediamtx

書き方は自動起動用のスクリプトと同じ。
exec の後に svlogd というログ記録コマンドが続き、その後に引数と保存場所が指定できる。

そのファイルに実行権限を与えサービスを再起動すれば、ログが自動で記録されローテーション管理もすべてやってくれる。

$ chmod +x $PREFIX/var/service/mediamtx/log/run
$ sv restart mediamtx

簡単。

Android をスリープさせずに安定性&パフォーマンス重視で起動

termux-services(sv) の使い方は上記の通り。
それに従って、Termux の API を開始したり、Android がスリープ状態にならないように wake-lock かけたりしておきたい。

$ mkdir $PREFIX/var/service/boot-setup
$ vi $PREFIX/var/service/boot-setup/run

run の中身は以下。

#!/data/data/com.termux/files/usr/bin/sh
termux-api-start
termux-wake-lock
exec sleep infinity

termux-api-start を実行しなくても API は使えるけど、一応…

termux-wake-lock は Android がスリープするのを防げるので、安定性とパフォーマンス維持に寄与するけど、その分、バッテリーの消費は早まるので、「持ち運びがメイン」な場合はちょっと考えもの。

だけど、termux-wake-lock をかけておいても今のところそこまで激しい消費にはなっていないので、しばらくはパフォーマンス重視で使ってみようと思う。

後々、下の方でも書いたけど、自宅と外とで使い分けてもいいし。
自宅ならいつでも充電できる or 充電しっぱなしでもイケるので。(充電しっぱなしは機種によってはNGかも?)

IP アドレスの通知欄への表示

本来なら IP アドレスは固定しておくのがサーバとしてはわかりやすい。
けど、スマホだからね。
「移動する」というメリットを生かしたい。
なので、DHCP から拾ってくる設定から変えずにおこうと思う。
(自宅と職場で切り替えるのも面倒だし、IPが時々変わるのはむしろ都合が良いことも無きにしも非ず、なので)

この時、「どうやってスマホに割り当てられた IP アドレスを調べるか」が問題になってくる。
いや、termux 使うくらいの人なら「調べるくらい簡単でしょ?」ってなるんだろうけど、もっとこう、他の人が見た時にもわかりやすくしたい。

となると、通知欄へ表示させたりするのが一番いい。

それも Termux はできる。
API を使えばいいのでサクッとインストール。

$ pkg install termux-api

次に、以下のコードをどこかに置いておく。
個人的には ~/script/ipcheck あたりがいいかな、と。

#!/data/data/com.termux/files/usr/bin/sh

CACHE_FILE="/data/data/com.termux/files/home/script/ipcheck/last_ip.txt"

rm $CACHE_FILE

while true; do
    # 現在のIPを取得
    CURRENT_IP=$(ifconfig 2>/dev/null | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://')
 
    # 以前のIPを確認
    if [ -f "$CACHE_FILE" ]; then
        LAST_IP=$(cat "$CACHE_FILE")
    else
        LAST_IP=""
    fi
 
    echo $CURRENT_IP
 
    # IPが取得できていて、かつ前回のIPと異なる場合
    if [ -n "$CURRENT_IP" ] && [ "$CURRENT_IP" != "$LAST_IP" ]; then
        # 通知を送る
        termux-notification \
            --id "ip_watcher" \
            --title "現在の IP アドレス" \
            --content "$CURRENT_IP" \
            --priority high \
            --ongoing 2>/dev/null
 
        # 新しいIPを保存
        echo "$CURRENT_IP" > "$CACHE_FILE"
    fi
 
    # 1分ごとにチェック
    sleep 60
done

これを先ほど有効化した termux-services に登録する。

$ mkdir $PREFIX/var/service/ipchecker
$ vi $PREFIX/var/service/ipchecker/run

みたいな感じにして、run の中身は以下のようにする。

#!/data/data/com.termux/files/usr/bin/sh
cd ~/script/ipcheck
exec sh ./check.sh

スクリプトファイルを作ったら、以下のようにして enable する。

$ chmod +x $PREFIX/var/service/ipchecker/run
$ sv-enable ipchecker

これで1分ごとに IP をチェックして、変化したら通知が上がる。
その通知は「ongoing」というパラメータを与えてあるので、消えない通知になるから、いつでも最新のIPアドレスが確認できる。

あ、作ったスクリプトと termux-services 用の run スクリプト、そのどちらにも chmod +x で実行権限与えるのを忘れずに。
これも忘れがちだよねぇ。

これでWiFi接続はもちろん、有線接続時にも IP アドレスに変更があったら1分程度で通知が上がり、永続的な表示となっているので、スマホを見ればどの IP アドレスにアクセスすればいいかがわかるようになる。

有線、無線、両方繋がっていてもちゃんと2つ IP アドレスが表示される。

マナーモードの自動切換え風 音量調整

自宅ならマナーモードオフ、出かけたらマナーモードオン、これを自動でやってみたい。
他にも、家の中にスマホがあるときはスマホを自由にしゃべらせてみたい。

尚、これ、アプリでできるしアプリの方がめっちゃ高機能なので、敢えて Python 書いてゴニョゴニョするより楽。
なので、本当にそうした機能が必要で使うことが目的ならアプリを入れましょうw

MacroDroid とか Tasker とか Automate でできるよ。

とはいえ、「手段が目的」になりがちな趣味ならば、自分でやってみたっていいと思うの。

そして、結果的にいくつかのファイルに分かれた。

保存先は適当でいいけど、~/status_monitor/ みたいなディレクトリを作って保存しておいた。

  • status_monitor.py  ……………  メインのスクリプト
  • location_monitor.py  ……………  自宅かどうかの判断用
  • battery_monitor.py  ……………  バッテリーステータス取得用
  • volume_monitor.py  ……………  ボリューム調整用

また、python の pip でいくつかインストールするものもあるし、仮想環境を用意し、予めいくつかのパッケージも導入。

$ python -m venv ./status_monitor
$ cd status_monitor
$ source ./bin/activate
$ pkg install termux-api
$ ./bin/pip requests, json, subprocess, schedule
location_monitor.py

自宅かどうかを判定する方法としては、自宅内で稼働しているラズパイの Web サーバにテキトーな内容が記載されたテキストファイルを記載しておいて、その有無から判断することにした。
ついでに、複数台で同じことをしておいて、簡単な死活監視も兼ねることに。

import requests

class LocationMonitor:

    def __init__(self):
        self.is_home = False
        self.alive_nodes = []
        self.dead_nodes = []

    def check_home_infrastructure(self):

        nodes = [
            {"name": "192.168.1.101", "url": "http://192.168.1.101/check.txt", "token": "one"},
            {"name": "192.168.1.102", "url": "http://192.168.1.102/check.txt",  "token": "tow"},
            {"name": "192.168.1.103", "url": "http://192.168.1.103/check.txt", "token": "three"},
            {"name": "192.168.1.104", "url": "http://192.168.1.104/check.txt", "token": "four"},
        ]

        self.alive_nodes = []
        self.dead_nodes = []

        # nodesの中身を総当たりチェック
        for node in nodes:
            try:
                # requestsでURLにアクセス。自宅だし、タイムアウトは短めで大丈夫でしょう
                r = requests.get(node["url"], timeout=1)
                # レスポンスとして返ってきたステータスコードが200ならアクセスは正常
                # さらに取得した文字列と、nodesに入ってる token 文字列を比較して、Dead or Alive
                if r.status_code == 200 and r.text.strip() == node["token"]:
                    self.alive_nodes.append(node["name"])
                else:
                    self.dead_nodes.append(node["name"])
            #予想外の出来事は全て Dead 扱いに
            except:
                self.dead_nodes.append(node["name"])

        # 判定
        count = len(self.alive_nodes)
        # 2台以上反応すれば自宅とみなす(クオラム的な感じにしたのはただの趣味w)
        self.is_home = count >= 2

        # 自宅かどうかで処理分岐
        if self.is_home:
            print(f"【自宅】 稼働中: {len(self.alive_nodes)}台")
            print(f"{'\n'.join(self.alive_nodes)}")
            if self.dead_nodes:
                print(f"以下のサーバが応答していません\n{'\n'.join(self.dead_nodes)}")
            return True
        else:
            print("【自宅外】 または 【自宅サーバー全滅…まさかね…】")
            print(f"{'\n'.join(self.dead_nodes)}")
            return False


def main():
    home = LocationMonitor()
    flag =  home.check_home_infrastructure()
    print(f"自宅? {flag}")


if __name__ == "__main__":
    main()

このスクリプト単独でも実行できるようにしてあって、自宅外判定されると以下のように表示される。
(実際、Ture/False 以外はあまり必要ないかもだけど、死活監視も含めてなので、どれにアクセスできた/できないはログに残しておきたかったため)

$ ./bin/python location_monitor.py
【自宅外】 または 【自宅サーバー全滅…まさかね…】
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
自宅? False
battery_monitor.py

持ち運べるサーバ、なので、バッテリーの消費は通常のスマホ使いと比較して大きいはず。
「気づいたらバッテリー切れで落ちていた」を避けるために、バッテリー残量の監視は必須かと。
ということで、下記でバッテリー情報を取得し、10%以下だったらスマホへの通知を発報。

尚、バッテリー情報は Termux の API で取得できる。
以下がAPIコマンドを直接実行した場合。
JSON形式で返ってくる。

$  termux-battery-status
{
  "present": true,
  "technology": "Li-ion",
  "health": "GOOD",
  "plugged": "UNPLUGGED",
  "status": "DISCHARGING",
  "temperature": 26.0,
  "voltage": 3745,
  "current": -130859,
  "current_average": 168240,
  "percentage": 33,
  "level": 33,
  "scale": 100,
  "charge_counter": 864172,
  "energy": null
}

この中から、必要と思われるものをピックアップして使う。

その結果出来上がった battery_monitor.py が下記。

import json
import subprocess


class BatMonitor:

    def __init__(self):
        self.health = "unknown"
        self.percent = -1
        self.plugged = "unknown"
        self.voltage = -1
        self.tempera = -1

    # バッテリー情報の取得&取得した値の調整と変数への格納
    def get_status(self):
        result = subprocess.check_output(["termux-battery-status"])
        battery = json.loads(result)

        self.health = battery["health"]
        self.percent = battery["percentage"]
        self.plugged = battery["plugged"]
        self.voltage = battery["voltage"] / 1000
        self.tempera = battery["temperature"]

        print( f"Health  : {self.health}\n"
               f"BtLevel : {self.percent}%\n"
               f"Plugged : {self.plugged}\n"
               f"Voltage : {self.voltage}\n"
               f"Tempera : {self.tempera}\n" )

    # バッテリー情報をスマホの通知欄に表示
    def push_notice(self):

        # 表示したい内容に整形
        content = ( f"Health  : {self.health}\n"
                    f"BtLevel : {self.percent}%\n"
                    f"Plugged : {self.plugged}\n"
                    f"Voltage : {self.voltage}\n"
                    f"Tempera : {self.tempera}\n" )

        # svログに残したいのでprintで標準出力する
        print(content)

        # termuxのAPIを使ってスマホに通知を上げる
        subprocess.run([
            "termux-notification",
            "--id", "BatteryAlart"
            "--title", "Battery Alart",
            "--content", content
        ])



def main():
    monitor = BatMonitor()
    monitor.get_status()
    if monitor.percent < 10:
        monitor.push_notice()



if __name__ == "__main__":
    main()

これも単独で実行可能。

ただし、ワンショット動作なので、実行したらその瞬間の状態に応じた動作しかしない。
定期的にチェックするためには別のスクリプトからこいつを叩く。

$ ./bin/python battery_monitor.py
Health  : GOOD
BtLevel : 33%
Plugged : UNPLUGGED
Voltage : 3.745
Tempera : 26.0
volume_monitor.py

これも Termux の API コマンドで取得できるもの。
内容は以下のようになっている。

$ termux-volume
[
  {
    "stream": "call",
    "volume": 5,
    "max_volume": 5
  },
  {
    "stream": "system",
    "volume": 5,
    "max_volume": 7
  },
  {
    "stream": "ring",
    "volume": 5,
    "max_volume": 7
  },
  {
    "stream": "music",
    "volume": 10,
    "max_volume": 15
  },
  {
    "stream": "alarm",
    "volume": 5,
    "max_volume": 7
  },
  {
    "stream": "notification",
    "volume": 5,
    "max_volume": 7
  }

この結果を利用したいので、volume_monitor.py は以下のようになった。

import sys
import json
import subprocess


class VolMonitor:

    def __init__(self):
        self.call   = -1
        self.system = -1
        self.ring   = -1
        self.music  = -1
        self.alarm  = -1
        self.notif  = -1

    # 音量情報取得
    def get_status(self):
        result = subprocess.check_output(["termux-volume"])
        volume = json.loads(result)

        self.call   = volume[0]["volume"]
        self.system = volume[1]["volume"]
        self.ring   = volume[2]["volume"]
        self.music  = volume[3]["volume"]
        self.alarm  = volume[4]["volume"]
        self.notif  = volume[5]["volume"]

    # マナーモード時の音量設定
    def set_manner_mode(self):
        self.system = 0
        self.ring   = 0
        self.notif  = 0
        self.music  = 0
        self.set_val("system", 0)
        self.set_val("ring",   0)
        self.set_val("notif",  0)
        self.set_val("music",  0)

    # マナモードオフ時の音量設定
    def set_manner_off(self):
        self.system  = 4
        self.ring    = 4
        self.notif   = 4
        self.music   = 10
        self.set_val("system", 4)
        self.set_val("ring",   4)
        self.set_val("notif",  4)
        self.set_val("music",  10)

    def set_val(self, key, val):
        subprocess.check_output(["termux-volume", key, str(val)])

    # 不要かな?と思ったけど、これも通知できるようにしておいた。
    def push_notice(self):
        self.get_status()

        content = ( f"Call   : {self.call}\n"
                    f"System : {self.system}\n"
                    f"Ring   : {self.ring}\n"
                    f"Music  : {self.music}\n"
                    f"Alarm  : {self.alarm}\n"
                    f"Notif  : {self.notif}\n")

        # 
        print(content)

        print("notice")
        subprocess.run([
            "termux-notification",
            "--id", "VolumeInfo"
            "--title", "Volume Notice",
            "--content", content
        ])


def main():
    if len(sys.argv) > 1:
        val = sys.argv[1]

    monitor = VolMonitor()

    if val == "on":
        monitor.set_manner_mode()

    if val == "off":
        monitor.set_manner_off()

    monitor.push_notice()


if __name__ == "__main__":
    main()

これも単体で使用可。

$ python volume_monitor.py on  でマナーモードオン
$ python volume_monitor.py off  でマナーモードオフ
status_monitor.py

そして、これらをすべて使った status_monitor.py を作る。

import schedule, time, subprocess
from location_monitor import LocationMonitor
from volume_monitor import VolMonitor
from battery_monitor import BatMonitor


class Monitor:

    def __init__(self):
        self.last_is_home = False
        self.need_charge = False
        self.manner_mode = False

    # マナーモード、というか自宅か外かのモード変更
    def mode_check(self):

        loc_monitor = LocationMonitor()
        vol_monitor = VolMonitor()

        is_home= loc_monitor.check_home_infrastructure()

        # 家にいた。今も家。
        # もしマナーモードに入ってなかったらマナーモードにする
        if self.last_is_home and is_home:
            print("家モード中…")
            if self.manner_mode:
                print("マナーモードオフ")
                vol_monitor.set_manner_off()
                self.manner_mode = False
            return


        # 家にいた。今は外。 = 音量変更(マナーモードにする)
        if self.last_is_home and not is_home:
            self.last_is_home = False
            vol_monitor.set_manner_mode()

            talk = "マナーモードに切り替えました"
            subprocess.check_output(["termux-toast", talk])
            return


        # 外にいた。今は家。 = 家モードに変更
        if not self.last_is_home and is_home:
            print("自宅モードに切り替え")
            self.last_is_home = True
            vol_monitor.set_manner_off()

            talk = "おかえりなさい"
            subprocess.check_output(["termux-tts-speak", talk])

            talk = "自宅モードに切り替えました"
            subprocess.check_output(["termux-tts-speak", talk])


        # 外にいた。今も外。 = なにもしない
        # もしマナーモードになっていなかったらマナーモードに変更
        if not self.last_is_home and not is_home:
            print("外モード中")
            if not self.manner_mode:
                print("マナーモードに変更")
                vol_monitor.set_manner_mode()
                self.manner_mode = True
            return


    # バッテリー情報チェック
    def battery_check(self):
        bat_monitor = BatMonitor()
        bat_monitor.get_status()

        if bat_monitor.percent < 10:
            self.need_charge = True
            bat_monitor.push_notice()
            if self.last_is_home and bat_monitor.plugged == "UNPLUGGED":
                talk = "バッテリー残量が少なくなってきています"
                subprocess.check_output(["termux-tts-speak", talk])
                talk = "早く充電せい!"
                subprocess.check_output(["termux-tts-speak", talk])

        if bat_monitor.percent == 100 and self.need_charge:
            self.need_charge = False
            talk = "充電が完了しました"
            subprocess.check_output(["termux-tts-speak", talk])


    # schedule で実行させるメソッド
    def status_check(self):
        self.mode_check()
        self.battery_check()

    # スケジュールで定期実行させる
    def start_schedule(self):
        self.status_check()
        schedule.every(10).minutes.do(self.status_check)
        while True:
            schedule.run_pending()
            time.sleep(5)    # 10分に1回の実行だから、もっと長くてもいい気がするけど…


def main():
    monitor = Monitor()
    monitor.start_schedule()


if __name__ == "__main__":
    main()

10分に1回、各ステータスをチェックして…

  自宅だったらマナーモードをオフ
  外だったらマナーモードをオン
  バッテリー残量が10%以下になったらアナウンス
  バッテリー充電が完了したらアナウンス

みたいなことができるようになったかな。

まぁ、労力の割にできることは少ない。

逆に、いろいろできて使い切れないほどの機能を提供してくれるアプリってスゲェ…

とまぁ…

こんな感じで Termux を使うとあれこれできますな。

使い古しのスマホでもラズパイよりも性能は高い場合は多いので、Pythonの実行もまぁまぁ速い。

スマホにはバッテリーもモニタも付いてるし、センサーもテンコ盛り。(ただ、センサーは Play ストア版では使えない)
CPUも速くてストレージも速い。

さすがに GPIO はないし SPI も I2C もないけど、用途によっては大ありな構成かと。

何より面白いし。

この記事にコメントしてみる