PR

ラズパイPico WからLINE Botへ通知を送るPythonプログラムの実装方法

ハードウェア制御 / 電子工作
スポンサーリンク

はじめに:Pico WからLINEへ通知を送るIoTシステムの総仕上げ

こんにちは!「py-vbalab」のニンジンです🥕

今回は、【ラズパイPico W入門】愛犬を守る!格安IoT温湿度見守りLINE Botの作り方(第3回:PythonでLINE通知&完全自動化編)です。

第1回のハードウェア準備第2回のLINE Messaging APIとお届けしてきたこの連載も、いよいよ今回が最終回です!

今回は、Pico WをWi-Fiに繋ぎ、前回取得した「LINEの鍵」を使ってスマホにメッセージを送る仕組みを作ります。

いきなり全部を組み合わせるとエラーが出た時に原因が分からなくなるため、「①Wi-Fi接続テスト」→「②LINE送信テスト」→「③本番用コードの完成」という3ステップで確実に進めていきましょう!

スポンサーリンク

1.Pico WのWi-Fi接続テスト:MicroPythonでネットワークに繋ぐ手順

まずは、Pico Wの内蔵Wi-Fi機能を使って、ご自宅のインターネットルーターに接続するテストを行います。

Thonnyを開き、新しいファイルに以下のコードを貼り付けてください。

※注意
コード内にWi-Fiの設定を入力する箇所があります。
ご自身の環境に書き換えてコードを動作させてください。

# Wifi_Connection_test.py
import network
import time

# Wi-Fi情報をご自身の環境に書き換えてください
WIFI_SSID = "あなたのWi-FiのSSID"
WIFI_PASSWORD = "あなたのWi-Fiのパスワード"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

print(f"Wi-Fi({WIFI_SSID})に接続中...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)

# 接続を少し待つ(最大10秒)
timeout = 10
while timeout > 0:
if wlan.isconnected():
break
timeout -= 1
print(".")
time.sleep(1)

if wlan.isconnected():
print("Wi-Fi接続に成功しました!")
# Pico Wに割り当てられたIPアドレスを表示
print("IP設定:", wlan.ifconfig())
else:
print("Wi-Fi接続に失敗しました。SSIDやパスワードを確認してください。")

Wifi_Connection_test.py テスト結果

SSIDとパスワードを書き換えて実行(F5)し、画面下のShellに「Wi-Fi接続に成功しました! IP設定: …」と表示されれば、第1関門クリアです!

スポンサーリンク

2.LINE送信テストと「日本語でエラー400になる」問題の解決法

Wi-Fiに繋がったら、次はいよいよ第2回で設定した「LINE Messaging API」への送信テストです。 ここでは文字化けなどのトラブルを防ぐため、あえて「半角英数字(英語)」だけのメッセージを送って通信の成功を確かめます。

以下のコードを新しいファイルに貼り付けて実行してみてください。

プログラム内に第2回の記事にて取得した2つの鍵「ユーザーID」「チャンネルアクセストークン」を入力し、書き換えて下さい。
Wi-Fiもご自身の環境のものに書き換えて下さい

# get_line_message.py
import network
import time
import urequests
import json

# --- ここをご自身の環境のものに書き換えて下さい ---
WIFI_SSID = "あなたのWi-FiのSSID"
WIFI_PASSWORD = "あなたのWi-Fiのパスワード"
LINE_TOKEN = "あなたのトークン(b7+ux...)"
USER_ID = "あなたのユーザーID(U...)"
# --------------------------------------------------

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)

print("Connecting to Wi-Fi...")
while not wlan.isconnected():
time.sleep(1)
print("Wi-Fi Connected!")

url = "https://api.line.me/v2/bot/message/push"

# f-stringを使って、完全に1本の文字列にしてヘッダーを作ります
auth_header = f"Bearer {LINE_TOKEN}"

headers = {
"Content-Type": "application/json",
"Authorization": auth_header
}

payload = {
"to": USER_ID,
"messages": [
{
"type": "text",
"text": "Hello from Pico W! Test OK."
}
]
}

print("Sending to LINE...")
try:
# データをLINEのサーバーへ送信します
response = urequests.post(url, data=json.dumps(payload), headers=headers)
print("Status Code:", response.status_code)
print("Response:", response.text)
response.close()
except Exception as e:
print("Error:", e)

get_line_message.py テスト結果

実行して Status Code: 200 が表示され、
あなたのスマホのLINEに「Hello from Pico W! Test OK.」とポコンと届けば、APIの連携は完璧です!

🚨 テスト送信がエラーになった場合のチェックポイント

もし上手くスマホに届かず、Thonnyの画面にエラーが出た場合は、以下のポイントをチェックしてみてください。

Status Code: 400(Bad Request)と出る場合

