ふろ自動をスマホとアレクサで操作

前回、赤外線リモコンをなんとなく制覇した感覚になったので、次は風呂自動を外出先からオンにできないかという話です。

今の新築は最初からそういう機能はあるかもしれないけれど、我が家のは全くスマート機能は無いので、家に帰る途中に湯舟のお湯が貯められたらいいなということでやってみました。

まずふろリモコンであるコントロールパネルを外し分解する。
ふろ自動リモコン外す
上にグッとスライドすると簡単に外れて、裏の中央の小さいカバーを外すとこうなります。コードのねじを外せばOKです。
ふろ自動リモコン分解

ボタンのところを見るとこんな感じ、押すと4本脚があって上下が短絡してスイッチON判定される仕組みです。この部分に別スイッチ付けちゃえばいいかなということでフォトリレーを使います。
ふろ自動分解ボタン

フォトリレーは、制御側と対象機器側を電気的に絶縁し、内部で光信号を使って対象ボタンの2端子をON/OFFする仕組みなので安全性が非常に高いです。

物理ボタンをパネルに両面テープでくっつけるスマートスイッチ、スイッチボットタイプをよく見ますが、出っ張ってしまってスマートさが多少欠けるのでパネル内部のみで完結を狙います。
スイッチボット、出っ張る

まずXIAO ESP32は給湯リモコン裏の壁の中に入れてしまっていいとして電源の確保を悩みました、候補としてはコントロールパネルの信号の2線からとるか、18650など3.7vリチウムイオン電池を使うかしかない雰囲気だったのですが、コンパネのコードからとるのはコンパネの信号の邪魔してエラーを出してしまいそう、電池は2000mAhで3日くらいしかもたない上に配置の問題があるのとリチウムイオンは安全性に欠ける。

少し離れた隣に床暖のコンパネがあって直接100vか200v来てるのが分かったのでこれを使うことにしました。当然こういうのは電気工事士の資格が必要です。
ふろ自動パネル横から電線延長1

床暖パネル裏
電源が確保できることが分かりました。

風呂自動スマート化スタートです

狙いとしては以下のとおり。
・スマートフォンで外出先から「ふろ自動」の命令を出したい。
・家の中では「アレクサ、ふろ自動on」での命令を出したい。
・ふろ自動を押したときのLEDランプ表示をスマホ上の表示と同期させたい。
・LEDランプを同期させることでoff命令も受け付けるようにしたい。
・交流をDC5vへの変換するので熱の監視をしたい
・安全対策を徹底したい
・取り外してメンテナンスするときの利便性も考える

必要なものは以下のとおり。
XIAO ESP32C3
フォトレジスタ(LEDの点灯を受けるセンサー)
光ファイバー(LEDの光を運ぶ)
温度センサー(安全対策)
フォトリレー(スイッチ)
ユニバーサル基盤
以下は電源回り、近くから5V取れる人は必要ないかもしれない物。
AC-DCコンバータ(AC200v/100v→DC5V)
ショットキーバリアダイオード(逆流防止)
ヒューズボックス(安全対策)
遅延ヒューズ1A
PCBネジ止め端子台 2ピン 5.08ピッチ(AC100v/200vをうけるコネクタ)
トグルスイッチ(XIAOの再起動用)
端子台(100v/200vをヒューズに繋ぐ為、2極あればいい)

安全対策は電源のコンバータ自体がすでに過電圧保護(OVP)、短絡保護(SCP)、過電流保護(OCP)を内蔵しています。短絡や過電流時は自動的に停止し、異常がなくなると再起動する仕様です。一次側には内部ヒューズも入っています。
さらに外部に1A遅延型ヒューズと温度管理で安全性を高めます。

配線はこんな感じ
ふろ自動スマートホーム化配線

これはXIAO裏面
XIAO ESP32C3裏面
D1:フォトリレー
D2:明るさセンサー
D4:温度センサー(SDA)
D5:温度センサー(SCL)
VUSB:5vをもらう
GND:5vのマイナスもらう
3v3:3.3vで温度センサーとフォトレジスタ
※USBタイプCをどこかから持ってこれる人はVUSBは使わない

