第一次认识家庭助理


家庭助理是用于组织智能家居的流行开源应用程序。 作者对家庭助理的首次体验是基于将智能电饭锅集成到家庭电饭煲中的尝试。 作者将尝试描述此应用程序的主要组件和功能,他有机会逐步了解这些应用程序。 本文以某种方式进行了评论,以某种方式为那些想开始与Home Assistant认识的人提供了指南。

对于那些很少有空闲时间的人,我建议您跳过俗语-第一章-直接进入第二章。 您只需要知道我们将与小米的智能中国电饭锅合作。

智能电饭煲

电饭煲显然是电饭煲。 Wiki向我们展示了大英博物馆的陶瓷蒸锅,其历史可追溯至公元前1250年 1945年,三菱成为日本第一家自制电饭煲公司。 我们的模型-小米的电饭煲-不仅可以煮饭。 “这是一种不仅可以制作米饭,而且可以制作其他类型的菜肴的绝佳设备。 广告说:“它可以煮汤,糕点等等。” 但最重要的是,存在wi-fi模块,具有自动化功能的软件和200多个软件安装的配方。 作者认为并决定:“通向腹部的智能家居之路是正确的。”

小米电饭煲(适合数字设备)在外观上非常吸引人,其圆形的外观和简约的外观令人愉悦。 为了配置和使用它,制造商提供了Mi Home应用程序。 注册Mi帐户后,该程序可以轻松找到新设备,然后在本地网络上进行注册。 应用程序界面不是最差的,它提供基本的自动化工具,并且可以接收来自设备的通知。 但是,存在明显的缺点。 并非每个人都会对向用户发送有关每次用户点击的信息感到满意。 如今,人们经常在民族色彩中发现不愉快的表情。 代替了200多种食谱,只有四种可以翻译成其他语言并可用。 其余的完全是中国人民专用的。 当您的“智能”电饭锅无法履行所有承诺的烹饪功能时,您会发现它变得可悲。 在Internet上徘徊了一段时间之后,一个悲伤的作者遇到了下一个有趣的项目 (对作者来说是永恒的利益)。 事实证明,这是专门为某个家庭助理开发模块的。

家庭助理

首先,一些一般信息。 正如我们在HA主页上所告知的那样: “这是一款用于智能家居自动化的开源软件,专注于本地管理和隐私。 它由开放的爱好者社区开发而成,非常适合在Raspberry Pi或本地服务器上工作。” 该项目已有五年多的历史,它使用python和Apache 2.0许可证。 编写这些行时的发布版本为0.99.3。

HA使用单独的模块(集成或组件)来管理设备。 创建一个非常简单。 在该站点上,您可以找到主要模块的目录(由社区批准和支持)。 在它们的总数(1485件)中,完全不同,名称包括亚马逊,谷歌,小米,甚至在目录中列出了yandex。
让我们尝试在Linux桌面上的虚拟环境中安装 HA。 我们将需要python3和pip软件包管理器。
python3 -m venv homeassistant #    cd homeassistant source bin/activate #    python3 -m pip install homeassistant #  Home Assistant hass --open-ui #  Home Assistant 

之后,HA GUI将在http:// localhost:8123上可用。 首次登录时,您需要创建一个用户帐户。 HA Web界面非常庞大。 一开始要提到的两个重要元素是“配置”→“常规”选项卡,您可以在其中轻松地重新加载配置文件或服务器本身。 以及开发人员工具列表中的“信息”页面,您可以在其中查看错误日志。

对于Linux,HA将所有必要的用户数据存储在“〜/ .homeassistant”设置文件夹中。 配置文件以YAML格式编写,主要是“ configuration.yaml”。 它结合了模块,自动化等的数据。 导入功能使您可以将设置分为逻辑上独立的文件。 模块存储在子文件夹“ components”(内置)和“ custom_components”中。

这些知识应该足以让我们安装新模块。 将文件夹“ xiaomi_cooker”从我们的存储库复制到我们的“〜/ .homeassistant / custom_components”中。 根据描述,将模块设置添加到“ configuration.yaml”文件中:
configuration.yaml
 xiaomi_cooker: #   name: 'Akari' #   host: 192.168.1.10 # IP   token: '4921def609273302248d040a24243a25' #   Xiaomi model: chunmi.cooker.normal2 #   


做完了 HA重新启动后,新的模块条目将出现在Web界面的“常规”→“集成”部分。