LINEのサーバーから「送られてきたデータの形式がおかしいよ」と怒られている状態です。

  • 原因1: LINE_TOKENUSER_ID""(ダブルクォーテーション)の中に、余計な「スペース」や「改行」が紛れ込んでいませんか?
  • 原因2: 「Hello from…」のテキストを、あえて「テスト」などの**日本語(全角文字)**に書き換えて実行していませんか?(※日本語を送るための対策は、この後の本番コードで行います!)
Status Code: 401(Unauthorized)と出る場合
  • 原因: LINEの「チャネルアクセストークン」が間違っています。第2回で取得した b7+ux... から始まる長〜い文字列が正しくコピペできているか確認してください。
Status Code: 200(成功)と出るのに、スマホに届かない場合
  • 原因: USER_ID が間違っている(別の人宛に送ろうとしている)か、LINE Official Account Managerの「応答設定」で「Webhook」が【オフ】のままになっています。第2回の設定をもう一度見直してみましょう。
[Errno 104] ECONNRESET などの通信エラーが出る場合
  • 原因: Pico WのWi-Fi通信が不安定になっているか、暗号化通信の処理で弾かれています。一度Pico WのUSBケーブルを抜き差しして再起動してから、もう一度実行してみてください。

🚨【罠解説】日本語を送るとエラー400になる!?

もしここで、メッセージを「テスト成功!」などの日本語に変えて実行すると、おそらく Status Code: 400 (Bad Request) というエラーで弾かれてしまいます。 MicroPythonでは、日本語(全角文字)をそのまま送信するとデータが壊れたと判定されるため、データを送信する直前にバイナリ(UTF-8)に変換してあげるという一手間が必要になります。本番コードではこの対策を組み込みます!

スポンサーリンク

3.【コード全公開】室温超過でLINE通知!温湿度自動アラートプログラムの完成

いよいよ集大成です。
第1回の「温度取得コード」と、先ほどの「Wi-Fi+LINE送信コード(日本語対応版)」を合わせます。

以下のコードを貼り付け、4つの設定をご自身の環境に合わせて書き換えてください。

WIFI_SSID = “SSIDを入力”
WIFI_PASSWORD = “Passwordを入力”
LINE_TOKEN = “b7+u・・・で始まるLINEトークンを入力”
USER_ID = “U・・・・から始まるユーザーIDを入力”

# Main_Temp_Line_bot.py
import machine
import dht
import network
import time
import urequests
import json

# --- ここをご自身の環境のものに書き換えて下さい ---
WIFI_SSID = "SSIDを入力"
WIFI_PASSWORD = "Passwordを入力"
LINE_TOKEN = "b7+u・・・で始まるLINEトークンを入力"
USER_ID = "U・・・・から始まるユーザーIDを入力"
# --------------------------------------------------

# --- 2. 見守りの設定 ---
ALERT_TEMP = 28 # この温度(℃)を超えたらLINEを送る
CHECK_INTERVAL = 10 # 温度をチェックする間隔(秒) ※テスト用に短くしています
# --------------------------------------------

# センサーとWi-Fiの初期設定
sensor = dht.DHT11(machine.Pin(15))
wlan = network.WLAN(network.STA_IF)

