“人明明还坐在沙发上,电视却自己暂停了。”这不是灵异事件,是毫米波存在传感器在远距离上的一次误判。一位智能家居用户为此写了一段 Python 代码,把“人突然消失”和“人起身离开”区分开来,让原本时灵时不灵的自动化变得几乎每次都靠谱。
他在家庭办公室装了一台 Everything Presence Lite 毫米波传感器,用来监控整个房间:有人进来开灯,人走关灯。他还在办公椅周围划了一个区域,传感器精度足够判断他是否坐在椅子上,配合 Home Assistant 自动化,坐太久就会被提醒起身走动几分钟。
办公室这套用得太顺,他又给客厅买了一台。目标很明确:有人起身去倒水或上厕所,电视自动暂停;人回到沙发,剧集接着播。
客厅的自动化搭法和办公室类似——在沙发和扶手椅范围划一个区域,区域内人数下降就暂停当前媒体,人回来就恢复。问题是,这套自动化只在一定程度上有效,实际非常不可靠。翻看传感器历史记录会发现,被追踪目标的位置有时会突然跳变,有时干脆整个消失。
原因出在距离上。办公室里他离传感器不到三英尺,而客厅里包含沙发的区域位于房间另一侧,检测距离远得多。传感器难以稳定维持每个目标的准确位置,人就会看起来突然“瞬移”,或者短暂彻底消失。
这两种误判都会触发错误动作:目标突然丢失,自动化以为人离开了房间,电视暂停;位置瞬间跳变,目标被挪出沙发区域,电视同样被无故暂停。
用位置序列代替“在不在”
他不想放弃这套自动化,因为办公室那套的表现摆在那里。他需要的是一个更可靠的方式,判断人究竟有没有离开沙发又回来。
关键判断是:一个人从沙发上起身离开房间,和一个人在半空中突然消失,是两件完全不同的事。前者应该能看到目标从当前位置移动、逐渐远离检测区域,而不是凭空不见。
于是他让本地服务器上运行的 Python 代码去看一串连续的位置,而不只是看目标在不在区域内。代码寻找的是一种持续向外移动的模式——若干个位置连成一条远离检测区域的路径,比目标数量突然下降更能说明有人起身了。
改完之后,即使目标短暂消失,或者位置突然比刚才往前挪了一英尺,电视也只会在人真正起身离开沙发时暂停。人在外面期间检测再怎么异常都无所谓,只有当检测到的目标数量与原始数量一致时,电视才会恢复播放。
调试过程需要一点实验,他还拉着妻子反复起身、坐下好几次,确认行为符合预期。最终,一套失败次数多于成功次数的自动化,变成了几乎每次都成功的自动化。
全家一起看还不行
这套方案仍有边界:传感器最多同时追踪三个目标。他把自动化设置为只在孩子上床睡觉之后生效,这样需要追踪的目标从不超过两个。
他并不认为这是传感器的锅。办公室的椅子检测依然稳如磐石,问题在于他把传感器用在了精度开始下降的距离上。一段考虑“人起身前后发生了什么”的 Python 脚本,补上了传感器在远距离丢失的那点判断力。
热门跟贴