フォトリレーの配線

フォトリレー
本体の〇印を1番と見ます。
1→330Ω→XIAOのD1
2→GND
4→給湯リモコンの風呂自動ボタンへ
6→給湯リモコンの風呂自動ボタンへ

フォトレジスタの配線

3.3v→フォトレジスタ→XIAOのD2
フォトレジスタのXIAO側→10kΩ→GND
下のようにフォトレジスタの1本●の部分は分岐します
3.3V

GL5528フォトレジスタ

●──── D2 / GPIO4

10kΩ

GND

温度センサーの配線

3.3v→VIN
GND→GND
XIAOのD4→SDA
XIAOのD5→SCL

コード

ライブラリはAdafruit SHT31とSinricProが必要です。
コードはこんな感じ

#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_SHT31.h>

#include <SinricPro.h>
#include <SinricProSwitch.h>
#include <SinricProTemperaturesensor.h>


// =====================================================
// Wi-Fi / SinricPro 設定
// =====================================================

const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";

const char* APP_KEY = "YOUR_APP_KEY";
const char* APP_SECRET = "YOUR_APP_SECRET";


// 風呂自動 Switch の Device ID
const char* SWITCH_ID =
"YOUR_SWITCH_DEVICE_ID";


// SHT31 温度センサーの Device ID
const char* TEMP_SENSOR_ID =
"SENSOR_DEVICE_ID";
// =====================================================
// XIAO ESP32-C3 ピン設定
// =====================================================

// TLP592A
const int TLP_PIN = 3; // D1 = GPIO3

// GL5528 LED3検出
const int LED3_SENSOR_PIN = 4; // D2 = GPIO4

// SHT31
const int SDA_PIN = 6; // D4 = GPIO6
const int SCL_PIN = 7; // D5 = GPIO7


// =====================================================
// TLP592A 設定
// =====================================================

// ボタンを押している時間
const unsigned long PRESS_TIME = 400;

// 連打防止
const unsigned long LOCK_TIME = 3000;

unsigned long lastPressTime = 0;


// =====================================================
// LED3 / GL5528 設定
// =====================================================

// 実機取り付け後に最終調整
const int LED3_THRESHOLD = 100;


// LED3を200msごとに確認
const unsigned long LED3_READ_INTERVAL = 200;
unsigned long lastLed3Read = 0;


// シリアル表示は10秒ごと
const unsigned long LED3_PRINT_INTERVAL = 10000;
unsigned long lastLed3Print = 0;


// 誤判定防止
const int LED3_STABLE_COUNT = 4;

int led3SameCount = 0;

bool led3CandidateState = false;


// 実際の風呂自動状態
bool bathState = false;

// LED状態が一度でも確認できたか
bool bathStateKnown = false;


// 現在のADC値
int led3RawValue = 0;


// =====================================================
// SHT31
// =====================================================

Adafruit_SHT31 sht31 = Adafruit_SHT31();

bool sht31OK = false;
bool sensorDataValid = false;

float temperature = 0.0;
float humidity = 0.0;


// SHT31読み取り:10秒
const unsigned long SENSOR_INTERVAL = 10000;
unsigned long lastSensorRead = 0;


// SinricPro送信:60秒
const unsigned long TEMP_SEND_INTERVAL = 60000;
unsigned long lastTempSend = 0;


// =====================================================
// LED3 ADC読み取り
// =====================================================

int readLed3ADC() {

const int SAMPLE_COUNT = 8;

long total = 0;

for (int i = 0; i < SAMPLE_COUNT; i++) {

total += analogRead(LED3_SENSOR_PIN);

delay(2);
}

return total / SAMPLE_COUNT;
}


// =====================================================
// LED3 ON/OFF判定
// =====================================================

