mirror of
https://github.com/CeeWeasel/fresh-home.git
synced 2026-08-09 18:40:14 -04:00
Bunches of fixes nd changes
This commit is contained in:
@@ -8,11 +8,17 @@ substitutions:
|
||||
board: wemos_d1_mini32
|
||||
static_ip: !secret hvac-multisensor-ip
|
||||
|
||||
# For i2c devices
|
||||
# In this case it's just the display
|
||||
sda_pin: GPIO21
|
||||
scl_pin: GPIO22
|
||||
|
||||
door_pin: GPIO19
|
||||
one_wire_pin: GPIO14
|
||||
trigger_pin: GPIO04
|
||||
|
||||
one_wire_pin: GPIO26
|
||||
|
||||
# For the ultrasonic sensor
|
||||
trigger_pin: GPIO16
|
||||
echo_pin: GPIO13
|
||||
|
||||
#mdc_pin: GPIO23
|
||||
@@ -21,8 +27,8 @@ substitutions:
|
||||
#power_pin: GPIO5
|
||||
|
||||
packages:
|
||||
#wifi: !include common/wifi_no_power_save.yaml
|
||||
ethernet: !include common/ethernet.yaml
|
||||
# network: !include common/ethernet.yaml
|
||||
network: !include common/wifi.yaml
|
||||
device_base: !include common/device_base.yaml
|
||||
ble_proxy: !include common/ble_proxy.yaml
|
||||
|
||||
@@ -30,34 +36,14 @@ esphome:
|
||||
name: ${devicename}
|
||||
friendly_name: ${friendly_name}
|
||||
name_add_mac_suffix: false
|
||||
on_boot:
|
||||
- priority: -100
|
||||
then:
|
||||
- lambda: |-
|
||||
if (id(oled)) {
|
||||
id(oled_enabled) = true;
|
||||
} else {
|
||||
id(oled_enabled) = false;
|
||||
}
|
||||
|
||||
esp32:
|
||||
board: ${board}
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
# web_server:
|
||||
# port: 80
|
||||
# version: 3
|
||||
# include_internal: true
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
level: DEBUG
|
||||
logs:
|
||||
sensor: INFO
|
||||
component: INFO
|
||||
ultrasonic: INFO
|
||||
ethernet: DEBUG
|
||||
|
||||
api: # Using settings from common/device_base.yaml
|
||||
|
||||
@@ -74,13 +60,22 @@ globals:
|
||||
- id: screen_power
|
||||
type: bool
|
||||
restore_value: yes
|
||||
initial_value: 'true'
|
||||
initial_value: 'false'
|
||||
|
||||
font:
|
||||
- file: 'CascadiaMonoPL.ttf'
|
||||
- file: 'fonts/CascadiaMonoPL.ttf'
|
||||
id: font1
|
||||
size: 17
|
||||
|
||||
# - file: "gfonts://Roboto"
|
||||
# id: roboto_20
|
||||
# size: 20
|
||||
|
||||
# - file: "gfonts://Material+Symbols+Outlined"
|
||||
# id: icons_50
|
||||
# size: 50
|
||||
# glyphs: ["\U0000e425"] # mdi-timer
|
||||
|
||||
one_wire:
|
||||
- platform: gpio
|
||||
pin: ${one_wire_pin}
|
||||
@@ -142,7 +137,7 @@ sensor:
|
||||
trigger_pin: ${trigger_pin}
|
||||
echo_pin: ${echo_pin}
|
||||
id: ultrasonic_source
|
||||
#update_interval: 5s
|
||||
update_interval: 1s
|
||||
internal: True
|
||||
filters:
|
||||
- sliding_window_moving_average:
|
||||
@@ -221,24 +216,21 @@ binary_sensor:
|
||||
filters:
|
||||
- invert:
|
||||
|
||||
# switch:
|
||||
# - platform: template
|
||||
# id: display_switch
|
||||
# name: "Display"
|
||||
# lambda: |-
|
||||
# if (id(oled_enabled)) {
|
||||
# if (id(screen_power)) {
|
||||
# id(oled).turn_on();
|
||||
# } else {
|
||||
# id(oled).turn_off();
|
||||
# }
|
||||
# }
|
||||
# return id(screen_power);
|
||||
# turn_on_action:
|
||||
# - lambda: |-
|
||||
# id(screen_power) = true;
|
||||
# // id(oled).turn_on();
|
||||
# turn_off_action:
|
||||
# - lambda: |-
|
||||
# id(screen_power) = false;
|
||||
# // id(oled).turn_off();
|
||||
switch:
|
||||
- platform: template
|
||||
id: display_switch
|
||||
icon: mdi:console
|
||||
name: "Display"
|
||||
lambda: |-
|
||||
// if (id(screen_power)) {
|
||||
// id(oled).turn_on();
|
||||
// } else {
|
||||
// id(oled).turn_off();
|
||||
// }
|
||||
return id(screen_power);
|
||||
turn_on_action:
|
||||
- lambda: |-
|
||||
id(screen_power) = true;
|
||||
turn_off_action:
|
||||
- lambda: |-
|
||||
id(screen_power) = false;
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
|
||||
substitutions:
|
||||
devicename: water-softener-multisensor
|
||||
entity_name: water_softener_multisensor
|
||||
friendly_name: Water Softener MultiSensor
|
||||
comment: Clever Water Softener MultiSensor
|
||||
platform: ESP32
|
||||
board: wemos_d1_mini32
|
||||
static_ip: !secret water-softener-multisensor-ip
|
||||
|
||||
door_pin: GPIO18
|
||||
|
||||
# For the ultrasonic sensor
|
||||
trigger_pin: GPIO16
|
||||
echo_pin: GPIO17
|
||||
|
||||
packages:
|
||||
# network: !include common/ethernet.yaml
|
||||
network: !include common/wifi.yaml
|
||||
device_base: !include common/device_base.yaml
|
||||
ble_proxy: !include common/ble_proxy.yaml
|
||||
|
||||
esphome:
|
||||
name: ${devicename}
|
||||
friendly_name: ${friendly_name}
|
||||
name_add_mac_suffix: false
|
||||
|
||||
esp32:
|
||||
board: ${board}
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
api: # Using settings from common/device_base.yaml
|
||||
|
||||
ota: # Using settings from common/device_base.yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
|
||||
sensor:
|
||||
- platform: ultrasonic
|
||||
trigger_pin: ${trigger_pin}
|
||||
echo_pin: ${echo_pin}
|
||||
id: ultrasonic_source
|
||||
update_interval: 1s
|
||||
internal: True
|
||||
filters:
|
||||
- sliding_window_moving_average:
|
||||
window_size: 5
|
||||
send_every: 5
|
||||
send_first_at: 1
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: distance_from_bottom
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- sensor.template.publish:
|
||||
id: distance_from_top
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_bottom
|
||||
name: "Salt Level in CM"
|
||||
icon: mdi:arrow-collapse-up
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (0.94 - (id(ultrasonic_source).state)) * 100;'
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: level_in_bags
|
||||
state: !lambda 'return id(distance_from_bottom).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_top
|
||||
name: "Salt Level From Top in CM"
|
||||
icon: mdi:arrow-collapse-down
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (id(ultrasonic_source).state) * 100;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "bags"
|
||||
state_class: measurement
|
||||
id: level_in_bags
|
||||
name: "Salt Level in Bags"
|
||||
icon: mdi:counter
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (id(distance_from_bottom).state) / 17.5;'
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: "Door"
|
||||
device_class: door
|
||||
pin:
|
||||
number: ${door_pin}
|
||||
mode: INPUT_PULLUP
|
||||
# filters:
|
||||
# - invert:
|
||||
|
||||
@@ -3,14 +3,17 @@ 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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+595
-130
@@ -5,32 +5,41 @@ substitutions:
|
||||
friendly_name: HVAC MultiSensor
|
||||
comment: Clever MultiSensor
|
||||
platform: ESP32
|
||||
board: wemos_d1_mini32
|
||||
board: esp32-wroom-32d
|
||||
variant: esp32
|
||||
# framework: esp-idf
|
||||
framework: arduino
|
||||
static_ip: !secret hvac-multisensor-ip
|
||||
|
||||
# Backlight Button
|
||||
backlight_button: GPIO34
|
||||
|
||||
# For TFT Display
|
||||
tft_dc_pin: GPIO02
|
||||
tft_reset_pin: GPIO04
|
||||
tft_cs_pin: GPIO15
|
||||
tft_backlight_pin: GPIO32
|
||||
|
||||
# For SPI and TFT
|
||||
spi_miso_pin: GPIO19
|
||||
spi_mosi_pin: GPIO23
|
||||
spi_clock_pin: GPIO18
|
||||
|
||||
# For Touchscreen
|
||||
touchscreen_irq_pin: GPIO27
|
||||
|
||||
# For i2c devices
|
||||
# In this case it's just the display
|
||||
sda_pin: GPIO21
|
||||
scl_pin: GPIO22
|
||||
|
||||
door_pin: GPIO19
|
||||
|
||||
one_wire_pin: GPIO26
|
||||
|
||||
# For the ultrasonic sensor
|
||||
trigger_pin: GPIO16
|
||||
echo_pin: GPIO13
|
||||
|
||||
#mdc_pin: GPIO23
|
||||
#mdio_pin: GPIO18
|
||||
#clk_mode: GPIO17_OUT
|
||||
#power_pin: GPIO5
|
||||
passive_buzzer_pin: GPIO26
|
||||
one_wire_pin: GPIO17
|
||||
|
||||
packages:
|
||||
# network: !include common/ethernet.yaml
|
||||
network: !include common/wifi.yaml
|
||||
device_base: !include common/device_base.yaml
|
||||
ble_proxy: !include common/ble_proxy.yaml
|
||||
# ble_proxy: !include common/ble_proxy.yaml
|
||||
|
||||
esphome:
|
||||
name: ${devicename}
|
||||
@@ -38,34 +47,103 @@ esphome:
|
||||
name_add_mac_suffix: false
|
||||
|
||||
esp32:
|
||||
board: ${board}
|
||||
# board: ${board}
|
||||
variant: ${variant}
|
||||
framework:
|
||||
type: esp-idf
|
||||
type: ${framework}
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
level: VERBOSE
|
||||
|
||||
time:
|
||||
- id: !remove homeassistant_time
|
||||
- platform: sntp
|
||||
id: sntp_time
|
||||
timezone: America/Detroit
|
||||
on_time:
|
||||
- hours: 2,3,4,5
|
||||
minutes: 5
|
||||
seconds: 0
|
||||
then:
|
||||
- switch.turn_on: switch_antiburn
|
||||
- hours: 2,3,4,5
|
||||
minutes: 35
|
||||
seconds: 0
|
||||
then:
|
||||
- switch.turn_off: switch_antiburn
|
||||
|
||||
api: # Using settings from common/device_base.yaml
|
||||
actions:
|
||||
- action: play_rtttl
|
||||
variables:
|
||||
song_str: string
|
||||
then:
|
||||
- rtttl.play: !lambda 'return song_str;'
|
||||
on_client_connected:
|
||||
- logger.log:
|
||||
format: "Client %s connected to API with IP %s"
|
||||
args: ["client_info.c_str()", "client_address.c_str()"]
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return (0 == client_info.find("Home Assistant "));'
|
||||
then:
|
||||
- lvgl.widget.show: lbl_hastatus
|
||||
on_client_disconnected:
|
||||
- logger.log:
|
||||
format: "Client %s disconnected to API with IP %s"
|
||||
args: ["client_info.c_str()", "client_address.c_str()"]
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return (0 == client_info.find("Home Assistant "));'
|
||||
then:
|
||||
- lvgl.widget.hide: lbl_hastatus
|
||||
|
||||
ota: # Using settings from common/device_base.yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
# esp32_ble_tracker:
|
||||
|
||||
globals:
|
||||
- id: oled_enabled
|
||||
type: bool
|
||||
restore_value: yes
|
||||
initial_value: 'false'
|
||||
# globals:
|
||||
# - id: oled_enabled
|
||||
# type: bool
|
||||
# restore_value: yes
|
||||
# initial_value: 'false'
|
||||
|
||||
- id: screen_power
|
||||
type: bool
|
||||
restore_value: yes
|
||||
initial_value: 'false'
|
||||
# - id: screen_power
|
||||
# type: bool
|
||||
# restore_value: yes
|
||||
# initial_value: 'false'
|
||||
|
||||
font:
|
||||
- file: 'fonts/CascadiaMonoPL.ttf'
|
||||
id: font1
|
||||
size: 17
|
||||
# - file: 'fonts/CascadiaMonoPL.ttf'
|
||||
# id: regular_20
|
||||
# size: 20
|
||||
# bpp: 4
|
||||
# extras:
|
||||
# - file: "fonts/materialdesignicons-webfont.ttf"
|
||||
# glyphs: [
|
||||
# "\U000F02D1", # mdi-heart
|
||||
# "\U000F05D4", # mdi-airplane-landing
|
||||
# "\U000F02DC", # mdi-home
|
||||
# "\U000F035E", # mdi-menu-left
|
||||
# "\U000F035F", # mdi-menu-right
|
||||
# ]
|
||||
|
||||
- file: 'fonts/RobotoCondensed-Regular.ttf'
|
||||
id: regular_20
|
||||
size: 20
|
||||
bpp: 4
|
||||
extras:
|
||||
- file: "fonts/materialdesignicons-webfont.ttf"
|
||||
glyphs: [
|
||||
"\U000F02DC", # mdi-home
|
||||
"\U000F035E", # mdi-menu-left
|
||||
"\U000F035F", # mdi-menu-right
|
||||
"\U000F05A9", # mdi-wifi
|
||||
"\U000F19B2", # mdi-arrow-up-thin
|
||||
"\U000F19B3", # mdi-arrow-down-thin
|
||||
"\U000F04DB", # mdi-stop
|
||||
]
|
||||
|
||||
# - file: "gfonts://Roboto"
|
||||
# id: roboto_20
|
||||
@@ -78,13 +156,92 @@ font:
|
||||
|
||||
one_wire:
|
||||
- platform: gpio
|
||||
pin: ${one_wire_pin}
|
||||
pin:
|
||||
number: ${one_wire_pin}
|
||||
mode:
|
||||
input: true
|
||||
pullup: true
|
||||
|
||||
i2c:
|
||||
sda: ${sda_pin}
|
||||
scl: ${scl_pin}
|
||||
frequency: 800kHz
|
||||
|
||||
spi:
|
||||
clk_pin: ${spi_clock_pin}
|
||||
mosi_pin: ${spi_mosi_pin}
|
||||
miso_pin: ${spi_miso_pin}
|
||||
|
||||
output:
|
||||
- platform: ledc
|
||||
pin: ${tft_backlight_pin}
|
||||
id: backlight_pwm
|
||||
|
||||
- platform: ledc
|
||||
pin: ${passive_buzzer_pin}
|
||||
id: rtttl_out
|
||||
|
||||
rtttl:
|
||||
output: rtttl_out
|
||||
id: buzzer
|
||||
gain: 60%
|
||||
|
||||
switch:
|
||||
- platform: template
|
||||
name: Antiburn
|
||||
id: switch_antiburn
|
||||
icon: mdi:television-shimmer
|
||||
optimistic: true
|
||||
entity_category: "config"
|
||||
turn_on_action:
|
||||
- logger.log: "Starting Antiburn"
|
||||
- if:
|
||||
condition: lvgl.is_paused
|
||||
then:
|
||||
- lvgl.resume:
|
||||
- lvgl.widget.redraw:
|
||||
- lvgl.pause:
|
||||
show_snow: true
|
||||
turn_off_action:
|
||||
- logger.log: "Stopping Antiburn"
|
||||
- if:
|
||||
condition: lvgl.is_paused
|
||||
then:
|
||||
- lvgl.resume:
|
||||
- lvgl.widget.redraw:
|
||||
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: backlight_pwm
|
||||
name: "Display Backlight"
|
||||
id: display_backlight
|
||||
restore_mode: RESTORE_DEFAULT_OFF
|
||||
|
||||
number:
|
||||
- platform: template
|
||||
name: LVGL Screen timeout
|
||||
optimistic: true
|
||||
id: display_timeout
|
||||
unit_of_measurement: "s"
|
||||
initial_value: 30
|
||||
restore_value: true
|
||||
min_value: 10
|
||||
max_value: 180
|
||||
step: 5
|
||||
mode: box
|
||||
|
||||
# binary_sensor:
|
||||
# - platform: gpio
|
||||
# pin:
|
||||
# number: ${backlight_button}
|
||||
# id: backlight_switch
|
||||
# filters:
|
||||
# - delayed_on: 10ms
|
||||
# - delayed_off: 10ms
|
||||
# on_press:
|
||||
# - light.toggle:
|
||||
# id: display_backlight
|
||||
|
||||
sensor:
|
||||
- platform: dallas_temp
|
||||
address: 0xB33C01B607798528
|
||||
@@ -93,7 +250,16 @@ sensor:
|
||||
icon: mdi:home-thermometer-outline
|
||||
update_interval: 10s
|
||||
filters:
|
||||
- lambda: return x * (9.0/5.0) + 32.0;
|
||||
- lambda: |-
|
||||
float val = x;
|
||||
if (isnan(val)) {
|
||||
val = 0.0;
|
||||
}
|
||||
return val * (9.0/5.0) + 32.0;
|
||||
#- lambda: return x * (9.0/5.0) + 32.0;
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 100.0
|
||||
unit_of_measurement: "°F"
|
||||
state_class: measurement
|
||||
|
||||
@@ -105,6 +271,9 @@ sensor:
|
||||
update_interval: 10s
|
||||
filters:
|
||||
- lambda: return x * (9.0/5.0) + 32.0;
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 100.0
|
||||
unit_of_measurement: "°F"
|
||||
state_class: measurement
|
||||
|
||||
@@ -116,6 +285,9 @@ sensor:
|
||||
update_interval: 10s
|
||||
filters:
|
||||
- lambda: return x * (9.0/5.0) + 32.0;
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 100.0
|
||||
unit_of_measurement: "°F"
|
||||
state_class: measurement
|
||||
|
||||
@@ -129,108 +301,401 @@ sensor:
|
||||
unit_of_measurement: "°F"
|
||||
state_class: measurement
|
||||
filters:
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 100.0
|
||||
- or:
|
||||
- throttle: 60s
|
||||
- delta: 1.0
|
||||
|
||||
- platform: ultrasonic
|
||||
trigger_pin: ${trigger_pin}
|
||||
echo_pin: ${echo_pin}
|
||||
id: ultrasonic_source
|
||||
update_interval: 1s
|
||||
internal: True
|
||||
filters:
|
||||
- sliding_window_moving_average:
|
||||
window_size: 5
|
||||
send_every: 5
|
||||
send_first_at: 1
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: distance_from_bottom
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- sensor.template.publish:
|
||||
id: distance_from_top
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_bottom
|
||||
name: "Salt Level in CM"
|
||||
icon: mdi:arrow-collapse-up
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (0.94 - (id(ultrasonic_source).state)) * 100;'
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: level_in_bags
|
||||
state: !lambda 'return id(distance_from_bottom).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_top
|
||||
name: "Salt Level From Top in CM"
|
||||
icon: mdi:arrow-collapse-down
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (id(ultrasonic_source).state) * 100;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "bags"
|
||||
state_class: measurement
|
||||
id: level_in_bags
|
||||
name: "Salt Level in Bags"
|
||||
icon: mdi:counter
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (id(distance_from_bottom).state) / 17.5;'
|
||||
|
||||
display:
|
||||
- platform: ssd1306_i2c
|
||||
id: oled
|
||||
model: "SSD1306 128x64"
|
||||
#reset_pin: GPIO14 #D0
|
||||
address: 0x3C
|
||||
lambda: |-
|
||||
it.print(0, 0, id(font1), "Delta:");
|
||||
it.printf(128, 0, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_delta).state);
|
||||
it.print(0, 16, id(font1), "Supply:");
|
||||
it.printf(128, 16, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_supply).state);
|
||||
it.print(0, 32, id(font1), "Return:");
|
||||
it.printf(128, 32, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(hvac_return).state);
|
||||
it.print(0, 48, id(font1), "Ambient:");
|
||||
it.printf(128, 48, id(font1), TextAlign::TOP_RIGHT, "%.1f°F", id(ambient).state);
|
||||
- platform: ili9xxx
|
||||
id: main_display
|
||||
# data_rate: 20MHz
|
||||
# spi_mode: MODE3
|
||||
# color_palette: 8BIT
|
||||
invert_colors: false
|
||||
auto_clear_enabled: false
|
||||
update_interval: never
|
||||
model: ili9488
|
||||
dc_pin: ${tft_dc_pin}
|
||||
reset_pin: ${tft_reset_pin}
|
||||
cs_pin: ${tft_cs_pin}
|
||||
transform:
|
||||
swap_xy: true
|
||||
mirror_x: true
|
||||
dimensions:
|
||||
height: 480
|
||||
width: 320
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: "Door"
|
||||
device_class: door
|
||||
pin: ${door_pin}
|
||||
filters:
|
||||
- invert:
|
||||
touchscreen:
|
||||
# - platform: ft5x06
|
||||
- platform: ft63x6
|
||||
id: main_touchscreen
|
||||
display: main_display
|
||||
transform:
|
||||
swap_xy: true
|
||||
mirror_y: true
|
||||
interrupt_pin: ${touchscreen_irq_pin}
|
||||
# on_touch:
|
||||
# - lambda: |-
|
||||
# ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
|
||||
# touch.x,
|
||||
# touch.y,
|
||||
# touch.x_raw,
|
||||
# touch.y_raw
|
||||
# );
|
||||
on_release:
|
||||
- if:
|
||||
condition: lvgl.is_paused
|
||||
then:
|
||||
- logger.log: "LVGL resuming"
|
||||
- lvgl.resume:
|
||||
- lvgl.widget.redraw:
|
||||
- if:
|
||||
condition:
|
||||
light.is_off: display_backlight
|
||||
then:
|
||||
- light.turn_on: display_backlight
|
||||
|
||||
switch:
|
||||
- platform: template
|
||||
id: display_switch
|
||||
icon: mdi:console
|
||||
name: "Display"
|
||||
lambda: |-
|
||||
// if (id(screen_power)) {
|
||||
// id(oled).turn_on();
|
||||
// } else {
|
||||
// id(oled).turn_off();
|
||||
// }
|
||||
return id(screen_power);
|
||||
turn_on_action:
|
||||
- lambda: |-
|
||||
id(screen_power) = true;
|
||||
turn_off_action:
|
||||
- lambda: |-
|
||||
id(screen_power) = false;
|
||||
lvgl:
|
||||
buffer_size: 25%
|
||||
displays: main_display
|
||||
top_layer:
|
||||
widgets:
|
||||
- label:
|
||||
text: "\U000F05A9"
|
||||
id: lbl_hastatus
|
||||
hidden: true
|
||||
align: top_right
|
||||
x: -2
|
||||
y: 7
|
||||
text_align: right
|
||||
|
||||
- buttonmatrix:
|
||||
align: bottom_mid
|
||||
styles: header_footer
|
||||
pad_all: 0
|
||||
outline_width: 0
|
||||
id: top_layer
|
||||
items:
|
||||
styles: header_footer
|
||||
rows:
|
||||
- buttons:
|
||||
- id: page_prev
|
||||
text: "\U000F035E"
|
||||
on_press:
|
||||
then:
|
||||
lvgl.page.previous:
|
||||
- id: page_home
|
||||
text: "\U000F02DC"
|
||||
on_press:
|
||||
then:
|
||||
lvgl.page.show: main_page
|
||||
- id: page_next
|
||||
text: "\U000F035F"
|
||||
on_press:
|
||||
then:
|
||||
lvgl.page.next:
|
||||
on_idle:
|
||||
timeout: !lambda "return (id(display_timeout).state * 1000);"
|
||||
then:
|
||||
- logger.log: "LVGL is idle"
|
||||
- light.turn_off: display_backlight
|
||||
- lvgl.pause:
|
||||
|
||||
pages:
|
||||
- id: room_page
|
||||
widgets:
|
||||
- obj: # a properly placed coontainer object for all these controls
|
||||
align: CENTER
|
||||
width: 400
|
||||
height: 256
|
||||
pad_all: 2
|
||||
bg_color: 0x414559
|
||||
bg_opa: TRANSP
|
||||
border_opa: TRANSP
|
||||
layout: # enable the GRID layout for the children widgets
|
||||
pad_row: 6
|
||||
pad_column: 8
|
||||
type: GRID # split the rows and the columns proportionally
|
||||
grid_columns: [FR(1), FR(1), FR(1)] # equal
|
||||
grid_rows: [FR(10), FR(30), FR(30), FR(30)] # like percents
|
||||
widgets:
|
||||
- label:
|
||||
text: "Red"
|
||||
grid_cell_column_pos: 0 # place the widget in
|
||||
grid_cell_row_pos: 0 # the corresponding cell
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
- button:
|
||||
id: but_cov_up_east
|
||||
bg_color: 0xFF0000
|
||||
grid_cell_column_pos: 0
|
||||
grid_cell_row_pos: 1
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_up_east
|
||||
align: CENTER
|
||||
text: "\U000F19B2"
|
||||
- button:
|
||||
id: but_cov_stop_east
|
||||
bg_color: 0xFF0000
|
||||
grid_cell_column_pos: 0
|
||||
grid_cell_row_pos: 2
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_stop_east
|
||||
align: CENTER
|
||||
text: "\U000F04DB"
|
||||
- button:
|
||||
id: but_cov_down_east
|
||||
bg_color: 0xFF0000
|
||||
grid_cell_column_pos: 0
|
||||
grid_cell_row_pos: 3
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_down_east
|
||||
align: CENTER
|
||||
text: "\U000F19B3"
|
||||
|
||||
- label:
|
||||
text: "Green"
|
||||
grid_cell_column_pos: 1
|
||||
grid_cell_row_pos: 0
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
- button:
|
||||
id: but_cov_up_south
|
||||
bg_color: 0x00FF00
|
||||
grid_cell_column_pos: 1
|
||||
grid_cell_row_pos: 1
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_up_south
|
||||
align: CENTER
|
||||
text: "\U000F19B2"
|
||||
- button:
|
||||
id: but_cov_stop_south
|
||||
bg_color: 0x00FF00
|
||||
grid_cell_column_pos: 1
|
||||
grid_cell_row_pos: 2
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_stop_south
|
||||
align: CENTER
|
||||
text: "\U000F04DB"
|
||||
- button:
|
||||
id: but_cov_down_south
|
||||
bg_color: 0x00FF00
|
||||
grid_cell_column_pos: 1
|
||||
grid_cell_row_pos: 3
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_down_south
|
||||
align: CENTER
|
||||
text: "\U000F19B3"
|
||||
|
||||
- label:
|
||||
text: "Blue"
|
||||
grid_cell_column_pos: 2
|
||||
grid_cell_row_pos: 0
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
- button:
|
||||
id: but_cov_up_west
|
||||
bg_color: 0x0000FF
|
||||
grid_cell_column_pos: 2
|
||||
grid_cell_row_pos: 1
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_up_west
|
||||
align: CENTER
|
||||
text: "\U000F19B2"
|
||||
- button:
|
||||
id: but_cov_stop_west
|
||||
bg_color: 0x0000FF
|
||||
grid_cell_column_pos: 2
|
||||
grid_cell_row_pos: 2
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_stop_west
|
||||
align: CENTER
|
||||
text: "\U000F04DB"
|
||||
- button:
|
||||
id: but_cov_down_west
|
||||
bg_color: 0x0000FF
|
||||
grid_cell_column_pos: 2
|
||||
grid_cell_row_pos: 3
|
||||
grid_cell_x_align: STRETCH
|
||||
grid_cell_y_align: STRETCH
|
||||
widgets:
|
||||
- label:
|
||||
id: cov_down_west
|
||||
align: CENTER
|
||||
text: "\U000F19B3"
|
||||
- id: main_page
|
||||
widgets:
|
||||
- obj:
|
||||
align: TOP_MID
|
||||
styles: header_footer
|
||||
widgets:
|
||||
- label:
|
||||
text: "ESPHome LVGL Display"
|
||||
align: CENTER
|
||||
text_align: CENTER
|
||||
- label:
|
||||
align: CENTER
|
||||
text: 'Hello World!'
|
||||
- label:
|
||||
align: LEFT_MID
|
||||
text: 'Left Mid'
|
||||
- label:
|
||||
align: RIGHT_MID
|
||||
text: 'Right Mid'
|
||||
- id: second_page
|
||||
widgets:
|
||||
- obj:
|
||||
align: TOP_MID
|
||||
styles: header_footer
|
||||
widgets:
|
||||
- label:
|
||||
text: "A second page"
|
||||
align: CENTER
|
||||
text_align: CENTER
|
||||
- label:
|
||||
align: CENTER
|
||||
text: 'Hello Again!'
|
||||
- id: third_page
|
||||
widgets:
|
||||
- obj:
|
||||
align: TOP_MID
|
||||
styles: header_footer
|
||||
widgets:
|
||||
- label:
|
||||
text: "A third page"
|
||||
align: CENTER
|
||||
text_align: CENTER
|
||||
- label:
|
||||
align: CENTER
|
||||
text: 'I am the very model of a modern major general'
|
||||
- id: fourth_page
|
||||
widgets:
|
||||
- obj:
|
||||
align: TOP_MID
|
||||
styles: header_footer
|
||||
widgets:
|
||||
- label:
|
||||
text: "A fourth page"
|
||||
align: CENTER
|
||||
text_align: CENTER
|
||||
- label:
|
||||
align: CENTER
|
||||
text: "I've information vegetable animal and mineral"
|
||||
|
||||
theme:
|
||||
label:
|
||||
text_font: regular_20 # set all your labels to use your custom defined font
|
||||
text_color: 0xcad3f5
|
||||
button:
|
||||
bg_color: 0x24273a
|
||||
bg_grad_color: 0x005782
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
border_color: 0x0077b3
|
||||
border_width: 1
|
||||
text_color: 0xcad3f5
|
||||
pressed: # set some button colors to be different in pressed state
|
||||
bg_color: 0x006699
|
||||
bg_grad_color: 0x00334d
|
||||
checked: # set some button colors to be different in checked state
|
||||
bg_color: 0x1d5f96
|
||||
bg_grad_color: 0x03324A
|
||||
text_color: 0xfff300
|
||||
buttonmatrix:
|
||||
bg_opa: TRANSP
|
||||
border_color: 0x0077b3
|
||||
border_width: 0
|
||||
text_color: 0xcad3f5
|
||||
pad_all: 0
|
||||
items: # set all your buttonmatrix buttons to use your custom defined styles and font
|
||||
bg_color: 0x24273a
|
||||
bg_grad_color: 0x005782
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
border_color: 0x0077b3
|
||||
border_width: 1
|
||||
text_color: 0xcad3f5
|
||||
text_font: regular_20
|
||||
pressed:
|
||||
bg_color: 0x006699
|
||||
bg_grad_color: 0x00334d
|
||||
checked:
|
||||
bg_color: 0x1d5f96
|
||||
bg_grad_color: 0x03324A
|
||||
text_color: 0x005580
|
||||
switch:
|
||||
bg_color: 0xC0C0C0
|
||||
bg_grad_color: 0xb0b0b0
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
checked:
|
||||
bg_color: 0x1d5f96
|
||||
bg_grad_color: 0x03324A
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
knob:
|
||||
bg_color: 0xFFFFFF
|
||||
bg_grad_color: 0xC0C0C0
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
slider:
|
||||
border_width: 1
|
||||
border_opa: 15%
|
||||
bg_color: 0xcccaca
|
||||
bg_opa: 15%
|
||||
indicator:
|
||||
bg_color: 0x1d5f96
|
||||
bg_grad_color: 0x03324A
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
knob:
|
||||
bg_color: 0x24273a
|
||||
bg_grad_color: 0x005782
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
border_color: 0x0077b3
|
||||
border_width: 1
|
||||
text_color: 0xcad3f5
|
||||
|
||||
style_definitions:
|
||||
- id: header_footer
|
||||
bg_color: 0x24273a
|
||||
bg_grad_color: 0x005782
|
||||
bg_grad_dir: VER
|
||||
bg_opa: COVER
|
||||
border_opa: TRANSP
|
||||
radius: 0
|
||||
pad_all: 0
|
||||
pad_row: 0
|
||||
pad_column: 0
|
||||
border_color: 0x0077b3
|
||||
text_color: 0xcad3f5
|
||||
width: 100%
|
||||
height: 30
|
||||
@@ -92,6 +92,7 @@ esp32:
|
||||
time:
|
||||
- platform: sntp
|
||||
id: sntp_time
|
||||
timezone: America/Detroit
|
||||
|
||||
logger:
|
||||
level: DEBUG
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
# 3v3 en svp sun 34 35 32 33 25 26 27 14 12 gnd 13 sd2 sd3 gnd 5v
|
||||
substitutions:
|
||||
devicename: water-softener-multisensor
|
||||
entity_name: water_softener_multisensor
|
||||
friendly_name: Water Softener MultiSensor
|
||||
comment: Clever Water Softener MultiSensor
|
||||
board: nodemcuv2
|
||||
static_ip: !secret water-softener-multisensor-ip
|
||||
|
||||
door_pin: D5
|
||||
|
||||
# For the ultrasonic sensor
|
||||
trigger_pin: D7
|
||||
echo_pin: D6
|
||||
|
||||
packages:
|
||||
# network: !include common/ethernet.yaml
|
||||
network: !include common/wifi.yaml
|
||||
device_base: !include common/device_base.yaml
|
||||
|
||||
esphome:
|
||||
name: ${devicename}
|
||||
friendly_name: ${friendly_name}
|
||||
name_add_mac_suffix: false
|
||||
|
||||
esp8266:
|
||||
board: ${board}
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
api: # Using settings from common/device_base.yaml
|
||||
|
||||
ota: # Using settings from common/device_base.yaml
|
||||
|
||||
sensor:
|
||||
- platform: ultrasonic
|
||||
trigger_pin: ${trigger_pin}
|
||||
echo_pin: ${echo_pin}
|
||||
id: ultrasonic_source
|
||||
update_interval: 1s
|
||||
internal: True
|
||||
filters:
|
||||
- sliding_window_moving_average:
|
||||
window_size: 5
|
||||
send_every: 5
|
||||
send_first_at: 1
|
||||
- lambda: 'return round( x * 10.0) / 10.0;'
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 150.0
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: distance_from_bottom
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- sensor.template.publish:
|
||||
id: distance_from_top
|
||||
state: !lambda 'return id(ultrasonic_source).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_bottom
|
||||
name: "Salt Level in CM"
|
||||
icon: mdi:arrow-collapse-up
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return (0.94 - x) * 100;'
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 150.0
|
||||
|
||||
on_value:
|
||||
then:
|
||||
- sensor.template.publish:
|
||||
id: level_in_bags
|
||||
state: !lambda 'return id(distance_from_bottom).state;'
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "cm"
|
||||
state_class: measurement
|
||||
id: distance_from_top
|
||||
name: "Salt Level From Top in CM"
|
||||
icon: mdi:arrow-collapse-down
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return x * 100;'
|
||||
- round: 1
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 150.0
|
||||
|
||||
|
||||
- platform: template
|
||||
unit_of_measurement: "bags"
|
||||
state_class: measurement
|
||||
id: level_in_bags
|
||||
name: "Salt Level in Bags"
|
||||
icon: mdi:counter
|
||||
disabled_by_default: true
|
||||
#update_interval: 5s
|
||||
filters:
|
||||
- lambda: 'return x / 17.5;'
|
||||
- round: 1
|
||||
- clamp:
|
||||
min_value: 0.0
|
||||
max_value: 10.0
|
||||
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
name: "Door"
|
||||
device_class: door
|
||||
pin:
|
||||
number: ${door_pin}
|
||||
mode: INPUT_PULLUP
|
||||
# filters:
|
||||
# - invert:
|
||||
|
||||
Reference in New Issue
Block a user