マイコン温度通知システムの製作16 デバイスからのデータ送信のエラー(JSON形式になっていない)

単純ミス

以下の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

タイトルとURLをコピーしました