bool getLed3State(int adcValue) {

// 配線:
//
// 3.3V
// |
// GL5528
// |
// +---- D2 / GPIO4
// |
// 10kΩ
// |
// GND
//
// 明るいほどADC値が高い

return adcValue >= LED3_THRESHOLD;
}


// =====================================================
// SinricProへ実際の風呂自動状態を送る
// =====================================================

void sendBathStateToSinric(bool state) {

if (!SinricPro.isConnected()) {
return;
}

SinricProSwitch &bathSwitch =
SinricPro[SWITCH_ID];

bool success =
bathSwitch.sendPowerStateEvent(state);

if (success) {

Serial.print("SinricPro 風呂自動状態 → ");
Serial.println(state ? "ON" : "OFF");

} else {

Serial.println("SinricPro 状態送信失敗");
}
}


// =====================================================
// LED3状態更新
// =====================================================

void updateLed3State() {

int adcValue = readLed3ADC();

led3RawValue = adcValue;

bool detectedState =
getLed3State(adcValue);


// ---------------------------------------------------
// 初回判定
// ---------------------------------------------------

if (!bathStateKnown) {

bathState = detectedState;
bathStateKnown = true;

led3CandidateState = detectedState;
led3SameCount = 0;

Serial.print("LED3 初期状態: ");
Serial.print(bathState ? "ON" : "OFF");

Serial.print(" ADC=");
Serial.println(led3RawValue);

sendBathStateToSinric(bathState);

return;
}


// ---------------------------------------------------
// 現在状態と同じなら何もしない
// ---------------------------------------------------

if (detectedState == bathState) {

led3SameCount = 0;
led3CandidateState = detectedState;

return;
}


// ---------------------------------------------------
// 状態変化候補
// ---------------------------------------------------

if (detectedState != led3CandidateState) {

led3CandidateState = detectedState;
led3SameCount = 1;

} else {

led3SameCount++;
}


// ---------------------------------------------------
// 4回連続したら状態変化を確定
// ---------------------------------------------------

if (led3SameCount >= LED3_STABLE_COUNT) {

bathState = led3CandidateState;

led3SameCount = 0;

Serial.println();

Serial.print("===== 風呂自動状態変化 ===== ");
Serial.println(bathState ? "ON" : "OFF");

Serial.print("LED3 ADC = ");
Serial.println(led3RawValue);


// 実際の状態をスマホへ反映
sendBathStateToSinric(bathState);
}
}


// =====================================================
// 風呂自動ボタンを1回押す
// =====================================================

void pressBathButton() {

unsigned long now = millis();


// ---------------------------------------------------
// 連打防止
// ---------------------------------------------------

if (
lastPressTime != 0 &&
now - lastPressTime < LOCK_TIME
) {

Serial.println("連打防止中");

return;
}


Serial.println();

Serial.println("風呂自動ボタンを押します");


// ---------------------------------------------------
// TLP592A ON
// D1 HIGH
// ---------------------------------------------------

digitalWrite(TLP_PIN, HIGH);


delay(PRESS_TIME);


// ---------------------------------------------------
// TLP592A OFF
// ---------------------------------------------------

digitalWrite(TLP_PIN, LOW);


Serial.println("風呂自動ボタンを離しました");


lastPressTime = millis();
}


// =====================================================
// スマホ / AlexaからのON/OFF要求
// =====================================================

bool onPowerState(
const String &deviceId,
bool &state
) {

(void)deviceId;


Serial.println();

Serial.print("スマホ要求 = ");
Serial.println(state ? "ON" : "OFF");


// ---------------------------------------------------
// LED3状態がまだ判定できていない
// ---------------------------------------------------

if (!bathStateKnown) {

Serial.println("LED3状態がまだ確定していません");

return true;
}


Serial.print("現在の実機状態 = ");
Serial.println(bathState ? "ON" : "OFF");


// ---------------------------------------------------
// 要求状態と実機状態が同じ
// ---------------------------------------------------

if (state == bathState) {

Serial.println(
"すでに要求された状態なので操作しません"
);

return true;
}


// ---------------------------------------------------
// 要求状態と実機状態が違う
//
// ON要求 + 実機OFF → 1回押す
// OFF要求 + 実機ON → 1回押す
// ---------------------------------------------------

Serial.println(
"状態が違うので風呂自動ボタンを1回押します"
);


pressBathButton();


// bathStateはここでは変更しない
//
// 実際にLED3が変化したことを確認してから
// updateLed3State() が状態を変更する


return true;
}