任何模块都是一组特定的对象(实体)和服务(服务,本质上是功能)。 对象存储从设备接收的各种数据。 例如,sensor.xiaomi_cooker_temperature是电饭锅的温度,sun.sun是太阳的位置。 对象的数据由一个基本值-状态(状态)和任意一组附加属性(属性)表示。 服务用于将命令和值传输到设备。 例如,xiaomi_cooker.start-用于启动电饭锅的命令,或者homeassistant.check_config-用于在HA设置文件中搜索错误的初始化。 Web界面的“开发人员工具”列表包含“服务”部分,您可以在其中查看可用服务列表并进行调用。 附近是“状态”部分,因此您可以在其中查看和更改对象的值。 应当指出,“状态”部分中对象值的更改是单方面的。 即 例如,如果您将此处的lights.state对象的状态从关闭更改为开启,则不会影响设备的真实状态,并且下次更新设备中的数据时,该对象的值将被实际覆盖。

自动化技术

智能家居的主要管理工具是自动化 。 您可以在“常规”→“自动化”部分或直接在“ automations.yaml”文件中使用图形界面添加和编辑它们。 自动化的主要功能是在满足某些条件时呼叫服务。 用于设置调用对象值的条件的基本工具,包括 时间数据。 还有一些更具体的解决方案,例如事件。 作为一个简单的自动化示例,我们将提供一个代码,该代码可以在15分钟的时间内更新作者的正负数据:
automations.yaml
  - id: '1565889970818' # ID  alias: Umpiro decharging #  trigger: #   - platform: time_pattern #   -  minutes: /15 #   (   –    15 ) condition: [] #    action: #    - data: # ,     entity_id: sensor.umpiro_charge #  (: ) service: homeassistant.update_entity #    


应当指出,到目前为止,如果不通过图形界面编辑yaml代码,就无法配置所有可用的自动化功能(例如,上述功能),但是开发人员表示,他们正在积极努力消除这一缺陷。

模板化

自动化之后,该讨论模板了 (模板)。 yaml文件中的各种设置元素使您可以使用jinja2脚本语言插入。 这些元素中的许多元素通过通用名称“模板”来统一,例如service_template或trigger_template。 使用模板,我们可以访问HA中对象的值,并能够在复杂的数学和逻辑表达式中使用此数据,这极大地扩展了我们的潜力。 举例来说,让我们来看看在“ configuration.yaml”中写下的更复杂的sensor.umpiro_charge代码。 这是template_sensor ,即“基于其他对象的值形成数据的传感器”。 我们的传感器将类似于逐渐放电的电池:
configuration.yaml
 sensor: #   platform: template #   -  sensors: #   #   – sensor.umpiro_charge umpiro_charge: #      UI () unit_of_measurement: '%' # ,    value_template: >- #    –   'int' # +     {% if states('sensor.umpiro_charge')|int('unknown') is number %} #       #         {% set value = (states('sensor.umpiro_charge')|int - (as_timestamp(now()) - as_timestamp(states.sensor.umpiro_charge.last_updated))/60/15)|round %} #       {{ [[0, value]|max, 100]|min }} {% else %} # ,  HA   #      {{ 'unknown' }} {% endif %} # ID  ,     #      entity_id: [] friendly_name: 'Charge' #   #      UI () device_class: battery 


我们将entity_id留为空白是因为我们已经添加了自动化功能,该功能将独立地导致对象数据的更新。

Python脚本

反过来,python脚本是用于创建新服务的简单工具。 在“ configuration.yaml”行中添加“ python script:”行之后,我们在文件夹“〜/ .homeassistant / python_scripts”中放置的所有扩展名为“ .py”的文件将作为名称为“ python_scripts”的服务提供。 file_name>”。 他们的代码在预定义的环境中执行,在该环境中,数据和hass变量使我们可以访问服务调用的参数以及HA对象和服务。 例如,我们为服务“ python_scripts.charge_set”提供文件“ charge_set.py”的代码。 它的功能是设置电池电量:
python_scripts / charge_set.py
 #     name = data.get('name', 'sensor.umpiro_charge') #     new_state = data.get('charge', '100') #    attributes = hass.states.get(name).attributes #    hass.states.set(name, new_state, attributes) 



建立整合

