Root化したPixel3のTermuxで遊んでるんだけど、CPUとかバッテリー温度とか取得できることがわかったよ!
サーバにするんだったら、温度は見ておきたいですからね!
UnixBenchでCPU温度がどのくらいまで上がるか見ておきたかったんです。
ねぇ、ThingSpeakってなんなの?
先日、メルカリでゲットしたPixel3をroot化して遊んでいます。そのうち、今動いているこのブログのサーバマシンとして、UmidigiF2から一旦置き換えてみようと思っています。UmidigiF2も、root化して遊んでみたいなと思っています。
さて、今回はスマホの中にある温度センサーから取得してグラフ描画にチャレンジしてみます。
ThingSpeakとは
ThingSpeak Documentation – MathWorks 日本
https://jp.mathworks.com/help/thingspeak/index.html
::
ThingSpeak は Internet of Things (IoT) プラットフォームであり、クラウドでセンサーのデータを収集および保存したり、IoT アプリケーションを開発したりできます。
ThigSpeakは、結構昔からあってIoT機器からデータを投げつける定番のWEBサービスです。4、5年くらい前にも一度さわっていたりします。
Soracom で IoT はじめました
https://hack.gpl.jp/2016/05/29/iot1/
もう、Soracomはやめてしまいましたがこの時はOrange PI にUSBデータ通信ドングルをつけてsoracomから、CPU温度をThigSpeakに送信してグラフ化していました。
Pixel3で温度はどうやって取得する?
root化したので、いろんな情報が見れます。通常のLinuxとは少し違うので、あれこれ物色していたのですが Android である Pixel3 は、Termux の root シェルから以下のように android のコマンドを使って取得できることがわかりました。例えば、バッテリーの情報は以下のように取得できます。
# dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 750000
Max charging voltage: 5000000
Charge counter: 2569000
status: 5
health: 2
present: true
level: 100
scale: 100
voltage: 4355
temperature: 270
technology: Li-ion
temperatureというが、バッテリー自体の温度のようです。他にも現在、AC電源から給電しているとか、状態(health)とかわかるようです。シェルからだと以下に温度が吐かれていることがわかりました。
# cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/battery/temp
295
# cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qcom,qpnp-smb2/power_supply/usb/temp
284
# cat /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pmi8998@2:qpnp,fg/power_supply/bms/temp
295
# cat /sys/devices/virtual/thermal/thermal_zone1/temp
34900
一番最後のが、CPUの温度のようです。本当にCPU温度なのか、UnixBenchを動かしながら温度が上がるのか確認してみたいと思います。
Pythonスクリプトを用意
以前、OrengePiのときに動かした Pythonスクリプトがありますのでそれを使ってみました。あの時は、Python version2で書いていたのですが、今は Python Version3系列がメインです。2to3というツールがPython3入れるとあるので、それで変換します。
2to3 – Python 2 から 3 への自動コード変換
https://docs.python.org/ja/3/library/2to3.html
変換は、-w オプションをつけるとオリジナルとバックアップが作られます。
$ 2to3 -w temp.py
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored temp.py
--- temp.py (original)
+++ temp.py (refactored)
@@ -13,9 +13,9 @@
temp = float(t) / 1000
payload = {'api_key': api_key, 'field1': float(temp)}
f.close()
- print "CPU Temp is:%s"%temp ,
+ print("CPU Temp is:%s"%temp, end=' ')
r = requests.get('http://api.thingspeak.com/update', params=payload)
- print "Result: ", r.text
+ print("Result: ", r.text)
time.sleep(1.0)
def main():
RefactoringTool: Files that were modified:
RefactoringTool: temp.py
$ ls -l
total 8
-rw------- 1 u0_a218 u0_a218 573 Oct 8 06:53 temp.py
-rw------- 1 u0_a218 u0_a218 564 Oct 8 06:52 temp.py.bak
変換したスクリプト全体は以下となります。api_keyには、書き込み用のKeyを入れておいてください。
#!/data/data/com.termux/files/usr/bin/python3
# coding: utf-8
import requests
import time
api_key='thingspeak Write API Key'
def sender():
while True:
f = open("/sys/class/thermal/thermal_zone0/temp","r")
t = f.read()
temp = float(t) / 1000
payload = {'api_key': api_key, 'field1': float(temp)}
f.close()
print("CPU Temp is:%s"%temp, end=' ')
r = requests.get('http://api.thingspeak.com/update', params=payload)
print("Result: ", r.text)
time.sleep(1.0)
def main():
sender()
if __name__ == '__main__':
main()
動かして見ると以下のようになります。
$ sudo python ./temp.py
CPU Temp is:43.1 Result: 236518
CPU Temp is:31.3 Result: 0
CPU Temp is:31.3 Result: 0
CPU Temp is:31.3 Result: 0
CPU Temp is:31.3 Result: 0
::
cronで定期実行
Termuxにcronはデフォルトでは入っていませんので、入れて起動しておきます。
$ pkg install cronie -y
$ crond
動いているか確認しておきます。
$ pgrep crond
23817
$ ps 23817
PID TTY STAT TIME COMMAND
23817 ? S<s 0:00 crond
では、ループ部分を削除して、cronに登録しておきましょう。2分に1回くらいにしておきます。
# CPU Temp to ThingSpeak
# https://thingspeak.com/channels/123997
*/2 * * * * sudo /data/data/com.termux/files/usr/bin/python3 /data/data/com.termux/files/home/.suroot/temp.py
グラグを見て見る!
無事にデータが投げられていれば、グラフが描画されていると思います。ThingSpeakのグラフを見て見ましょう。
まだ登録したばかりなので、グラフの描画は中途半端ですが、大丈夫なようです。以前に、1分ごとに計測してUnixBenchを動作させたときのグラフは以下のようになりました。70度くらいまで上がっていますね。
それから、root化したのでhtopが正常に8CPU見れています。ベンチ中はフル回転ですね!
あと、UnixBenchを全開で動作させていたときの消費電力(USB-AC充電)は以下のようでした。
4.2w〜6.8wくらいです。5wとして計算してみると24時間動かして1ヶ月の電気代は、約97円でした。とても低消費で高パフォーマンスです!
UnixBenchは、気温が低い時に計測したらなんと、1700を超えていました!
・Pixel3 Android11 再計測
シングル:590.1
8CPU:1732.6
まとめ
今回、なんとなくわかったのは以下となります。
・Androidシステムでは、dumpsysコマンドで各種情報がとれる
・各種温度は機種によって吐き出される場所が違うようだ
・/sys/配下に吐かれる電源関連のbattery、usb、bmsの温度はモニターしておいたほうがいいかも。常時充電しているから
・ThingSpeakのグラフは、あまり綺麗じゃないので自分自身で描画する仕組みを作りたい。
・MRTGや、RRDtoolなどtermuxで動作するグラフ描画ツールはないか?
・snmpdがtermuxで動かせればもっと楽できそうだが、まだなさそう。
・しかし、ここのコメントでは動かせる感じ
https://github.com/net-snmp/net-snmp/issues/155
あとがき
スマホサーバ(AndroidOS+Termux)は消費電力も少なくて、お手軽で安く入手できIoTデバイスの情報を集める家庭内サーバとしても使える印象を持ちました。AndroidOS自体は、すごく安定しているので、電池駆動、SIM駆動、しかもタッチ画面付きで大きな戦力になりそうです。これから5Gの買い替え需要も発生するので、ますます安くて高性能なスマホが入手できる環境になります。無限の可能性を感じますね!
著者にメッセージ
コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。
間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。