// =====================================================
// SHT31読み取り
// =====================================================

void readSHT31() {

float t = sht31.readTemperature();
float h = sht31.readHumidity();


if (isnan(t) || isnan(h)) {

Serial.println("SHT31 読み取りエラー");

sensorDataValid = false;

return;
}


temperature = t;
humidity = h;

sensorDataValid = true;


Serial.print("温度: ");
Serial.print(temperature, 1);
Serial.print(" ℃");

Serial.print(" 湿度: ");
Serial.print(humidity, 1);
Serial.println(" %");
}


// =====================================================
// SinricProへ温湿度送信
// =====================================================

void sendTemperatureToSinric() {

if (!sensorDataValid) {

Serial.println(
"SinricPro送信:温湿度データなし"
);

return;
}


if (!SinricPro.isConnected()) {

Serial.println("SinricPro未接続");

return;
}


SinricProTemperaturesensor &tempSensor =
SinricPro[TEMP_SENSOR_ID];


bool success =
tempSensor.sendTemperatureEvent(
temperature,
humidity
);


if (success) {

Serial.print("SinricProへ送信 OK ");

Serial.print(temperature, 1);

Serial.print(" ℃ / ");

Serial.print(humidity, 1);

Serial.println(" %");

} else {

Serial.println(
"SinricProへ温湿度送信 失敗"
);
}
}


// =====================================================
// Wi-Fi
// =====================================================

void setupWiFi() {

Serial.print("Wi-Fi接続中");


WiFi.mode(WIFI_STA);

WiFi.setSleep(false);

WiFi.setAutoReconnect(true);


WiFi.begin(
WIFI_SSID,
WIFI_PASS
);


while (
WiFi.status() != WL_CONNECTED
) {

delay(500);

Serial.print(".");
}


Serial.println();

Serial.println("Wi-Fi 接続OK");

Serial.print("IPアドレス: ");

Serial.println(WiFi.localIP());
}


// =====================================================
// SinricPro
// =====================================================

void setupSinricPro() {

// ---------------------------------------------------
// 風呂自動
// ---------------------------------------------------

SinricProSwitch &bathSwitch =
SinricPro[SWITCH_ID];


bathSwitch.onPowerState(
onPowerState
);


// ---------------------------------------------------
// 温度センサー
// ---------------------------------------------------

SinricProTemperaturesensor &tempSensor =
SinricPro[TEMP_SENSOR_ID];

(void)tempSensor;


// ---------------------------------------------------
// SinricPro接続時
// ---------------------------------------------------

SinricPro.onConnected([]() {

Serial.println("SinricPro 接続OK");


// 接続したら現在の実機状態をスマホへ送る
if (bathStateKnown) {

sendBathStateToSinric(
bathState
);
}
});


SinricPro.onDisconnected([]() {

Serial.println("SinricPro 切断");

});


SinricPro.begin(
APP_KEY,
APP_SECRET
);
}


// =====================================================
// setup
// =====================================================

