ESPHome示例代码

这篇文章详述了如何使用ESPHome配置WiFi连接强度、ADC采集、GPIO开关和二进制传感器,以及如何处理数据、进行OTA更新和设备管理。内容涵盖了WiFi信号强度的检测、设备WiFi连接状态的监控、GPIO的开关和二进制传感器的使用,还涉及到了OTA密码的作用、图标设置、设备基本信息和各种循环操作的实现。
摘要由CSDN通过智能技术生成

注意

如果你是参考esphome官网上的例程,那么你一定要将esphome更新到最新的版本,要不然编译的时候会有各种各样的报错

ESPHOME在线烧录-调试

esphome:
  name: esp8266-water-level-sensor
  friendly_name: ESP8266_water_level_sensor

esp8266:
  board: nodemcuv2

# 串口1输出日志
logger:
  hardware_uart: UART1 

# Enable Home Assistant API
api:
  encryption:
    key: "9WFDX0RhsQbfYgRoWnBZhPZnr34jXSq5lxI+Qno5n/Y="

ota:
  password: "7b0462fce4653e433f45dc557c8354ab"

# 自动连接的WiFi账号密码
wifi:
  networks:
    - ssid: "wifi1账号"
      password: "WiFi1密码"
    - ssid: "wifi2账号"
      password: "WiFi2密码"

  # 配网热点密码
  ap:
    ssid: "Esp8266-Water-Level-Sensor"
    password: "12345678"

captive_portal:

1.web控制(需要arduino框架使用)

# web控制,添加了这2行,就可以在网页端打开设备ip;
web_server:  
  port: 80

2.hx711称重传感器

hx711称重传感器放大器

sensor:
  - platform: hx711                 ## 平台
    name: "HX711 数据"              ## 传感器名称
    dout_pin: D0                    ## 数据引脚
    clk_pin: D1                     ## 时钟引脚
    gain: 128                       ## 增益 32 64 128
    update_interval: 20s            ## 数据更新时间
    unit_of_measurement: "Pa"       ## 单位
    filters:
      - calibrate_linear:           ## 单位转化
          - -72000 -> 0
          - 0 -> 0
          - 5741532 -> 100

3.ADC采集

esp8266-ADC采集
注意:esp8266的A0引脚,只能采集1V电压,如果需要采集3.3V,需要进行分压处理

# 测量ADC电压
  - platform: adc                   ## 平台;
    unit_of_measurement: "mV"       ## 单位;
    icon: "mdi:flower-outline"      ## 图标;
    accuracy_decimals: 1            ## 设备值上报的最小精度;
    pin: A0                         ## ADC引脚,只支持A0;
    filters:                        ## 校准
      - calibrate_linear:           ## 单位转化
          - 0 -> 0
          - 1.0 -> 3300
    name: "ADC采集"                 ## 传感器名称;
    update_interval: 3s             ## 数据更新时间

在这里插入图片描述

4.ADC采集

sensor:
  - platform: adc                   ## 平台;
    id: "water_level_sensor"
    unit_of_measurement: "V"        ## 单位;
    icon: "mdi:icon-tint"           ## 图标;
    attenuation: 11dB
    accuracy_decimals: 5            ## 设备值上报的最小精度;
    pin: 0                          ## ADC引脚:0/1/2/3(电压范围0~2.8V左右)
    name: "Water Level Sensor"      ## 传感器名称;
    update_interval: 1s             ## 数据更新时间
    filters:                        ## 校准
      - sliding_window_moving_average:
          window_size: 15
          send_every: 15

这段ESPHome代码用于配置一个模拟数字转换器(ADC)传感器,用于检测水位。配置包括以下内容:

  1. 设置平台为adc
  2. 为传感器分配ID “water_level_sensor”。
  3. 报告的单位为伏特(V)。
  4. 使用mdi图标库中的"mdi:icon-tint"作为传感器图标。
  5. 设置衰减为11dB。
  6. 设置数据精度到小数点后5位。
  7. 将传感器连接到引脚0(电压范围0~2.8V左右)。
  8. 将传感器命名为"Water Level Sensor"。
  9. 数据更新时间间隔设置为1秒。
  10. 对数据应用滑动窗口移动平均滤波器:
    • 设置窗口大小为15。
    • 设置每15个数据点发送一次平均值。

通过这些设置,您可以实时监控和报告水位传感器的读数,并对数据进行平滑处理,以减少噪声和误差。

5.WiFi

5.1当前WiFi连接强度

无线信号传感器

sensor:
  - platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB
    name: "WiFi Signal dB"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: "diagnostic"

  - platform: copy # Reports the WiFi signal strength in %
    source_id: wifi_signal_db
    name: "WiFi Signal Percent"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "Signal %"
    entity_category: "diagnostic"

这段代码是用于在ESPHome环境中配置两个WiFi信号传感器的。
第一个传感器用于报告WiFi的信号强度(RSSI,以dB为单位),并将其命名为“WiFi Signal dB”。更新间隔为60秒。
第二个传感器是一个复制传感器,它接收来自第一个传感器的数据,并将信号强度转换成百分比形式,然后命名为“WiFi Signal Percent”。
转换公式使用了一个lambda函数,将信号强度映射到0-100%的范围内。这两个传感器都属于诊断类别。
在这里插入图片描述

5.2.WiFi连接状态

interval:
  - interval: 5s
    then:
      - if:
          condition:
            wifi.connected:
          then:
            - logger.log: "wifi Connected"
          else:
            - logger.log: "wifi Disconnected"

这段ESPHome代码定义了一个间隔触发器,每5秒检查设备的WiFi连接状态,并根据连接状态在日志中记录相应的消息。

  1. interval: - 创建一个间隔触发器。
  2. - interval: 5s - 设置间隔为5秒。这意味着每隔5秒都会执行一次以下的then部分。
  3. then: - 指定在每个间隔触发时要执行的操作序列。
  4. - if: - 使用条件语句判断下面的条件是否满足。
  5. condition: - 定义用于判断的条件。
  6. wifi.connected: - 确定设备当前是否连接到WiFi。当连接时,此条件为真(true);否则为假(false)。
  7. then: - 如果wifi.connected条件为真(已连接),则执行以下操作:
    a. - logger.log: "wifi Connected" - 在设备日志中记录消息“wifi Connected”。
  8. else: - 如果wifi.connected条件为假(未连接),则执行以下操作:
    a. - logger.log: "wifi Disconnected" - 在设备日志中记录消息“wifi Disconnected”。

总之,这段代码每5秒检查一次设备的WiFi连接状态。如果设备已连接到WiFi,它将在设备日志中记录“wifi Connected”。如果设备未连接到WiFi,它将在设备日志中记录“wifi Disconnected”。这样可以通过查看设备日志来了解设备的WiFi连接状态。
在这里插入图片描述

6.GPIO开关 和 二进制传感器

switch:
  - platform: gpio
    pin: GPIO0
    name: "wireless05_switch"
    id: relay2
    
binary_sensor:
  - platform: gpio
    pin: GPIO2
    name: "press_switch05"
    device_class: opening
    filters:
      - delayed_on_off: 100ms 
    on_press:
      then:
        - switch.toggle: relay2

这段ESPHome配置代码定义了一个基于GPIO平台的开关和一个二进制传感器。具体功能如下:

  1. 定义一个基于GPIO平台的开关:

    • 使用GPIO0作为控制引脚。
    • 将开关命名为"wireless05_switch"。
    • 使用ID "relay2"进行标识。
  2. 定义一个基于GPIO平台的二进制传感器:

    • 使用GPIO2作为输入引脚。
    • 将传感器命名为"press_switch05"。
    • 设备类别设置为"opening"(表示门、窗等开关)。
    • 添加一个100ms延迟的滤波器(delayed_on_off),消除信号噪声和抖动。
    • 当传感器被按下(on_press)时,触发以下操作:
      • 切换ID为"relay2"的开关(“wireless05_switch”)。

更多关于switch使用参考链接

7.ota-password作用

ota:
  password: "your_secure_ota_password"

