why keep track any more?

This commit is contained in:
CeeWeasel
2025-12-03 20:23:33 -05:00
parent 7b8fbb063e
commit 921c3df342
52 changed files with 1985 additions and 1419 deletions
@@ -1,2 +1,4 @@
platform: status
name: "Status"
binary_sensor:
- platform: status
name: "Status"
id: local_status_sensor
@@ -0,0 +1,35 @@
number:
- platform: template
name: High Humidity Trigger
id: val_humidity
icon: mdi:gauge-full
unit_of_measurement: '%'
entity_category: config
optimistic: True
restore_value: True
initial_value: 70
min_value: 0
max_value: 100
step: 1.0
mode: box
- platform: template
name: Humidity Change Trigger
id: val_derivative
icon: mdi:gauge-full
unit_of_measurement: ''
entity_category: config
optimistic: True
restore_value: True
initial_value: 2.0
min_value: -10.0
max_value: 10.0
step: .01
mode: box
binary_sensor:
- platform: template
name: Too Humid
id: too_humid
device_class: moisture
lambda: return id(relative_humidity).state >= id(val_humidity).state or id(relative_humidity_change).state >= id(val_derivative).state;
+47 -5
View File
@@ -67,7 +67,10 @@ sensor:
id: temperature
internal: true
sample_rate: lp
unit_of_measurement: C"
unit_of_measurement: F"
# Converting to farenheit here, to avoid decimals when viewing the sensor in home assistant
filters:
- lambda: return round( (x * (9.0/5.0) + 32.0) * 100.0) / 100.0;
web_server:
sorting_weight: 11
sorting_group_id: sorting_group_temperature_settings
@@ -149,13 +152,18 @@ sensor:
- platform: copy
source_id: temperature
device_class: temperature
unit_of_measurement: C"
unit_of_measurement: F"
name: "Air Temperature"
id: air_temperature
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
- lambda: 'return round( x * 10.0) / 10.0;'
web_server:
sorting_weight: 12
sorting_group_id: sorting_group_temperature_settings
@@ -165,8 +173,9 @@ sensor:
- platform: copy
source_id: temperature
device_class: temperature
unit_of_measurement: C/m"
unit_of_measurement: F/m"
name: "Air Temperature Change"
id: air_temperature_change
icon: mdi:chart-line
disabled_by_default: true
filters:
@@ -182,7 +191,10 @@ sensor:
float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*5;
last_value = x;
last_time = time;
return change;
return round( change * 100.0) / 100.0;
- or:
- heartbeat: 60s
- delta: 0.1
- sliding_window_moving_average:
window_size: 10
send_every: 10
@@ -196,11 +208,16 @@ sensor:
device_class: humidity
unit_of_measurement: "%"
name: "Relative Humidity"
id: relative_humidity
filters:
- round: 2
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_weight: 22
sorting_group_id: sorting_group_humidity_settings
@@ -210,6 +227,7 @@ sensor:
device_class: humidity
unit_of_measurement: "%/m"
name: "Relative Humidity Change"
id: relative_humidity_change
icon: mdi:chart-line
disabled_by_default: true
filters:
@@ -222,14 +240,18 @@ sensor:
last_time = time;
return {};
}
float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*5;
float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*10;
last_value = x;
last_time = time;
return change;
- round: 2
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_weight: 23
sorting_group_id: sorting_group_humidity_settings
@@ -243,6 +265,10 @@ sensor:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_pressure_settings
@@ -255,6 +281,10 @@ sensor:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_pressure_settings
@@ -267,6 +297,10 @@ sensor:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
@@ -279,6 +313,10 @@ sensor:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
@@ -291,6 +329,10 @@ sensor:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
+371
View File
@@ -0,0 +1,371 @@
web_server:
port: 80
version: 3
include_internal: true
sorting_groups:
- id: sorting_group_temperature_settings
name: "Temperature Settings"
sorting_weight: 10
- id: sorting_group_humidity_settings
name: "Humidity Settings"
sorting_weight: 20
- id: sorting_group_pressure_settings
name: "Pressure Settings"
sorting_weight: 30
- id: sorting_group_quality_settings
name: "Quality Settings"
sorting_weight: 40
bme68x_bsec2_i2c:
i2c_id: ${i2c_id}
model: bme680
# i2c address
# -----------
# Common values are:
# - 0x76
# - 0x77
# Default: 0x76
address: 0x77
# Temperature offset
# ------------------
# Useful if device is in enclosure and reads too high
# Default: 0
temperature_offset: 0
# Sample rate
# -----------
# This controls the sampling rate for gas-dependant sensors and will govern the interval
# at which the sensor heater is operated.
# By default this rate will also be used for temperature, pressure and humidity sensors
# but these can be overridden on a per-sensor level if required.
#
# Available options:
# - lp (low power - samples every 3 seconds)
# - ulp (ultra low power - samples every 5 minutes)
# Default: lp
sample_rate: lp
# Interval at which to save BSEC state
# ------------------------------------
# Default: 6h
state_save_interval: 6h
sensor:
- platform: bme68x_bsec2
temperature:
# Temperature in °C
id: temperature
internal: true
sample_rate: lp
unit_of_measurement: "°F"
# Converting to farenheit here, to avoid decimals when viewing the sensor in home assistant
filters:
- lambda: return round( (x * (9.0/5.0) + 32.0) * 100.0) / 100.0;
web_server:
sorting_weight: 11
sorting_group_id: sorting_group_temperature_settings
humidity:
# Relative humidity %
id: humidity
internal: true
sample_rate: lp
unit_of_measurement: "%"
web_server:
sorting_weight: 21
sorting_group_id: sorting_group_humidity_settings
pressure:
# Pressure in hPa
id: pressure
internal: true
sample_rate: lp
unit_of_measurement: "hPa"
web_server:
sorting_weight: 31
sorting_group_id: sorting_group_pressure_settings
gas_resistance:
# Gas resistance in Ω
id: resistance
internal: true
unit_of_measurement: "Ω"
disabled_by_default: True
web_server:
sorting_weight: 41
sorting_group_id: sorting_group_pressure_settings
iaq:
# Indoor air quality value
id: iaq
internal: true
unit_of_measurement: "AQI"
web_server:
sorting_weight: 51
sorting_group_id: sorting_group_quality_settings
co2_equivalent:
# CO2 equivalent estimate in ppm
id: co2
internal: true
unit_of_measurement: "ppm"
web_server:
sorting_weight: 61
sorting_group_id: sorting_group_quality_settings
breath_voc_equivalent:
# Volatile organic compounds equivalent estimate in ppm
id: breath_voc
internal: true
unit_of_measurement: "ppm"
web_server:
sorting_weight: 71
sorting_group_id: sorting_group_quality_settings
iaq_accuracy:
# IAQ accuracy as a numeric value of 0, 1, 2, 3
name: "Numeric IAQ Accuracy"
id: iaq_accuracy
disabled_by_default: True
web_server:
sorting_weight: 81
sorting_group_id: sorting_group_quality_settings
filters:
- median:
window_size: 20
send_every: 20
send_first_at: 1
# These source sensors update every 3 seconds
# An average with a window size of 10 and send_every of 10 means that an average is pushed out every 30 seconds
- platform: copy
source_id: temperature
device_class: temperature
unit_of_measurement: "°F"
name: "Air Temperature"
id: air_temperature
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
- lambda: 'return round( x * 10.0) / 10.0;'
web_server:
sorting_weight: 12
sorting_group_id: sorting_group_temperature_settings
# These derivatives attempt to calculate the change per minute
- platform: copy
source_id: temperature
device_class: temperature
unit_of_measurement: "°F/m"
name: "Air Temperature Change"
id: air_temperature_change
icon: mdi:chart-line
disabled_by_default: true
filters:
- lambda: |-
static float last_value = 0;
static float last_time = 0;
float time = (float) millis();
if (last_time == 0){
last_value = x;
last_time = time;
return {};
}
float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*5;
last_value = x;
last_time = time;
return round( change * 100.0) / 100.0;
- or:
- heartbeat: 60s
- delta: 0.1
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
web_server:
sorting_weight: 13
sorting_group_id: sorting_group_temperature_settings
- platform: copy
source_id: humidity
device_class: humidity
unit_of_measurement: "%"
name: "Relative Humidity"
id: relative_humidity
filters:
- round: 2
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_weight: 22
sorting_group_id: sorting_group_humidity_settings
- platform: copy
source_id: humidity
device_class: humidity
unit_of_measurement: "%/m"
name: "Relative Humidity Change"
id: relative_humidity_change
icon: mdi:chart-line
disabled_by_default: true
filters:
- lambda: |-
static float last_value = 0;
static float last_time = 0;
float time = (float) millis();
if (last_time == 0){
last_value = x;
last_time = time;
return {};
}
float change = ( ( x - last_value ) / ( time - last_time ) ) *1000*10;
last_value = x;
last_time = time;
return change;
- round: 2
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_weight: 23
sorting_group_id: sorting_group_humidity_settings
- platform: copy
source_id: pressure
unit_of_measurement: "hPa"
name: "Pressure"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_pressure_settings
- platform: copy
source_id: resistance
unit_of_measurement: "Ω"
name: "Gas Resistance"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_pressure_settings
- platform: copy
source_id: iaq
unit_of_measurement: "AQI"
name: "Air Quality Index"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
- platform: copy
source_id: co2
unit_of_measurement: "ppm"
name: "CO2 Equivalent"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
- platform: copy
source_id: breath_voc
unit_of_measurement: "ppm"
name: "Breath VOC Equivalent"
filters:
- sliding_window_moving_average:
window_size: 10
send_every: 10
send_first_at: 1
- round: 2
- or:
- heartbeat: 60s
- delta: 0.1
web_server:
sorting_group_id: sorting_group_quality_settings
text_sensor:
- platform: template
name: "IAQ Classification"
icon: "mdi:checkbox-marked-circle-outline"
web_server:
sorting_weight: 60
sorting_group_id: sorting_group_quality_settings
lambda: |-
if (int(id(iaq).state) <= 50) {
return {"Excellent"};
}
else if (int(id(iaq).state) <= 100) {
return {"Good"};
}
else if (int(id(iaq).state) <= 150) {
return {"Lightly polluted"};
}
else if (int(id(iaq).state) <= 200) {
return {"Moderately polluted"};
}
else if (int(id(iaq).state) <= 250) {
return {"Heavily polluted"};
}
else if (int(id(iaq).state) <= 350) {
return {"Severely polluted"};
}
else if (int(id(iaq).state) <= 500) {
return {"Extremely polluted"};
}
else {
return {"unknown"};
}
- platform: bme68x_bsec2
iaq_accuracy:
# IAQ accuracy as a text value of Stabilizing, Uncertain, Calibrating, Calibrated
name: "AQI Accuracy"
web_server:
sorting_weight: 61
sorting_group_id: sorting_group_quality_settings
@@ -1,3 +1,5 @@
platform: restart
name: "Restart"
disabled_by_default: false
button:
- platform: restart
name: "Restart"
id: local_restart_button
disabled_by_default: false
+5 -11
View File
@@ -23,14 +23,8 @@ ota:
- platform: esphome
password: !secret ota-password
binary_sensor:
- <<: !include binary_sensor/status_sensor.config.yaml
button:
- <<: !include button/restart_button.config.yaml
sensor:
- <<: !include sensor/uptime_sensor.config.yaml
text_sensor:
- <<: !include text_sensor/version_sensor.config.yaml
packages:
binary_sensor: !include binary_sensor/status_sensor.config.yaml
button: !include button/restart_button.config.yaml
sensor: !include sensor/uptime_sensor.config.yaml
text_sensor: !include text_sensor/version_sensor.config.yaml
+6 -7
View File
@@ -16,11 +16,10 @@ ethernet:
use_address: ${devicename}.local
manual_ip:
static_ip: ${static_ip}
gateway: !secret iot_default_gateway
subnet: !secret iot_subnet_mask
dns1: !secret iot_default_dns1
# manual_ip:
# static_ip: ${static_ip}
# gateway: !secret iot_default_gateway
# subnet: !secret iot_subnet_mask
# dns1: !secret iot_default_dns1
text_sensor:
- <<: !include text_sensor/ethernet_info.config.yaml
text_sensor: !include text_sensor/ethernet_info.config.yaml
+8
View File
@@ -0,0 +1,8 @@
esp32:
board: esp32-evb
framework:
#type: arduino
type: ${framework}
packages:
network: !include ../common/wifi.yaml
+16 -3
View File
@@ -1,3 +1,16 @@
platform: wifi_signal
name: RSSI
update_interval: 60s
# Example configuration entry with 2 sensors and filter
sensor:
- platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB
name: "RSSI"
id: local_wifi_signal_db
update_interval: 60s
entity_category: "diagnostic"
- platform: copy # Reports the WiFi signal strength in %
source_id: local_wifi_signal_db
name: "WiFi Signal Strength"
filters:
- lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
unit_of_measurement: "%"
entity_category: "diagnostic"
device_class: ""
@@ -1,4 +1,6 @@
platform: uptime
name: Uptime
disabled_by_default: true
icon: mdi:timer-check
sensor:
- platform: uptime
name: Uptime
id: local_uptime_sensor
disabled_by_default: true
icon: mdi:timer-check
@@ -1,10 +1,10 @@
# Text sensors with general information.
platform: ethernet_info
ip_address:
name: "IP Address"
icon: mdi:ip
disabled_by_default: true
mac_address:
name: MAC Address
icon: mdi:network
disabled_by_default: true
text_sensor:
- platform: ethernet_info
ip_address:
name: "IP Address"
icon: mdi:ip
disabled_by_default: true
mac_address:
name: MAC Address
icon: mdi:network
disabled_by_default: true
@@ -1,5 +1,5 @@
# Text sensors with general information.
platform: ethernet_info
ip_address:
name: "IP Address"
disabled_by_default: true
text_sensor:
- platform: ethernet_info
ip_address:
name: "IP Address"
disabled_by_default: true
@@ -1,4 +1,5 @@
platform: ethernet_info
mac_address:
name: MAC Address
disabled_by_default: true
text_sensor:
- platform: ethernet_info
mac_address:
name: MAC Address
disabled_by_default: true
@@ -1,6 +1,6 @@
platform: version
name: ESPHome Version
# id: ${entity_name}_version
hide_timestamp: true
disabled_by_default: true
icon: mdi:chip
text_sensor:
- platform: version
name: ESPHome Version
hide_timestamp: true
disabled_by_default: true
icon: mdi:chip
@@ -1,21 +1,21 @@
# Text sensors with general information.
platform: wifi_info
ip_address:
name: IP
icon: mdi:ip
update_interval: 60s
disabled_by_default: true
ssid:
name: SSID
icon: mdi:lan
update_interval: 60s
disabled_by_default: true
bssid:
name: BSSID
disabled_by_default: true
update_interval: 60s
icon: mdi:router-network
mac_address:
name: Wifi MAC Address
disabled_by_default: true
icon: mdi:wifi-cog
text_sensor:
- platform: wifi_info
ip_address:
name: IP
icon: mdi:ip
update_interval: 60s
disabled_by_default: true
ssid:
name: SSID
icon: mdi:lan
update_interval: 60s
disabled_by_default: true
bssid:
name: BSSID
disabled_by_default: true
update_interval: 60s
icon: mdi:router-network
mac_address:
name: Wifi MAC Address
disabled_by_default: true
icon: mdi:wifi-cog
+1 -3
View File
@@ -38,6 +38,4 @@ ethernet:
packages:
ble_proxy: !include ../common/ble_proxy.yaml
text_sensor:
- <<: !include text_sensor/ethernet_info.config.yaml
text_sensor: !include text_sensor/ethernet_info.config.yaml
@@ -0,0 +1,50 @@
esphome:
name: ${devicename}
platformio_options:
board_build.arduino.memory_type: qio_opi
board_build.flash_mode: dio
upload_speed: 921600
monitor_speed: 115200
esp32:
board: ${board}
flash_size: 16MB
framework:
type: ${framework}
sdkconfig_options:
CONFIG_ESP32_S3_BOX_BOARD: "y"
psram:
mode: octal
speed: 80MHz
packages:
network: !include ../common/wifi.yaml
# captive_portal:
# wifi:
# # Enable fast connect
# fast_connect: true
# min_auth_mode: WPA2
# use_address: ${devicename}.local
# networks:
# - ssid: !secret wifi_ssid
# password: !secret wifi_password
# hidden: true
# manual_ip:
# static_ip: ${static_ip}
# gateway: !secret iot_default_gateway
# subnet: !secret iot_subnet_mask
# dns1: !secret iot_default_dns1
# # Enable fallback hotspot (captive portal) in case wifi connection fails
# ap:
# ssid: "${friendly_name}"
# password: !secret fallback_ap_password
# packages:
# sensor: !include sensor/rssi_sensor.config.yaml
# text_sensor: !include text_sensor/wifi_sensor.config.yaml
+3 -5
View File
@@ -23,8 +23,6 @@ wifi:
ssid: "${friendly_name}"
password: !secret fallback_ap_password
sensor:
- <<: !include sensor/rssi_sensor.config.yaml
text_sensor:
- <<: !include text_sensor/wifi_sensor.config.yaml
packages:
sensor: !include sensor/rssi_sensor.config.yaml
text_sensor: !include text_sensor/wifi_sensor.config.yaml
+2 -4
View File
@@ -17,8 +17,6 @@ wifi:
ssid: "${friendly_name}"
password: !secret fallback_ap_password
sensor:
- <<: !include sensor/rssi_sensor.config.yaml
sensor: !include sensor/rssi_sensor.config.yaml
text_sensor:
- <<: !include text_sensor/wifi_sensor.config.yaml
text_sensor: !include text_sensor/wifi_sensor.config.yaml