如何在 Home Assistant 中设置自定义传感器

深入研究 YAML 文件,在本家庭自动化系列的第六篇文章中设置自定义传感器。
106 位读者喜欢这个。
Computer screen with files or windows open

Opensource.com

在关于家庭自动化的这个系列文章的上一篇中,我开始深入研究 Home Assistant。我设置了 Zigbee 集成,使用了 Sonoff Zigbee Bridge,并安装了一些插件,包括 Node-RED、File Editor、Mosquitto broker 和 Samba。最后,我介绍了 Node-RED 的配置,我将在本系列的后续内容中大量使用它。在那之前的四篇文章讨论了什么是 Home Assistant,你为什么可能需要本地控制,智能家居组件的 一些通信协议,以及如何使用 libvirt 在虚拟机 (VM) 中安装 Home Assistant

在这第六篇文章中,我将介绍 YAML 配置文件。如果你只是使用用户界面 (UI) 中支持的集成,这在很大程度上是不必要的。但是,在某些时候,特别是当你拉入自定义传感器数据时,你必须亲自处理配置文件。

让我们开始吧。

检查配置文件

你可能需要调查几个潜在的配置文件。虽然我即将向你展示的所有内容可以在主要的 configuration.yaml 文件中完成,但将你的配置拆分为专用文件可能会有所帮助,尤其是在大型安装中。

下面我将介绍如何配置我的系统。对于我的自定义传感器,我使用 ESP8266 芯片组,它对制造商非常友好。我主要使用 Tasmota 作为我的自定义固件,但我也有些组件运行 ESPHome。配置固件不属于本文的范围。现在,我将假设你使用一些自定义固件设置了你的设备(或者你使用 Arduino IDE 编写了自己的固件)。

/config/configuration.yaml 文件

Configuration.yaml 是 Home Assistant 读取的主要文件。对于以下内容,请使用你在上一篇文章中安装的 File Editor。如果你在左侧边栏中没有看到 File Editor,请返回到 Supervisor 设置并单击 File Editor 以启用它。你应该看到如下屏幕

确保 Show in sidebar 处于启用状态。对于我经常使用的任何插件,我也总是启用 Watchdog 设置。

完成后,启动 File Editor。在左上角的标题栏中有一个文件夹图标。这是导航图标。/config 文件夹是存储你关心的配置文件的位置。如果你单击文件夹图标,你将看到一些重要的文件

Configuration split files

以下是默认的 configuration.yaml

符号 script: !include scripts.yaml 表示 Home Assistant 应该在需要脚本对象的定义时引用 scripts.yaml 的内容。你会注意到这些文件中的每一个都与单击文件夹图标时观察到的文件相关联。

我在我的 configuration.yaml 中添加了三行

input_boolean: !include input_boolean.yaml
binary_sensor: !include binary_sensor.yaml
sensor: !include sensor.yaml

