米家极客版精通指南_第1页
米家极客版精通指南_第2页
米家极客版精通指南_第3页
米家极客版精通指南_第4页
米家极客版精通指南_第5页
已阅读5页,还剩80页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

米家极客版自动化·精通指南—PAGE—米家极客版自动化精通指南━━━━━━━━━━━━━━━━━━从入门到精通·变量·函数·状态机·多网关·跨生态全掌握【适合人群】已掌握基础·追求进阶·想搭建复杂系统的极客玩家【内容涵盖】变量深度精通·函数表达式·虚拟事件模块化·状态机设计·多网关架构·性能调优·跨生态联动【图文并茂】12张原创示意图·15张专业对比表·8大章节系统讲解·6万字深度内容2026年8月整理编写目录CONTENTS第一章精通之路——从新手到高手的思维转变 31.1新手与高手的核心差距 31.2极客版的设计哲学 41.3精通者的五大思维模式 51.4本书的学习路径 8第二章变量系统深度精通 92.1变量的本质与底层逻辑 92.2全局变量的模块化设计方法论 122.3变量编码与解码技巧 152.4变量触发机制深度解析 172.5变量命名规范与管理最佳实践 192.6实战:全屋有无人状态系统 212.7实战:设备工作时长统计 24第三章函数与表达式高级应用 263.1函数系统全景图 263.2数学函数实战 273.3随机函数的创意玩法 313.4时间函数与时间戳计算 333.5三角函数的特殊应用 363.6表达式编写技巧与调试 373.7实战:温差自动控温系统 383.8实战:RGB灯随机色彩氛围 40第四章虚拟事件精通——自动化的模块化编程 414.1虚拟事件的本质 414.2虚拟事件的三大核心用法 434.3虚拟事件模块化设计实战 464.4虚拟事件桥接非中枢设备 484.5虚拟事件与变量的配合模式 504.6实战:小爱主动问询交互 524.7虚拟事件使用注意事项 54第五章复杂逻辑与状态机设计 555.1状态机思维入门 555.2用变量实现状态机 575.3多条件组合逻辑设计 595.4事件先后顺序判断 615.5防循环与防抖设计 625.6实战:灯光模式循环切换 645.7实战:家庭模式状态机 66第六章多网关架构与系统优化 686.1中枢网关主备架构 686.2从网关的角色与配置 706.3本地化优先设计原则 716.4云端与本地的混合策略 736.5设备分组与负载均衡 756.6网络优化关键参数 766.7实战:大户型多网关部署 78第七章性能调优与高级调试 797.1自动化性能瓶颈分析 797.2日志深度解读技巧 817.3延迟与响应时间优化 837.4规则数量与复杂度管理 847.5常见性能问题排查 867.6数据备份与恢复 887.7实战:自动化卡顿排查 89第八章跨生态联动与高级玩法 918.1第三方设备接入思路 918.2屏幕面板与灯具双向同步 938.3传统设备智能化改造 948.4米家APP与极客版协同 968.5创意玩法合集 97附录 99附录A函数速查表 99附录B变量卡片速查表 100附录C常见问题FAQ 101附录D学习资源与社区 103第一章精通之路——从新手到高手的思维转变1.1新手与高手的核心差距很多人在学完米家极客版的基础操作后,会陷入一个瓶颈:知道每个卡片怎么用,但真要设计一套复杂的自动化时,却不知道从何下手。做出来的规则要么经常出bug,要么越改越乱,最后干脆放弃,回到普通版自动化的简单玩法。这不是因为你不够聪明,而是因为你还在用"新手思维"看待极客版。新手和高手的核心差距,不在于谁记住了更多卡片,而在于思维方式的不同。新手的思维是"事件驱动"的:看到一个触发条件,就想到一个执行动作。比如"人来灯亮",新手会直接做一条规则——人体传感器检测到人,就开灯。这种思维在简单场景下没问题,但一旦场景变复杂,比如需要同时判断时间、亮度、是否有人、是否在观影模式,新手就会把所有条件堆在一条规则里,最后规则变得臃肿不堪,出了问题也不知道哪里错了。高手的思维是"系统设计"的:他们会先分析整个场景的状态变化,把复杂场景拆分成多个独立的模块,用变量来记录状态,用虚拟事件来串联模块。比如同样是"人来灯亮",高手会先设计一个"房间有无人"的状态变量,所有涉及这个房间的自动化都读取这个变量,而不是各自去判断传感器。这样做的好处是:更换传感器时只需要改一处,增加多个传感器时只需要修改变量的计算逻辑,其他所有自动化都不需要动。💡小贴士记住一句话:新手写规则,高手写系统。规则是一次性的,系统是可维护的。当你的自动化数量超过20条时,如果没有系统思维,管理成本会指数级上升。1.2极客版的设计哲学要精通极客版,首先要理解它的设计哲学。米家极客版不是一个"更复杂的自动化编辑器",而是一个运行在中枢网关上的"可视化编程环境"。它的底层逻辑和计算机编程是相通的,理解了这一点,很多设计就豁然开朗了。第一个设计哲学是"本地优先"。极客版的所有自动化都运行在中枢网关本地,不依赖云端。这意味着即使断网,你的自动化依然能正常执行。这也是为什么极客版的响应速度比普通版快很多——普通版的自动化需要经过云端转发,延迟通常在1-3秒,而极客版的本地执行延迟可以做到毫秒级。第二个设计哲学是"卡片即代码"。每一个卡片本质上就是一段代码:设备触发卡片是事件监听器,条件判断卡片是if语句,延迟卡片是sleep函数,变量卡片是变量赋值和读取,虚拟事件是函数调用。当你把卡片用线连起来时,你其实就是在写一段程序。理解了这个对应关系,你就可以用编程的思维来设计自动化。第三个设计哲学是"状态与行为分离"。在极客版中,设备的状态(灯是否开着、温度是多少)和自动化的行为(什么时候开灯、开多亮)是分离的。你可以用变量来记录状态,用条件卡片来判断状态,用执行卡片来改变状态。这种分离让复杂的逻辑变得清晰可维护。图1-1极客版变量系统架构:全局变量与本规则变量的访问范围对比第四个设计哲学是"模块化复用"。通过虚拟事件和全局变量,你可以把一段常用的逻辑封装成一个"模块",然后在多个自动化中调用它。比如你可以把"关闭全屋灯光"封装成一个虚拟事件,然后在离家模式、睡眠模式、观影模式中都调用它,而不需要每条规则都重复写一遍关闭所有灯的动作。1.3精通者的五大思维模式根据众多米家极客版达人的分享和官方文档的设计思路,我们总结出精通者必备的五大思维模式。掌握了这五种思维,你就能从"会用卡片"升级到"会设计系统"。1.3.1状态思维状态思维的核心是:不要只关注"发生了什么事件",更要关注"系统当前处于什么状态"。举个例子,新手做"离家关灯",触发条件是"门锁上锁",执行动作是"关闭所有灯"。这看起来没问题,但如果门锁上锁时其实家里还有人呢?比如家人出门倒垃圾,锁了门但很快就回来。这时候灯全关了就很尴尬。有状态思维的高手会这样设计:先创建一个"全屋有人"的全局变量,通过各个房间的人体传感器来维护这个变量的状态。然后离家模式的触发条件不是"门锁上锁",而是"门锁上锁且全屋有人变量为0"。这样就避免了误触发。状态思维的关键是:把系统的所有可能状态都列出来,然后为每个状态定义明确的进入条件和退出条件,最后在状态变化时执行对应的动作。这就是我们第五章要详细讲解的"状态机"设计方法。1.3.2模块化思维模块化思维的核心是:把复杂的自动化拆分成独立的、可复用的小模块,每个模块只做一件事。比如做一个"观影模式",新手会把所有动作堆在一条规则里:关闭窗帘、调暗主灯、打开氛围灯、设置空调、关闭顶灯……这条规则会变得很长,出了问题很难排查,而且如果其他场景也需要"调暗灯光"这个动作,还得重复写一遍。有模块化思维的高手会这样拆分:模块A:调暗客厅灯光(虚拟事件"客厅观影灯光")模块B:关闭客厅窗帘(虚拟事件"客厅关窗帘")模块C:设置空调观影温度(虚拟事件"空调观影模式")主规则:触发观影模式时,依次调用A、B、C三个虚拟事件这样做的好处是:每个模块可以独立测试和修改,比如你想调整观影时的灯光亮度,只需要改模块A,不需要动主规则;而且模块A还可以被其他场景复用,比如"游戏模式"也可以调用"客厅观影灯光"。图1-2虚拟事件模块化:主流程通过虚拟事件调用多个子流程1.3.3变量思维变量思维的核心是:能用变量记录的状态,就不要用设备状态来判断;能通过变量传递的信息,就不要让自动化之间互相依赖设备。变量思维是极客版区别于普通版的核心能力。普通版自动化之间是孤立的,一条规则无法知道另一条规则做了什么。而极客版通过全局变量,让自动化之间可以"通信"。比如你想做"人走灯灭",新手会直接用人体传感器的"无人移动"事件来关灯。但人体传感器有一个问题:它的"无人"状态是延迟判断的(通常需要1-5分钟没有移动才会判定无人),而且如果传感器本身有盲区,人站着不动也可能被误判为无人。有变量思维的高手会这样做:创建一个"客厅有人"的全局变量,当人体传感器检测到人时把变量设为1,当无人移动持续3分钟时把变量设为0。然后所有需要判断客厅是否有人的自动化,都读取这个变量,而不是直接读传感器。这样做的好处是:如果你后来增加了第二个传感器(比如摄像头的人形检测),只需要修改变量的赋值逻辑,把两个传感器的状态做"或运算",所有读取这个变量的自动化都自动受益。1.3.4防抖思维防抖思维的核心是:不要对每一次状态变化都立即执行动作,而是要过滤掉抖动和误触发。智能家居中最常见的问题就是"抖动":人体传感器可能因为宠物经过而误触发,门锁可能因为风吹而误报,温度传感器可能因为空调直吹而剧烈波动。如果你的自动化对每一次变化都立即响应,就会出现灯频繁开关、空调频繁启停的问题。防抖的方法有很多种:时间防抖:状态维持一段时间后才执行动作(比如无人移动持续3分钟才关灯)阈值防抖:数值变化超过一定阈值才执行动作(比如温度变化超过0.5度才调整空调)状态防抖:只有状态从A变到B时才执行,B变到A不执行(比如只有从"有人"变到"无人"时才关灯)我们会在第五章详细讲解各种防抖技巧。1.3.5容错思维容错思维的核心是:假设任何设备都可能出问题,设计自动化时要考虑到设备离线、状态异常、网络中断等情况。新手做自动化时,默认所有设备都是正常的。但实际使用中,设备离线是家常便饭:蓝牙设备可能因为距离太远而断连,WiFi设备可能因为路由器重启而离线,Zigbee设备可能因为干扰而丢包。如果你的自动化依赖某个设备的状态,而这个设备刚好离线了,自动化就会出问题。有容错思维的高手会这样设计:关键状态用多个设备冗余判断(比如"有人"状态同时用人体传感器和摄像头判断)给自动化设置超时和兜底逻辑(比如开灯后如果5分钟内没有检测到人,就自动关灯)重要的自动化尽量本地化,不依赖云端设备1.4本书的学习路径本书是《米家极客版自动化新手入门教程》的进阶篇,假设你已经掌握了基础操作(登录界面、五大卡片、基本变量用法)。如果你还没有看过入门篇,建议先学习基础内容再来阅读本书。本书的学习路径如下:章节核心内容学习目标第二章变量系统深度精通变量底层逻辑、模块化设计、编码解码、命名规范能用变量构建复杂的状态系统第三章函数与表达式高级应用全部函数详解、表达式技巧、实战案例能用函数和运算实现复杂计算第四章虚拟事件精通虚拟事件三大用法、模块化编程、桥接设备能用虚拟事件搭建模块化系统第五章复杂逻辑与状态机状态机设计、多条件组合、防循环防抖能设计稳定可靠的复杂逻辑第六章多网关架构与系统优化主备架构、本地化优先、网络优化能搭建高可用的全屋智能系统第七章性能调优与高级调试瓶颈分析、日志解读、备份恢复能排查和解决自动化性能问题第八章跨生态联动与高级玩法第三方接入、双向同步、创意玩法能突破生态限制实现高级玩法每一章都包含原理讲解、实战案例和避坑指南。建议你按照顺序阅读,因为后面的章节会用到前面的概念。但如果你已经有一定基础,也可以直接跳到感兴趣的章节。💡小贴士最好的学习方式是边读边练。每看完一个实战案例,都打开极客版自己动手做一遍。只有亲手做过,才能真正理解其中的原理和细节。

