YAS's VB.NET Tips
 
ラズベリーパイ活用
ラズベリーパイ活用 >> 記事詳細

2022/11/17

Raspberry Pi Pico W から LINE に通知する

| by:YAS
 LINE Notifyを使って、Raspberry Pi Pico Wから自分のLINEに送信してみます。
 LINE Notify API Documentによると、https://notify-api.line.me/api/notifyに、application/x-www-form-urlencodedでPOSTすればよいようです。
 しかし、Pico WのMicroPythonには、URLエンコードができるモジュールはないようです。そこで、upipでurllib.parseモジュールをインストールすることにします。
 ところが、
最新版のPico W用MicroPythonには、upipがなく、mipというものに代わっているようなのです。そして、mipでは、urllib.parseをインストールできません。前回の投稿のWifiに接続するモジュールを使って下の様なコードを実行しても、エラーになってしまいました。
import wifi
wlan, ip = wifi.connect()
import mip
mip.install('urllib.parse')
Installing urllib.parse (latest) from https://micropython.org/pi/v2 to /lib Package not found: https://micropython.org/pi/v2/package/6/urllib.parse/latest.json Package may be partially installed
 upipが実行できるのは、古いバージョンのMicroPythonのようです。探してみると、
Raspberry Pi Datasheetsにある、soft/micropython-firmware-pico-w-290622.uf2では、upipが使えました。下のようなコードに変更すると、urllib.parseモジュールがインストールできました。
import wifi
wlan, ip = wifi.connect()
import upip
upip.install('urllib.parse')

Installing to: /lib/ Warning: micropython.org SSL certificate is not validated Installing urllib.parse 0.5.2 from https://micropython.org/pi/urllib.parse/urllib.parse-0.5.2.tar.gz Installing micropython-collections 0.1.2 from https://micropython.org/pi/collections/collections-0.1.2.tar.gz Installing micropython-collections.defaultdict 0.3 from https://micropython.org/pi/collections.defaultdict/collections.defaultdict-0.3.tar.gz Installing micropython-re-pcre 0.2.5 from https://micropython.org/pi/re-pcre/re-pcre-0.2.5.tar.gz Installing micropython-ffilib 0.1.3 from https://micropython.org/pi/ffilib/ffilib-0.1.3.tar.gz
 ようやくURLエンコードができるかと思いきや、import urllib.parseでエラーになってしまいます。
Traceback (most recent call last): File "", line 2, in File "/lib/urllib/parse.py", line 30, in File "/lib/re.py", line 11, in AttributeError: 'NoneType' object has no attribute 'func'
 これは、どうやらlibフォルダからffilib.pyとre.pyを削除して、内蔵のものを使うようにすればよいようです。それで、下のコードを実行できるようになりました。実行すると、無事、LINEに通知が送られました。
import urequests as requests
from urllib.parse import urlencode
from micropython import const

LINE_TOKEN = const('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
LINE_URL = const('https://notify-api.line.me/api/notify')

def line_notify(message):
    header = {
        'Content-Type' : 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + LINE_TOKEN
    }
    contents = { 'message' : message}
    message = urlencode(contents)
    try:
        response = requests.post(LINE_URL, headers = header, data = message)
        print(message)
    except Exception as e:
        print(e)
    finally:
        if 'response' in locals():
            response.close()

if __name__ == '__main__':
    import wifi
    try:
        wlan, ip = wifi.connect()
        line_notify('テスト送信')
    except Exception as e:
        print(e)
    finally:
        if 'wlan' in locals():
            wifi.disconnect(wlan)


21:20