void setup() {

// ===================================================
// 最優先:
// TLP592Aを確実にOFF
// ===================================================

pinMode(
TLP_PIN,
OUTPUT
);

digitalWrite(
TLP_PIN,
LOW
);


// ===================================================
// Serial
// ===================================================

Serial.begin(115200);

delay(1000);


Serial.println();

Serial.println(
"=========================="
);

Serial.println(
" 風呂自動 XIAO ESP32-C3"
);

Serial.println(
" LED3同期制御版"
);

Serial.println(
"=========================="
);


// ===================================================
// GL5528
// ===================================================

pinMode(
LED3_SENSOR_PIN,
INPUT
);


delay(100);


// 起動時のLED3状態を確認
updateLed3State();


// ===================================================
// SHT31
// ===================================================

Wire.begin(
SDA_PIN,
SCL_PIN
);


sht31OK =
sht31.begin(0x44);


if (sht31OK) {

Serial.println("SHT31 接続OK");

readSHT31();

} else {

Serial.println(
"SHT31が見つかりません"
);
}


// ===================================================
// Wi-Fi
// ===================================================

setupWiFi();


// ===================================================
// SinricPro
// ===================================================

setupSinricPro();


Serial.println();

Serial.println("準備完了");

Serial.println(
"b = 風呂自動ボタン手動試験"
);

Serial.println(
"s = LED3センサー値表示"
);
}
// =====================================================
// loop
// =====================================================
void loop() {
// ===================================================
// SinricPro
// ===================================================
SinricPro.handle();
unsigned long now = millis();
// ===================================================
// LED3
// 200msごとにチェック
// ===================================================
if (
now - lastLed3Read >=
LED3_READ_INTERVAL
) {

lastLed3Read = now;

updateLed3State();
}


// ===================================================
// LED3 ADC
// シリアルには10秒ごとに表示
// ===================================================

if (
now - lastLed3Print >=
LED3_PRINT_INTERVAL
) {

lastLed3Print = now;


Serial.print("LED3 ADC: ");

Serial.print(led3RawValue);


Serial.print(" 判定: ");

Serial.println(
bathState ? "ON" : "OFF"
);
}


// ===================================================
// SHT31
// 10秒ごと
// ===================================================

if (
sht31OK &&
now - lastSensorRead >=
SENSOR_INTERVAL
) {

lastSensorRead = now;

readSHT31();
}


// ===================================================
// 温湿度をSinricProへ60秒ごと
// ===================================================

if (
sht31OK &&
(
lastTempSend == 0 ||
now - lastTempSend >=
TEMP_SEND_INTERVAL
)
) {

lastTempSend = now;


readSHT31();


sendTemperatureToSinric();
}


// ===================================================
// シリアル手動試験
// ===================================================

if (Serial.available()) {

char command =
Serial.read();


// -----------------------------------------------
// b:TLP592Aを1回作動
// -----------------------------------------------

if (
command == 'b' ||
command == 'B'
) {

pressBathButton();
}


// -----------------------------------------------
// s:LED3のADC確認
// -----------------------------------------------

if (
command == 's' ||
command == 'S'
) {

int value =
readLed3ADC();


Serial.println();

Serial.print("LED3 ADC = ");

Serial.println(value);


Serial.print("LED3 判定 = ");

Serial.println(
getLed3State(value)
? "ON"
: "OFF"
);
}
}
}

上記に Wi-Fi / SinricPro 設定という6項目の情報を入力必要があります。
またconst int LED3_THRESHOLD = 100;のしきい値はフォトレジスタが光ファイバーを通ってきて受けた数値を見ながら決めるといいです。シリアルモニタに数値が出てくるのでoffの時とonの時を比べて中間くらい50~2000くらいの値になるかと思います。

動作確認したらユニバーサル基盤に半田付け

半田付けは3年に1度やるかどうかというレベルなのでうまくはないです。
基盤は片側がスズメッキになっているから、反対側から差し込んで裏で半田付けする感じになる。
間違い半田付け
左上の白いのは5v受けるためのコネクタです。直接ラインを半田づけでもいいと思いますが、使わない物があったのでつけてみました。
まずUSBタイプC繋いで動作確認をしてみる。
XIAOにUSB差し込んだとたんにふろ自動オンになってしまった。
調べたらフォトリレーの配線間違ってフォトリレーの1番が3.3v、2番が330Ω挟んでXIAOのD1に行っていた。

