Po stronie HA mam taki kafelek
type: entities
entities:
- entity: sensor.pompa_1_status
- type: custom:slider-entity-row
entity: fan.pompa_1_pwm
full_row: true
- entity: select.pompa_1_pwm_tryb
card_mod:
style: |
ha-select {
width: 170px !important;
}
state_color: true
title: Pompa 1
Tak wygląda to dla 2 pomp, łącznie z poborem energii
Jak widac pompa na maxa bierze 46W czyli odpowiada to 3 bieg.
Za płynną regulację odpowiada ta sekcja
- type: custom:slider-entity-row
entity: fan.pompa_1_pwm
full_row: true
Dodatkowo mam pewne atrybuty do konfiguracji pompy (ustawienie w procentach dzień, noc)
Po stronie ESPHome wygląda to tak
Ustawienie parametrów podczas startu esphome
esphome:
name: ${device_name_lower}
comment: ${comment}
platform: ESP32
board: esp32dev
on_boot:
- priority: -10
then:
if:
condition:
lambda: 'return id(day_pump1_value).state > 0;'
then:
- fan.turn_on:
id: fan_pump1
speed: !lambda |-
return id(day_pump1_value).state;
else:
- fan.turn_off: fan_pump1
Zmienna globalna status pompy
globals:
# Pompa 1
- id: on_boot_pump1
type: bool
initial_value: "true"
- id: fan_pump1_state
type: bool
Zmienne ustawiane z poziomu HA dla dla trybow pompy (dzień, noc)
wyglad w HA
kod w esphome
number:
# Pompa 1 dzień
- platform: template
name: "Pompa 1 dzień"
id: day_pump1_value
icon: mdi:rotate-right
unit_of_measurement: "%"
mode: "box"
optimistic: true
min_value: 10
max_value: 100
step: 1
restore_value: true
initial_value: 40
# Pompa 1 noc
- platform: template
name: "Pompa 1 noc"
id: night_pump1_value
icon: mdi:rotate-right
unit_of_measurement: "%"
mode: "box"
optimistic: true
min_value: 10
max_value: 100
step: 1
restore_value: true
initial_value: 20
Select po stronie HA do ustawienia trybów pracy (dzień, noc, off)
wygląd w HA
kod w esphome
select:
# Pompa 1
- platform: template
name: "Pompa 1 PWM tryb"
id: pump1_mode
icon: mdi:rotate-right
optimistic: true
options:
- "Dzień"
- "Noc"
- "Off"
initial_option: "Dzień"
restore_value: true
on_value:
then:
- if:
condition:
lambda: 'return x == "Dzień";'
then:
- fan.turn_on:
id: fan_pump1
speed: !lambda 'return id(day_pump1_value).state;'
- if:
condition:
lambda: 'return x == "Noc";'
then:
- fan.turn_on:
id: fan_pump1
speed: !lambda 'return id(night_pump1_value).state;'
- if:
condition:
lambda: 'return x == "Off";'
then:
- fan.turn_off: fan_pump1
- delay: 30min
- select.set:
id: pump1_mode
option: "Dzień"
Uwaga: dla trybu off pompa działa przez 30 minut, następnie przechodzi w tryb dzień
Główna konfiguracja pompy
output:
# Ppompa 1
- platform: ledc
pin: 26
frequency: 1000Hz
id: ledc_pump1
- platform: template
id: custom_fan_pump1
type: float
write_action:
- lambda: |-
if (id(on_boot_pump1)) {
id(on_boot_pump1) = false;
return;
}
float in_min = 0.01;
float in_max = 1.0;
float out_min = 0.84;
float out_max = 0.42;
id(fan_pump1_state) = state > 0;
float value = state == 0 ? 0 : (state - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
id(ledc_pump1).set_level(value);
fan:
# Ppompa 1
- platform: speed
id: fan_pump1
output: custom_fan_pump1
name: "Pompa 1 PWM"
Sensor zliczania impulsów (pobór energii) oraz ustawienie statusu
sensor:
# Ppompa 1
- platform: duty_cycle
pin:
number: 33
mode: INPUT_PULLUP
id: pump1_power
name: Pompa 1 pobór
update_interval: 5s
accuracy_decimals: 0
device_class: "power"
unit_of_measurement: 'W'
filters:
- lambda: |-
return x == 100.0 ? 0.0 : x;
on_value:
- lambda: |-
ESP_LOGD("pompa1", "state=%f", id(pump1_power).state);
if (id(pump1_power).state == 0) {
id(pump1_status).publish_state("Wyłączona");
}
else if (id(pump1_power).state > 74 && id(pump1_power).state < 76) {
id(pump1_status).publish_state("Ostrzeżenie");
}
else if (id(pump1_power).state > 84 && id(pump1_power).state < 86) {
id(pump1_status).publish_state("Zatrzymanie alarmowe, awaria elektryczna");
}
else if (id(pump1_power).state > 89 && id(pump1_power).state < 91) {
id(pump1_status).publish_state("Zatrzymanie alarmowe, blokada");
}
else if (id(pump1_power).state > 94 && id(pump1_power).state < 96) {
id(pump1_status).publish_state("Tryb gotowości przez sygnał PWM (STOP)");
}
else if (id(pump1_power).state >= 100) {
id(pump1_status).publish_state("Wyłączona");
id(pump1_power).publish_state(0);
}
else {
if (id(fan_pump1_state)) { id(pump1_status).publish_state("PWM"); }
else { id(pump1_status).publish_state("Ręczny"); }
}
Sensor tekstowy do wyświetlenia stanu
wygląd w HA
kod w esphome (jest to ustawiane wyżej w zliczaniau impulsów)
text_sensor:
# Ppompa 1
- platform: template
id: pump1_status
name: "Pompa 1 status"
update_interval: 600s
icon: mdi:thermostat
Oczywiście wszystko nie jest potrzebne, kiedyś tak sobie to wymyśliłem i tak już to u mnie funkcjonuje.