def connect_wifi():
wlan.active(True)
if not wlan.isconnected():
print("Wi-Fiに接続中...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
time.sleep(1)
print("Wi-Fi接続成功! IP:", wlan.ifconfig()[0])

def send_line(message):
try:
connect_wifi()
url = "https://api.line.me/v2/bot/message/push"
headers = {
"Content-Type": "application/json; charset=UTF-8", # 文字コードを指定
"Authorization": f"Bearer {LINE_TOKEN}"
}
payload = {
"to": USER_ID,
"messages": [{"type": "text", "text": message}]
}

# ★ココが重要! json.dumps(payload) をさらに .encode('utf-8') で変換します
binary_data = json.dumps(payload).encode('utf-8')

# data= にバイナリデータを渡す
response = urequests.post(url, data=binary_data, headers=headers)
print(f"LINE送信結果ステータス: {response.status_code}")
response.close()
except Exception as e:
print(f"LINE送信エラー: {e}")

# メイン処理開始
print("温湿度監視システムを起動しました")
send_line("温湿度監視システムが起動しました!監視を開始します。")

# 一度LINEを送ったら、しばらく連続送信を防ぐためのフラグ
alert_sent = False

while True:
try:
# センサーから値を読み取る
sensor.measure()
temp = sensor.temperature()
humidity = sensor.humidity()
print(f"【現在値】 温度: {temp}°C, 湿度: {humidity}%")

# 温度がしきい値を超えた場合の判定
if temp >= ALERT_TEMP:
if not alert_sent:
# まだアラートを送っていない場合のみ送信
msg = f"【警告】室温が{temp}°Cになりました!エアコンを確認してください!(湿度: {humidity}%)"
print("警報レベル到達!LINEを送ります。")
send_line(msg)
alert_sent = True # フラグを立てて、連続送信を防ぐ
else:
if alert_sent:
# 温度が安全圏内に戻ったらフラグをリセットし、安心通知を送る
print("温度が安全圏に戻りました。")
send_line(f"室温が{temp}°Cに下がりました。安全圏内です。")
alert_sent = False

except OSError as e:
print("センサーの読み取りエラー(スキップします)")

# 指定した時間だけ待つ
time.sleep(CHECK_INTERVAL)

Main_Temp_Line_bot.py テスト結果

実行ボタンを押すと、スマホに「温湿度監視システムが起動しました!」と日本語で届きます!

その後、DHT11センサーにハァーっと温かい息を吹きかけて、温度が28度を超えた瞬間に「【警告】室温が〇〇°Cになりました!」とアラートメッセージが受信されます。

その後、27℃以下になると
アラート解除の安全メッセージが受信されれば大成功です!

スポンサーリンク

4.PC不要で完全自動化!Pico Wにmain.pyを保存して独立稼働させる方法

ここまではテストのために、PCを開いてThonnyから「実行」ボタンを押して動かしてきました。でも、実用的に使うためにPCを24時間繋ぎっぱなしにしておくわけにはいきませんよね。

そこで最後は、Pico WをPCから完全に切り離します!プログラムを本体に記憶させて、コンセントに挿すだけで自動的に監視を始めてくれる**「あなただけの小さなIoT見守り家電」**へと進化させましょう!

Thonnyのメニューから 「ファイル」>「名前を付けて保存」 を選びます。

保存先に 「Raspberry Pi Pico」 を選びます。

ファイル名を必ず main.py」 にして保存してください。

💡 なぜ main.py なのか?
Raspberry Pi Picoは、電源が入った瞬間に内部にある main.py という名前のファイルを自動で実行する仕様になっています。

保存できたら、Pico WからUSBケーブルを抜き、スマホの充電器など(5V ACアダプター)に繋いで部屋のコンセントに直接挿してみてください。 PCなしで自動的にWi-Fiに繋がり、LINEに起動通知が届けばミッション・コンプリートです!

スポンサーリンク

おわりに:完成した自作IoT見守り家電と、次なるスマートホーム化への野望

全3回にわたる「愛犬のためのIoT温湿度見守りLINE Bot」の作成、本当にお疲れ様でした!

「100均の充電専用ケーブルの罠」から始まり、「LINE側の仕様変更によるWebhookエラー」、そして今回の「MicroPythonの日本語エンコード問題」と、初心者が挫折しやすいポイントをすべて乗り越えて完成したこのシステムは、最高の愛着と安心感をもたらしてくれるはずです。

でも、IoTの夢はここでは終わりません。

「警告が来たら、そのままLINEから『エアコンつけて!』って命令して、自動で冷房をオンにできたら最強じゃない?」

……実は、できます。 次回からの新シリーズでは、赤外線LEDやトランジスタ(C1815)を使って「ラズパイPico Wで自作するスマートリモコン」に挑戦します!

また次回の記事でお会いしましょう。ニンジンでした!


第1回:ハードウェア準備&温度取得編はこちら

第2回:LINE Messaging APIの最新設定編はこちら


スポンサーリンク

他のシリーズ




PythonでExcel請求書を自動PDF化!openpyxlからCustomTkinterによる一括GUIツール開発まで完全解説
PythonでExcel請求書を自動PDF化するツール「Invoice Maker」の制作シリーズ全3回をまとめて解説。openpyxlとpywin32による基本ロジック、for文でのループ処理、CustomTkinterを使ったGUIアプリ化まで、業務自動化の全ステップをこの1記事で確認できます。
【完全版】ゼロから作る自作CNCロードマップ!Arduino制御とレーザー刻印機への全手順
Arduino×GRBL×1064nm赤外線レーザーで自作するCNCマシンの全工程を、全10回のロードマップで完全解説。要素設計から本筐体の組み立て、配線エラーの解決、設計データ配布までを網羅します。
ラズパイPico W×GASで自作!「LINEで動く温湿度&スマートリモコン」完全ロードマップ
ペットの熱中症対策に。Pico W+GASでスマホからエアコンを遠隔操作する自作スマートリモコンをLINE Botで作る全5回の総集編。回路図・Pythonコード・API設定・フリーズ対策まで全部まとめました。
GASとLINE Bot(Webhook)でPico Wを遠隔操作!双方向通信の作り方
ラズパイPico WとLINEを連携して自作スマートリモコンを完成させよう!第5回ではGoogle Apps Script(GAS)を中継サーバーとして使い、外部からエアコンを遠隔操作する仕組みと、PC不要で動かす完全スタンドアロン化の手順を解説します。
ラズパイPico Wで赤外線リモコンを自作!送受信回路とPWM制御のやり方
Raspberry Pi Pico Wを使ってエアコンの赤外線信号をハック!自作IoTスマートリモコンの要となるハードウェア改造手順を解説します。受光モジュールの配線、38kHzの信号解析、トランジスタを使ったIR送信回路の組み方まで、実践的な電子工作ノウハウを公開。

コメント