正しく半田付けしなおしして動作確認。
半田付け正しい配線
各パーツも300Ωが効いてて壊れていないようで、うまく動作確認完了。

給湯パネルのスイッチ部分と光ファイバーの設置

ふろ自動のリモコン側です。
狭くてやりにくそうだけどやるしかない。
壊したら2万~3万円・・・
ふろ自動基盤半田
このSW4のところが「ふろ自動」スイッチでLED3がふろ自動が動作中に点灯するLEDライト。
スイッチ右側だと基盤の導通用の小さい穴のビアが3個ほど邪魔な位置にあるので、穴が少ないスイッチ左側を狙う。それでも下にビアがあるので事前にレジンで穴埋めした。しかし高温に対応していないレジンぽいから気休め。
スイッチ割り込み半田付け
これはイケたか?

2つの線の色はどちらにつけても大丈夫です。
外れないようにコードをUVレジンで固定する。
ついでに光ファイバーもこんな感じに横で光をもらう感じにレジンで固定する。
ラインと光ファイバーレジンで固定
改めて今アップで見るとLEDから少しずれている。だから受ける光量が少なかったのかと今気づいた。
ちなみにこのスイッチ部分の半田付けは4本足の上2本と下2本がそれぞれでグループだったから上下に半田付けしています。もしかして左右かもしれないしテスターで導通テストをしてからにしましょう。

光ファイバーでリモコンのLED3の光をもってきてXIAO側フォトレジスタでの受け方は、熱圧縮チューブのサイズ違いを重ねて周りの光を受けないようにしています。
光ファイバー熱圧縮チューブ

光ファイバーを熱圧縮チューブで
これを光ファイバー抜いた状態でライターとかで熱して、少し縮めて細い状態にしてから光ファイバーを差し込んだだけの状態です。
光ファイバー差し込んだまま炙ったら光ファイバーは当たり前にふにゃってなったので注意。

とりあえずリモコン本体。裏をまわってこんな感じにしました。
この配線と光ファイバーが通る順路で、プラスチック部分の数か所を少しルーターで削って通りやすくして線にかかる負担を減らしたりしました。
リモコン裏面

作業を進めている最中に気付いてくることが出てきて、当初の計画としては壁内にXIAO本体と5v変換のコンバータ両方を収納すれば最高にスマートな仕上がりと考えていたが、スペースがかなり狭いということと同時に、電気の流れ上のロスで発生する熱の逃げ場がない問題があった。

サイズ感はこんな感じ
スイッチボックスとの比較
穴を削って中に入れてみた感じ
スイッチボックスへXIAO
これでは狭い。XIAOは入るけど電源関係が無理。2芯一本で5V持ってこれれば大丈夫な可能性はある感じか。

以上の事から安全性を考え、監視とメンテナンスしやすいようにボックスを使うことにしました。
ボックスは壁の向こうの部屋へ設置かな。

床暖からVVFケーブルで横延長出来て喜んだ瞬間はあったものの、違う違う違うそうじゃない、そうじゃなくなった。
VVFケーブル分岐
VVFケーブルは給湯リモコン側には持ってこないで、壁の向こうの部屋で棚があるほうに持っていくことにしたのです。

これが裏面で、壁に穴開けてボックスに穴開けてVVFケーブル引っ張ってきたところ。
真裏は階段だったので50cmほどずれた場所。少し手こずりました。
壁穴あけ

そしてテスターで調べると床暖から持ってくるVVFケーブルは結局200vだったので端子台を使って両方にヒューズをつなぐ。XIAO再起動用のトグルスイッチもヒューズボックスもボックスに固定。
配線ボックス内

このボックスにいろいろ収納していくところを見ると、やはり給湯リモコンの裏の狭いスイッチボックスだけで収めるのは無理でしたね。

ちなみに配線はこれが正解です。
途中間違った時の配線の画像が入っているかもしれませんが、フォトリレーの1番は330Ω抵抗を挟んでD1に行きます。
半田付け正しい配線

