Files
cirkelzaagtafelafzuiging/esphome/afzuiginglageweg.yaml
2026-09-09 08:09:30 +02:00

196 lines
4.9 KiB
YAML

#' ==============================================================================
#' ESP32-C3 SUPER MINI - CT RELAY CONTROLLER WITH OLED & ROTARY ENCODERS
#' ==============================================================================
#' UPDATED GPIO ASSIGNMENTS OVERVIEW:
#' ------------------------------------------------------------------------------
#' GPIO 0 : Rotary Encoder 1 - Phase A (Current Threshold)
#' GPIO 1 : Rotary Encoder 1 - Phase B (Current Threshold)
#' GPIO 2 : Rotary Encoder 1 - Push Button (Toggle Display On/Off)
#' GPIO 3 : Rotary Encoder 2 - Phase A (Off-Delay)
#' GPIO 4 : CT Current Sensor (Analog Input ADC1_CH4) [MOVED FROM GPIO7]
#' GPIO 7 : Rotary Encoder 2 - Phase B (Off-Delay) [MOVED FROM GPIO4]
#' GPIO 5 : I2C - SCL (SH1106 Display)
#' GPIO 6 : I2C - SDA (SH1106 Display)
#' GPIO 8 : Relay Output (Active High)
#' ==============================================================================
esphome:
name: afzuiginglageweg
esp32:
board: esp32-c3-devkitm-1
variant: esp32c3
preferences:
flash_write_interval: 1min
logger:
api:
ota:
- platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 192.168.1.173
gateway: 192.168.1.1
subnet: 255.255.255.0
dns1: 192.168.1.1
ap:
ssid: "CT-Relay Fallback AP"
password: !secret ap_password
i2c:
sda: GPIO6
scl: GPIO5
scan: true
font:
- file: "gfonts://Roboto"
id: font_main
size: 10
globals:
- id: current_threshold
type: float
restore_value: true
initial_value: '0.5'
- id: off_delay_seconds
type: int
restore_value: true
initial_value: '5'
- id: display_timeout_timer
type: int
restore_value: false
initial_value: '0'
binary_sensor:
- platform: gpio
pin:
number: GPIO2
mode: INPUT_PULLUP
id: encoder_1_button
name: "Display Toggle Button"
on_press:
then:
- lambda: |-
id(display_timeout_timer) = 10;
id(main_display).turn_on();
- id: load_detected
platform: template
name: "Load Detected"
lambda: |-
return id(ct_current).state >= id(current_threshold);
on_state:
then:
- if:
condition:
binary_sensor.is_on: load_detected
then:
- switch.turn_on: relay_output
- script.stop: delay_off_script
else:
- script.execute: delay_off_script
sensor:
# Current Transformer Reading on valid ADC Pin (GPIO4)
- platform: ct_clamp
sensor: adc_sensor
name: "CT Measured Current"
id: ct_current
update_interval: 500ms
sample_duration: 200ms
accuracy_decimals: 0
force_update: true
filters:
- calibrate_linear:
- 0.01 -> 0
- 1 -> 1
- platform: adc
pin: GPIO4
id: adc_sensor
attenuation: 12db
# Rotary Encoder 1: Threshold Control
- platform: rotary_encoder
name: "Threshold Setting"
pin_a: GPIO0
pin_b: GPIO1
id: encoder_threshold
on_value:
then:
- lambda: |-
static int last_val = 0;
int diff = x - last_val;
last_val = x;
id(current_threshold) += (diff * 0.1);
if (id(current_threshold) < 0.0) id(current_threshold) = 0.0;
id(display_timeout_timer) = 10;
id(main_display).turn_on();
# Rotary Encoder 2: Delay Control
- platform: rotary_encoder
name: "Delay Setting"
pin_a: GPIO3
pin_b: GPIO7
id: encoder_delay
on_value:
then:
- lambda: |-
static int last_val = 0;
int diff = x - last_val;
last_val = x;
id(off_delay_seconds) += diff;
if (id(off_delay_seconds) < 0) id(off_delay_seconds) = 0;
id(display_timeout_timer) = 10;
id(main_display).turn_on();
switch:
- platform: gpio
pin: GPIO8
inverted: true
name: "Relay Output"
id: relay_output
script:
- id: delay_off_script
mode: restart
then:
- delay: !lambda "return id(off_delay_seconds) * 1000;"
- switch.turn_off: relay_output
display:
- platform: ssd1306_i2c
model: "SH1106 128x64"
address: 0x3C
id: main_display
update_interval: 0.1s
lambda: |-
it.printf(0, 0, id(font_main), "Current: %.2f A", id(ct_current).state);
it.printf(0, 11, id(font_main), "Threshold: %.1f A", id(current_threshold));
it.printf(0, 22, id(font_main), "Delay Set: %d s", id(off_delay_seconds));
it.printf(0, 33, id(font_main), "Relay State: %s", id(relay_output).state ? "ON" : "OFF");
it.printf(0, 44, id(font_main), "Delay: %d s", id(display_timeout_timer));
interval:
- interval: 1s
then:
- lambda: |-
if (id(display_timeout_timer) > 0) {
id(display_timeout_timer)--;
if (id(display_timeout_timer) == 0) {
id(main_display).turn_off();
}
}