2025-01-12

iPhone で unix time をミリ秒で得る 〜 Termux 代替の iSH を使う【2025-01-14 書き直し】

 

 

Android の Termux 相当を iPhone で実現するには iSH や a-shell アプリというターミナルエミュレーターがあります。

 

残念なことに Termux: Widget や Termux: Tasker プラグインのような仕組みはありません。

 

なので、作成したシェルスクリプトをウィジェット化してワンタップで実行するとか、プラグインで Tasker や MacroDroid で自動化する、というようなことはできません。

 

 

しかし iSH はパッケージを自由に追加可能な Alpine Linux です。


ターミナルエミュレーター機能に限れば Termux 相当といえるでしょう。


iSH のディレクトリやファイルを iOS のファイルアプリで扱えるので GUI エディターが使え、シェルスクリプトを作成・編集できます。

 

 

iSH とエディター LiquidLogic をインストールします。

 

 

iOS のファイルアプリで iSH のディレクトリにアクセスできますから、いつでもスクリプトを編集できます。

 


 

 

iSH で下記のスクリプト(SwitchBot plug の状態を確認するスクリプト)を作成し、任意のディレクトリに SW_stat.sh という名前で格納し、実行権を与えておきます。

 

ーーーーーーーーーー ここから ーーーーーーーーーー
deviceid
="<デバイスID>"
token="<トークン>"
secret="<クライアントシークレット>"
t=$(date +%s%3N)
nonce=$(uuidgen -r)
sign=$(echo -n ${token}${t}${nonce} | openssl dgst -sha256 -hmac ${secret} -binary | base64)

curl -sS -X GET "https://api.switchbot.net/v1.1/devices/${deviceid}/status"
\
-H "sign: ${sign}" \
-H "t: ${t}" \
-H "nonce: ${nonce}" \
-H "Content-Type: application/json; charset=utf-8" \
-H "Authorization:  ${token}" \
 | cat > ./SW_stat.txt

cat ./SW_stat.txt
echo ""
ーーーーーーーーーー ここまで ーーーーーーーーーー

 

 

これを実行して、SwitchBot plug の状態を確認してみます。

 

そのため iSH で、必要なパッケージをインストールします(echo や cat, base64 は iSH に最初から入っています)。

 

   ~$ apk add uuidgen openssl curl


そして作成したシェルスクリプト SW_stat.sh を実行します。


   ~$ ./SW_stat.sh


結果はエラーでうまくできません。

コマンドラインを一つずつ検証したところ、

 

   t=$(date +%s%3N)

 

この部分でちゃんとミリ秒が得られていないためということがわかりました。

 

改めて date コマンドを検証してみます。

 

   ~$ date +%s%3N
   17366467533N

 

結果は 10桁(秒)に文字列 "3N" がくっついています。


Mac のターミナルで date を検証してみると、上記と同じで 10桁(秒)に文字列 "3N" がくっついてしまいます。

 

 

まずは Mac で brew を使って coreutils をインストールし、GNU 版 date コマンドの gdate でミリ秒が得られました。


   ~$ gdate +%s%3N
   1736647342397

 

Mac と同様に iSH 上で coreutils をインストールして、

 

   ~$ gdate +%s%3N

 

としますが、そんなコマンドはないよと叱られます。

 

ですが coreutils インストールによって、date コマンド自体がミリ秒に対応したことがわかりました。

 

   ~$ date +%s%3N
   1736649967217
 

 

と、13桁のミリ秒を得ました。

 

 

unix time のミリ秒を得るコマンドが Mac と iPhone の iSH で異なるのは、macOS が BSD なのに対して iPhone に入れた iSH が Alpine Linux のためでしょう。

 

 

 

ともあれ date コマンドで unix time ミリ秒が得られるようになりましたので、改めて前記のシェルスクリプトを実行してみます。


   ~$ ./SW_stat.sh

 

curl 実行結果を書き出した SW_stat.txt の内容は下記のように得られ、問題なく処理できました。

 

   ~$ cat SW_stat.txt
   {"statusCode":100,"body":{"version":"V2.0-
   2.0","power":"on","voltage":99,"weight":5.9,
   "electricityOfDay":81,"electricCurrent":95,
   "deviceId":"<デバイス ID>","deviceType":"Plug Mini (JP)",
   "hubDeviceId":"
<デバイス ID>"},"message":"success"}

 

 

iSH が Termux の代替になることを確認できましたが、さてどのように活用しましょうか。

 

 

iSH で作成・保存したシェルスクリプトをショートカット化できると面白いのですが、いまのところできるのかどうかわかっていません(多分、できなさそう (;_;) )。

 

 

 

 

 

 

 

 

0 件のコメント: