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

    scene 和 snapshot:先把現在的狀態存起來,等一下還原回去

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    有一個需求很常見,但做法不直覺:

    「看電影的時候把燈調暗,電影結束後恢復成原本的樣子。」

    難的是「原本的樣子」——你不知道使用者剛剛把燈調成什麼。



    錯誤做法:寫死一個「恢復場景」

    很多人的做法是建兩個場景:看電影、正常。
    問題是「正常」是寫死的 —— 如果你原本是 30% 暖光,
    電影結束後會被強制變成 80% 白光。使用者會覺得「怎麼自己變了」。

    正確做法:scene.create

    HA 有一個動作叫 scene.create,可以在執行當下
    把某些實體的現況拍成一個臨時場景。
    1. alias: 看電影模式
    2. triggers:
    3.   - trigger: state
    4.     entity_id: media_player.投影機
    5.     to: "playing"
    6. actions:
    7.   # 1. 先把現況存起來
    8.   - action: scene.create
    9.     data:
    10.       scene_id: before_movie
    11.       snapshot_entities:
    12.         - light.客廳
    13.         - light.氛圍燈
    14.         - light.餐廳
    15.         - cover.客廳窗簾
    16.   # 2. 切成看電影的設定
    17.   - action: light.turn_off
    18.     target: {entity_id: light.客廳}
    19.   - action: light.turn_on
    20.     target: {entity_id: light.氛圍燈}
    21.     data:
    22.       brightness_pct: 12
    23.       color_temp_kelvin: 2200
    24.   - action: cover.close_cover
    25.     target: {entity_id: cover.客廳窗簾}
    26. mode: single
    複製代碼

    還原:
    1. alias: 電影結束還原
    2. triggers:
    3.   - trigger: state
    4.     entity_id: media_player.投影機
    5.     from: "playing"
    6.     to: "idle"
    7.     for: "00:00:30"
    8. actions:
    9.   - action: scene.turn_on
    10.     target:
    11.       entity_id: scene.before_movie
    12. mode: single
    複製代碼

    使用者原本是什麼樣,就還原成什麼樣。



    幾個重點

    1. scene_id 不要加 scene. 前綴
    1. # 建立時:不加前綴
    2.       scene_id: before_movie
    3. # 使用時:要加
    4.       entity_id: scene.before_movie
    複製代碼

    這個不一致很容易寫錯。

    2. 臨時場景重啟後會消失

    scene.create 建的場景只存在記憶體裡。
    HA 重啟的話它就沒了,這時候 scene.turn_on 會失敗
    (日誌會有錯誤,但自動化不會停)。

    要保險的話加個判斷:
    1.   - if:
    2.       - condition: template
    3.         value_template: "{{ states('scene.before_movie') not in ['unknown','unavailable'] }}"
    4.     then:
    5.       - action: scene.turn_on
    6.         target: {entity_id: scene.before_movie}
    7.     else:
    8.       - action: scene.turn_on
    9.         target: {entity_id: scene.預設客廳}     # 退而求其次
    複製代碼

    3. snapshot_entities 要列完整

    只存了 light.客廳,那窗簾就不會被還原。
    你改了什麼,就要存什麼。

    我的習慣是把「要改的清單」和「要存的清單」寫成同一份,
    用 variables 定義一次:
    1. actions:
    2.   - variables:
    3.       受影響的實體:
    4.         - light.客廳
    5.         - light.氛圍燈
    6.         - cover.客廳窗簾
    7.   - action: scene.create
    8.     data:
    9.       scene_id: before_movie
    10.       snapshot_entities: "{{ 受影響的實體 }}"
    複製代碼

    4. 也可以混合:存一部分、指定一部分
    1.   - action: scene.create
    2.     data:
    3.       scene_id: mixed_scene
    4.       snapshot_entities:
    5.         - light.客廳            # 存現況
    6.       entities:
    7.         light.餐廳:             # 指定一個固定值
    8.           state: "on"
    9.           brightness: 128
    複製代碼

    正規場景(存在 scenes.yaml 的)

    那種是事先定義好的固定狀態,適合「回家模式」「睡前模式」這類。
    1. # scenes.yaml
    2. - id: '1727000000001'
    3.   name: 睡前
    4.   entities:
    5.     light.客廳:
    6.       state: "off"
    7.     light.主臥:
    8.       state: "on"
    9.       brightness: 30
    10.       color_temp_kelvin: 2200
    11.     climate.主臥:
    12.       state: cool
    13.       temperature: 26
    14.       fan_mode: low
    15.     cover.主臥窗簾:
    16.       state: closed
    複製代碼

    用 UI 建比較快:設定 → 自動化與場景 → 場景 → 新增場景
    把家裡調成你想要的樣子,然後按「儲存」—— 它會自動抓現況。

    場景的一個限制要知道

    場景是「設定狀態」,不是「執行動作」。

    所以場景不能:


    • 發通知
    • 呼叫服務
    • 有條件判斷
    • 有延遲


    需要那些就得用 script。很多人想用場景做複雜流程,最後都會撞到這個牆。

    我的分工


    • 場景 — 純粹的「燈光/空調要長什麼樣」
    • script — 流程:先做 A、等一下、再做 B、通知誰
    • script 裡呼叫場景 — 兩者結合,最常用

    1. 睡前流程:
    2.   sequence:
    3.     - action: scene.turn_on
    4.       target: {entity_id: scene.睡前}       # 燈光空調交給場景
    5.     - action: lock.lock
    6.       target: {entity_id: lock.前門}
    7.     - delay: "00:00:03"
    8.     - if:
    9.         - condition: state
    10.           entity_id: lock.前門
    11.           state: unlocked
    12.       then:
    13.         - action: notify.mobile_app_charles
    14.           data: {message: 門鎖沒成功,請手動確認}
    複製代碼

    transition:場景也能漸變
    1.   - action: scene.turn_on
    2.     target: {entity_id: scene.睡前}
    3.     data:
    4.       transition: 5           # 花 5 秒慢慢變過去
    複製代碼

    這個小細節體感差很多。
    燈光瞬間跳變會嚇到人,五秒漸變就很舒服。

    (要燈本身支援 transition 才有效,Zigbee 燈泡多數支援,
    智能開關類的不支援。)

    ---

    scene.create 這個功能知道的人不多,但它解決的是一個
    「你不能事先知道使用者狀態」的通用問題。

    除了看電影,我還用在:訪客模式、清潔模式、還有「小孩午睡時全屋靜音」。
    都是臨時改一下、結束後要恢復原狀的情境。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

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

    GMT+8, 2026-9-24 10:29 , Processed in 0.086470 second(s), 26 queries .

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