我们在模板和Python脚本的帮助下所做的所有事情,也许编写一个单独的模块会更容易做到这一点。 如前所述,非官方模块存储在“ custom_components”文件夹中。 将来,我们将需要一个对象,该对象存储有关电饭锅当前食谱的信息,以及一个允许您更改此数据的服务。 基于文档中示例,我们将为此创建一个新模块“ overmind”。 第一步是custom_components / overmind / __ init__.py文件:
custom_components / overmind / __ init__.py
 #     DOMAIN = 'overmind' #       () DEFAULT_RECIPE = { "title": "Habr post", "description": "Post an article on habr.com", "profile": "471822" } #    def setup(hass, config): #    hass.states.set('overmind.current_recipe', 'on', DEFAULT_RECIPE) #       def handle_set(call): #    recipe = call.data.get('recipe', DEFAULT_RECIPE) #   -    hass.states.set('overmind.current_recipe', 'set', recipe) #   hass.services.register(DOMAIN, 'recipe_set', handle_set) return True 


之后,我们将新模块报告到配置文件“ configuration.yaml”,并在其中添加模块名称为“ overmind:”的行。 问题解决了。

Lovelace UI

这是使用的前端 HA的名称。 该图形界面是HA Web界面的首页,邀请普通用户通过该界面控制智能家居。 LUI接口由各种类型的卡组成,可以反映对象的值,用于调用函数和其他任务。 可以类似于浏览器书签在页面(视图)上分发卡片。 该设置可通过相同的图形界面方便地进行组织,但也可以通过yaml代码进行访问,该代码还具有内置的文本编辑器。 我建议您查看页面https://demo.home-assistant.io/ ,其中有几个不同的LUI设置示例,您可以在其中轻松查看,单击和修改它们。


GUI设置示例

不幸的是,谈到界面的缺点,开发人员自己承认该项目试图同时坐在台式机和智能手机的椅子上。 默认情况下,LUI喜欢独立确定卡的位置和大小,这有时会使在监视器上看起来正常的页面变成智能手机屏幕上的混乱,反之亦然。 有一些简单的工具可以简化界面,但以我的经验来看,它们并不总是有效的。

我认为使用图形工具描述界面的创建没有多大意义,因此我将以我使用的yaml代码的形式给出一些示例。 为电饭锅创建了单独的页面(视图)后,我们将尝试用最必要的元素填充它,以便在使用智能手机屏幕时不会引起拒绝。

在这里,我们将尝试使用那些非常简单的界面排序工具,即水平堆栈和垂直堆栈。 首先,使用实体按钮和传感器类型的卡创建垂直堆栈。 第一个用于启动我们的电饭锅,第二个用于显示温度:
垂直堆叠
 cards: #    - type: entity-button #      entity: sensor.xiaomi_cooker_state # ,     icon: 'mdi:selection' #     icon_height: 100px #   name: Offline #    show_icon: true # show_name: true # tap_action: #    action: call-service #  –   service: script.turn_on #  –   service_data: #    entity_id: script.order_cooker_start #  –   hold_action: #    action: none # - type: sensor #      entity: sensor.xiaomi_cooker_temperature # ,     name: Temper #   type: vertical-stack #   –   


家庭助理包括一个“ 材料设计图标”档案,该文件可以通过适当的名称(例如,mdi:selection)用于设置项目。 我们用来调用服务的脚本(在这种情况下,不是python-,而是yaml-)是另一个便捷的HA工具。

现在,将上述垂直堆栈与我们现在的水平堆栈中的肖像卡结合起来。 一切都将变得简单:
水平堆叠
 ards: #    - type: picture #   image: /local/akari_r.jpg #    - #         type: horizontal-stack #   –   


在这里,您需要标记“图像:”行。 我们放在文件夹“〜/ .homeassistant / www”中的所有文件都可以通过链接http:// localhost / local / filename获得

下一步是对我们创建的服务呼叫按钮进行一些操作。 如果它用作拨动开关,即对我们来说将很方便。 打开/关闭,而不是现在完成的方式。 这可以通过使用条件型卡来实现,可以通过设置某些条件来调整其在屏幕上的显示。 以下是卡的代码,该代码是用于关闭电饭锅的按钮,并且仅在电饭锅正在准备菜时才可见:
有条件的
 card: #    entity: sensor.xiaomi_cooker_state # icon: 'mdi:star-box-outline' # icon_height: 100px # name: Running # tap_action: # action: call-service # service: xiaomi_cooker.stop # type: entity-button # conditions: #   # ,    entity: sensor.xiaomi_cooker_mode #  ,     state: Running type: conditional #   


以类似的方式重写以前创建的电源按钮代码,并将其与此结合,我们得到一个可以同时打开和关闭的按钮。

我们用另一张卡片补充了我们的兴趣-直到烹饪结束为止的时间(类似于温度卡片),另外一张还显示了食谱的详细信息(自定义:食谱卡片)。 结果,我们得到这样的东西:

定制卡