在ESPHome中,ota配置用于设置设备的"Over-the-Air"(OTA)更新选项。OTA更新允许您无线地将固件更新到ESPHome设备,而不需要连接USB或其他物理接口。

password参数用于设置OTA更新所需的验证密码。这个密码保护了远程更新过程,确保只有拥有正确密码的人才能上传新的固件至设备。这增加了设备的安全性,防止未经授权的用户访问。

8.icon图标设置

图标库(链接)

icon: mdi:water-percent

9.ESPHome设备的基本信息

esphome:
  name: "esp32c3-water-level-sensor"
  friendly_name: "esp32c3-water-level-sensor"
  platformio_options:
    board_build.flash_mode: dio # 使用合宙的ESP32C3,flash模式需要更改为dio
    board_build.mcu: esp32c3

这段代码在ESPHome配置文件中定义了一些关于ESPHome设备的基本信息。

  1. name: 设置用于标识设备的名称,这会影响到生成的固件名称以及部署时的主机名。在这个例子中,它被设置为"esp32c3-water-level-sensor"。
  name: "esp32c3-water-level-sensor"
  1. friendly_name: 设置设备的友好名称,通常用于在用户界面(如Home Assistant)中显示。在此示例中,它也被设置为"esp32c3-water-level-sensor"。
  friendly_name: "esp32c3-water-level-sensor"
  1. platformio_options: 这部分允许您为PlatformIO定制特定构建选项。PlatformIO是一个用于嵌入式系统开发的工具,可以编译和上传固件到硬件设备。
    • board_build.flash_mode: 设置闪存模式。在这个例子中,它设置为"dio",表示双I/O传输模式。
    • board_build.mcu: 设置目标微控制器型号。在这里,它指定为"esp32c3",一个由Espressif Systems生产的Wi-Fi与蓝牙低功耗芯片。
  platformio_options:
    board_build.flash_mode: dio
    board_build.mcu: esp32c3

10.单色灯PWM控制

output:
  - platform: ledc
    pin: GPIO18
    id: my_led_output
    frequency: 1000 Hz

light:
  - platform: monochromatic
    output: my_led_output
    name: "My Adjustable LED Light"
    gamma_correct: 1.0
    default_transition_length: 5s 
    restore_mode: RESTORE_DEFAULT_OFF 

这是一个 ESPHome 配置文件的一部分,用于设置一个可调节亮度的单色 LED 灯。请看下面对每行代码的解释:

  1. output::定义输出设备部分开始。
  2. - platform: ledc:使用 ledc 平台创建输出设备,适用于 ESP32 微控制器,它提供硬件 PWM 控制。
  3. pin: GPIO18:将 ledc 输出引脚指定为 ESP32 上的 GPIO18。
  4. id: my_led_output:为该输出设备分配唯一标识符 “my_led_output”,以便稍后在 light 组件中引用。
  5. frequency: 1000 Hz:设置 ledc PWM 的频率为 1000 Hz。
  6. light::定义 light 设备部分开始。
  7. - platform: monochromatic:使用 monochromatic 平台创建单色 LED 灯。
  8. output: my_led_output:将 LED 灯关联到之前定义的输出设备 “my_led_output”。
  9. name: "My Adjustable LED Light":为此 LED 灯设备命名为 “My Adjustable LED Light”,以便在 Home Assistant 等系统中显示。
  10. gamma_correct: 1.0:设置 gamma 校正系数为 1.0,实现线性亮度调节。
  11. default_transition_length: 5s:设置默认过渡时间为 5 秒,即当亮度发生改变时,需要 5 秒的时间平滑过渡到新的亮度。
  12. restore_mode: RESTORE_DEFAULT_OFF:设置还原模式为默认关闭。在断电恢复后,LED 灯将保持关闭状态。
    在这里插入图片描述

11.延时执行动作

binary_sensor:
  - platform: gpio
    pin: GPIO9
    name: "Button"
    on_press:
      then:
        - switch.turn_on: light_switch
        - script.stop: auto_off_script
        - script.execute: auto_off_script

switch:
  - platform: gpio
    pin: GPIO18
    name: "Light Switch"
    id: light_switch

