物联网分类
家庭自动化的核心,在于知道当前发生了什么。我们越快知道状态发生了变化,就越能更好地为你服务。比如,如果你希望回家时灯光自动打开,那么要是系统只能在你已经开门、甚至还得手动把灯打开之后才知道你到家了,那显然没有帮助。
每个智能设备都由两部分组成:一部分是“普通”的设备本体,另一部分是让它变“智能”的连接能力。设备的连接能力可能包含控制、状态,或两者兼有。
状态描述的是设备当前正在做什么。比如,一盏灯可能处于开启状态,颜色是红色,亮度为中等。
控制指的是通过 API 发送命令来操控智能设备。这些命令可能包括配置设备的工作方式,或者模拟用户与设备交互的方式。媒体播放器可能支持切换到下一首曲目,而传感器则可能允许你配置其灵敏度或轮询间隔。
Home Assistant 的 API 已尽量设计得足够方便。不过,网络系统的强弱总取决于最薄弱的一环。对我们来说,这一环就是各个集成。以一盏不会上报状态的灯为例,在发送命令之后,Home Assistant 唯一能报告的就只是“假定状态”:也就是如果命令执行成功,我们预计这盏灯会处于什么状态。
我们希望你能获得尽可能好的家庭自动化体验,而这要从确保设备能与 Home Assistant 良好配合开始。因此,我们将开始为各个集成应用以下分类标记:
至于我们为什么会整理出这些分类标记,你可以在下文中继续了解。
状态
状态的传递方式可以分成 5 类。这些分类并不是互斥的,同一个设备的状态可能同时通过云端和本地连接获得。
没有可用状态
这类设备没有能力公开自己的状态。它们只能被控制。比如使用红外遥控器控制的设备,像电视和空调。你可以按下遥控器上的开机按钮,但你只能假定你的命令已经被设备接收并成功执行。设备可能根本没有通电,或者有东西挡住了红外接收器。
家庭自动化面对这类设备时,只能基于“命令会被正确接收”的假设来工作,也就是采用乐观更新。意思是,发送命令之后,系统会把设备状态更新为“仿佛命令已经成功执行”的结果。
优点:
- 无
缺点:
- 如果命令没有被正确接收,或者设备通过家庭自动化系统之外的其他方式被控制,家庭自动化就会假定出错误的状态。
轮询云端
这类设备只会把状态上报给自己的云端后端。云端后端允许你读取状态,但不会在有新状态到来时主动通知。这意味着家庭自动化系统必须频繁检查状态是否发生了变化。
优点:
- 无论你在家还是外出,都可以控制设备。
- 云端可以利用更强的计算能力分析设备数据,并向你提供优化建议。
缺点:
- 一旦互联网中断,或者厂商停止支持,这套方案就无法工作。
- 你将不再完全掌控谁可以访问你的数据。
云端推送新状态
前一节的内容同样适用于这里。除此之外,云端现在还会在有新状态到来时通知家庭自动化系统。这意味着云端一知道,家庭自动化系统也就立刻知道。
优点:
- 新状态一旦在云端可用,系统就能立即获知。
轮询本地设备
这类设备会提供一个可在本地访问的 API。家庭自动化系统需要频繁检查状态是否发生了变化。
优点:
- 不依赖互联网。
缺点:
- 若要支持轮询,设备就必须始终在线,这意味着它需要持续接入电源。
本地设备推送新状态
这是最理想的情况。这类设备在进入新状态时会主动发出通知。它们通常会使用某种家庭自动化协议,把消息传递给一个 Hub,再由 Hub 负责管理并通知订阅者。
优点:
- 新状态几乎可以瞬时送达。
- 设备可以在两次状态更新之间进入深度休眠,从而获得更长的电池续航。
缺点:
- 如果它同时不支持轮询,那么在家庭自动化系统启动之后,只有等状态真正变化时,系统才会知道当前状态。
- 如果设备通过 Wi-Fi 并采用深度休眠,那么它在唤醒时会产生延迟,因为连接 Wi-Fi 和获取 IP 地址都需要时间。
控制
和状态一样,控制设备也可以通过云端和/或本地连接来完成。但控制中更重要的一点,是知道你的命令是否执行成功,以及设备的新状态是什么。
没有可用控制
这类设备无法被控制。它们只能提供状态。
发送命令后轮询状态
这类设备需要在发送命令后,再去轮询状态,才能知道命令是否执行成功。
优点:
- 命令发送后,系统可以很快尝试确认状态。
缺点:
- 状态更新可能需要时间。我们该多久轮询一次,又该等待多久才认定命令失败?此外,状态也可能由于其他因素而变化,因此很难判断更新后的状态究竟是不是由我们的命令引起的。
设备主动推送状态更新
这类设备不会把新状态作为命令的直接返回值,而是会立刻主动推送一个新的状态。这个方案的缺点是,我们只能假定:如果某个状态更新在发送命令后的一段时间内到达,那它就与这次命令有关。
命令直接返回新状态
这是最好的情况。这类设备会在执行命令之后,直接以响应的形式返回新的状态。
Home Assistant 的分类
Home Assistant 会尽量通过自己的 API 提供最好的使用体验。与 Home Assistant 交互的方式有多种,但它们全部都是本地的。
- 可以通过 REST API 轮询状态。
- 还提供了一个流式 API,会在有新状态到达时立即推送给订阅者。这也是前端始终能够保持同步的原因。
- 调用 Home Assistant 中的某个服务时,返回结果会包含该服务执行期间发生变化的所有状态。遗憾的是,这并不总能包含那些通过主动推送来上报新状态的设备的最终状态,因为这些状态有可能会在服务执行结束之后才到达。