第二章变量系统深度精通变量是极客版的灵魂。如果说普通版自动化是"各自为政的孤岛",那么变量就是连接这些孤岛的桥梁。掌握了变量,你就掌握了极客版的核心能力。本章我们将深入变量系统的底层逻辑,学习高手是如何用变量构建复杂系统的。2.1变量的本质与底层逻辑2.1.1变量到底是什么在入门篇中我们说过,变量是"可以变化的量",用来存储设备状态或中间数据。但这个描述还不够深入。从计算机科学的角度看,变量本质上是中枢网关内存中的一个"存储单元",它有一个名字(变量名)和一个值(当前存储的数据)。你可以把变量想象成一个贴了标签的盒子:标签上写着变量名(比如"客厅温度"),盒子里放着当前的值(比如26.5)。任何自动化都可以通过变量名来"查看盒子里的值"(读取变量),也可以"往盒子里放新的值"(赋值变量)。极客版支持两种类型的变量:数值变量:存储数字,比如温度26.5、亮度80、状态1文本变量:存储文字,比如"现在温度26.5度"、"观影模式"数值变量是最常用的,因为大部分设备状态都是数字形式的(温度、湿度、亮度、色温、功率等)。文本变量主要用于小爱播报和状态描述。2.1.2全局变量与本规则变量的本质区别全局变量和本规则变量的区别,不仅仅是"能不能在多条规则中使用"这么简单。它们的底层存储方式和生命周期完全不同。全局变量存储在中枢网关的"全局内存区",所有自动化规则共享这个区域。全局变量的生命周期是"持久"的——只要中枢网关不重启,全局变量的值就会一直保留。即使你关闭了某条自动化规则,全局变量的值也不会丢失。本规则变量存储在每条自动化规则的"局部内存区",只有当前规则能访问。本规则变量的生命周期是"临时"的——每次规则启动时,本规则变量都会被重置为初始值。规则执行完毕后,本规则变量就被销毁了。对比项全局变量本规则变量存储位置中枢网关全局内存区规则局部内存区访问范围所有自动化规则仅当前规则生命周期持久(重启后保留)临时(规则启动时重置)适用场景跨规则通信、共享状态单规则临时数据、中间计算命名冲突全局唯一,不能重名不同规则间可以重名⚠️注意一个常见的误区:很多新手以为本规则变量在规则执行完毕后会保留值,下次执行时还能用。实际上本规则变量每次规则启动都会重置为初始值。如果你需要在多次执行之间保留状态,必须使用全局变量。2.1.3变量的触发机制变量系统中最容易被误解的,就是"变量值更新"卡片的触发机制。很多新手抱怨:"我的变量值更新卡片时灵时不灵,有时候变量变了却不触发。"这其实不是bug,而是设计如此。根据小米官方文档的说明,"变量值更新"卡片的触发逻辑是:只有当变量的判断结果从"假"变为"真"时,才会输出事件。举个例子:你设置了一个变量值更新卡片,判断条件是"客厅有人>0"。当变量从0变成1时,判断结果从假变真,卡片会触发一次。但如果变量从1变成2(仍然大于0),判断结果一直是真,卡片不会再次触发。只有当变量从2变成0(判断结果从真变假),然后再从0变成1(判断结果从假变真)时,卡片才会再次触发。理解这个机制非常重要,它直接影响你的自动化设计。如果你需要"变量每次变化都触发",就不能用"变量值更新"卡片,而应该用"设备触发赋值"卡片的输出事件——设备触发赋值卡片在每次赋值完成时都会输出事件,不管值有没有变化。💡小贴士官方变量指南中明确提到这个特性:"当变量值变化时,只有判断的表达式结果发生变化时才会发生事件。"这是一个设计特性,不是bug。如果你需要真正的"值变动就触发",可以用设备触发赋值卡片的输出事件来代替。2.2全局变量的模块化设计方法论全局变量最强大的用法,不是简单地存一个值,而是用它来构建"模块化的状态系统"。达人"八哥"在他的分享中反复强调:全局变量的核心价值是"解耦"——把设备和自动化解耦,把状态和行为解耦。2.2.1什么是解耦"解耦"是一个编程术语,意思是"降低两个模块之间的依赖关系"。在智能家居中,解耦就是让自动化不直接依赖具体的设备,而是依赖变量记录的状态。举个具体的例子。假设你做了一个"卫生间人来灯亮"的自动化,新手的做法是:触发条件直接选"卫生间人体传感器检测到人",执行动作是"打开卫生间灯"。这种做法的问题是:自动化和人体传感器这个具体设备"耦合"在一起了。如果你以后想换一个更好的传感器,或者想增加一个传感器(比如毫米波雷达),你就需要修改所有用到这个传感器的自动化。如果你有10条自动化都用到了这个传感器,就得改10次。解耦后的做法是:创建一个全局变量"卫生间有人",然后做一条专门的自动化来维护这个变量——当人体传感器检测到人时,把变量设为1;当无人移动持续3分钟时,把变量设为0。其他所有自动化(开灯、开排气扇、开音乐等)都读取"卫生间有人"这个变量,而不是直接读传感器。这样做的好处是:以后更换传感器时,你只需要修改"维护变量"那一条自动化,其他所有自动化都不需要动。这就是解耦的威力。2.2.2模块化设计的三步法根据达人们的分享经验,全局变量的模块化设计可以总结为三步法:第一步:识别"共享状态"。先列出你家中所有需要被多条自动化共享的状态,比如"全屋有人/无人"、"各个房间有人/无人"、"当前模式(在家/离家/睡眠)"、"当前灯光场景"等。这些就是你需要创建的全局变量。第二步:为每个共享状态创建"维护规则"。每一个全局变量都应该有一条(或几条)专门的自动化来维护它的值。维护规则的职责很单一:就是根据设备状态来更新变量值。比如"客厅有人"变量的维护规则,就是根据客厅人体传感器的状态来更新变量。第三步:所有业务规则读取变量,不直接读设备。所有需要判断状态的自动化,都去读取对应的全局变量,而不是直接读取设备状态。这样业务规则和具体设备就解耦了。💡小贴士一个好的判断标准:如果你发现自己在多条自动化中重复使用同一个设备的同一个状态判断,那就应该把这个状态抽成全局变量。重复是坏味道,变量是消除重复的利器。2.2.3变量的分层设计当你的全局变量越来越多时,需要对变量进行分层管理,否则变量列表会变得混乱。推荐的分层方式是按"抽象层级"来分:第一层:设备层变量。直接反映设备状态的变量,比如"客厅温度"、"客厅湿度"、"客厅人体状态"。这些变量的值直接来自设备,维护规则就是简单的"设备触发赋值"。第二层:房间层变量。由多个设备层变量计算得出的房间级状态,比如"客厅有人"(可能由人体传感器+摄像头+毫米波雷达共同判断)、"客厅亮度过暗"(由光照传感器+时间共同判断)。第三层:系统层变量。由多个房间层变量计算得出的系统级状态,比如"全屋有人"(所有房间有人状态的或运算)、"家庭模式"(在家/离家/睡眠/观影)。这种分层设计的好处是:每一层只依赖下一层,不跨层依赖。设备更换只影响设备层,房间逻辑变化只影响房间层,系统模式变化只影响系统层。整个系统结构清晰,易于维护。2.3变量编码与解码技巧当你的自动化越来越复杂时,变量的数量也会越来越多。有时候你需要在自动化之间传递多个状态,但创建太多变量会让变量列表变得臃肿。这时候就可以用到"变量编码"技巧——把多个状态压缩成一个数字变量。2.3.1为什么需要编码想象一个场景:你想在两条自动化之间传递一个灯光的完整状态,包括开关状态(开/关)、亮度(0-100)、色温(2700-6500K)。如果用普通变量,你需要创建3个变量:灯光开关、灯光亮度、灯光色温。每次传递状态时,要同时更新这3个变量,接收方也要同时读取这3个变量。如果用编码技巧,你可以把这3个状态"打包"成一个数字。比如约定:开关占1位(0=关,1=开),亮度占2位(00-99),色温占4位(2700-6500)。那么"开、亮度80、色温4000K"就可以编码为10804000。接收方只需要读取这一个数字,然后通过数学运算"解码"出各个状态。2.3.2编码方式一:文本拼接编码最简单的编码方式是用文本拼接卡片。把各个状态用固定位数的字符串拼接起来,形成一个长文本。比如上面的灯光状态例子:开关:开=1,关=0(1位)亮度:80→"80"(2位,不足补0,比如5→"05")色温:4000→"4000"(4位)拼接结果:"1"+"80"+"4000"="1804000"解码时,用文本变量的子串功能(如果支持)或者通过约定的位数来截取。不过极客版目前对文本变量的操作能力有限,文本拼接编码更适合用于小爱播报等场景,而不是用于需要数学计算的场景。2.3.3编码方式二:数值位编码更常用的编码方式是数值位编码,利用数学运算来实现编码和解码。编码公式:编码值=状态1×权重1+状态2×权重2+状态3×权重3比如灯光状态的例子:开关(0或1)×1000000亮度(0-100)×10000色温(2700-6500)×1编码值=开关×1000000+亮度×10000+色温那么"开、亮度80、色温4000K"的编码值=1×1000000+80×10000+4000=1804000解码时用除法和取整:开关=floor(编码值/1000000)亮度=floor((编码值%1000000)/10000)色温=编码值%10000⚠️注意数值位编码需要注意每个状态的取值范围,确保权重足够大,不会出现"进位"问题。比如亮度最大是100,如果权重是10000,那么100×10000=1000000,刚好和开关位的权重一样,就会出现进位冲突。所以亮度的权重应该至少是最大色温值+1,即6501。正确的权重设计需要仔细计算。2.3.4什么时候该用编码编码技巧虽然巧妙,但并不是所有场景都需要用。以下情况适合用编码:需要在自动化之间一次性传递多个关联状态变量数量已经很多,不想再增加状态的取值范围固定且有限以下情况不适合用编码:只有一两个状态需要传递(直接用普通变量更简单)状态的取值范围很大或不固定(编码容易出错)需要频繁单独修改某个状态(编码后修改单个状态需要重新编码整个值)💡小贴士编码是一把双刃剑。它能减少变量数量,但也增加了理解和维护的难度。新手不建议过早使用编码,等你对变量系统非常熟悉之后,再在合适的场景中尝试。2.4变量触发机制深度解析在2.1.3节我们提到了变量值更新卡片的触发机制,这里我们再深入讲解一下各种变量卡片的触发和输出逻辑,这是很多bug的根源。2.4.1设备触发赋值卡片设备触发赋值卡片的逻辑是:当指定设备的指定属性发生变化时,自动把新值赋给变量。赋值完成后,可以选择输出一个事件。这个卡片的关键点:触发条件是"设备属性变化",不管新值和旧值是否相同,只要设备上报了新值就会触发赋值是自动的,不需要额外的执行卡片输出事件是"赋值完成时"触发,每次赋值都会输出(如果开启了输出事件)设备触发赋值卡片是维护设备层变量的首选。比如"客厅温度"变量,就可以用"温湿度传感器温度变化时赋值给客厅温度"来维护。2.4.2查询设备并赋值卡片查询设备并赋值卡片的逻辑是:当卡片接收到输入事件时,主动去查询设备的当前状态,然后把查询到的值赋给变量。这个卡片和设备触发赋值的区别是:设备触发赋值是"被动等待"设备变化,而查询设备并赋值是"主动查询"设备状态。它适用于以下场景:设备不能作为触发条件(有些设备的属性不支持事件触发)需要在特定时刻主动获取设备状态(比如定时查询)需要在某个事件发生后立即获取设备最新状态2.4.3变量值更新卡片变量值更新卡片的逻辑是:当变量的值发生变化时,判断变量是否满足指定条件。如果判断结果从"假"变为"真",则输出事件。这个卡片的关键点(也是最容易踩坑的地方):只有判断结果从假变真时才输出事件变量值变化但判断结果不变时,不输出事件判断结果从真变假时,不输出事件这个卡片适合用于"状态进入"的触发,比如"当全屋有人变量从0变为1时(即从无人变为有人),执行回家模式"。2.4.4查询变量值卡片查询变量值卡片的逻辑是:当卡片接收到输入事件时,查询变量的当前值,然后判断是否满足条件。如果满足,从"满足条件"输出事件;如果不满足,从"否则"输出事件。这个卡片和变量值更新卡片的区别是:变量值更新是"变量变化时被动判断",查询变量值是"收到事件时主动查询判断"。查询变量值卡片有两个输出端(满足/否则),可以实现if-else分支逻辑。2.4.5数值运算卡片数值运算卡片的逻辑是:当卡片接收到输入事件时,对指定的数值和变量进行数学运算,然后把运算结果输出。运算结果可以直接作为执行动作的参数,也可以赋值给变量。数值运算卡片支持加减乘除四则运算,以及各种内置函数(abs、max、min、round、floor、ceil、pow、log、三角函数等)。我们会在第三章详细讲解函数的用法。卡片名称触发方式输出时机典型用途设备触发赋值设备属性变化每次赋值完成维护设备层变量查询设备并赋值收到输入事件查询赋值完成主动获取设备状态变量值更新变量值变化判断结果假→真状态进入触发查询变量值收到输入事件立即判断输出if-else分支判断数值运算收到输入事件运算完成复杂计算、状态编码2.5变量命名规范与管理最佳实践当你的全局变量超过20个时,变量列表就会变得难以管理。一个好的命名规范可以让你快速找到需要的变量,也能避免命名冲突和理解错误。2.5.1推荐的命名格式推荐使用"区域_类型_描述"的命名格式,比如:客厅_人体_有人客厅_环境_温度客厅_环境_亮度全屋_状态_有人全屋_模式_当前系统_时间_日出这种命名格式的好处是:变量按区域分组,同区域的变量排在一起,一目了然。在变量列表中,"客厅_"开头的变量会全部排在一起,"全屋_"开头的也会排在一起。2.5.2命名注意事项变量名不要太长:极客版的变量名显示空间有限,太长的变量名会被截断。建议控制在15个汉字以内。不要用特殊字符:变量名中不要使用空格、逗号、引号等特殊字符,可能会在表达式中引起解析错误。状态变量用0/1表示:对于开关型状态(有人/无人、开/关、在家/离家),统一用0表示"否/关/离开",1表示"是/开/在家",保持一致性。给变量加注释:虽然极客版没有变量注释功能,但你可以在变量名中隐含说明,比如"客厅_人体_有人(0无人1有人)"。不过这样会让变量名变长,建议只在容易混淆的变量上加。2.5.3变量管理的其他建议定期清理不用的变量:很多变量是测试时创建的,用完就忘了删。建议每个月检查一次变量列表,删除不再使用的变量。备份变量配置:极客版支持导出自动化配置,但变量的初始值可能不会被完整备份。建议重要的变量配置手动记录下来,以防中枢网关重置后丢失。不要滥用全局变量:不是所有变量都需要是全局的。只在单条规则中使用的临时变量,用本规则变量即可。全局变量太多会增加系统负担,也容易造成意外的跨规则影响。⚠️注意小米官方文档特别提醒:"不建议都用全局变量,这样容易造成滥用,从而不知不觉影响其他场景。"全局变量是共享资源,修改一个全局变量可能会影响所有读取它的自动化。在创建全局变量之前,先问自己:这个变量真的需要被多条规则共享吗?2.6实战:全屋有无人状态系统现在我们来做一个完整的实战案例,用变量系统构建一个"全屋有无人状态系统"。这个系统是很多高级自动化的基础——离家模式、安防模式、节能模式都需要知道"家里有没有人"。图2-1全屋有无人状态系统:各房间传感器数据汇总运算得出全屋状态2.6.1需求分析我们的目标是:创建一个"全屋有人"全局变量,当家里任何一个房间有人时,变量为1;当所有房间都无人时,变量为0。这个变量可以被离家模式、安防模式等自动化读取。假设家里有三个房间:客厅、主卧、卫生间,每个房间都有一个人体传感器。2.6.2变量设计我们需要创建以下全局变量:客厅_人体_有人(数值,初始0)主卧_人体_有人(数值,初始0)卫生间_人体_有人(数值,初始0)全屋_状态_有人(数值,初始0)前三个是房间层变量,分别记录每个房间的有人状态。最后一个是系统层变量,由前三个计算得出。2.6.3维护房间层变量为每个房间创建一条自动化,用"设备触发赋值"卡片维护房间层变量:客厅规则:触发:客厅人体传感器"有人移动"事件→把"客厅_人体_有人"设为1,输出事件触发:客厅人体传感器"无人移动"事件(持续3分钟)→把"客厅_人体_有人"设为0,输出事件主卧和卫生间同理,各做一条规则。2.6.4计算全屋状态创建一条"全屋有人计算"规则:触发:任意一个房间层变量的赋值完成事件(三个房间的设备触发赋值卡片都开启输出事件,然后用"或"逻辑把三个输出事件连在一起作为触发)动作:数值运算卡片,计算max(客厅_人体_有人,主卧_人体_有人,卫生间_人体_有人)把运算结果赋值给"全屋_状态_有人"变量这里用max函数的原因是:只要有一个房间有人(值为1),max的结果就是1;只有所有房间都无人(全为0),max的结果才是0。💡小贴士如果房间数量很多,也可以用加法代替max:全屋有人=客厅+主卧+卫生间。只要总和大于0就说明有人。加法的好处是可以同时知道"有几个房间有人",但需要额外判断">0"。2.6.5使用全屋状态变量现在"全屋_状态_有人"变量已经可以准确反映家里有没有人了。你可以在各种自动化中使用它:离家模式:触发:门锁上锁且查询变量"全屋_状态_有人"等于0动作:关闭所有灯、关闭空调、启动安防节能模式:触发:"全屋_状态_有人"从1变为0(变量值更新卡片)动作:关闭不必要的设备、调低空调温度2.6.6扩展与优化这个基础系统可以进一步扩展:增加更多房间:只需要新增房间层变量和对应的维护规则,然后在全屋计算的max函数中加入新变量即可。增加冗余判断:如果某个房间有多个传感器(人体传感器+毫米波雷达),可以在房间层用max函数合并两个传感器的状态。增加延迟确认:为了避免误判,可以在"全屋有人"从1变为0后,延迟1分钟再执行离家动作。⚠️注意人体传感器的"无人"判断有延迟,通常需要1-5分钟没有移动才会判定无人。这意味着"全屋有人"变量从1变为0会有延迟。如果你需要更快的响应,可以结合门锁状态来判断——门锁上锁后立即开始倒计时,倒计时结束且全屋无人变量为0时才执行离家。2.7实战:设备工作时长统计第二个实战案例是用变量和时间函数统计设备的工作时长。比如你想知道电视每天开了多久,或者空调运行了多长时间,就可以用这个方法。2.7.1原理极客版的now()函数可以获取当前时间戳(从1970年1月1日到现在的毫秒数)。我们可以在设备开启时记录一次时间戳(存在变量A中),在设备关闭时再记录一次时间戳(存在变量B中),然后用B-A就得到了设备本次的工作时长(毫秒)。2.7.2变量设计创建以下全局变量:电视_时间_开启时刻(数值,初始0)电视_时间_本次时长(数值,初始0)电视_时间_今日总时长(数值,初始0)2.7.3记录开启时刻创建一条规则:触发:电视开启(可以用智能插座的功率大于10W来判断,或者用电视的USB口接门磁传感器来判断)动作1:数值运算now(),把结果赋值给"电视_时间_开启时刻"动作2:小爱播报"电视已开启"(可选)2.7.4计算工作时长创建一条规则:触发:电视关闭(功率小于5W,或门磁断开)动作1:数值运算now()-电视_时间_开启时刻,把结果赋值给"电视_时间_本次时长"动作2:数值运算电视_时间_今日总时长+电视_时间_本次时长,把结果赋值给"电视_时间_今日总时长"动作3:数值运算round(电视_时间_本次时长/60000),得到分钟数,然后用文本拼接卡片让小爱播报"本次电视观看时长XX分钟"2.7.5每日重置创建一条定时规则:触发:每天凌晨0点动作:把"电视_时间_今日总时长"设为0这样每天的总时长都会从零开始统计。💡小贴士时间戳的单位是毫秒,所以计算时长后需要除以1000得到秒,除以60000得到分钟,除以3600000得到小时。记得用round函数取整,避免小爱播报出很长的小数。2.8本章小结本章我们深入学习了变量系统的底层逻辑和高级用法。核心要点包括:1.变量的本质是中枢网关内存中的存储单元,全局变量持久化存储,本规则变量临时存储。2.变量值更新卡片只有在判断结果从假变真时才触发,这是设计特性不是bug。3.全局变量的核心价值是"解耦"——把设备和自动化解耦,让系统更易维护。4.模块化设计三步法:识别共享状态、创建维护规则、业务规则读取变量。5.变量编码可以把多个状态压缩成一个数字,但要注意权重设计避免进位冲突。6.好的命名规范和定期清理是变量管理的关键。7.不要滥用全局变量,只在真正需要跨规则共享时才使用。变量是极客版的基石。掌握了变量系统,你就具备了构建复杂自动化的基础能力。下一章我们将学习函数与表达式,让变量的计算能力更上一层楼。

第三章函数与表达式高级应用如果说变量是极客版的"记忆",那么函数就是极客版的"大脑"。函数让极客版具备了数学计算能力,可以处理温度差、计算时长、生成随机数、进行各种复杂运算。本章我们将全面学习极客版的函数系统,以及如何用函数和表达式实现高级功能。3.1函数系统全景图根据小米官方《极客版变量使用指南》(基于V1.5版本),极客版目前支持以下函数:图3-1函数系统全景:数学函数、时间函数、随机函数三大分类分类函数说明数学函数abs(x)取x的绝对值数学函数pow(x,y)x的y次方数学函数log(x,y)以x为底y的对数数学函数max(x1,x2,...)取多个值中的最大值数学函数min(x1,x2,...)取多个值中的最小值数学函数round(x)四舍五入取整数学函数floor(x)向下取整数学函数ceil(x)向上取整三角函数sin(x)正弦(弧度)三角函数cos(x)余弦(弧度)三角函数tan(x)正切(弧度)三角函数asin(x)反正弦(弧度)三角函数acos(x)反余弦(弧度)随机函数rand()生成0到1之间的随机小数随机函数randint(x,y)生成x到y之间的随机整数时间函数now()当前时间戳(毫秒)时间函数year()当前年份时间函数month()当前月份时间函数day()当前星期(0-6,周日到周六)时间函数hour()当前小时时间函数minute()当前分钟常数pi()圆周率π常数e()自然常数e💡小贴士函数的参数可以是具体数字,也可以是变量。比如max(客厅温度,卧室温度)就是比较两个变量的值取最大。多个参数之间用英文逗号分隔,不要用中文逗号。3.2数学函数实战数学函数是最常用的函数类别。我们来逐个讲解常用数学函数的实际应用场景。3.2.1abs——取绝对值abs函数的作用是取绝对值,也就是把负数变成正数。它最常见的用途是计算"差值"。比如你想计算室内外温差,用室内温度减去室外温度,结果可能是正数(室内比室外热)也可能是负数(室内比室外冷)。但你只关心"差了多少度",不关心谁高谁低,这时候就可以用abs函数。实战案例:机柜散热自动控制场景:弱电机柜里放了路由器、NAS等设备,夏天容易过热。你想在机柜内温度比客厅温度高5度以上时,自动开启机柜风扇降温。变量:机柜温度、客厅温度条件:abs(机柜温度-客厅温度)>=5动作:开启机柜风扇用abs的好处是:不管机柜温度比客厅高还是低,都能正确计算温差。如果不用abs,当机柜温度低于客厅温度时,差值为负,条件永远不会满足。3.2.2max/min——取最大/最小值max和min函数可以从多个值中取出最大或最小的一个。这两个函数在智能家居中有很多巧妙的用法。用法一:多传感器取极值如果一个房间有多个温度传感器(比如客厅有空调自带的温度传感器、温湿度计、中央空调面板的温度传感器),它们的读数可能略有差异。你可以用max函数取最高温度来控制空调(避免过热),或者用min函数取最低温度(避免过冷)。用法二:多房间有人判断在第二章的全屋有无人系统中,我们用max函数来判断是否有任意一个房间有人。max(客厅有人,主卧有人,卫生间有人)只要有一个为1,结果就是1。用法三:限制数值范围你可以用max和min组合来"夹紧"一个数值的范围。比如你想让灯光亮度在20到80之间,低于20的按20算,高于80的按80算:min(80,max(20,亮度值))。这个技巧在自动调光中非常有用。3.2.3round——四舍五入取整round函数用于对小数进行四舍五入取整。它最常见的用途是在小爱播报前把数字取整,避免小爱播报出"当前温度26.3456789度"这样的长小数。比如温湿度传感器上报的温度通常有一位小数(26.5),但经过计算后可能变成多位小数。在让小爱播报之前,用round函数取整或保留一位小数:round(温度)→27(四舍五入到整数)round(温度×10)/10→26.5(保留一位小数,先乘10取整再除10)3.2.4floor/ceil——向下/向上取整floor是向下取整(不管小数部分是多少,都舍去),ceil是向上取整(不管小数部分是多少,都进一位)。floor(2.1)=2,floor(2.9)=2ceil(2.1)=3,ceil(2.9)=3这两个函数在以下场景很有用:计算需要多少个设备:比如每个智能开关最多控制3路灯,有8路灯需要ceil(8/3)=3个开关。时间计算:比如计算设备运行了多少个完整小时,用floor(时长/3600000)。变量编码解码:在2.3节的数值位编码中,解码时需要用floor函数来截取每一位。💡小贴士round、floor、ceil的区别:round是四舍五入(2.5→3,2.4→2),floor是永远向下(2.9→2),ceil是永远向上(2.1→3)。根据实际需求选择,不要搞混。3.2.5pow——幂运算pow(x,y)计算x的y次方。比如pow(2,3)=8,pow(10,2)=100。在智能家居中,pow函数的直接应用场景不多,但在一些特殊计算中会用到。比如你想根据环境亮度自动调整灯光亮度,可能需要非线性的映射关系(亮度差越大,灯光调整幅度越大),这时候可以用pow函数来实现指数曲线。3.3随机函数的创意玩法随机函数是极客版中最有趣的函数,它可以让你的智能家居变得"不那么死板"。rand()生成0到1之间的随机小数,randint(x,y)生成x到y之间的随机整数。3.3.1随机色彩灯光RGB彩灯可以显示1600万种颜色。如果你想让灯光每次开启时显示不同的颜色,可以用随机函数生成随机的色相值。实现方法:触发:灯光开启动作:数值运算randint(1,65535),把结果赋值给变量"随机色相"动作:把灯光的色相设置为"随机色相"变量的值这样每次开灯,灯光的颜色都不一样,充满惊喜感。3.3.2随机延迟防循环在一些场景中,你可能需要避免两个自动化同时触发。比如你有两盏灯,都由同一个传感器触发,如果同时开启可能会造成网络拥堵。你可以给其中一盏灯加一个随机延迟:灯1:传感器触发后立即开启灯2:传感器触发后延迟randint(1,3)秒再开启这样两盏灯不会同时开启,减少了同时通信的压力。3.3.3模拟"有人在家"当你出门旅行时,可以用随机函数模拟有人在家的效果,起到防盗作用:触发:每天晚上6点到10点之间,随机时间点实现:用定时触发+rand函数计算随机延迟,然后开启/关闭灯光、窗帘等设备效果:灯光开关的时间每天都不一样,看起来像真的有人在家3.3.4随机播报内容如果你有多个播报内容想轮换,可以用随机函数来选择:创建文本变量"播报内容1"、"播报内容2"、"播报内容3"触发:需要播报时动作:randint(1,3)生成随机数,然后用条件判断选择对应的播报内容3.4时间函数与时间戳计算时间函数是极客版中非常实用的一类函数。now()函数返回当前时间戳(从1970年1月1日00:00:00到现在的毫秒数),year/month/day/hour/minute返回当前的日期时间信息。3.4.1时间戳的本质时间戳是一个很大的数字,比如2026年8月30日的时间戳大约是1756569600000。这个数字本身没有直观意义,但它的"差值"非常有用——两个时间戳相减,得到的就是两个时间点之间的毫秒数。时间戳的典型用途:计算设备运行时长(关闭时刻-开启时刻)计算距离某个事件过去了多久(现在-事件发生时刻)给事件打上时间标记,用于后续判断3.4.2实战:电视观看时长提醒我们在2.7节已经学过如何用now()计算设备工作时长。这里再扩展一个应用:电视观看超过2小时自动提醒休息。变量设计:电视_时间_开启时刻(数值)电视_状态_已提醒(数值,初始0,防止重复提醒)规则设计:规则1(记录开启):电视开启时,now()赋值给"电视_时间_开启时刻",同时把"已提醒"设为0规则2(时长检查):每5分钟定时触发,查询变量判断now()-电视_时间_开启时刻>=7200000(2小时=7200000毫秒)且已提醒=0,如果满足则小爱播报"您已经看电视2小时了,请注意休息",并把已提醒设为1用"已提醒"变量的目的是防止每5分钟都提醒一次。提醒一次后把变量设为1,后续的定时检查就不会再触发了。3.4.3日期函数的应用year()、month()、day()、hour()、minute()函数可以直接获取当前的日期时间信息,不需要额外的设备。day()函数返回0-6,对应周日到周六。这个函数在"工作日/周末"判断中很有用:工作日:day()>=1且day()<=5(周一到周五)周末:day()==0或day()==6(周日或周六)比如你可以做一条规则:工作日早上7点闹钟,周末早上9点闹钟。用day()函数来判断是工作日还是周末,然后设置不同的闹钟时间。hour()和minute()函数可以用于更精细的时间判断。比如你想在"晚上10点到早上6点之间"执行某个动作,可以用条件:hour()>=22或hour()<6。💡小贴士注意极客版的时间段卡片和hour()函数的区别:时间段卡片是"在某个时间段内"的静态条件,而hour()函数是动态获取当前小时,可以和其他变量组合进行更复杂的判断。3.5三角函数的特殊应用sin、cos、tan等三角函数在智能家居中用得不多,但在一些特殊场景中可以发挥意想不到的作用。三角函数的输入是"弧度",不是角度。弧度和角度的换算关系是:弧度=角度×pi()/180。3.5.1平滑过渡效果sin函数的值在-1到1之间周期性变化,可以用来实现平滑的呼吸灯效果。比如你想让灯光亮度在30到80之间平滑变化:亮度=55+25×sin(now()/10000)这里now()/10000让变化速度变慢,55是中心亮度,25是变化幅度不过极客版的自动化是事件驱动的,不是持续运行的,所以实现真正的呼吸灯需要配合定时触发(比如每0.5秒更新一次亮度),这会给中枢网关带来较大负担。建议只在特殊场合(比如节日氛围)短暂使用。3.5.2日出日落模拟太阳的高度角可以用sin函数近似计算。如果你想模拟日出日落时的光线变化,可以用sin函数来计算灯光的亮度和色温曲线。不过极客版已经内置了日出日落时间卡片,通常不需要自己用三角函数计算。3.6表达式编写技巧与调试3.6.1表达式的基本语法在数值运算卡片中,你可以直接输入表达式。表达式的基本规则:支持加减乘除:+-*/支持括号:()支持函数:函数名(参数1,参数2,...)支持变量:$变量名或点击(x)按钮选择多个参数用英文逗号分隔合法的表达式示例:客厅温度+2(机柜温度-客厅温度)*1.8+32(摄氏度转华氏度)max(客厅温度,卧室温度,卫生间温度)round(abs(室内温度-室外温度))min(100,max(0,亮度值))3.6.2常见表达式错误用了中文逗号或括号:表达式中的逗号和括号必须是英文半角的,中文符号会导致解析错误。函数名拼写错误:函数名是小写的,比如max不能写成Max,round不能写成Round。参数数量不对:比如max函数至少需要2个参数,abs函数只能有1个参数。变量名包含特殊字符:变量名中如果有空格或特殊字符,在表达式中可能无法正确识别。除零错误:如果表达式中有除法,确保除数不会为0。3.6.3表达式调试技巧如果你的表达式计算结果不对,可以用以下方法调试:1.分步计算:把复杂表达式拆成多个简单的数值运算卡片,每一步的结果都赋值给一个临时变量,然后查看每个变量的值来定位哪一步出错了。2.小爱播报:把计算结果通过文本拼接让小爱播报出来,直观地看到结果是多少。3.用已知值测试:把变量暂时替换成已知的固定数字,看计算结果是否符合预期。3.7实战:温差自动控温系统现在我们来做一个综合实战,用函数和变量实现一个"温差自动控温系统"。这个系统可以根据室内外温差自动调整空调温度,达到节能的目的。3.7.1需求分析研究表明,空调设定温度和室外温度的差值每减少1度,空调能耗可以降低约6-8%。所以当室外比较凉爽时,我们可以把空调温度调高一些(比如28度),既节能又不会觉得热。当室外很热时,再把温度调低一些(比如26度)。我们的目标是:空调温度=室外温度-固定差值,但限制在24到28度之间。3.7.2变量设计室外_环境_温度(数值,由室外温湿度计维护)室内_环境_温度(数值,由室内温湿度计维护)空调_设定_目标温度(数值,计算得出)3.7.3计算目标温度创建一条规则:触发:室外温度变化(设备触发赋值的输出事件)动作1:数值运算室外温度-4(目标是比室外低4度)动作2:数值运算min(28,max(24,上一步结果))(限制在24-28度之间)动作3:把结果赋值给"空调_设定_目标温度"动作4:把空调温度设置为"空调_设定_目标温度"变量的值这里用了min和max的组合来"夹紧"温度范围:max(24,温度)确保温度不低于24度min(28,上一步结果)确保温度不高于28度3.7.4增加判断条件为了避免频繁调整空调,可以增加以下条件:只在空调开启时才调整温度室外温度变化超过1度时才重新计算(用abs判断差值)计算出的目标温度和当前设定温度差值超过1度时才执行设置这些条件可以有效减少空调的启停次数,延长设备寿命。3.8实战:RGB灯随机色彩氛围第二个实战是用随机函数实现RGB灯的随机色彩效果,适合用于派对、节日等氛围场景。3.8.1变量设计灯光_随机_色相(数值)灯光_随机_饱和度(数值)灯光_随机_亮度(数值)3.8.2实现步骤创建一条"随机色彩"规则:触发:无线开关单击(或其他触发方式)动作1:randint(1,65535)→赋值给"灯光_随机_色相"动作2:randint(50,100)→赋值给"灯光_随机_饱和度"(饱和度不要太低,否则颜色不鲜艳)动作3:randint(30,80)→赋值给"灯光_随机_亮度"(亮度不要太低或太高)动作4:把RGB灯的色相、饱和度、亮度分别设置为对应变量的值3.8.3扩展:渐变色彩如果你想让颜色缓慢变化而不是突然跳转,可以配合定时规则:每10秒触发一次,生成新的随机色相但不要完全随机,而是在当前色相的基础上加减一个随机值:当前色相+randint(-500,500)这样颜色会缓慢漂移,产生渐变效果⚠️注意频繁更新RGB灯的颜色会增加蓝牙Mesh网络的通信负担。建议更新间隔不要低于5秒,否则可能导致灯光卡顿或其他蓝牙设备响应变慢。3.9本章小结本章我们全面学习了极客版的函数系统和表达式编写。核心要点包括:1.极客版支持约20个函数,分为数学函数、三角函数、随机函数、时间函数和常数五大类。2.abs函数用于计算差值,max/min用于取极值和多传感器融合,round/floor/ceil用于取整。3.随机函数可以让智能家居更有"人情味",实现随机色彩、随机延迟、模拟有人在家等效果。4.now()时间戳的差值可以精确计算时间间隔,用于设备时长统计、超时提醒等场景。5.day()函数可以判断工作日/周末,hour()/minute()可以做精细的时间判断。6.表达式编写要注意英文符号、函数名小写、参数数量正确。7.调试表达式可以用分步计算、小爱播报、已知值测试等方法。函数和变量结合,让极客版具备了强大的计算能力。下一章我们将学习虚拟事件,它是极客版实现"模块化编程"的关键工具。

第四章虚拟事件精通——自动化的模块化编程如果说变量是极客版的"记忆",函数是"大脑",那么虚拟事件就是极客版的"神经系统"。虚拟事件让自动化之间可以互相调用,让复杂的流程可以拆分成模块化的子程序。本章我们将深入学习虚拟事件的高级用法,掌握"模块化编程"的核心技能。4.1虚拟事件的本质4.1.1什么是虚拟事件虚拟事件,顾名思义,就是"虚拟的事件"。它不是由真实设备产生的事件(比如传感器检测到人、开关被按下),而是由中枢网关自己"创造"出来的事件。你可以把虚拟事件想象成一个"自定义的信号"。你给这个信号起一个名字(比如"关闭全屋灯光"),然后在一条自动化中"发送"这个信号,在另一条(或多条)自动化中"监听"这个信号。当信号被发送时,所有监听它的自动化都会被触发。虚拟事件的本质是自动化之间的"消息传递机制"。发送方不需要知道谁在监听,监听方也不需要知道是谁发送的。这种松耦合的设计,正是模块化编程的基础。4.1.2虚拟事件与变量的区别很多新手会混淆虚拟事件和全局变量,因为它们都能实现自动化之间的通信。但它们的本质完全不同:对比项虚拟事件全局变量本质消息/信号数据/状态特性瞬时的,触发后就消失持久的,一直保存着值用途"做某件事"的指令"当前是什么状态"的记录触发方式事件发生时立即触发值变化且条件满足时触发类比函数调用全局变量简单来说:如果你想告诉另一条自动化"现在去做某件事",用虚拟事件;如果你想告诉另一条自动化"现在的状态是什么",用全局变量。比如"关闭全屋灯光"是一个指令——你发送这个事件,意思是"现在去关灯",这适合用虚拟事件。而"全屋有人"是一个状态——它持续存在,其他自动化可以随时读取,这适合用全局变量。💡小贴士一个简单的判断标准:需要"立即执行"的用虚拟事件,需要"持续查询"的用全局变量。两者经常配合使用——虚拟事件触发动作,全局变量记录动作执行后的状态。4.2虚拟事件的三大核心用法根据达人们的分享和官方文档的说明,虚拟事件有三大核心用法,每一种都能解决一类重要问题。4.2.1用法一:极客版与米家APP的桥接这是虚拟事件最基础也最重要的用法。极客版虽然功能强大,但并不是所有设备都能在极客版中直接控制——有些设备只在米家APP中支持,有些功能(比如小爱播报、扫地机器人自定义打扫)在极客版中没有对应的卡片。虚拟事件可以解决这个问题:你在极客版中发送一个虚拟事件,然后在米家APP中创建一条自动化,触发条件是"中枢网关产生虚拟事件",执行动作是那些极客版做不了的操作。反过来也可以:在米家APP中发送虚拟事件(通过"手动控制"或其他自动化),在极客版中监听这个虚拟事件来触发高级逻辑。具体步骤:1.在极客版的自动化中,选择执行动作→中枢网关→产生虚拟事件,给事件起个名字(比如"打开空调")2.打开米家APP,创建自动化,触发条件选"中枢网关"→"虚拟事件发生",输入和上面一模一样的事件名3.执行动作选你需要的设备操作(比如空调伴侣打开空调)4.保存后,极客版发送虚拟事件时,米家APP的自动化就会被触发⚠️注意虚拟事件的名称必须完全一致,包括大小写和空格。"打开空调"和"打开空调"(后面多了个空格)是两个不同的事件。建议复制粘贴事件名,避免手写出错。4.2.2用法二:极客版自动化之间的互相调用虚拟事件可以在极客版内部的不同自动化之间传递消息。这让你可以把一个复杂的大自动化拆分成多个小自动化,每个小自动化负责一个功能,然后通过虚拟事件来调用。比如你有一个"观影模式"自动化,需要做很多事情:调暗灯光、关闭窗帘、设置空调、打开电视、关闭顶灯。如果全写在一条规则里,这条规则会非常长,出了问题很难排查。用虚拟事件拆分后:规则A:观影灯光(监听"观影模式"事件,执行灯光调整)规则B:观影窗帘(监听"观影模式"事件,执行窗帘关闭)规则C:观影空调(监听"观影模式"事件,执行空调设置)主规则:触发观影模式时,发送"观影模式"虚拟事件这样每条规则都很短,职责单一,易于维护。而且规则A、B、C还可以被其他模式复用——比如"游戏模式"也可以发送"观影灯光"事件来调暗灯光。4.2.3用法三:虚拟事件嵌套调用虚拟事件还可以嵌套——一条自动化发送虚拟事件A,触发另一条自动化,那条自动化又发送虚拟事件B,触发第三条自动化。这种嵌套调用可以实现非常灵活的流程编排。比如"离家模式"可以这样设计:主规则:触发离家→发送"关闭全屋灯光"事件+发送"关闭所有窗帘"事件+发送"设置安防模式"事件"关闭全屋灯光"规则:监听事件→逐个关闭各房间灯光→完成后发送"灯光已关闭"事件"设置安防模式"规则:监听事件→等待"灯光已关闭"事件→启动安防摄像头这种嵌套设计让流程的每一步都清晰可控,而且可以在关键节点插入等待和确认逻辑。图4-1观影模式模块化架构:主触发通过虚拟事件调用灯光、窗帘、空调三个子模块4.3虚拟事件模块化设计实战现在我们来做一个完整的模块化设计实战,把一个复杂的"观影模式"拆分成多个独立的模块。4.3.1需求分析观影模式需要完成以下动作:1.客厅主灯调暗到20%亮度2.客厅氛围灯打开,设置为暖光3.客厅窗帘关闭4.空调设置为26度,自动风5.电视打开(通过红外遥控器)6.5分钟后如果没有人移动,自动关闭顶灯4.3.2模块拆分我们把这些动作拆分成以下模块:模块1:观影灯光设置监听事件:"观影_灯光"动作:主灯亮度20%,氛围灯开(暖光),顶灯关模块2:观影窗帘设置监听事件:"观影_窗帘"动作:关闭客厅窗帘模块3:观影空调设置监听事件:"观影_空调"动作:空调26度,自动风模块4:观影电视开启监听事件:"观影_电视"动作:发送虚拟事件给米家APP,由红外遥控器打开电视模块5:观影无人关灯监听事件:"观影_启动"动作:延迟5分钟→检查客厅无人→关闭顶灯主规则:观影模式启动触发:无线开关双击/小爱同学"观影模式"动作:发送"观影_灯光"+"观影_窗帘"+"观影_空调"+"观影_电视"+"观影_启动"4.3.3退出观影模式同样,退出观影模式也拆分成模块:主规则:触发退出→发送"退出_观影"事件各模块监听"退出_观影"事件,执行恢复操作(灯光恢复、窗帘打开等)4.3.4模块化的好处这样拆分后,你会发现很多好处:单独测试:每个模块可以单独触发测试,比如你只想测试灯光设置,直接发送"观影_灯光"事件即可。独立修改:想调整观影时的灯光亮度,只改模块1,不需要动其他模块。复用性:"观影_灯光"模块还可以被"游戏模式"、"约会模式"等其他场景调用。易于排错:如果观影模式出了问题,你可以逐个触发模块,快速定位是哪个模块出了问题。💡小贴士模块化设计的关键是"单一职责原则"——每个模块只做一件事。如果一个模块做了两件不相关的事,就应该把它拆成两个模块。模块的粒度越细,复用性和可维护性就越高,但模块太多也会增加管理成本。建议根据实际情况找到平衡点。4.4虚拟事件桥接非中枢设备虚拟事件的另一个重要用途是桥接那些不能直接接入中枢网关的设备。4.4.1哪些设备需要桥接以下设备通常不能在极客版中直接控制,需要通过虚拟事件桥接:红外控制的设备(电视、空调、机顶盒):需要通过米家APP的红外遥控器功能只支持WiFi不支持蓝牙Mesh/Zigbee的设备:有些WiFi设备在极客版中没有执行卡片第三方品牌设备:通过米家APP接入但不在中枢网关本地执行的设备扫地机器人:自定义打扫、区域清扫等高级功能通常只在米家APP中支持小爱音箱:播报、问答等交互功能需要通过米家APP触发4.4.2桥接的实现方法桥接的基本思路是"极客版发事件,米家APP做动作":1.在极客版中,需要控制非中枢设备时,执行"中枢网关产生虚拟事件"2.在米家APP中,创建自动化,触发条件是"中枢网关虚拟事件",执行动作是控制目标设备3.事件名称在两边必须完全一致比如你想在极客版的自动化中打开电视(电视通过红外遥控器控制):极客版:发送虚拟事件"打开客厅电视"米家APP:触发条件"中枢网关-虚拟事件-打开客厅电视"→执行"红外遥控器-电视-开机"4.4.3反向桥接:米家APP触发极客版有时候你需要反过来——在米家APP中触发极客版的高级逻辑。比如你想用小爱同学的语音来触发一个复杂的极客版自动化。方法是:1.在米家APP中创建自动化(或手动场景),执行动作选"中枢网关-产生虚拟事件"2.在极客版中创建自动化,触发条件选"中枢网关-虚拟事件发生"3.事件名称两边一致比如你想让小爱同学执行"回家模式"(这个模式在极客版中实现了复杂的逻辑):米家APP:创建手动场景"回家模式",执行动作"中枢网关产生虚拟事件-回家模式"在小爱训练中添加指令:"我回来了"→执行手动场景"回家模式"极客版:触发条件"虚拟事件-回家模式"→执行复杂的回家逻辑图4-2跨生态联动:中枢网关通过虚拟事件桥接米家设备和第三方设备4.5虚拟事件与变量的配合模式虚拟事件和全局变量经常配合使用,形成"事件触发+状态记录"的经典模式。4.5.1模式一:事件触发,变量记录状态当一个事件发生时,不仅要执行动作,还要记录当前的状态,供其他自动化查询。比如"回家模式"被触发时:发送虚拟事件"回家模式"(触发各种回家动作)把全局变量"家庭模式"设为1(1=在家,记录当前状态)其他自动化可以通过查询"家庭模式"变量来知道当前是否在家,而不需要监听"回家模式"事件。4.5.2模式二:变量判断,事件触发动作先判断变量状态,根据状态决定发送什么事件。比如无线开关被单击时:查询变量"当前灯光模式"如果是0(日常模式)→发送"切换到阅读模式"事件,变量设为1如果是1(阅读模式)→发送"切换到观影模式"事件,变量设为2如果是2(观影模式)→发送"切换到日常模式"事件,变量设为0这就是我们第五章要讲的"状态机"模式,变量记录当前状态,事件触发状态转换和对应动作。4.5.3模式三:事件确认机制在重要的自动化流程中,可以用变量来做"确认",确保前一步完成后再执行下一步。比如"离家模式"中,你想确保所有灯都关闭后再启动安防:发送"关闭全屋灯光"事件每条灯光关闭规则在完成后,把对应房间的"灯光状态"变量设为0安防启动规则监听所有"灯光状态"变量,当全部为0时才启动安防这种模式虽然复杂,但能确保流程的可靠性。4.6实战:小爱主动问询交互虚拟事件和变量结合,可以实现一个非常酷的功能——小爱音箱主动问询。比如你晚上回家开门时,小爱主动问你:"需要打开客厅灯吗?"你回答"是的",灯就打开了。4.6.1实现原理这个功能需要极客版和米家APP配合:1.极客版检测到开门事件,判断需要问询,发送虚拟事件2.米家APP收到事件,让小爱播报问询语3.用户回答后,小爱训练识别回答,发送另一个虚拟事件4.极客版收到回答事件,执行对应动作4.6.2变量设计系统_状态_等待回答(数值,初始0):记录是否正在等待用户回答系统_状态_问询类型(数值,初始0):记录当前问询的是什么(1=开灯,2=开空调等)4.6.3极客侧规则规则1:开门问询触发:门锁开门且时间在晚上且客厅灯关闭动作:把"等待回答"设为1,"问询类型"设为1动作:发送虚拟事件"问询_是否开灯"规则2:收到肯定回答触发:虚拟事件"回答_是"动作:查询变量"问询类型"如果=1(开灯问询)→打开客厅灯动作:把"等待回答"设为0规则3:收到否定回答触发:虚拟事件"回答_否"动作:把"等待回答"设为0(不执行任何动作)4.6.4米家APP侧规则规则1:播报问询触发:中枢网关虚拟事件"问询_是否开灯"动作:小爱播报"需要打开客厅灯吗?"规则2:识别回答(在小爱训练中设置)指令:"是的"/"好的"/"开吧"等肯定回答条件:"等待回答"变量为1(可选,通过米家APP的条件判断)动作:中枢网关产生虚拟事件"回答_是"指令:"不用"/"不需要"/"算了"等否定回答动作:中枢网关产生虚拟事件"回答_否"4.6.5超时处理为了防止用户不回答导致"等待回答"变量一直为1,可以加一个超时规则:触发:"等待回答"变量变为1后,延迟30秒动作:把"等待回答"设为0,"问询类型"设为0这样30秒内用户没有回答,系统就自动取消问询状态。💡小贴士小爱主动问询是一个非常高级的玩法,需要仔细调试。建议先从简单的问询开始(比如"是否开灯"),跑通整个流程后再扩展到更多场景。注意小爱训练的识别率不是100%,用户的回答方式要尽量标准化。4.7虚拟事件使用注意事项4.7.1命名规范虚拟事件的命名建议和变量一样,采用"区域_功能_描述"的格式,比如:客厅_灯光_观影客厅_灯光_日常全屋_模式_回家全屋_模式_离家这样事件多了之后也能一目了然。4.7.2避免循环触发虚拟事件最容易出的问题是"循环触发":A规则发送事件X触发B规则,B规则又发送事件X触发A规则,形成死循环。避免循环的方法:确保事件的流向是单向的,不要形成环在关键规则中加入变量判断,只有满足条件时才发送事件给可能循环的规则加"防抖"——同一事件在短时间内只处理一次4.7.3不要过度使用虚拟事件虽然强大,但不是所有场景都需要用。如果一个动作只在一个地方用到,直接写在规则里就好,不需要拆成虚拟事件。过度使用虚拟事件会导致规则数量膨胀,增加管理难度。一个好的判断标准:如果一段逻辑会被两个以上的自动化调用,或者这段逻辑本身比较复杂(超过5个动作),就值得拆成虚拟事件模块。否则直接写在主规则里更简单。4.8本章小结本章我们深入学习了虚拟事件的高级用法。核心要点包括:1.虚拟事件的本质是自动化之间的消息传递机制,实现松耦合的模块化编程。2.虚拟事件是"瞬时的指令",全局变量是"持久的状态",两者配合使用效果最佳。3.三大核心用法:桥接米家APP、自动化之间互相调用、嵌套调用实现复杂流程。4.模块化设计的关键是单一职责原则,每个模块只做一件事。5.虚拟事件可以桥接红外设备、WiFi设备、第三方设备等非中枢设备。6.小爱主动问询是虚拟事件+变量+米家APP配合的高级玩法。7.注意命名规范、避免循环触发、不要过度使用。虚拟事件让极客版从"单条自动化"升级到"自动化系统"。下一章我们将学习状态机设计,这是构建复杂可靠逻辑的核心方法。

第五章复杂逻辑与状态机设计当你的自动化越来越复杂时,简单的"如果A就做B"已经不够用了。你需要处理多个状态之间的转换、多个条件的组合、防止误触发和循环。这时候就需要"状态机"思维。本章我们将学习如何用变量和虚拟事件实现状态机,设计出稳定可靠的复杂逻辑。5.1状态机思维入门5.1.1什么是状态机状态机是计算机科学中的一个经典概念,它的核心思想是:一个系统在任何时刻都处于某个"状态",当某个"事件"发生时,系统会根据当前状态和事件,转换到一个新的状态,并执行对应的动作。听起来很抽象,我们用一个生活中的例子来说明。电梯就是一个典型的状态机:状态:开门、关门、上升、下降、停止事件:按楼层按钮、到达楼层、开门按钮、关门按钮转换:在"停止"状态下按了楼层按钮→进入"上升/下降"状态;在"上升"状态下到达目标楼层→进入"停止"状态,然后开门状态机的好处是:它把系统的所有可能状态和转换都明确地列出来,不会出现"不知道当前该做什么"的混乱情况。5.1.2为什么智能家居需要状态机智能家居中的很多场景本质上都是状态机。比如"家庭模式"就是一个状态机:状态:在家、离家、睡眠、观影事件:门锁开门、门锁上锁、睡觉时间到、无线开关被按转换:离家状态下门锁开门→在家状态;在家状态下睡觉时间到→睡眠状态如果不用状态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论