日出日落与光线联动

最自然的那条线

太阳能教你做事:天黑开灯、天亮关灯,是所有家庭自动化的「起手式」。HA 内置天文计算,知道你所在经纬度每一天的日出日落时刻,不用自己维护任何时间表。

这一篇的核心思想只有一句:把「按钟表」换成「按太阳」,再把「按太阳」升级成「按实际有多亮」。三层递进,体验一层比一层好。

先说为什么值得做:钟表方案最大的问题是夏天和冬天的日照差异巨大。北方城市夏天日落可能晚上八点,冬天五点就黑了。固定 18 点开灯的方案,半年舒服半年别扭。而 sun 集成的计算是跟着你所在地的经纬度走的,每一天的触发时刻都不同,天然带有季节适应性。追求更好的体验,就再叠一层实测亮度,把「应该亮」变成「真的暗了」。

sun 集成给了什么

只要配好时区和经纬度,sun 集成提供两个实体:太阳最高点(elevation,地平线上角度)和日照阶段。而自动化里更常用的是两个触发器/条件。配置不需要手动填经纬度,HA 安装时会通过 IP 定位自动带入,之后随生活地变化再改即可。

要素 取值 用途
sun 触发 sunrise / sunset 日出日落瞬间
sun 条件 after: sunset / before: sunrise 天黑判断
elevation 数值 更精细的日照角度

关键认知:日落时刻不等于「天黑了」。日落是太阳沉入地平线的那一瞬间,夏天天还很亮,冬天下班时已经全黑。所以直接用 sunset 做开灯触发,夏天会开太早、冬天开太晚。

一个冷知识:日落之后还有一段「暮光」时间,太阳虽然在地下,但余光仍照亮天空。暮光分为民用、航海、天文三档,对应不同的亮度感受。HA 里通过 elevation 数值可以精确把握这段过渡:太阳高度角约 -6 度是民用暮光结束,这个时候大多数人才真正觉得「天黑了」。用 elevation 替代 sunset,是进阶玩家的常用手段。

第一层:日落偏移

最简单的改法:给 sunset 加偏移量(offset),让开灯时间随季节平滑变化。

trigger:
  - platform: sun
    event: sunset
    offset: "-00:15:00"

这段配置表示「日落前 15 分钟开灯」。为什么是减号?因为 offset 是相对日落时刻的偏移,提前就是负数。夏天日落在 19 点,18:45 开灯正合适;冬天日落在 17 点,16:45 也会开——但冬天下班时往往已经全黑,这时候你又觉得它开晚了。

这就是单层方案的极限:钟表式的偏移只能迁就一个季节。想要全年都舒服,得上第二层。

一个细节顺带说明:offset 是固定的时长,每天的触发时刻仍随日落浮动。所以它不是「提前 15 分钟」的钟表时间,而是「比日落早 15 分钟」的相对时间。这个区别很重要——夏天触发可能在 19:45,冬天可能在 16:45,但始终贴着日落走。

第二层:光照传感器校准

天黑的本质是「环境亮度低于某个值」。所以最稳的做法是直接测亮度:一个光照传感器( lux 为单位),配合 numeric_state 触发。

trigger:
  - platform: numeric_state
    entity_id: sensor.living_lux
    below: 30
    for: "00:03:00"
condition:
  - condition: sun
    after: sunset

为什么还要 condition?因为大晴天中午云彩遮一下也可能掉到 30 lux 以下。「日落之后」是防护栏,「亮度低于 30」是精确尺——粗条件挡住白天,细条件抓住黄昏。这套组合在阴雨多的地区尤其重要:梅雨天下午三点就暗得要开灯,sun 触发是管不了这事的。

两个数字的关系也想清楚:触发是「低于 30 再持续 3 分钟」。持续时间的意义是防止汽车的远光、闪电这类瞬时亮源把你晃灭灯。反过来,灭灯自动化也要对称设计:亮度高于某值(比如 100)持续 5 分钟,再把灯关掉。开关两侧都做过滤,曲线才平滑。

阈值定多少?没有标准答案,教你一个校准办法:黄昏时坐在沙发上,觉得「该开灯了」就去看传感器读数,连续记三天,取中间值。阈值是你家自己的生理曲线,别照抄网上数值。

还有一个实战要点:传感器要选对位置。放在窗边测的是「外面有多亮」,放在客厅中央测的是「坐在这里有多亮」。前者适合控窗帘,后者适合控灯。很多翻车案例都是传感器贴着窗户,人进屋时屋里还很暗但传感器读数仍高,灯就是叫不亮。