script:
  - id: auto_off_script
    then:
      - delay: 5s
      - switch.turn_off: light_switch

这段代码定义了一个按键、一个开关和一个脚本。下面是每个部分的详细解释:

  1. binary_sensor:
    定义了一个基于GPIO的二进制传感器,用作按键。该按键连接到GPIO9(请确保您的硬件支持在GPIO9上使用)。

    • on_press: 触发器: 当按键被按下时执行以下操作:
      • 打开名为"Light Switch"的开关 (switch.turn_on: light_switch)。
      • 停止名为 “auto_off_script” 的脚本,如果它正在运行 (script.stop: auto_off_script)。
      • 执行名为 “auto_off_script” 的脚本 (script.execute: auto_off_script)。
  2. switch:
    定义了一个基于GPIO的开关,连接到GPIO18。这个开关可以是一个继电器,用于控制灯泡或其他可控设备。

  3. script:
    定义了一个具有ID “auto_off_script” 的脚本。此脚本包含两个操作:

    • 延迟5秒 (delay: 5s)。
    • 关闭名为 “Light Switch” 的开关 (switch.turn_off: light_switch)。

综上所述,当按下GPIO9上的按键时,代码将执行以下操作:

  1. 打开与GPIO18相关联的开关(如继电器)。
  2. 停止当前运行的 “auto_off_script” 脚本(如果有的话)。
  3. 重新执行 “auto_off_script” 脚本。在脚本内,它将等待5秒,然后关闭相关联的开关。

这样,每次按下按键,都会打开开关并刷新5秒倒计时。如果在5秒内再次按下按钮,延时将重新计算,从头开始新的5秒倒计时。

12.进入深度睡眠

deep_sleep:
  run_duration: 10s
  sleep_duration: 1min

ESP8266的IO16和RST连接,休眠时间结束,IO16会拉低,复位重启设备

13.类似if else 操作

- platform: adc                   ## 平台;
    id: ADC
    unit_of_measurement: "v"       ## 单位;
    icon: "mdi:flower-outline"      ## 图标;
    accuracy_decimals: 2          ## 设备值上报的最小精度;
    pin: A0                         ## ADC引脚,只支持A0;
    filters:                        ## 校准
      - calibrate_linear:           ## 单位转化
          - 0 -> 0
          - 1.0 -> 3.3
    on_value_range:                 #选择采到的数值做对应的操作
      - below: 1                    #1v以下
        then:                        
          - logger.log: "1v以下"
      - above: 1                      #1v到3v之间
        below: 3
        then:
          - logger.log: "1v到3v之间"
      - above: 3                         #3v以上
        then:
          - logger.log: "3v以上"
     
    name: "电压采集"                 ## 传感器名称;
    update_interval: 1s

14.GPIO上电是初始状态

switch:
  - platform: gpio
    pin: GPIO2
    name: "Relay 1"
    restore_mode: ALWAYS_ON

RESTORE_DEFAULT_OFF (默认值)- 尝试还原状态,如果无法还原,则默认为 OFF。
RESTORE_DEFAULT_ON - 尝试恢复状态并默认为 ON。
ALWAYS_OFF - 始终在启动时将引脚初始化为OFF。
ALWAYS_ON - 始终在启动时将引脚初始化为 ON

15.实时读取GPIO输入状态1/0

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
    name: "io0输入"
    id: io0_sensor

16.数据定义/修改/掉电保存

在这里插入图片描述

需求:定义一个参数,可以通过HA进行修改,设备掉电后数值依旧保存

esphome:
  name: esp8266-val
  friendly_name: 参数设置demo
  on_boot:
    then:
      - lambda: "id(my_number_input).publish_state(id(my_global_number));"
      
web_server:
  port: 80

globals:
  - id: my_global_number
    type: float
    restore_value: true
    initial_value: "5"

