Apple 在 WWDC 2020 在 HomeKit 上發表了 Adaptive Lighting 的概念,當使用可調整色溫和亮度的燈具時,可以讓燈具的光線跟隨自然光的變化而自動調整:早晨跟晚上是柔和的暖色光線,白天則調整為幫助專注的冷白光。
這個功能很酷,但卻很少被提起,因為想要完整的體驗這個功能,使用者必須購買支援 Homekit 與 Adaptive Lighting 的智慧燈具,除了價格相對高昂以外,選擇也非常少。
跟蘋果發表會同步上市的 Nanoleaf 智慧燈條 |
最適合使用 Adaptive Lighting 的燈具應該是燈條或是間接光這種用來打亮整體空間的燈具了,但當初規劃室內燈光的時候,考慮到市售的 LED 智慧燈條要不是演色性僅有 80,或者根本就沒標示(有些會說明因為規格為 RGB 所以無法測量,原因我不確定)。原本想說那就放棄使用智慧燈具了,但在尋找合適的產品時發現一個有趣的產品:可調光的 LED 燈管, T5 支架燈 4 呎規格,演色性達 95 並且支援可調光,有 3000K 與 6500K 兩種可以選購:
可以調光的 T5 支架燈 |
按照燈具的使用說明,調整光線的方法為關閉電源後 3-5 秒再開啟,燈具就會緩緩亮起,當到達適合的亮度時快速重起開關,燈具就會維持在指定的亮度。
燈具調光使用說明 |
像這樣的產品一般來說是搭配傳統機械開關使用,不過如果透過智慧開關控制,可以很輕易的透過 Home Assistant 裡面的腳本來自動完成各種亮度的設定。
於是購買 3000K 與 6500K 兩種燈管,分別使用 Sonoff Basic R2 控制通電並且安裝在間接光盒裡面,這樣硬體的部份就建構完成了。腳本的部份,實際測試燈具從開啟到最亮時約 8~10 秒,沒有使用相關的儀器檢查,但就先設定在 3s、4s、5s、6s、以及無限來作為 20%、40%、60%、80%、100%,取得中五種亮度區段的設定。
例如設定 40% 的白光的腳本設定如下:
alias: 40 白光 sequence: - service: scene.turn_on //啟用開啟白光場景 target: entity_id: scene.whitelight.
turn_on
metadata: {} - delay:
//延遲 4 秒
hours: 0 minutes: 0 seconds: 4 milliseconds: 0 - service: scene.turn_on
//啟用關閉白光場景
target: entity_id: scene.
whitelight.
turn_off
metadata: {} - delay:
//延遲 50 毫秒
hours: 0 minutes: 0 seconds: 0 milliseconds: 50 - service: scene.turn_on
//啟用開啟白光場景
target: entity_id: scene.
whitelight.
turn_on
metadata: {} mode: single icon: mdi:globe-light
可以自由設定兩種色溫的燈管亮度後,接下來是必須知道如何安排光線的亮度與色溫,由於蘋果並沒有公開 Homekit Adaptive Lighting 的相關數值,於是只能自己去找相關文件。參考 HA 組件
adaptive-lighting 中提供的相關數值來反向推出需要的數值。為了實作方便預計簡化到只有五個亮度,所以利用日出日落時間的整合來分別推算出日出以及日落前的幾小時來做時間區段。
adaptive-lighting 提供的數據 |
以日出日落時間為基準,將一天分成 10 種光線配置 |
接下來開始寫自動化,邏輯很簡單:
1. 創造一個虛擬開關命名為「間接光」,並且接回 HomeKit 方便透過 Siri 控制,作為整個系統的主要控制器。
2. 「間接光」開啟的時候,針對當下所在的時間決定要呼叫哪個白光與黃光的腳本。未來所有需要開啟或關閉間接光的場合如起床、離開家、到家,或是 Siri 語音呼叫,都透過啟動這個虛擬開關來控制。
3. 在特定時間時,偵測「間接光」為開啟時,設定切換腳本來達到調光的效果
4. 由於燈具非原生智慧燈具,為降低切換燈光時必須關燈的突兀感,將白光與黃光燈泡錯開 15 秒切換。
首先先寫「間接光」的部份,當偵測開關開啟時,根據不同時段執行不同腳本:
啟動條件:當「間接光」開關開啟時
判斷時間不同區段執行不同腳本
alias: 開啟間接光
description: ""
trigger: //偵測條件,當間接光從任何狀態變為開啟時
- platform: state
entity_id:
- input_boolean.jian_jie_guang
from: null
to: "on"
condition: []
action:
- alias: sunrise-2 //設定條件,日出前兩小時,時段為日出前 2 小時至日出前 1 小時
if:
- condition: sun
before: sunrise
after: sunrise
before_offset: "-01:00:00"
after_offset: "-02:00:00"
then: //執行黃光 40% 的腳本
- service: script.0
metadata: {}
data: {}
- service: script.yellow_light_40
data: {}
- service: notify.line_notification
metadata: {}
data:
message: sunrise -2
- alias: sunrise-1//設定條件,日出前兩小時,時段為日出前 1 小時至日出
if:
- condition: sun
before: sunrise
after: sunrise
after_offset: "-01:00:00"
then://執行黃光 60% 的腳本
- service: script.0
metadata: {}
data: {}
- service: script.yellow_light_60
data: {}
- service: notify.line_notification
metadata: {}
data:
message: Sunrise -1
...
如此即完成開啟的設定,接下來處理光線轉換的部分:
啟動條件:設定為 10 個啟動時間:日出前 2 小時、日出前 1 一小時、日出時間....
判斷條件:「間接光」開關狀態為開啟時
判斷時間不同區段執行不同腳本,這邊使用一個簡化自動化腳本的小技巧,即在觸發條件可以把所有的時段,以及條件都寫進來,然後在觸發執行的時候再進行一次判斷來決定要執行那一個行為。
例如觸發判斷就把所有時段加進來,並且條件為 「間接光」開關狀態為開啟時才執行:
alias: 間接光模式轉換
description: ""
trigger: //以日出與日落為基準 offset 的各時段區間作為起啟動條件
- platform: sun
event: sunrise
offset: "-02:00:00"
- platform: sun
event: sunrise
offset: "-01:00:00"
- platform: sun
event: sunrise
- platform: sun
event: sunrise
offset: "01:00:00"
- platform: sun
event: sunrise
offset: "03:00:00"
- platform: sun
event: sunset
offset: "-03:00:00"
- platform: sun
event: sunset
offset: "-01:00:00"
- platform: sun
event: sunset
- platform: sun
event: sunset
offset: "01:00:00"
- platform: sun
event: sunset
offset: "02:00:00"
condition: //間接光開關為開啟的時候
- condition: state
entity_id: input_boolean.ambient_light
state: "on"
啟動條件達成後,再判斷一次當下的時間來決定要執行哪一個燈光配置
action:
- alias: "sunrise-2 " //條件命名日出前兩小時
if: //如果時間在日出前 1 小時至日出前了 2 小時
- condition: sun
before: sunrise
after: sunrise
before_offset: "-01:00:00"
after_offset: "-02:00:00"
then: //執行黃光 40% 的腳本
- service: script.yellow_light_40
data: {}
其他狀態依據相同邏輯補齊,最後完成之後,系統只要偵測人到家,就會開啟間接光並且自動幫我選擇適合的色溫與亮度。並且會根據日出日落前色溫變化較大的時間點,自動幫我重新開關燈具調整到指定的色溫與亮度。