找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 3|回覆: 0

    完整專案:浴室的智慧通風,從硬體到程式碼全給你

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005764
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    這篇是一個完整的專案,照著做就能用。

    解決的問題:浴室潮濕、排風扇忘記開或忘記關、久了長霉。



    先定義「做好是什麼樣子」


    • 洗完澡濕度上升 → 自動開排風扇
    • 濕度降回來 → 自動關掉
    • 不是每次開燈就轉(上廁所不需要)
    • 半夜不要太吵
    • 手動也能控制,而且手動優先
    • 排風扇壞了要知道


    最後兩項是新手最容易漏掉的 ——
    自動化最惱人的就是「我明明關掉它又自己開」。

    硬體清單
    1. 溫濕度感測器  ×1    浴室裡(Zigbee,約 300-500 元)
    2. 溫濕度感測器  ×1    浴室外(做基準比較用,同上)
    3. 智能開關      ×1    控制排風扇(要看你家線路)
    4. 功率監測插座  ×1    選配,用來偵測風扇故障
    複製代碼

    感測器的擺位(很重要)


    • 不要放在蓮蓬頭正對面 —— 會直接被水噴到
    • 不要放在門口 —— 開門的瞬間讀值會亂跳
    • 建議放在牆上,離地 1.5 公尺左右
    • 遠離排風扇 —— 不然它一轉讀值就掉,會太早關掉


    為什麼要兩個感測器

    因為「濕度 70%」不代表潮濕。


    • 梅雨季外面 85%,浴室 75% 是正常的
    • 冬天外面 50%,浴室 75% 就是剛洗完澡


    用「浴室比外面高多少」判斷,比看絕對值準很多。



    第一步:建立判斷用的感測器
    1. template:
    2.   - sensor:
    3.       - name: 浴室濕度差
    4.         unique_id: bath_humidity_delta
    5.         unit_of_measurement: "%"
    6.         state_class: measurement
    7.         state: >
    8.           {% set 內 = states('sensor.浴室濕度') | float(-1) %}
    9.           {% set 外 = states('sensor.走道濕度') | float(-1) %}
    10.           {% if 內 < 0 or 外 < 0 %}
    11.             unknown
    12.           {% else %}
    13.             {{ (內 - 外) | round(1) }}
    14.           {% endif %}
    15.         availability: >
    16.           {{ has_value('sensor.浴室濕度') and has_value('sensor.走道濕度') }}
    複製代碼

    三個細節


    • float(-1) 加上判斷 —— 感測器離線時不要算出錯的值
    • availability —— 資料不完整時整個感測器變 unavailable,
        自動化就不會誤判
    • state_class: measurement —— 才能畫歷史圖表


    第二步:建立一個「洗澡中」的狀態

    這是整個設計的核心 ——
    用一個 input_boolean 記住「現在是洗澡後的除濕階段」。
    1. input_boolean:
    2.   浴室除濕中:
    3.     name: 浴室除濕中
    4.     icon: mdi:water-percent
    複製代碼

    為什麼要這個


    • 自動化可以分成「開始」和「結束」兩段,各自獨立
    • 你可以在儀表板上看到現在是什麼狀態
    • 可以手動取消
    • 比用一個超長的自動化好維護太多




    第三步:開始除濕的自動化
    1. automation:
    2.   - alias: 浴室 - 開始除濕
    3.     id: bath_vent_start
    4.     mode: single
    5.     triggers:
    6.       - trigger: numeric_state
    7.         entity_id: sensor.浴室濕度差
    8.         above: 12
    9.         for: "00:02:00"
    10.     conditions:
    11.       - condition: state
    12.         entity_id: input_boolean.浴室手動模式
    13.         state: "off"
    14.     actions:
    15.       - action: input_boolean.turn_on
    16.         target:
    17.           entity_id: input_boolean.浴室除濕中
    18.       - action: switch.turn_on
    19.         target:
    20.           entity_id: switch.浴室排風扇
    複製代碼

    為什麼是「高 12% 而且持續兩分鐘」


    • 12% 這個數字要自己調 —— 先觀察一週你家洗澡後的實際數字
    • 持續兩分鐘 —— 避免開門的瞬間、或者洗手時的短暫波動


    第四步:結束除濕的自動化
    1.   - alias: 浴室 - 結束除濕
    2.     id: bath_vent_stop
    3.     mode: single
    4.     triggers:
    5.       # 條件一:濕度降回來了
    6.       - trigger: numeric_state
    7.         entity_id: sensor.浴室濕度差
    8.         below: 5
    9.         for: "00:05:00"
    10.         id: 濕度正常
    11.       # 條件二:安全上限,避免一直轉
    12.       - trigger: state
    13.         entity_id: input_boolean.浴室除濕中
    14.         to: "on"
    15.         for: "01:00:00"
    16.         id: 超時
    17.     conditions:
    18.       - condition: state
    19.         entity_id: input_boolean.浴室除濕中
    20.         state: "on"
    21.     actions:
    22.       - action: switch.turn_off
    23.         target:
    24.           entity_id: switch.浴室排風扇
    25.       - action: input_boolean.turn_off
    26.         target:
    27.           entity_id: input_boolean.浴室除濕中
    28.       - if:
    29.           - condition: trigger
    30.             id: 超時
    31.         then:
    32.           - action: persistent_notification.create
    33.             data:
    34.               title: 浴室除濕超時
    35.               message: 轉了一小時濕度還沒降,檢查一下排風扇
    複製代碼

    「超時」那個觸發器非常重要


    • 排風扇壞了 → 濕度永遠降不下來 → 會一直轉
    • 感測器壞了 → 同上
    • 門窗全關 → 除濕效率很差


    任何「等待某個條件」的自動化都應該有一個安全上限。



    第五步:手動優先(最重要的一段)

    問題:你手動關掉排風扇,
    但濕度還是高,自動化又把它打開了。

    這是所有自動化最惹人厭的行為。

    解法:偵測手動操作,暫停自動化
    1. input_boolean:
    2.   浴室手動模式:
    3.     name: 浴室手動模式
    4.     icon: mdi:hand-back-right
    5. automation:
    6.   - alias: 浴室 - 偵測手動操作
    7.     id: bath_manual_detect
    8.     mode: restart
    9.     triggers:
    10.       - trigger: state
    11.         entity_id: switch.浴室排風扇
    12.     conditions:
    13.       # 只有「不是自動化做的」才算手動
    14.       - condition: template
    15.         value_template: "{{ trigger.to_state.context.parent_id == none }}"
    16.       - condition: template
    17.         value_template: "{{ trigger.to_state.context.user_id != none }}"
    18.     actions:
    19.       - action: input_boolean.turn_on
    20.         target:
    21.           entity_id: input_boolean.浴室手動模式
    22.       # 30 分鐘後自動解除
    23.       - delay: "00:30:00"
    24.       - action: input_boolean.turn_off
    25.         target:
    26.           entity_id: input_boolean.浴室手動模式
    複製代碼

    這段的關鍵是 context

    HA 的每一個狀態變化都帶一個 context,記錄「是誰造成的」


    • context.user_id —— 有值 = 是人做的
    • context.parent_id —— 有值 = 是別的自動化觸發的
    • 兩個都是 none —— 裝置自己變的(例如實體開關被按)


    用這個就能分辨「人動的」和「自動化動的」。

    注意實體牆壁開關被按的話 user_id 是 none ——
    如果你想把它也算手動,把第二個條件拿掉。

    mode: restart 也很重要

    你在 30 分鐘內又動了一次,計時會重新開始。

    用 single 的話第二次操作會被忽略,手動模式就會提早結束。

    第六步:夜間降噪
    1.   - alias: 浴室 - 夜間限制
    2.     triggers:
    3.       - trigger: state
    4.         entity_id: input_boolean.浴室除濕中
    5.         to: "on"
    6.     conditions:
    7.       - condition: time
    8.         after: "23:00:00"
    9.         before: "07:00:00"
    10.     actions:
    11.       # 如果風扇支援調速
    12.       - action: fan.set_percentage
    13.         target:
    14.           entity_id: fan.浴室排風扇
    15.         data:
    16.           percentage: 40
    複製代碼

    風扇不支援調速的話,可以改成「夜間只轉 20 分鐘就停」。



    第七步:故障偵測(選配但推薦)

    用功率監測插座
    1.   - alias: 浴室 - 排風扇故障
    2.     triggers:
    3.       - trigger: state
    4.         entity_id: switch.浴室排風扇
    5.         to: "on"
    6.         for: "00:01:00"
    7.     conditions:
    8.       - condition: numeric_state
    9.         entity_id: sensor.浴室排風扇功率
    10.         below: 5
    11.     actions:
    12.       - action: notify.mobile_app_phone
    13.         data:
    14.           title: 排風扇可能壞了
    15.           message: 開關是開的,但功率只有 {{ states('sensor.浴室排風扇功率') }}W
    複製代碼

    這招可以套用到任何「有開關但不知道有沒有真的在動」的裝置


    • 除濕機
    • 電熱水器
    • 洗衣機


    儀表板卡片
    1. type: entities
    2. title: 浴室
    3. entities:
    4.   - entity: sensor.浴室濕度
    5.     name: 浴室濕度
    6.   - entity: sensor.浴室濕度差
    7.     name: 比外面高
    8.   - entity: input_boolean.浴室除濕中
    9.     name: 除濕中
    10.   - entity: input_boolean.浴室手動模式
    11.     name: 手動模式(暫停自動)
    12.   - entity: switch.浴室排風扇
    13.     name: 排風扇
    14.   - type: attribute
    15.     entity: input_boolean.浴室除濕中
    16.     attribute: last_changed
    17.     name: 狀態變更時間
    複製代碼

    調校:先觀察一週再調數字

    不要一開始就設定門檻,先收集資料


    • 裝好感測器,先不要接自動化
    • 觀察一週
    • 看歷史圖表:洗澡後濕度差峰值多少?多久降回來?
    • 用實際數字設定門檻


    常見的調整


    • 老是不觸發 → 門檻(12)調低
    • 洗手也觸發 → 門檻調高,或者 for 時間拉長
    • 太早關掉 → below 的數字調低(例如 5 改成 3)
    • 轉太久 → below 調高,或者加短一點的超時


    這個架構可以套用到很多地方

    「感測 → 條件成立就做 → 條件解除就停 → 手動優先 → 有超時保護」

    同樣的骨架可以做


    • 廚房油煙排風(用 PM2.5 或瓦斯感測)
    • 地下室除濕
    • 衣櫃除濕
    • 機房散熱風扇(用溫度)


    ---

    下一篇:完整專案之二 ——
    做一套會「判斷有沒有人真的在家」的偵測系統。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 13:20 , Processed in 0.081927 second(s), 24 queries .

    快速回覆 返回頂部 返回列表