翻译自:https://home-assistant.io/developers/architecture/
我是为了方便自己理解作出的翻译,供大家参考,转载请注明出处!
系统架构
在我们深入到家庭助理的架构之前,先知道家庭自动化系统清晰的整体概念是非常重要的。请允许我们用图片展现家庭助理的不同部分。会有有一个时间比较长的讨论在概述中各部分负责的功能,看看我们的博客。一个简洁版本的博客:
- Home Control负责导通收集信息和控制设备。
- Home Automation根据用户的配置触发命令。
- Smart Home触发基于之前的出现过的行为命令。(智能吗?)
家庭自动化概述
Home Assistant内核负责家庭控制。它有四个部分,包括以下功能:
- 该Event Bus 有利于事件的触发和听力。这是Home Assistant跳动的心脏。
- 该State Machine 跟踪事物的状态。当状态已经改变时,发送state_changed的事件。
- 该Service Registry监听Event bus(事件总线)上的call_service事件,并允许其他代码来注册服务。
- 该Timer 将发送的每1秒的time_changed事件给Event bus。
民政助理核心架构的概述
家庭助理可以通过components(组件)扩展的。每个组件负责在家庭助理特定的域。组件可以监听或触发事件,提供服务和保持状态。组件是用Python编写的,可以做所有的Python所提供的善良。开箱即用,家庭助理提供了一堆内置的组件。
我们可以在助手首页区分两个不同类型的组件。
物联网领域里相互作用的组件
这些组件将在一个特定域内跟踪装置和存在一个核心部分和特定平台的逻辑的。这些组件使得可通过State Machine和 Event Bus获得他们的信息。该组件也将在 Service Registry注册服务,公开设备的控制方法。
例如,内置的组件之一是switch
组件。此组件是负责与不同类型的开关交互。
如果你打算增加一个新的平台,请查看添加新的平台部分。
家庭助手中对事件作出响应的组件
这些组件提供小部分的家居自动化逻辑或服务——在你的房子里做些普通任务。
例如,device_sun_light_trigger
组件跟踪设备的状态和太阳,以确保在灯都打开天黑时或有人在家。该组件的使用逻辑大致如下:
In the event that device 'Paulus Nexus 5' changes to the 'Home' state:
If the sun has set and the lights are not on:
Turn on the lights
In the event that the combined state of all tracked devices changes to 'Not Home':
If the lights are on:
Turn off the lights
In the event of the sun setting:
If the lights are off and the combined state of all tracked device equals 'Home':
Turn on the lights
家庭自动化组件的扩展例子可以点这里。
全貌
当我们把家庭助理的所有的不同部分组合在一起,我们看到,非常接近最初的草图家庭自动化概述。智能家居的AI智能是尚未实现,因此,从下面的图片中省略。
完整的家庭助理架构与情侣装组件和平台的概述。
组件的平台逻辑使用第三方Python库的设备进行通信。这样做是为了让我们可以利用那些Python社区伟大的设备库。
多个连接实例
家庭助理支持使用主从模式运行多同步的实例。每当从机调用events.fire
或states.set
,它将其转发给主机。主机会复制所有的事件并改变状态回复从机。
民政助理架构的多种设备的概述。
从实例可以开始下面的代码,并具有组件作为主实例同样的支持。
import homeassistant.remote as remote
import homeassistant.bootstrap as bootstrap
# Location of the Master API: host, password, port.
# Password and port are optional.
remote_api = remote.API("127.0.0.1", "password", 8124)
# Initialize slave
hass = remote.HomeAssistant(remote_api)
# To add an interface to the slave on localhost:8123
bootstrap.setup_component(hass, 'frontend')
hass.start()
hass.block_till_stopped()
因为每个从机维护其自己的ServiceRegistry,它可能有多个从机对一个服务呼叫作出响应。