はじめに: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 テスト結果
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 テスト結果
🚨 テスト送信がエラーになった場合のチェックポイント
もし上手くスマホに届かず、Thonnyの画面にエラーが出た場合は、以下のポイントをチェックしてみてください。
① Status Code: 400(Bad Request)と出る場合
LINEのサーバーから「送られてきたデータの形式がおかしいよ」と怒られている状態です。
- 原因1:
LINE_TOKENやUSER_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 テスト結果
4.PC不要で完全自動化!Pico Wにmain.pyを保存して独立稼働させる方法
ここまではテストのために、PCを開いてThonnyから「実行」ボタンを押して動かしてきました。でも、実用的に使うためにPCを24時間繋ぎっぱなしにしておくわけにはいきませんよね。
そこで最後は、Pico WをPCから完全に切り離します!プログラムを本体に記憶させて、コンセントに挿すだけで自動的に監視を始めてくれる**「あなただけの小さなIoT見守り家電」**へと進化させましょう!
💡 なぜ 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で自作するスマートリモコン」に挑戦します!
また次回の記事でお会いしましょう。ニンジンでした!
第2回:LINE Messaging APIの最新設定編はこちら















コメント