COMPANY SERVICE STAFF BLOG NEWS CONTACT
2025.08.28

IoT家電とAWSで部屋の温度を自動調節してみた

テクログaws

人が心地よい気温・湿度とは?

事務作業やオフィスワークの場合22~26℃程度が快適とされています。

特に25℃前後は集中力が維持しやすく、多くのオフィスで推奨されています。

湿度は 40~60%程度が望ましく、乾燥や蒸し暑さを防ぎます。

冷房と除湿の切り替えはどうするか考える

真夏日(28℃以上、強い暑さ)

冷房にする

設定温度: 26~27℃

蒸し暑い梅雨時や夜間(25~28℃、湿度70%以上)

除湿にする

設定温度: 27~28℃

涼しいがジメジメ(25℃以下、湿度70%以上)

エアコンはOFFにする

扇風機+換気 で何とかなりそう

上記以外

節電の為、エアコンはOFFにする

これらを踏まえ、ロジックを整理すると…


机上の空論はここまで。現実的に考えてみる

① どう気温・湿度を測るか

物理的に温度計・湿度計を使い何らかの方法で上げ幅を感知する…?

水銀を触るのが普通にこわい

Raspberry Piを使う…?

ハードの知識が必要そう

Nature Remoを使う…?

ハードの知識がそこまでなくてもできそう

② 繰り返し処理とそれを実行させるプログラム

Google App Scriptを使う…?

LambdaとEventBridgeを使う…?

個人的にこっちでやりたい

③ エアコンのリモコン操作

物理的にリモコンを解体して基盤を弄る

冗談です

スマート家電ならいけそう

やっぱりNature Remo?

Nature Remoで進めてみる

Nature Remo自体使うのが初めてだったので…次で説明します。注文ボタン ポチッ

Nature Remoとは?

Nature Remo は、スマートリモコン です。

特徴

  • 赤外線リモコンを学習して、エアコン・テレビ・照明などをスマホやクラウドAPIから操作できる
  • センサーを内蔵(モデルによって温度・湿度・照度・人感など)
  • Wi-Fi接続でクラウドに常時接続 → API経由で遠隔制御可能

つまり「普通の家電をスマート家電に変えるためのハブ機器」であり、

今回のように AWSと連携して自動制御する用途でも適しています。

つまり、Nature Remoが今回使える機能は

  • 気温・湿度の測定
  • エアコンのリモコン操作

(改めて…) アーキテクチャ作成

制御判定は「冷房と除湿の切り替えはどうする?」に当たります

Lambdaの実装

Node.js 20を使用します

環境変数にAPPLIANCE_IDNATURE_TOKENを設定

  • APPLIANCE_ID
    • Nature Remo に登録されている「家電(エアコン)」を識別するためのID
  • NATURE_TOKEN
    • Nature Remo Cloud API を使うための「アクセストークン」です
    • Nature公式サイトでログインすると入手できます
const APPLIANCE_ID = process.env.APPLIANCE_ID;
const NATURE_TOKEN = process.env.NATURE_TOKEN;

async function getJson(url) {
  const r = await fetch(url, { headers: { Authorization: `Bearer ${NATURE_TOKEN}` }});
  if (!r.ok) throw new Error(`${url} ${r.status} ${await r.text()}`);
  return r.json();
}

async function postSettings(payload) {
  const url = `https://api.nature.global/1/appliances/${APPLIANCE_ID}/aircon_settings`;
  const r = await fetch(url, {
    method: "POST",
    headers: { 
      Authorization: `Bearer ${NATURE_TOKEN}`, 
      "Content-Type": "application/x-www-form-urlencoded" 
    },
    body: new URLSearchParams(payload),
  });
  const text = await r.text();
  if (!r.ok) throw new Error(`aircon_settings ${r.status} ${text}`);
  return text;
}

// 制御判定
function decide(temp, humi) {
  if (temp >= 28.0) {
    const t = 27;
    return { operation_mode: "cool", temperature: String(t), air_volume: "auto" };
  }
  if (Number.isFinite(humi) && temp >= 25.0 && temp < 28.0 && humi >= 70) {
    const t = 27;
    return { operation_mode: "dry", temperature: String(t), air_volume: "auto" };
  }
  return { button: "power-off" };
}

export const handler = async () => {
  const devs = await getJson("https://api.nature.global/1/devices");
  const temp = parseFloat(devs[0].newest_events.te.val);
  const humi = devs[0].newest_events.hu ? parseFloat(devs[0].newest_events.hu.val) : NaN;

  const target = decide(temp, humi);

  const res = await postSettings(target);

  return { status: "done", temp, humi, sent: target, response: res };
};

 EventBridge 設定

  • スケジュール式: rate(15 minutes)
    • Lambda が 15分ごとに起動し、自動で室温・湿度をチェック

実験

  • 実験は1日(2025/8/22)限りとする
  • 湿度・温度が変化してしまうため、この日は前日から窓を開けてはならない
  • 部屋を前日からエアコンをかけずにそのままの状態し0時から実験スタート

結果は失敗

  • 計測初めは仕方ないが、途中部屋が冷えすぎたり、暑くなりすぎたりしてしまっている
  • 湿度に関してはほぼ許容範囲内

今後の課題

当たり前のことではあるが

① 温湿度計測

② リモコン操作

③ 室内温湿度反映

までは時間がかかる。

気温・湿度それぞれどれくらいで反映するのか計算に入れておき計測時に次の温度・湿度を予測して制御する必要がありそうだ。

EventBridgeのスケジュールをさらに刻めば解決するかもしれない

とりあえず、冷房も除湿も設定温度を27度にしていたが、調節したほうが良さそうだ

この記事を書いた人

烏龍茶

入社年
2021年
出身地
千葉
業務内容
Web開発
特技・趣味
Bouldering / Alpine Climbing / 温泉 / ルービックキューブ / テニス / ゴルフ / ピアノ

テクログに関する記事一覧