TermuxスマホのCPU温度をThingSpeakでリアルタイム・グラフにしてみた!

じゃんくはっく
じゃんくはっく

Root化したPixel3のTermuxで遊んでるんだけど、CPUとかバッテリー温度とか取得できることがわかったよ!

サーバにするんだったら、温度は見ておきたいですからね!

ぴー
ぴー
じゃんくはっく
じゃんくはっく

UnixBenchでCPU温度がどのくらいまで上がるか見ておきたかったんです。

ねぇ、ThingSpeakってなんなの?

ぴー
ぴー

先日、メルカリでゲットしたPixel3をroot化して遊んでいます。そのうち、今動いているこのブログのサーバマシンとして、UmidigiF2から一旦置き換えてみようと思っています。UmidigiF2も、root化して遊んでみたいなと思っています。

 さて、今回はスマホの中にある温度センサーから取得してグラフ描画にチャレンジしてみます。

ThingSpeakとは

ThingSpeak Documentation – MathWorks 日本
::
ThingSpeak は Internet of Things (IoT) プラットフォームであり、クラウドでセンサーのデータを収集および保存したり、IoT アプリケーションを開発したりできます。

https://jp.mathworks.com/help/thingspeak/index.html

ThigSpeakは、結構昔からあってIoT機器からデータを投げつける定番のWEBサービスです。4、5年くらい前にも一度さわっていたりします。

Soracom で IoT はじめました

/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の買い替え需要も発生するので、ますます安くて高性能なスマホが入手できる環境になります。無限の可能性を感じますね!

著者にメッセージ

コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。