家庭助理,除了内置卡类型丰富之外,当然还提供创建自己的功能。 这种卡称为自定义卡,并使用javascript创建它们。 是两个简单的代码示例。 在网络上可以轻松找到由各种发烧友创建的现成的卡片,如果您想尝试一下自己的话,那么可以发现有专门创建的js模块可以简化编写新卡片的工作。 我对javascript的需求仍然会减少,因此,举例来说,我只给出一小部分用于选择和显示当前食谱的卡片代码。
www / recipe-card.js
 import { //     lit-element LitElement, html, css } from "https://unpkg.com/lit-element@latest/lit-element.js?module"; //      class RecipeCard extends LitElement { //     HA static get properties() { return { hass: {}, config: {} }; } //    callServiceEx() { this.hass.callService('persistent_notification', 'create', {message: 'example'}); } //  html-  render() { //    ,     const entityId = this.config.entity; //    const state = this.hass.states[entityId]; //    const titleStr = state ? state.attributes.title : 'unavailable'; const descrStr = state ? state.attributes.description : 'unavailable'; //    return html` <ha-card> <div class="flex" style="margin-top:16px;"> <div class="icon"> <ha-icon icon="mdi:bowl"></ha-icon> </div> <div class="header"> <span class="name">Recipe</span> </div> </div> <div class="flex info" style="margin-bottom:16px;"> <span class="recipe-title">${titleStr}</span> <span class="recipe-descr">${descrStr}</span> </div> </ha-card> `; } //     customElements.define('recipe-card', RecipeCard); 



要使用新卡,您需要在LUI设置文件的开头添加以下代码:
食谱卡
 resources: #    - type: module #   –  url: /local/recipe-card.js #   

在卡片列表中:
  - type: 'custom:recipe-card' #   entity: overmind.current_recipe # ,     



通知事项

智能家居的必要部分是向用户发送消息。 在HA中,这些消息称为通知,并且有两种基本类型的通知。 首先是持久性通知。 要发送它们,使用内置服务“ persistent_notification.create”。 此类消息的列表可通过图形界面中的响铃图标获得,它们使用降价标记,从本质上讲非常简单。

另一个更有趣的工具是内置的notify模块,通过安装其他模块,您可以使用第三方平台发送消息。 例如,考虑一个电报模块

要使用该模块,首先,我们需要在电报本身中创建一个机器人。 设置时,我们需要用户的chat_id和令牌机器人API。 如何获取这些数据-在上面的链接中有详细描述,我们假设我们已经准备好了。 直接转到安装模块,首先,就像我们已经做的那样,将其源代码复制到components文件夹,然后将其设置添加到“ configuration.yaml”文件中:
configuration.yaml
 telegram_bot: #   telegram platform: polling #   api_key: XXXXXXXXXXXXX # API Token   allowed_chat_ids: XXXXXXX # chat_id   proxy_url: socks5://XXXXXXXXXXXXX #     proxy_params: username: umpiro password: umpiro_password 

加上通知模块的设置:
 notify: #   notify name: notify_send #   (   –  notify.notify_send) platform: telegram #   chat_id: XXXXXXX # chat_id   



电报模块允许我们发送消息,图片或视频。 例如,我们将创建自动化程序以发送带有图片的消息,以通知我们烹饪即将结束。
automations.yaml
  - id: '1571074941908' # ID  alias: EOC #   trigger: #    # ,   - entity_id: sensor.xiaomi_cooker_mode from: Running #    #   –    platform: state to: Waiting #    condition: [] #   action: #    - service: notify.notify_send #  –   data: # ,     title: End of Cooking #  message: "EOC" #  data: #    photo: #   -  #   - file: /home/umpiro/.homeassistant/www/cat.jpg #   caption: “EOC” 



后记

想要尝试组织智能家居的本地管理的人可能会对Home Assistant感兴趣。 由于社区的努力,这是一个广泛,有趣,开放和积极发展的项目。 各种各样的家庭助理工具不能不让人高兴(我没有时间提到一些重要的工具)。 作为一个减法,可以提到文档的相对复杂性和不完整性。
聚苯乙烯
最近,在10月10日,我不知道这是否可以称为发行版,即项目从0.99版到0.100版的过渡。
引用发行说明:
欢迎阅读又一个精彩发行的发行说明! 不,我们不打算1.0,我们要0.100! 感觉我们还没有为1.0的目标做好准备,但是我们每天都在进步。 要了解我们正在考虑的内容,请查看Home Assistant 1.0中的博客“ 简单模式”。

Source: https://habr.com/ru/post/zh-CN471822/


All Articles