注意
如果你是参考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称重传感器
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)传感器,用于检测水位。配置包括以下内容:
- 设置平台为
adc
。 - 为传感器分配ID “water_level_sensor”。
- 报告的单位为伏特(V)。
- 使用mdi图标库中的"mdi:icon-tint"作为传感器图标。
- 设置衰减为11dB。
- 设置数据精度到小数点后5位。
- 将传感器连接到引脚0(电压范围0~2.8V左右)。
- 将传感器命名为"Water Level Sensor"。
- 数据更新时间间隔设置为1秒。
- 对数据应用滑动窗口移动平均滤波器:
- 设置窗口大小为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连接状态,并根据连接状态在日志中记录相应的消息。
interval:
- 创建一个间隔触发器。- interval: 5s
- 设置间隔为5秒。这意味着每隔5秒都会执行一次以下的then
部分。then:
- 指定在每个间隔触发时要执行的操作序列。- if:
- 使用条件语句判断下面的条件是否满足。condition:
- 定义用于判断的条件。wifi.connected:
- 确定设备当前是否连接到WiFi。当连接时,此条件为真(true);否则为假(false)。then:
- 如果wifi.connected
条件为真(已连接),则执行以下操作:
a.- logger.log: "wifi Connected"
- 在设备日志中记录消息“wifi Connected”。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平台的开关和一个二进制传感器。具体功能如下:
-
定义一个基于GPIO平台的开关:
- 使用GPIO0作为控制引脚。
- 将开关命名为"wireless05_switch"。
- 使用ID "relay2"进行标识。
-
定义一个基于GPIO平台的二进制传感器:
- 使用GPIO2作为输入引脚。
- 将传感器命名为"press_switch05"。
- 设备类别设置为"opening"(表示门、窗等开关)。
- 添加一个100ms延迟的滤波器(delayed_on_off),消除信号噪声和抖动。
- 当传感器被按下(on_press)时,触发以下操作:
- 切换ID为"relay2"的开关(“wireless05_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设备的基本信息。
name
: 设置用于标识设备的名称,这会影响到生成的固件名称以及部署时的主机名。在这个例子中,它被设置为"esp32c3-water-level-sensor"。
name: "esp32c3-water-level-sensor"
friendly_name
: 设置设备的友好名称,通常用于在用户界面(如Home Assistant)中显示。在此示例中,它也被设置为"esp32c3-water-level-sensor"。
friendly_name: "esp32c3-water-level-sensor"
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 灯。请看下面对每行代码的解释:
output:
:定义输出设备部分开始。- platform: ledc
:使用 ledc 平台创建输出设备,适用于 ESP32 微控制器,它提供硬件 PWM 控制。pin: GPIO18
:将 ledc 输出引脚指定为 ESP32 上的 GPIO18。id: my_led_output
:为该输出设备分配唯一标识符 “my_led_output”,以便稍后在light
组件中引用。frequency: 1000 Hz
:设置 ledc PWM 的频率为 1000 Hz。light:
:定义 light 设备部分开始。- platform: monochromatic
:使用 monochromatic 平台创建单色 LED 灯。output: my_led_output
:将 LED 灯关联到之前定义的输出设备 “my_led_output”。name: "My Adjustable LED Light"
:为此 LED 灯设备命名为 “My Adjustable LED Light”,以便在 Home Assistant 等系统中显示。gamma_correct: 1.0
:设置 gamma 校正系数为 1.0,实现线性亮度调节。default_transition_length: 5s
:设置默认过渡时间为 5 秒,即当亮度发生改变时,需要 5 秒的时间平滑过渡到新的亮度。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
这段代码定义了一个按键、一个开关和一个脚本。下面是每个部分的详细解释:
-
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
)。
- 打开名为"Light Switch"的开关 (
-
switch
:
定义了一个基于GPIO的开关,连接到GPIO18。这个开关可以是一个继电器,用于控制灯泡或其他可控设备。 -
script
:
定义了一个具有ID “auto_off_script” 的脚本。此脚本包含两个操作:- 延迟5秒 (
delay: 5s
)。 - 关闭名为 “Light Switch” 的开关 (
switch.turn_off: light_switch
)。
- 延迟5秒 (
综上所述,当按下GPIO9上的按键时,代码将执行以下操作:
- 打开与GPIO18相关联的开关(如继电器)。
- 停止当前运行的 “auto_off_script” 脚本(如果有的话)。
- 重新执行 “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 动作不支持变量或运行时确定的循环次数