2024年2月2日金曜日

Ambient.iotで IoTデータを表示

iMacのUSBポートにAruduino UNO が接続されており、 9600bpsで次のようなメッセージが5秒ごとに送られてくる。 BMP_001:Pres:1011.81 BMP_001:Temp:18.20 SHT_001:Temp:19.74 SHT_001:Humi:68.48 RTC_001:Time:2001/05/16-04:00:00 RTC_001:Temp:17.00 HAM_001:Light:69

このデータを1分おきに ambient.iot へ送るためのPython プログラムを作った。

------ 

ChatGPTに作られせた。

------------------------------

import serial
import time
import requests
import json

# Ambientの設定
AMBIENT_CHANNEL_ID = "YOUR_CHANNEL_ID"
AMBIENT_WRITE_KEY = "YOUR_WRITE_KEY"
AMBIENT_URL = "http://ambidata.io/api/v2/channels/{channel_id}/data".format(channel_id=AMBIENT_CHANNEL_ID)

# シリアルポートの設定 (Mac向けに調整)
SERIAL_PORT = '/dev/cu.usbmodemXXXXX' # Macに接続されているArduinoのポート。XXXXはデバイスによって異なります。

BAUD_RATE = 9600

def send_data_to_ambient(data):
headers = {
"Content-Type": "application/json",
}
response = requests.post(AMBIENT_URL, data=json.dumps(data), headers=headers)
if response.status_code == 200:
print("Data successfully sent to Ambient.")
else:
print("Failed to send data to Ambient.")

def main():
with serial.Serial(SERIAL_PORT, BAUD_RATE) as ser:
# 1分おきにデータ送信
while True:
aggregated_data = {}
start_time = time.time()
while time.time() - start_time < 60: # 60秒間データを収集
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').strip()
# データ解析と整形
if line:
parts = line.split(':', 2) # 最大2回まで分割
if len(parts) == 3:
sensor_id, value_type, value = parts
key = f"{sensor_id}_{value_type}"
aggregated_data[key] = value
else:
print("Received malformed data:", line)
if aggregated_data:
# Ambientに送信するデータの形式に合わせて整形
data = {"writeKey": AMBIENT_WRITE_KEY, "d1": aggregated_data.get('BMP_001_Pres', ''),
"d2": aggregated_data.get('BMP_001_Temp', ''), "d3": aggregated_data.get('SHT_001_Temp', ''),
"d4": aggregated_data.get('SHT_001_Humi', ''), "d5": aggregated_data.get('RTC_001_Time', ''),
"d6": aggregated_data.get('RTC_001_Temp', ''), "d7": aggregated_data.get('HAM_001_Light', '')}
send_data_to_ambient(data)
# 次の送信までの待機時間を計算し、負の値でないことを保証
sleep_time = 60 - (time.time() - start_time)
if sleep_time > 0:
time.sleep(sleep_time)

if __name__ == "__main__":
main()

----------------------------

2/2 00:30から 05:30までの観測結果を表示した結果が下の図のとおり



--------

raspberry piでの プログラムも ほぼ同様で動作するはず。
USBポートの設定を変えれば良い。


--



2 件のコメント: