米家的无线开关有极速和标准两个模式,前者响应快,后者花样多。由于双无线开关拥有两个按键,所以自然而然的,为什么不能一个按键走极速响应,另一个按键走标准模式,允许单击、双击甚至更多。

一、基础信息

1.1 前置条件

  • 网关(必须):小米智能中枢网关;
  • 开关:小米无线开关(双键版);
  • 小米无线开关操作模式设置为极速模式。

1.2 前置知识

关于事件处理

已知中枢网关处理触发事件(事件发生或状态更新类卡片)不是实时响应的,而是每隔一秒钟处理一次,对于开关而言,连续的点击行为相当于存进了一个先入先出的待处理队列中。

关于延时卡片

极客版中的延时卡片天生是一个防抖实现:每一次流程到达延迟卡片时其状态均会被重置,在延时未完前重复触发将推迟最终的结束时间;此外延时卡片没有中途停止功能,这点需要留意。

二、设计思路

以按键的单击事件作为触发信号,利用『到达指定次数时』卡片区分实际按下次数,利用『自定义状态』卡片作为条件区分需要响应的分支路线,利用『延时』卡片在时间到达后作为执行信号,利用『当-如果-就』卡片根据执行信号和条件去执行具体真实的操作,这样整体就可以拆分成触发事件和状态条件两部分。

基础逻辑

触发事件

主要用途:作为执行操作的时间信号,在用户按下开关的一定时间后触发任务的执行。

由于中枢网关不是实时响应,为了顺利的在一轮自动化中完整执行而不进入到下一轮判断,那么完整运行所需的总时间至少大于 (按下次数 - 1) 秒,以模拟三次按键点击举例,这个时间为至少两秒;另一方面在极客版中时间控制由延时卡片实现,结合其特性,实际效果为用户最后一次按下开关的两秒后开始执行。

最后一次开关按下后的相应秒数再去执行有些太慢了,这里就有两个优化思路:

  1. 想办法不重置延时卡片的状态,保留第一次开关按下后的延时状态;
  2. 根据中枢网关特性,如果在一秒后没有出新的按下事件,就可以认为本轮按键已经结束。

延时控制

状态条件

主要用途:区分实际的按下次数,输出一个布尔值用于执行操作前的判断。

无线开关按下后开始计数,自定义状态卡片未初始化时默认为假,利用下一次的计数到达否认上一次的计数状态,再将自己的状态置为真。

状态控制

最后再结合上面的触发事件,在延时结束时再重置计数和自定义状态重置为假,那么可以得到这样的结果:

(图中最左侧的延时卡片为使整体排版整齐而设计,非必须)

为了避免网络传输带来的延时,每个延时卡片加入了 50ms 的误差,这样我们就完成了单键对多键的模拟操作,单次按键最快在一秒后相应,而二三次按键能够在两秒后完成响应。

三、案例分享

双线无线开关:一个按键走极速响应,另一个按键模拟三键。

双键无线开关

评论