PythonでSwitchBotの温湿度データをCSV出力

PC

SwitchBot温湿度データをPythonで1時間おきに自動取得してCSV保存【API活用】

この記事では、SwitchBotの温湿度計からクラウド経由で温度・湿度を取得し、Pythonを使って1時間ごとにCSVへ自動記録するスクリプトとの備忘録です。

📌 この方法の特徴

  • SwitchBotのAPIを活用
  • 複数デバイスを並列処理
  • Power BIなどへの可視化にも対応
  • 重複記録を防ぐロジックあり

💡 使用環境と準備

  • SwitchBot温湿度計 + Hub
  • SwitchBot APIトークン
  • Python 3.8以上(Windows/Linux)
  • Device IDとCSV保存フォルダ

💻 スクリプト全文(ダミー値含む)

以下のコードを使用して、1時間ごとに温湿度を取得し、重複排除付きのCSV出力を実現しています。


import csv
import time
import os
import shutil
from datetime import datetime
import multiprocessing

API_TOKEN = os.getenv("SWITCHBOT_API_TOKEN")

DEVICE_INFO = {
'AAAAAAAAAA': 'aaaa.csv',
'BBBBBBBBBB': 'bbbb.csv',
'CCCCCCCCCC': 'cccc.csv',
'DDDDDDDDDD': 'dddd.csv',
}

URL_TEMPLATE = 'https://api.switch-bot.com/v1.0/devices/{}/status'

HEADERS = {
'Authorization': API_TOKEN,
'Content-Type': 'application/json; charset=utf8'
}

SOURCE_FOLDER = './data'
DESTINATION_FOLDER = './data'

def get_temperature_humidity(device_id):
url = URL_TEMPLATE.format(device_id)
response = requests.get(url, headers=HEADERS)
data = response.json()
temperature = data['body']['temperature']
humidity = data['body']['humidity']
return temperature, humidity

def read_last_two_timestamps(filename):
last_two = []
if os.path.exists(filename):
with open(filename, 'r', newline='') as file:
reader = csv.reader(file)
next(reader)
for row in reader:
last_two.append(row[0])
return last_two[-2:]

def save_to_csv(device_id, temperature, humidity):
now = datetime.now().replace(minute=0, second=0, microsecond=0)
timestamp = now.strftime('%Y-%m-%d %H:%M:%S')
filename = f'temperature_humidity_data_{device_id}.csv'
file_path = os.path.join(SOURCE_FOLDER, filename)
file_exists = os.path.isfile(file_path)

with open(file_path, mode='a', newline='') as file:
writer = csv.writer(file)
if not file_exists:
writer.writerow(['Timestamp', 'Temperature (°C)', 'Humidity (%)'])
writer.writerow([timestamp, temperature, humidity])

copy_csv(filename, DEVICE_INFO[device_id])

last_two = read_last_two_timestamps(file_path)
if len(last_two) == 2 and last_two[0] == last_two[1]:
remove_last_row(file_path)

copied_file_path = os.path.join(DESTINATION_FOLDER, DEVICE_INFO[device_id])
last_two_copied = read_last_two_timestamps(copied_file_path)
if len(last_two_copied) == 2 and last_two_copied[0] == last_two_copied[1]:
remove_last_row(copied_file_path)

def copy_csv(source_filename, destination_filename):
if not os.path.exists(DESTINATION_FOLDER):
os.makedirs(DESTINATION_FOLDER)
shutil.copy(
os.path.join(SOURCE_FOLDER, source_filename),
os.path.join(DESTINATION_FOLDER, destination_filename)
)

def remove_last_row(filename):
with open(filename, 'r+', newline='') as file:
lines = file.readlines()
file.seek(0)
file.writelines(lines[:-1])
file.truncate()

def process_device(device_id):
while True:
try:
temperature, humidity = get_temperature_humidity(device_id)
save_to_csv(device_id, temperature, humidity)
print(f'{device_id}:{temperature}°C, {humidity}% saved at {datetime.now()}')
except Exception as e:
print(f'エラー({device_id}):{e}')
time.sleep(3600)

def main():
processes = []
for device_id in DEVICE_INFO.keys():
p = multiprocessing.Process(target=process_device, args=(device_id,))
processes.append(p)
p.start()

for p in processes:
p.join()

if __name__ == '__main__':
main()

🔐 セキュリティ&個人情報

下記の部分は、ご自身の環境に合わせて置き換えてください。

プレースホルダー説明
'os.getenv("SWITCHBOT_API_TOKEN")'SwitchBotアプリで取得したAPIトークン
'AAAAAAAAAA' など各デバイスのDevice ID
'aaaa.csv'など出力するCSVファイル名

📊 可視化や応用アイデア

  • Power BI DesktopでCSVを読み込んでグラフ化
  • Google Sheetsと連携してクラウド上で監視
  • 家庭内の複数部屋の温湿度を一括ログ化
  • ラズパイなどに組み込んで24時間稼働

コメント

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