物联网分类

家庭自动化的核心,在于知道当前发生了什么。我们越快知道状态发生了变化,就越能更好地为你服务。比如,如果你希望回家时灯光自动打开,那么要是系统只能在你已经开门、甚至还得手动把灯打开之后才知道你到家了,那显然没有帮助。

每个智能设备都由两部分组成:一部分是“普通”的设备本体,另一部分是让它变“智能”的连接能力。设备的连接能力可能包含控制、状态,或两者兼有。

状态描述的是设备当前正在做什么。比如,一盏灯可能处于开启状态,颜色是红色,亮度为中等。

控制指的是通过 API 发送命令来操控智能设备。这些命令可能包括配置设备的工作方式,或者模拟用户与设备交互的方式。媒体播放器可能支持切换到下一首曲目,而传感器则可能允许你配置其灵敏度或轮询间隔。

Home Assistant 的 API 已尽量设计得足够方便。不过,网络系统的强弱总取决于最薄弱的一环。对我们来说,这一环就是各个集成。以一盏不会上报状态的灯为例,在发送命令之后,Home Assistant 唯一能报告的就只是“假定状态”:也就是如果命令执行成功,我们预计这盏灯会处于什么状态。

我们希望你能获得尽可能好的家庭自动化体验,而这要从确保设备能与 Home Assistant 良好配合开始。因此,我们将开始为各个集成应用以下分类标记:

分类标记 说明
假定状态 我们无法获取设备的状态。我们能做的最好情况,就是根据最后一次发送的命令来假定设备当前的状态。
云端轮询 此设备通过云端进行集成,并且需要可用的互联网连接。由于是轮询状态,因此系统可能会较晚才注意到更新。
云端推送 此设备通过云端进行集成,并且需要可用的互联网连接。一旦有新的状态可用,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 中的某个服务时,返回结果会包含该服务执行期间发生变化的所有状态。遗憾的是,这并不总能包含那些通过主动推送来上报新状态的设备的最终状态,因为这些状态有可能会在服务执行结束之后才到达。