Pushoverを使ってみた

去年あたりから LINE Notify の無料プランが使えなくなってしまいました

自作の温度制御ツールでも、経過報告や警報通知などを LINE Notify に頼っていたので、使えなくなるとやっぱり不便なんですよね。「代わりになる通知サービスはないものか…」と探してみることに。

そこで ChatGPT に相談したところ、いくつか候補を挙げてくれました。その中でも気になったのが、海外の通知サービス Pushover
これがなかなか良さそうだったので試してみました。

Pushover は 買い切りの有料アプリ(約500円/$5) で、なんと 月1万件までスマホへ通知を送れるとのこと。
個人用途なら十分すぎるスペックですね。

導入手順もシンプルで、

  1. スマホアプリをダウンロード
  2. アカウント作成
  3. PCからログイン
  4. APIキーを発行
  5. 自作プログラムから利用

といった流れで使えるようになります。
さらに嬉しいことに、アプリ購入後の最初の1ヶ月はお試し期間として無料で使えるようになっていました。

こんな感じで画像と一緒にメッセージを送ることができます。

これはラズベリーパイの温度制御プログラムから自分のスマホに通知を送ったところです

何といっても音で知らせてくれるのが超強力。作業中でもスマホからピロンと音が鳴って知らせてくれるのです。

音の種類も送る側から指定できるそうです。

カスタムサウンドにも対応しているみたいで”〇〇が終了しました”のような音声データも送れるそうです。

これは色々と捗りそうです。

株価監視ツール

昨日は1日かけて日経先物の値動き監視ツールを作ってました

前回作ったアプリの改良バージョンです。

グラフに記録したデータを表示し、急騰急落を検知してスマホに通知できるようにしてみました。

ここでは1分間(データ6個)に60円以上動いたらアラートを送信するように設定しています。

グラフのデザインはChatGPTに考えてもらいました。

こんな感じで通知が送られてくるようにしています

サンプルコード

以下がpushoverのPythonプログラムのサンプルです

import os
import requests
from datetime import datetime

# Pushover通知用設定
API_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
USER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

last_notify_time = None

def send(text, img_path=None, sound=None, device=None):
    global last_notify_time

    # 直前の通知から5秒以内なら送信しない(スパム防止)
    sec = seconds_since_notify()
    if sec is not None and sec < 5:
        return None

    try:
        data = {
            "token": API_TOKEN,
            "user": USER_KEY,
            "message": text,
        }
        if sound:
            data["sound"] = sound
        if device:
            data["device"] = device

        if img_path and os.path.exists(img_path):
            with open(img_path, "rb") as f:
                files = {"attachment": (os.path.basename(img_path), f, "image/png")}
                res = requests.post(
                    "https://api.pushover.net/1/messages.json",
                    data=data,
                    files=files
                )
        else:
            res = requests.post(
                "https://api.pushover.net/1/messages.json",
                data=data
            )
    except:
        pass

    last_notify_time = datetime.now()
    return res

# 前回送信してからの経過秒数を取得
def seconds_since_notify():
    global last_notify_time
    if last_notify_time is None:
        return None
    return (datetime.now() - last_notify_time).total_seconds()

これをpushover.pyとして保存して次のように使います

import pushover
# ...グラフ作成処理(省略)
plt.savefig("graph.png")  # グラフを画像として保存
pushover.send("株価急騰!", img_path="graph.png")

めちゃ簡単ですね

APIキーは外部から読み込むようにしたほうが安全です

カスタムサウンドを使ってみる

Pushover では、50KB未満の MP3 ファイルを通知音として鳴らすことができます。
つまり、「自分だけのカスタム通知音」を作って送ることができるということ。

アップロード方法もシンプルで、
Pushover のダッシュボードにある “Your Custom Sounds” の項目から、
使いたい MP3 ファイルをそのままアップロードするだけ。

これで「作業完了しました」「温度が上昇しています」など、
好きな音声データをスマホに直接鳴らせるようになります。

音声合成サイトでmp3ファイルを作成

今回はここのサイトを使ってみました。

このサイトではモデル(話者)を選んで音声を合成して、mp3ファイルとしてダウロードすることが出来ます。