一天亮度变化与联动窗口

第三层:两层条件协商

更有意思的玩法是让「太阳」和「实测亮度」互相印证,哪个信号强听哪个。典型做法:

  • 满足「日落且亮度低于 X」立刻开灯;
  • 满足「亮度低于 Y」但还在白天(阴天),只开部分灯到中等亮度。

同样是开灯,白天阴天场景和夜晚场景给到的亮度色温完全不同。用 choose 按「现在是不是日落之后」分发,就是一对很优雅的自动化。

这种「双信号协商」的思路可以推广到所有场景:固定规则提供骨架,实时传感器提供手感,骨架保证不出格,手感决定体验。

再举一个协商的例子:早上该拉窗帘时,先看温度——如果盛夏清早户外已 30 度,拉开等于给屋里加热,不如拉着;冬天则一定拉开晒。同样是「日出后拉窗帘」这条自动化,加一个温度条件就有了灵魂。

窗帘与日照

日照联动的另一半是窗帘。窗帘自动化是很多人买智能窗帘的第一动力,但也最容易装完失望——因为它调参周期长,每个季节都要微调。思路对了,它就是家里存在感最低、好评最高的设备。

  • 夏天清晨:太阳直射会让房间升温,日出后自动拉上西晒的窗帘,空调节电效果立竿见影。
  • 冬天清晨:正好相反,拉开窗帘让阳光进来当暖气。

同样是「日出后拉窗帘」,夏天和冬天的诉求恰好相反。区分依据有两个:月份(now().month)或户外温度。实战中用温度更准——三月的寒潮和十一月的暖秋都会让月份判断翻车。温度是结果,月份只是嫌疑。

还有一个反向联动值得做:入夜后自动关窗帘。它不只是遮光,更是隐私和保温。这条自动化触发简单(日落后延迟 10 分钟),却显著提升「家」的完整感,是新手练手的高性价比项目。

渐变而非切换

亮度变化时,人眼讨厌突变。两招提升质感:

  1. 灯光过渡:light.turn_on 支持 transition 参数(秒),让灯在 2~3 秒内平滑亮起。
  2. 分档:黄昏先亮 30%,入夜再 80%,让环境渐变跟随窗外天色。配合场景(scene)做「黄昏」「深夜」两档,比一把拉满自然。

色温也随黄昏变化更有气氛:从 4000K 的暖白逐渐过渡到 2700K 的烛光色,人的生物钟会觉得「天真的黑了」。这套梯度可以用两个场景加一条时间触发串起来,写一次管一年。

顺带一提,深夜起床喝水又是另一种光:10% 亮度、最暖色温的地脚灯,比开顶灯仁慈一万倍。它的触发是 mmWave 加夜间条件,在「回家与离家」一篇里已经讲过同一个套路。

黄昏到深夜的灯光梯度

常见坑

  • 时区没设对:所有 sun 相关时刻整体偏移,先检查配置里的时区。
  • 传感器位置:光照传感器放窗边和放沙发旁读数差几倍,先定位坐姿高度再定阈值。
  • 数值抖动:必须加 for 参数过滤,否则一朵云就能触发开灯。
  • 忘加条件:裸用 numeric_state 下限触发,白天乌云密布时全屋通明。

  • 只测不学:传感器装好一周后,你会在日志里看到自家的亮度规律——晨昏过渡多快、阴天的谷值多少。花十分钟读一遍历史,阈值该定多少自己就跳出来了。调参不是体力活,是观察活。

  • 夏天忘测西晒:朝西的房间午后室温可能比户外还高,窗帘策略要按朝向区分,一个阈值打天下必然翻车。

小结:三层方案怎么选

给纠结的人一个直接结论:

方案 成本 体验 推荐度
固定时间 零 及格 能用但尴尬
日落偏移 零 良好 新手首选
亮度校准 一个传感器 优秀 阴雨多地区必上
双信号协商 同上 优秀 追求细腻体验

从第二行开始选起,住两周不舒服再升级,是最省心的路线。每多一层传感器,维护成本也多一层,体验到了「够用」就停手,是工程的美德。

延伸阅读

  • 触发器与条件配合见本系列「触发器全家桶」与「condition 入门」。
  • 空调联动见「空调与温湿度闭环控制」。
  • 部署在 NAS 上长期运行的读者可参考 《群晖 DSM 指南》,软路由用户见 《软路由指南》。
  • 温控闭环思路见本系列「空调与温湿度闭环控制」一篇。