~/blog/notifying-windows-10-pc-when-android-smartphone-battery-is-low
Published on

Androidスマホのバッテリーが少なくなったらWindows 10パソコンに通知する

5052文字9分で読めます–––
閲覧数
Authors
  • avatar
    Name
    Shou Arisaka nyapp.buzz/shou
    short bio
    Z世代の情報技術者。Next.jsで自作SNSを個人開発中。

Androidスマホのバッテリーが少なくなったらWindows 10パソコンに通知するプログラムについて紹介します。

なんとなく需要ありそうなので書いてみた。

androidのバッテリーが15%になったときにパソコン上で音声通知をします。

全体の流れ

ひとつひとつやってることは難しいことではないのですが、使う技術は相変わらず多いので、場合によっては時間がかかるかもしれませんが、これができると他のandroidのデータのやりとりにも応用できるのでぜひがんばってみてください。

  1. androidがバッテリー少なくなったらIFTTTでウェブリクエストする
  2. ubuntuのsinatraサーバーでそれを受け取って任意のコマンドをファイルに書き込む
  3. ファイルのテキストをコマンドとして実行する。(ポップアップ通知する;ttsする;etc)

事前準備

  • ポートフォワーディングができるWifiルーターにしましょう。

ポート転送をすることで、ローカルで動かしているサーバーをグローバルIPの公開URLからリクエストするため、そういうルーターでない方は買いましょう。幸運にも、どのルーターを買えばいいのかは明白です。

光回線工事後、4台のルーターを実際に買って検証した結果導き出された最高のwifiルーターとは

WSL

Ruby環境を作りましょう

Rubyでsinatraを動かします。3分でできるのでささっと環境を作りましょう。

sudo apt update ; sudo apt install build-essential patch zlib1g-dev liblzma-dev ruby{,-dev} -y ; sudo gem install bundler

mkdir -p /mnt/c/pg/ruby_dev && cd $_

sudo bundle init
vim Gemfile
sudo bundle install

vim Gemfile

# add
gem "pry"
gem "sinatra"

手順

  • wifiルーターでポートフォワーディングの設定をします
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_056219d2-d4f2-4e9d-89a5-0c6ec5a927bf.png
  • IFTTTでアプレットを作ります
Make an Applet - IFTTT
this ... android battely
that ... webhooks

title(例) ... If Battery drops below 15%, then get request to server
URL(例) ... http://220.247.111.111:8005/android-battely
method ... get
type ... json
body ... (空欄)
  • android側でIFTTTの設定をします

もしまだなら、androidでIFTTTのアプリをインストールし、当該のアプレットを有効化します。

IFTTT - Apps on Google Play
  • Windowsのフォルダをマウントしてファイルを同期できるようにしておきます
sudo mount -t  cifs //192.168.0.167/_sync_ ~/share -o user=user,pass=pass,dir_mode=0777,file_mode=0777

シェアディレクトリのcommand.txtにコマンドとして実行するテキストをストアしておき、それをWSLで定期的に読み取って実行する、ということをあとで実装します。 サーバー上でダイレクトにコマンドを実行しても、音が出る系などプロセスがサブプロセス(?)だと動かないため意味がなく、ファイルを経由する必要があるからです。

  • sinatraを動かします

dev.rb

require "sinatra"
require "open3"
require 'json'
require 'pry'

Encoding.default_external = 'UTF-8'


get "/android-battely" do

    # binding.pry

    stdout, stderr, statusCode = Open3.capture3( %( bash -c " host #{request.ip} | awk '{print $5}' | awk '/amazonaws.com|ifttt.com/' || echo '' " ) )
    if stdout.to_s.strip.empty? then redirect to('/404') end

    # puts "ok"
    puts @body = request.body.read

        stdout, stderr, statusCode = Open3.capture3( %( bash -ic "printf 'tts \\"android battery low\\"' > /home/yuis/share/command.txt || echo '' " ) )

    puts stdout, stderr, statusCode

end

sudo bundle exec ruby dev.rb -o 0.0.0.0
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_3bde1a6f-1d16-4302-a105-c409affb3250.png

簡単な解説 ...

stdout, stderr, statusCode = Open3.capture3( %( bash -c " host #{request.ip} | awk '{print $5}' | awk '/amazonaws.com|ifttt.com/' || echo '' " ) )
if stdout.to_s.strip.empty? then redirect to('/404') end

サーバーを公開していると、ハッカーによる悪意のあるアクセスが結構来ます。これを放置していると、最悪パソコンがハッキングされるか壊れるか、今回の例でいえば少なくとも一日中通知が来ます。

なので、そういうのをフィルタするには、sinatraでは、面倒ですが、404ページへリダイレクトさせるのがよいみたいです。 どういうアクセスを404へ飛ばすか、IFTTTからのアクセスでないアクセスを全て遮断します。IFTTTはawsなので、それだけを許可するようにします。

これでもawsって結構広範囲なので、もしかすると変なアクセスがくるかもしれません。その場合はIFTTT側でgetリクエストにトークン的な意味でパラメータをつけて、サーバー側で認証してやると確実です。

printf 'tts \\"android battery low\\"'

RubyとBashの二段階でエスケープをする必要があるので、バックスラッシュは二回つけます。

  • WSL側で使用する関数を定義してください

今回はttsを使っています。これは、tts textのようにすることでpowershellを経由してテキストを音読させるものです。

PowershellでTTS(text-to-speech)

以下をbashで実行するか.bashrcへ入れてください。

tts ()
{
    /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe -  <<EOF
tts "${1}"
EOF

}

  • WSL側で定期的にコマンドテキストの入ったファイルを監視するスクリプトを実行します

conemuなどで以下のスクリプトを実行して放置。

while true; do

  echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"

  [[ -s "$SHAREDDIR/command.txt" ]] && {
    eval "$(cat "$SHAREDDIR/command.txt")" ; > "$SHAREDDIR/command.txt" ; printf "A command excuted." ;
  }

  sleep 2s
done
https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_7ad36b6d-d722-46e0-9227-6ad333b33e6e.png
  • 実際に動くかテストします

なにか問題があればコメントしてください。

avatar

Shou Arisaka

情報技術者 / Z世代プログラマー / SaaSアプリやSNSを開発
今すぐ話そう!

15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。

Created with Fabric.js 5.2.4 何かご質問がありますか?