単純ミス
以下のmicropython実行のコマンドでエラーになりました。
ampy --port /dev/tty.usbserial-0001 put main.py
Usage: ampy put [OPTIONS] LOCAL [REMOTE]
Try 'ampy put --help' for help.
原因は、micropythonのファイルmain.pyがあるディレクトリでコマンドを実行していないことでした。
妥当な値を送信しているのに未定義のエラーになる
デバイスからFirebaseの関数にデータを送信するとき、以下のようなエラーが起こりました。
ampy --port /dev/tty.usbserial-0001 run main.py
macAddress type : <class 'str'>
macAddress : XXX
temperature type : <class 'float'>
temperature : 29.5
Wi-Fiに接続しました
Sending payload: {'macAddress': 'XXX', 'temperature': 29.5}
Data sent. Response: {'error': 'Value for argument "value" is not a valid query constraint.
Cannot use "undefined" as a Firestore value. If you want to ignore undefined values,
enable `ignoreUndefinedProperties`.'}
これについては、firebaseの関数でJSON形式でデータを取得するにも関わらず、その形式で送っていないためエラーが発生していました。
デバイスのコードを作った後、firebaseのデバイス受信プログラムを大幅に修正していて、かつテストに使っていたコマンドがjson形式で送るものでした。
そのためデバイスのコードは初期に作ったのでJSON形式で送信しておらずエラーになっていました。
なお、これらがわかるまでにも時間がかかっており、いくらchatGPTやGeminiに聞いてもコードに問題は無いと回答されていました。
そこで発想を変え、テストに使っていたデータ送信コマンドと同じ動作をするコードをmicropythonで書いてと伝えたところ、このJSON形式が問題点だということがわかりました。
・firebaseにデプロイした受信プログラムの一部
// JSONリクエストボディから温度データを抽出し、数値に変換
const temperature = parseFloat(req.body.temperature);
console.log(`temperature : ${temperature}`);
// JSONリクエストボディからマイコンのMACアドレスを抽出
const macAddress = req.body.macAddress;
console.log(`macAddress : ${macAddress}`);
上記のHTTPリクエストにより、受信データはjson形式でないといけません。
・送信エラーが起きたコードの一部
url = "https://xxx"
headers = {"Content-Type": "application/json"}
payload = {"temperature": temperature, "macAddress": macAddress}
try:
response = urequests.post(url, json=payload, headers=headers)
print(response.text)
print("Data sent. Response:", response.json())
except Exception as e:
print("Error sending data:", e)
・送信に成功したmicropythonコード
import urequests
import json
# FirebaseのURL
firebase_url = "https:/xxx"
# 送信するデータ
data = {
"temperature": "29.5",
"macAddress": "08d1f9e822ec"
}
# JSONデータを文字列に変換
payload = json.dumps(data)
# ヘッダーを設定
headers = {
"Content-Type": "application/json"
}
try:
# POSTリクエストを送信
response = urequests.post(firebase_url, data=payload, headers=headers)
except Exception as e:
print("An error occurred:", e)
aaa