顺便说一句,我在 configuration.yaml 文件中配置了我的 MQTT 设置(有关更多详细信息,请参阅 Home Assistant 的 MQTT 文档

mqtt:
  discovery: true
  discovery_prefix: homeassistant
  broker: 192.168.11.11
  username: mqtt
  password: superpassword

如果你进行了编辑,请不要忘记单击磁盘图标来保存你的工作。

/config/binary_sensor.yaml 文件

在 configuration.yaml 中命名你的文件后,你必须创建它。在 File Editor 中,再次单击文件夹图标。有一个小图标,上面有一张纸,中心有一个 + 符号。单击它以显示此对话框

我有三种主要的 二进制传感器:门、运动和电源。二进制传感器只有两种状态:开或关。我所有的二进制传感器都将其数据发送到 MQTT。有关 MQTT 的更多信息,请参阅我关于云与本地控制的文章。

我的 binary_sensor.yaml 文件如下所示

  - platform: mqtt
    state_topic: "BRMotion/state/PIR1"
    name: "BRMotion"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    device_class: motion
   
  - platform: mqtt
    state_topic: "IRBlaster/state/PROJECTOR"
    name: "ProjectorStatus"
    qos: 1
    payload_on: "ON"
    payload_off: "OFF"
    device_class: power
   
  - platform: mqtt
    state_topic: "MainHallway/state/DOOR"
    name: "FrontDoor"
    qos: 1
    payload_on: "open"
    payload_off: "closed"
    device_class: door

看看这些定义。由于 platform 是不言自明的,所以从 state_topic 开始。

  • state_topic,顾名思义,是设备状态发布的主题。这意味着任何订阅该主题的人都会在状态更改时收到通知。此路径是完全任意的,因此你可以随意命名。我倾向于使用约定 location/state/object,因为这对我有意义。我希望能够引用某个位置的所有设备,并且对我来说,这种布局最容易记住。按设备类型分组也是一种有效的组织布局。
  • name 是用于在 Home Assistant 中引用设备的字符串。它通常由 type.name 引用,如 Home Assistant Lovelace 界面中的这张卡片所示

  • qos,是服务质量 (quality of service) 的缩写,指的是 MQTT 客户端在发布到主题时如何与代理通信。
  • payload_onpayload_off 由固件确定。这些部分告诉 Home Assistant 设备将发送什么文本来指示其当前状态。
  • device_class: 设备类有多种可能性。有关更多信息和每种可用类型的描述,请参阅 Home Assistant 文档

/config/sensor.yaml 文件

此文件与 binary_sensor.yaml 的一个非常重要的区别是:此配置文件中的传感器可以在其有效负载中包含截然不同的数据。看看一些比较棘手的传感器数据,温度。

这是我的 DHT 温度传感器的定义

  - platform: mqtt
    state_topic: "Steve_Desk_Sensor/tele/SENSOR"
    name: "Steve Desk Temperature"
    value_template: '{{ value_json.DHT11.Temperature }}'
    
  - platform: mqtt
    state_topic: "Steve_Desk_Sensor/tele/SENSOR"
    name: "Steve Desk Humidity"
    value_template: '{{ value_json.DHT11.Humidity }}'

你会从一开始就注意到两件事。首先,对于同一个 state_topic 有两个定义。这是因为此传感器发布三个不同的统计信息。

其次,有一个新的 value_template 定义。大多数传感器,无论是自定义的还是非自定义的,都会在 JSON 有效负载中发送它们的数据。该模板告诉 Home Assistant JSON 文件中重要信息的位置。以下显示了来自我自制传感器的原始 JSON。(我使用程序 jq 使 JSON 更具可读性。)

{
  "Time": "2020-12-23T16:59:11",
  "DHT11": {
    "Temperature": 24.8,
    "Humidity": 32.4,
    "DewPoint": 7.1
  },
  "BH1750": {
    "Illuminance": 24
  },
  "TempUnit": "C"
}

这里有几点需要注意。首先,由于传感器数据存储在基于时间的数据存储中,因此每个读数都有一个 Time 条目。其次,此输出附加了两个不同的传感器。这是因为我将 DHT11 温度传感器和 BH1750 光传感器都连接到同一个 ESP8266 芯片。最后,我的温度以摄氏度报告。

希望现在 Home Assistant 的定义更有意义了。value_json 只是 Home Assistant 摄取的任何 JSON 对象的标准名称。value_template 的格式为 value_json.<component>.<data point>

例如,要检索露点

value_template: '{{ value_json.DHT11.DewPoint}}'

虽然你可以从 Home Assistant 中的文件中转储此信息,但我使用 Tasmota 的 Console 来查看它正在发布的数据。(如果你想让我写一篇关于 Tasmota 的文章,请在下面的评论中告诉我。)

顺便说一句,我还密切关注我本地 Home Assistant 的资源使用情况。为此,我将此内容放入我的 sensor.yaml 文件中

  - platform: systemmonitor
    resources:
      - type: disk_use_percent
        arg: /
      - type: memory_free
      - type: memory_use
      - type: processor_use

虽然这在技术上不是传感器,但我将其放在这里,因为我认为它是一个数据传感器。有关更多信息,请参阅 Home Assistant 的 系统监控 文档。

/config/input_boolean 文件

最后这部分很容易设置,我将它用于各种各样的应用程序。输入布尔值用于跟踪事物的状态。它要么是开还是关,在家还是离开等等。我在自动化中大量使用它们。

我的定义是

    steve_home:
        name: steve
    steve_in_bed:
        name: 'steve in bed'
    guest_home:
    
    kitchen_override:
        name: kitchen
    kitchen_fan_override:
        name: kitchen_fan
    laundryroom_override:
        name: laundryroom
    bathroom_override:
        name: bathroom
    hallway_override:    
        name: hallway
    livingroom_override:    
        name: livingroom
    ensuite_bathroom_override:
        name: ensuite_bathroom
    steve_desk_light_override:
        name: steve_desk_light
    projector_led_override:
        name: projector_led
        
    project_power_status:
        name: 'Projector Power Status'
    tv_power_status:
        name: 'TV Power Status'
    bed_time:
        name: "It's Bedtime"

我在 Lovelace UI 中直接使用其中一些。我创建了一些小徽章,我将它们放在我在 UI 中拥有的每个页面的顶部

这些可以用来确定我是否在家,或者是否有客人在我家等等。点击这些徽章可以让我切换布尔值,并且自动化程序可以读取这个对象,以便决定“智能设备”如何对人员的出现做出反应(如果需要)。我将在以后的文章中更详细地探讨 Node-RED 时,重新讨论这些布尔值。

总结

在这篇文章中,我研究了 YAML 配置文件,并在其中添加了一些自定义传感器。您已经离使用 Home Assistant 和 Node-RED 实现一些功能性自动化不远了。在下一篇文章中,我将深入探讨一些基本的 Node-RED 流程,并介绍一些基本的自动化。

请继续关注;我还有很多内容要介绍,并且像往常一样,如果您希望我研究一些特定的内容,请在下面留下评论。如果可以的话,我一定会将您问题的答案纳入未来的文章中。

接下来阅读
User profile image.
Steve 是一位敬业的 IT 专业人士和 Linux 倡导者。 在加入 Red Hat 之前,他在金融、汽车和电影行业工作了数年。 Steve 目前在 Red Hat 担任解决方案和技术实践架构师。 他拥有从 RHCA(DevOps 领域)到 Ansible,再到容器化应用程序等各种认证。

2 条评论

对我来说不容易

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.