number:
 - platform: template
    name: "My Number Input"
    id: my_number_input
    min_value: 5
    max_value: 30
    step: 1.0
    optimistic: true
    restore_value: false
    update_interval: never
    on_value:
      then:
        - logger.log:
            format: "New number value received: %f"
            args: ['x']
        - globals.set:
            id: my_global_number
            value: !lambda return x;
  • number:: 表示我们要定义一个Number组件。
  • -platform: template: 选择"模板"作为此数值组件的平台类型。
  • name: “My Number Input”: 在Home Assistant用户界面上显示的名称为"My Number Input"。
  • id: my_number_input: 这个数值组件的内部ID,用于在其他地方引用。
  • min_value: 5: 这个数值组件可以接受的最小值为5。
  • max_value: 30: 这个数值组件可以接受的最大值为30。
  • step: 1.0: 当调整这个数值时,它的增量或减量步长为1.0。
  • optimistic: true: 表示无需确认从Home Assistant发来的命令的成功执行。即使设备没有向Home Assistant返回确认信息,HA也会假定命令已成功执行。
  • restore_value: false: 表示在重启后不恢复此数值的旧状态(不保留旧值)。
  • update_interval: never: 表示不定期自动更新此数值的状态。
  • on_value:: 当这个数值被改变时触发以下的动作。
  • then:: 指明当on_value事件被触发时将执行的操作
  • args: [‘x’]则表示取该数值组件的当前值

注意:ESPHome的number组件默认情况下不会在掉电后保存其值。然而,你可以使用 globals 组件结合 on_boot 指令去实现这个功能。
首先,你需要定义一个全局变量来存储这个数值:globals
在number中,把参数保存到全局变量

- globals.set:
	id: my_global_number
	value: !lambda return x;

最后,你需要在设备启动时从全局变量中恢复这个数值:

esphome:
  name: esphome_device
  on_boot:
    then:
      - lambda: 'id(my_number_input).publish_state(id(my_global_number));'

17.设备每隔一段时间就会重启?

设备没有连接HA,默认10min会重启一次

api:
  encryption:
    key: "4aHfpCnSugBxiFPzCCPtuUFXUvLeXQ7gRGDXNcoCqCY="
  reboot_timeout: 0s # 没有连接HA,默认10min会重启一次,设置为0s,将不再重启

18.定义全局变量

定义一个全局变量,开启一个定时器,每隔10s增加1

yaml
globals:
  - id: my_counter
    type: int
    restore_value: no
    initial_value: '0'

interval:
  - interval: 10s
    then:
      - lambda: |-
          id(my_counter)++;
          ESP_LOGD("main", "Counter value: %d", id(my_counter));

globals:: 这是globals部分的标头,用于定义全局变量。
- id: my_counter: 这一行定义了一个全局变量,其名称为 my_counter。- 表示一个列表项,每个列表项用于定义一个全局变量。
type: int: 这一行指定了变量的数据类型,这里是整数 (int) 类型。这意味着 my_counter 是一个整数变量。
restore_value: no: 这一行指定了当设备重新启动时是否恢复变量的值。在这里,设置为 no 表示不会在重新启动时恢复值,而将其保留为初始值。
initial_value: '0': 这一行设置了变量的初始值,即在开始时 my_counter 的值将被设置为0。

19.switch 使用

switch:
  - platform: template
    name: "Switch_Test"
    id: Switch_Test_id
    turn_on_action:
      - logger.log: "Switch_Test on"
    turn_off_action:
      - logger.log: "Switch_Test off"

理论上打开的时候日志会输出 Switch_Test on , 关闭开关的时候日志会输出 Switch_Test off
事实上打开/关闭都是输出 Switch_Test on ,turn_off_action部分根本没有执行

添加了一个optimistic参数,这告诉ESPHome在没有反馈的情况下猜测开关状态

switch:
  - platform: template
    name: "Switch_Test"
    optimistic: true
    id: Switch_Test_id
    turn_on_action:
      - logger.log: "Switch_Test on"
    turn_off_action:
      - logger.log: "Switch_Test off"

这样子就符合我们需要的逻辑了

20.类型for循环

script:
  - id: my_script
    then:
      repeat:
        count: 5
        then:
          - delay: 2s
          - logger.log: "This is a loop iteration."

count 是固定的,ESPHome 的 repeat 动作不支持变量或运行时确定的循环次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值