最後は電源

ATS005A2-F050Pというコンバータを使います。入電はAC100vでもAC200vでもDC5vで出力してくれます。安全性高い設計で結構いい商品です。短絡・過電流時は停止して異常除去後に自動復帰してくれる優れもの。
コンバーターACの2つにヒューズを通ってきた線を300v対応コネクタで受けて、5vの+側はスイッチを経由してXIAOへ送ります。XIAO側はダイオードを逆流防止で挟んでVUSB(5v)へ接続、
コンバータ5vマイナスはXIAOのGNDへ接続で完了です。
※ダイオードは方向があるので注意が必要です。灰色のラインがXIAO側です。
※ATS005A2-F050Pと受けるためのコネクタは基盤5.08ピッチなので、ユニバーサル2.54ピッチ基盤の穴を細いドリルで広げたりする必要があります。

コンバーター

作業としての残りは基盤をボックス内に固定ですが、基盤の裏面がべたっとついてはいけないのでスペーサーを準備して固定する予定です。とりあえず裏面は絶縁の液体ゴムを塗っています。周りと接触しないよう注意してボックスに入れて完成となります。

基板裏絶縁ゴム

ボックスに収納

収納完成

メンテナンスするときはヒューズを両方外すか端子台からACを外せばOK。

ボックス内の理想の温度は40℃以下を保てればいいです。部屋の位置は北側1階に位置しているので夏場でも条件的には悪くないはず。

熱源の1番は電源のACーDCコンバータで、なおかつコンバータはメーカーHPを見ると周囲温度上限が50℃となっています。
熱源の2番目はXIAOがWi-Fi機能を使っている場合に熱を持ちます。
これら以外は熱を発しても瞬間的なものなのて無視できるレベル。

室温25度で1時間経過で30℃以下。単純に考えて室温より5℃アップくらいだと、このままで全く問題ないかもしれない。
風呂自動ボックス内温度

蓋のねじを緩めて隙間を開けた状態
風呂自動ボックス内温度、通気

消費電力は以下のとおりでマックス120mA程度です。
発熱もコンバータはほんのり暖かい程度で熱は持たなかった。XIAOのほうが温かい。
●XIAO ESP32-C3(Wi-Fi接続中) 約50~120mA平均
●Wi-Fi送信時の瞬間ピーク 200~350mA程度
●SHT31 ほぼ1mA未満
●GL5528+抵抗 1mA未満
●TLP592A ボタンを押す400msだけ約5~7mA

もうすこし様子見て、ボックスに熱排気用のスリットをいれるとか、5vの小型排気ファンつけることになるかもしれない。

まずはこれで当初の希望通りのことが出来るようになりました。
スマホで外から「ふろ自動」をONにし、LEDの状態が変わったらスマホの画面上でも同じ状態になりOFFの命令も出せる。
室内ではSinricPROとアレクサとの連動で「アレクサふろ自動オン」の音声操作が使えるようになる。

完成スマホで風呂自動

見た目もスッキリ元通り

新築や風呂リフォームの時に選択肢があるのであれば、多少金額が上がっても最初からスマート機能つけたほうが無難ではあると思います。
今回の部品代はXIAOまわりで2,200円くらいと電源回りで2,140円、ボックスが1000円くらい半田とかジャンパーピンや、もともとあったコネクタ等を含めて全部で5,500円くらいです。

電源さえ近くにあって、そのコードをリモコン側まで伸ばすのが見えていいというところを妥協できれば壁内に収納で簡単ですね。
状況的に近くに電源がない場合は、厚みのないボックスをふろリモコンの隣に設置して、18650などのリチウムイオン電池4本くらいを収納する感じになるかと思うけれど、それなら出っ張るけどスイッチボットを両面テープでくっつける方法がいいのか微妙なところです。

「ふろ自動をスマホで」が欲しいためだけとして随分大変な作業だったような気がする・・・
ただ電気工事士は取得しておいてホントよかった\(^o^)/

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