気圧と健康の気象病予報士@東京

OpenWeatherMapのデータと生成AIを用いて記事を作成しています

QZSS で受信したデータに特定のワードがあった場合

QZSS「みちびき」からのデータで特定のワードがあった場合に、PushOver アプリで、通知を送信する Python スクリプトです。

www.kadenken.com

特定のワードを埼玉とし

今回、特定のワードを「埼玉」としました。「埼玉」がマッチしたときに、行を「発表時刻」までさかのぼり、コピーして、メッセージとして送信します。メッセージ内容が重複し、同一の場合には、通知しないようにしています。

通知アプリに課金をする

通知をするアプリ、PushOver は、たしか、ひと月は無料です。課金制でもあり、iOS 版だと、700円ぐらいで買い切りです。

ラズパイと接続する方法

補足として。これは Raspberry Piラズベリーパイ)と、GR-M10-RP を接続して QZSS から、災害危険情報を取得して行う方法です。QZSS からのデータを日本語に変換するスクリプトについては、以前の投稿にありますので、ご参考ください。

meteoropathy.hateblo.jp

import time
from pushover import Client
import os
from dotenv import load_dotenv

# .envファイルから環境変数を読み込む
load_dotenv()

# Pushoverの初期設定
PUSHOVER_USER_KEY = os.getenv('PUSHOVER_USER_KEY')
PUSHOVER_API_TOKEN = os.getenv('PUSHOVER_API_TOKEN')
client = Client(PUSHOVER_USER_KEY, api_token=PUSHOVER_API_TOKEN)

# ログファイルのパス
LOG_FILE_PATH = os.getenv('LOG_FILE_PATH')

# 前回送信したメッセージを記憶する変数
last_sent_message = None

def send_pushover_notification(message):
    global last_sent_message
    if message != last_sent_message:
        client.send_message(message, title="Log Alert")
        last_sent_message = message

def monitor_log_file(file_path):
    file_byte_pos = 0
    while True:
        with open(file_path, 'r', encoding='utf-8') as file:
            file.seek(file_byte_pos)
            lines = file.readlines()
            file_byte_pos = file.tell()

            for i, line in enumerate(lines):
                if "埼玉" in line:
                    # "埼玉"を含む行を見つけた場合、"発表時刻"まで遡る
                    start_index = i
                    for j in range(i, -1, -1):
                        if "発表時刻" in lines[j]:
                            start_index = j
                            break
                    message = ''.join(lines[start_index:i+1])
                    send_pushover_notification(message)
        time.sleep(2)

if __name__ == "__main__":
    if os.path.exists(LOG_FILE_PATH):
        monitor_log_file(LOG_FILE_PATH)
    else:
        print(f"Log file {LOG_FILE_PATH} does not exist.")