「スマートホームって、なんか専用のデバイスを買わないといけないんじゃないの?」
そんなふうに思っている方、多いんじゃないでしょうか。実は、PythonとAI、そして安価なセンサーを組み合わせるだけで、自分だけのスマートホームシステムを作れちゃうんです 🏠✨
今回は、センサーからのデータ収集・AI判断・自動化まで、ざっくりとした流れがつかめるように解説していきます。「むずかしそう」を「できそう」に変える記事を目指しました!
📋 この記事でわかること・対象読者

- ✅ Pythonの基本構文がわかる初〜中級者の方
- ✅ IoTやスマートホームに興味があるけど何から始めればいいかわからない方
- ✅ センサーデータをAIで解析して「自動化」まで持っていきたい方
難易度の目安は ⭐⭐⭐(中級) です。Pythonが少し書けるなら十分チャレンジできます!
🏗️ スマートホームの全体像をざっくり理解しよう
まず「スマートホームって何をするシステムなの?」というイメージを固めましょう。
イメージとしてはこんな感じです:
- センサーがデータを取得する(温度・湿度・人感など)
- Pythonがそのデータを収集・整理する
- AIが「今どんな状況か」を判断する
- 判断結果に応じてデバイスを自動制御する(エアコンON、照明調整など)
この4ステップが、スマートホームの骨格です。難しそうに見えますが、一つひとつは意外とシンプルなんですよね。
🔧 必要なものを確認しておきましょう
ハード面とソフト面、両方確認しておきましょう。
ハードウェア
- Raspberry Pi(ラズパイ)または Arduino
- 温湿度センサー(例:DHT22)
- 人感センサー(PIRセンサー)
- リレーモジュール(家電のON/OFFに使う)
ソフトウェア・ライブラリ
# 必要なライブラリをインストール
pip install RPi.GPIO # Raspberry Pi GPIO制御
pip install Adafruit-DHT # 温湿度センサー用
pip install scikit-learn # AI(機械学習)用
pip install pandas # データ整理用
pip install requests # 通知送信用
ポイントをまとめるとこんな感じです。
- scikit-learn:学習済みモデルの作成・推論に使います
- pandas:センサーデータをCSVに保存・読み込みする際に便利
- requests:LINEやSlackへの通知送信に使います
📡 STEP1:センサーデータをPythonで収集する
まずは温湿度センサー(DHT22)からデータを取得してみましょう。ここが「スマートホームの耳と鼻」になる部分です 👃
import Adafruit_DHT
import time
import csv
from datetime import datetime
# センサーの種類とGPIOピン番号を設定
SENSOR = Adafruit_DHT.DHT22
PIN = 4 # Raspberry PiのGPIOピン番号
def collect_sensor_data(interval_sec=60, save_file="sensor_log.csv"):
"""センサーデータを定期的に収集してCSVに保存する関数"""
print("📡 センサーデータの収集を開始します...")
with open(save_file, mode="a", newline="") as f:
writer = csv.writer(f)
# ヘッダー行(初回のみ書き込む想定)
writer.writerow(["timestamp", "temperature", "humidity"])
while True:
# センサーから温度・湿度を取得
humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
if humidity is not None and temperature is not None:
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
writer.writerow([now, round(temperature, 1), round(humidity, 1)])
print(f"✅ [{now}] 温度: {temperature:.1f}℃ / 湿度: {humidity:.1f}%")
else:
print("⚠️ センサーの読み取りに失敗しました")
time.sleep(interval_sec) # 指定した間隔で繰り返す
collect_sensor_data()
ここが重要です。
Adafruit_DHT.read_retry()は読み取り失敗時に自動でリトライしてくれます- データはCSVに追記していくので、ログとして蓄積されていきます
- この蓄積データが後のAI学習に使われます 🤖
🤖 STEP2:AIで「快適かどうか」を判断させる
次はAI(機械学習)の出番です。収集したデータをもとに、「今の室内環境が快適かどうか」を自動判断させます。
つまり、「温度28℃・湿度75%」というデータを入れたら、「暑くて不快 → エアコンをONにすべき」という判断をAIにさせるイメージです。
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pickle
def train_comfort_model(csv_file="sensor_log_labeled.csv"):
"""
ラベル付きデータでAIモデルを学習する。
CSVには temperature, humidity, label(0=快適, 1=不快)の列が必要。
"""
df = pd.read_csv(csv_file)
# 特徴量とラベルを分離
X = df[["temperature", "humidity"]]
y = df["label"] # 0=快適, 1=不快
# 学習データとテストデータに分割(8:2の割合)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ランダムフォレストで学習
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
accuracy = model.score(X_test, y_test)
print(f"🎯 モデルの精度: {accuracy * 100:.1f}%")
# 学習済みモデルを保存しておく
with open("comfort_model.pkl", "wb") as f:
pickle.dump(model, f)
print("💾 モデルを保存しました: comfort_model.pkl")
return model
def predict_comfort(temperature, humidity):
"""保存済みモデルを使って快適度を予測する"""
with open("comfort_model.pkl", "rb") as f:
model = pickle.load(f)
result = model.predict([[temperature, humidity]])[0]
label = "快適 😊" if result == 0 else "不快 😓 → 自動制御を実行します"
print(f"🌡️ 温度:{temperature}℃ / 湿度:{humidity}% → {label}")
return result
# 使用例
train_comfort_model()
predict_comfort(28.5, 75.0)
ポイントをまとめるとこんな感じです。
- ランダムフォレスト(RandomForest):複数の決定木を組み合わせた手法。少ないデータでも比較的精度が出やすいです
- 学習済みモデルは
pickleで保存しておけば、次回起動時に読み込むだけでOK - ラベルは最初のうちは自分で「これは不快だった」と手動入力して学習データを作ります
⚡ STEP3:AIの判断に応じてデバイスを自動制御する
AI判断と自動制御を組み合わせます。「不快と判断されたらリレーをONにしてエアコンを動かす」流れを作りましょう。
import RPi.GPIO as GPIO
import requests
# リレーモジュールが接続されているGPIOピン
RELAY_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(RELAY_PIN, GPIO.OUT)
LINE_TOKEN = "あなたのLINE Notifyトークン" # LINE Notifyで取得
def send_line_notification(message):
"""LINEに通知を送る"""
headers = {"Authorization": f"Bearer {LINE_TOKEN}"}
payload = {"message": message}
requests.post("https://notify-api.line.me/api/notify", headers=headers, data=payload)
def control_device(is_uncomfortable: bool):
"""不快と判断された場合にエアコン(リレー)をONにする"""
if is_uncomfortable:
GPIO.output(RELAY_PIN, GPIO.HIGH) # リレーON → エアコン起動
print("🔌 エアコンをONにしました")
send_line_notification("🏠 室温が上昇しました。エアコンを自動でONにしました!")
else:
GPIO.output(RELAY_PIN, GPIO.LOW) # リレーOFF
print("✅ 環境は快適です。エアコンOFF")
# 実際の制御フロー
result = predict_comfort(28.5, 75.0) # AIで判断
control_device(result == 1) # 結果に応じてデバイス制御
# 終了時はGPIOをリセット
GPIO.cleanup()
ここが重要です。
- リレーモジュール:小さな電気信号で大きな電力を制御できるパーツ。家電の電源ラインに挟み込む形で使います
- LINE Notify:無料で使えるLINE通知API。自動制御のたびにスマホに通知が来るようにすると安心です 📱
GPIO.cleanup()は忘れずに。GPIOを初期化しないとピンが壊れる原因になります
🔄 全体をつなげてループさせる
3つのステップをまとめて、定期的に動き続けるシステムにするにはこんな流れになります。
- センサーデータを取得(STEP1)
- AIで快適度を判断(STEP2)
- 判断に応じてデバイスを制御・通知(STEP3)
- 一定時間待って①に戻る
あとは Raspberry Pi を常時起動にしておくだけで、完全自動のスマートホームシステムの完成です 🎉
📝 まとめ
今回は、PythonとAIを使ったスマートホームの作り方を、センサーデータ収集・AI判断・デバイス自動制御の3ステップで解説しました。
- 📡 センサーデータをCSVに蓄積する
- 🤖 scikit-learnでAIモデルを作り、快適度を判断させる
- ⚡ 判断結果でリレーを制御し、LINEに通知する
「スマートホームって高価なデバイスが必要」という思い込み、少し薄れてきましたか? Pythonがあれば、ここまでできちゃうんですよね 😊
まずはセンサーデータの収集だけでも試してみてください。データが貯まってくると、「次はこれを自動化したい!」というアイデアがどんどん湧いてきますよ。ぜひ一緒に作っていきましょう!
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。