ただ実際に使ってみると、感情がしっかり入りすぎていて通知音としては少し使いづらい印象でした。
アラート用途だと、もう少し淡々とした声や機械的な読み上げの方が合いますね。

その点、VoiceText などのシンプルな読み上げAPIを使うと、クセのない通知向けの音声を生成できるので、
温度管理や機器の状態通知にはこちらのほうが向いているかもしれません。

Pushoverに音声を登録

Pushoverのダッシュボード画面から音声ファイルを登録します

カスタム通知音を登録するときは、まず Name に識別用の名前、
Description に音声の説明を入力し、
MP3 ファイルの欄に先ほど作成した音声データを選択します。
そのまま 「Upload Sound」 ボタンを押せば登録完了です。

ここで特に重要なのが Name の値
プログラム側から通知を送る際は、この Name を指定することで
「どのカスタム音を鳴らすか」を選べる仕組みになっています。

つまり、

  • “alert_temp_high”
  • “finish_task01”
  • “warning_beep”

のように、用途ごとに分かりやすい名前を付けておくと後で管理しやすくなります。

Pythonプログラム

プログラム側からこのカスタム音を鳴らす方法もとても簡単で、
先ほど使ったモジュールのパラメータ sound に、登録した Name をそのまま指定するだけです。

import pushover
# ...グラフ作成処理(省略)
plt.savefig("graph.png")  # グラフを画像として保存
pushover.send("株価急落!", img_path="graph.png", sound = "KabuDrop")

送信されるデータ構造を見ると次のようになります。

        data = {
            "token": API_TOKEN,
            "user": USER_KEY,
            "message": text,
            "sound" : "KabDrop",
        }

実際にプログラムを動かしてみると、
スマホから 「株価が急落しました(ねっとり)」 という音声が流れます。

病院の待合室なんかで鳴った日には赤面必至です。

デバイスを指定する

Pushover は 1つのアカウントで複数のデバイスを登録できる のも便利なポイントです。

試しに、タブレット端末の Xiaomi Pad(Wi-Fiモデル) に Pushover アプリをインストールしてみたところ、
自動的にデバイス一覧へ追加され、スマホと同じように通知を受け取れるようになりました。

Name(デバイス名) をプログラム側の device パラメータ に指定することで、
特定の端末だけに通知を送ることができます。

import pushover
# ...グラフ作成処理(省略)
plt.savefig("graph.png")  # グラフを画像として保存
pushover.send("株価急騰!", img_path="graph.png", device = "xiaomipad5")

これは SIM契約していない端末でも普通に使える ので、
色々といたずr……いや、便利な使い方がかなり広がりそうです。

例えば、玄関先にタブレットを置いておいて、
センサーが反応したら

「いらっしゃいませ」

としゃべらせる、なんてこともできます。
簡易的なスマートチャイムとして十分機能しそうですね。

あるいは、薬の服用管理アプリと組み合わせて、

  • 飲んだことをアプリに入力
  • 飲んでいないと 30分おきに「薬は飲みましたか?」 と通知で尋ねてくる

といった使い方も可能。
「うっかり」を防ぐ用途にも相性バツグンです。

SIMなし端末を再活用するアイデアとしては、かなり面白い可能性を感じます。

おわりに

LINE Notify が使えなくなって不便を感じていましたが、代わりに導入した Pushover は想像以上に柔軟で、通知システムとしてとても優秀でした。

カスタム通知音の登録はもちろん、音声データをそのまま再生したり、特定の端末だけを指定して通知を送ったりと、思っていた以上にできることが多く、ちょっとしたアラート環境なら簡単に構築できてしまいます。SIM なしの古いタブレットでも活用できるので、アイデア次第で玄関アナウンスや服薬リマインダーなど、いろいろな場面で役に立ちそうです。

「通知をスマホで受ける」というシンプルな仕組みが、カスタム音声や複数デバイス対応のおかげで一気に広がるのを感じました。ラズベリーパイでの温度管理だけでなく、他の自作システムとも積極的に連携させていこうと思います。

Pushover は買い切りで導入しやすく、試用期間もあるので、通知環境を整えたい方は一度試してみる価値はありそうです。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です