【HASS初级教程】2-初探工作原理并编写配置文件
-----编辑中,内容感觉还是不够简明精炼,格式也有点乱,请大家多批评,慢慢修改-------
前言
上篇教程,我们初识了HASS的前端UI,并了解了HASS的配置文件基本情况。
本篇教程,我们将继续学习HASS运行的基本原理,了解核心和组件的概念,并以此来帮助我们理解配置文件的编写方式。
一、HASS的工作原理(简略版)
新手不用担心,虽然标题很抽象,但是本章实际上不会涉及太难理解的知识点。只需要熟读本章内容,确保在脑海中建立组件
和核心
的初步概念。
1. 核心和组件在哪里
HASS是用Python
语言编写的程序,这个程序由诸多包含源代码的源文件组成(源代码是程序的原始代码,Python
程序的运行直接依靠对源文件的解释和编译,通常不需要生成可执行文件
)。这些源文件,分门别类的归档存放在我们的计算机中的,他们按照功能不同,构成了HASS程序中的各个部件,我们把每个这样相对独立部件称为HASS的组件
。其中,最原始、最重要、最必须的那个部件,我们叫做核心
。
上图是HASS的代码库,橙色部分都属于组成核心的源文件,而紫色部分虽然只有一个文件夹,里面包含了很多的组件的源文件哦。
核心
其实比一般的组件
要复杂一些,核心
还可以细分为很多模块,但是本文只需要你把它们看作一个整体就好了。
2. 核心和组件如何工作
我们把核心
看作是一个特殊的组件
,是HASS启动后自动加载运行、并贯穿全程的程序代码段。它实现了事件总线、状态机、服务注册等基础性的服务。并且,核心
是调用其它组件
的基础和前提。其它组件
都要通过核心
来调用,除了一部分特定的系统组件
外,普通组件
并不会被核心
自动加载和配置。
HASS的核心
启动后,会自动在配置文件根目录
下,寻找并读取配置文件
,并根据文件内容去调用相应的组件
,并配置组件
。若文件的编写和配置不当,组件
的调用就会出问题,轻则功能缺失,重则打断核心
的运行,造成HASS当机。
HASS的工作过程,就好比一个团队在领导的带领下协同工作,共同完成某项任务,举个栗子:
核心
=组织者和管理者,简称领导
。协同合作工作的第一步,就是建立组织、明确领导,没有一个主心骨和牵头人,工作没法顺利的开展和进行,而领导的主要才能,就是拥有一套组织管理的套路手段;
组件
=某项分工的具体实施者,简称人才
。即某个领域的专职人员,比如秘书、司机、保安、厨师、医生、电工、律师、程序员、平面设计师、编辑、播音员、翻译...
配置文件
=工作方案
。在工作方案中,我们决定任用哪些人才
并为他们准备好工作的前提条件,以使得工作得以顺利进行,比如,给司机一把车钥匙,并告诉他车子停在哪里;告诉厨师需要准备几个人的菜,以及有什么忌口和要求。
工作方案确定后,领导就按照工作方案中指定的要求,来到人才库,挑选天命之人,并为他们提供工作的条件,然后这些人才就各自开展工作,并在领导的带领和管理下,收集和分析各类资源信息、接入和掌控外部设施设备、向领导汇报情况并接受领导下达的指令、向其他人才提供帮助和支持......
在人才库中,有些人才是辅助领导和支持团队的,比如秘书
。这些人才就好比HASS的系统组件
。有的时候,我们在工作方案中没有要求秘书
到场,但是领导
也不是傻的,他会自动带上秘书
,并且提供他默认的工作条件。虽然有时我们没有在配置文件
中调用某个组件
,但是实际上,它可能已经被其它组件
调用并完成了默认的初始化。这种情况是存在的。这显然并不是什么典型的情况,而且只是组件之间的问题,通常也仅存在于核心
和系统组件
之间,所以我们暂时不需要研究这些,只需要按自己的需求,写好配置文件
即可。
补充:
组件
本身只是个程序逻辑,并不是一个可操作的对象。当组件加载成功后,核心才会根据组件的要求生成相关的实体及状态、服务、事件等等。它们才是我们在HASS中具体操作的对象。所以,理解这些对象的概念,对于我们学习HASS的配置来说,同样具有有重要意义,系列教程后面将介绍实体
和状态
等概念。
二、加载和配置组件(基础版)
通过上面的啰嗦,我们初步了解到核心、组件,以及与配置文件的关系。
下面我们试试看,自己编写配置文件,从而让HASS的核心
调用组件
并实现简单的功能。
转到配置文件根目录
,将原来的configuration.yaml
重命名为configuration.yaml.bak
,然后新建一个空白的configuration.yaml
文件(需要使用原来的配置文件的时候,只需删除此配置文件,并把备份文件的.bak去掉)。没错,让我们从零开始。
1. 如何在配置文件中,调用组件:
例子:
在空白的配置文件
中,输入以下内容:
frontend:
注意:
- YAML文件中的英文和符号必须使用半角字符。
- HASS中的YAML文件,编码方式必须为UTF-8。
然后重启HASS服务(这里恕不叙述重启服务的方法了,不会的话直接重启设备或者容器吧)。现在,打开你的浏览器,输入http://HASS主机IP:8123
,你就可以登录到HASS的WEB前端,是不是很简单。
没错,只要这么1行,9个字符,你就可以获得1个支持WEB前端UI的HASS实例。这一行代码的作用,可以让核心调用前端组件,从而为HASS提供一个WEB前端UI。
写法:(顶格)
组件名:
说明:顶格书写组件名+冒号
,前后都不用加任何符号。
用途:例子中调用了frontend
(前端)组件,从而为我们的HASS提供了前端服务。
讲解:
核心
读取配置文件
中顶格书写的组件名,调用对应的组件
。
- 在HASS的组件库中,常用的组件有很多,
frontend
组件只是其中之一,其它还有比如homeassistant
(核心)组件、http
(网络)组件、group
(群组)组件等。
- 没有在
配置文件
中写入的组件,不一定没有被核心
调用。特别是系统组件,比如logger
(日志)组件,即使没有在配置文件
中调用,也会自行被核心
加载并进行默认的配置。
2. 如何在配置文件中,配置组件:
例子:
下面,我们再把配置文件
修改如下:
homeassistant: # 调用核心组件
name: Hello # 配置该组件的name项,值为Hello
latitude: 30 # 配置该组件的latitude项,值为30
longitude: 120 # 配置该组件的logitude项,值为120
elevation: 0 # 配置该组件的elevation项,值为0
time_zone: Asia/Shanghai # 配置该组件的time_zone项,值为Asia/Shanghai
frontend: # 调用前端组件
注意:
name:
、latutude:
等内容,前面用2个空格
缩进,:
后面要加至少1个空格
。
- 绝对不要在YAML的编辑中使用TAB键,确保文本编辑器不会在换行时自动使用
TAB
。
#
以及之后的内容属于单行注释文本,不用写进配置文件。
然后,我们重启HASS服务,登录前端注意到左上角显示的名字变成Hello,说明组件配置成功。
写法:(换行)
(缩进2个空格)
配置项:
(空格)
值
说明:配置某组件,就是在对应的组件名:
下方,另起一行并缩进2个空格,填写配置项和值。
用途:例子中调用了homeassistant
(核心)组件和frontend
(前端)组件,并为核心组件的几个配置项,配置了相应的值,使得核心组件按我们的配置来启动HASS。
分析:
核心
读取配置文件
中组件名对应下方缩进书写的配置项及其值,对已调用的组件
进行配置。
- 一般来讲,配置项是组件固有的属性。比如上面代码中的
name
,指的是前端左上角显示的名字;latitude
、longitude
、elevation
则是指HASS所在位置的经纬度高程信息;time_zone
则是指HASS所在的时区信息。除非组件允许,我们不可以随意的指定一个配置项,并赋予值。比如在核心
中配置:city: wuxi
,核心
不存在这种属性,也不允许我们自定义属性,所以这样的配置会引发系统报错:"city不是一个有效的配置项!"
- 配置项一般可以分为
必须
、可选
和必选
配置项。必需
配置项必须在配置文件
中写清楚并给出配置的值;可选
配置项则可根据实际情况选择是否填写;必选
配置项,则需要在若干个配置项中选择特定的某些项填写,比如,某个组件需要对SSH的登录信息进行配置,而SSH又可以使用用户名密码或者证书2种方式来登录,那么用户名、密码、证书路径这3个配置项中,用户要么选择配置用户名和密码2项,要么选择配置证书路径1项,必须做出选择,不能3项都不选。
- 组件没有配置项或者配置项不全,并不能代表组件没有进行配置或者配置不完整,因为组件内部是允许使用一些默认值的,如果我们不对可选的配置项进行配置,组件一样可以给这些配置项赋予默认的值。比如文中的
frontend
组件,并非没有配置项,也并非没有进行配置,而是启用了默认的配置。
3. 如何了解组件具体的配置方法
组件的配置项和配置方法,一般可以通过查看其文档来了解,对于官方组件,查看以下网址找到对应组件的说明文档从而完成组件的加载和配置,是新手必须掌握的贯穿整个HASS学习过程中的必备技能:
如:
配置核心
的基础信息:https://www.home-assistant.io/docs/configuration/basic/
配置核心
的自定义实体属性:https://www.home-assistant.io/docs/configuration/customizing-devices/
配置frontend-组件
:https://www.home-assistant.io/components/frontend/
配置http-组件
:https://www.home-assistant.io/components/http