From 64d5e467d584c9d55b286ccf9c70201b86639868 Mon Sep 17 00:00:00 2001 From: Dave Williams | DitroniX | G8PUO <20687856+DitroniX@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:49:04 +0100 Subject: [PATCH] Update wren-c5-esphome.yaml --- YAML Examples/WREN C5/wren-c5-esphome.yaml | 332 +++++++++++++++++---- 1 file changed, 271 insertions(+), 61 deletions(-) diff --git a/YAML Examples/WREN C5/wren-c5-esphome.yaml b/YAML Examples/WREN C5/wren-c5-esphome.yaml index 5114d63..05109e6 100644 --- a/YAML Examples/WREN C5/wren-c5-esphome.yaml +++ b/YAML Examples/WREN C5/wren-c5-esphome.yaml @@ -1,11 +1,46 @@ +# Dave Williams, DitroniX 2019-2026 (ditronix.net) +# WREN | ESP32-C5 Recliner Linear Motor Controller | IoT Home Automation + +# Example Code, to demonstrate and test the WREN C5 + +# Remember! +# - Set the BOARD to Use ESP32C5 Dev Module (or similar). +# - You can also set the BAUD rate up to 921600 to speed up flashing. +# - The SDK does NOT need external power to flash. It will take Power from the USB 5V. +# - The Serial Monitor is configured for BAUD 115200 + +# The purpose of this test code is to cycle through the various main functions of the board as part of bring up testing. + +# This test code is OPEN SOURCE and formatted for easier viewing. Although is is not intended for real world use, it may be freely used, or modified as needed. +# It is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +# For board configuration, see: + +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation/wiki/Arduino-IDE +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation/wiki/PlatformIO-ESP32%E2%80%90C5 +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation/wiki/Home-Assistant-and-ESPHome +# * github.com/DitroniX/Home-Assistant-Dev + +# Further information, details and examples can be found on our website or github.com/DitroniX + +# * ditronix.net +# * github.com/DitroniX +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation/wiki +# * github.com/DitroniX/WREN-Recliner-Linear-Motor-Controller-IoT-Home-Automation/wiki/FAQ +# * hackster.io/DitroniX/ +# * hackster.io/DitroniX/wren-esp32-c5-recliner-linear-motor-controller-iot-rs485-e2b397 + +# This YAML code has been created to show the features and functionality of WREN C5. +# This code has expanded to become an all encompassing ESPHome applicaition and is a fully working baseline. esphome: name: wren-c5 + friendly_name: WREN C5 on_boot: priority: 800 then: - - lambda: |- uint8_t cfg[2] = {0x03,0x00}; @@ -22,28 +57,65 @@ esphome: "TCA6408A initialized" ); - - delay: 500ms - if: condition: binary_sensor.is_on: sflag then: - - logger.log: - "SFLAG ACTIVE AFTER BOOT" - - script.execute: - fault_handler + - logger.log: "SFLAG ACTIVE AFTER BOOT" + - script.execute: fault_handler esp32: - board: esp32-c5-devkitc-1 variant: esp32c5 framework: type: esp-idf -i2c: +################################## ESPHOME ################################## +# ======================== ESPHome - Enter Below your Key/Pasawords =========================== + +api: + encryption: + key: !secret wren_c5__encryption_key +ota: + - platform: esphome + password: !secret wren_c5__ota_password + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + ap: + ssid: WREN C5 Fallback Hotspot + password: !secret wren_c5__ap_password +captive_portal: + +logger: + +################################## SUBSTITUTIONS ################################## +substitutions: + # ======================== About =========================== + + author: "DitroniX - Dave Williams" + firmware_version: "1.00.02" + release_date: "2026-06-21" + board_name: "WREN C5" + board_mcu: "ESP32-C5" + board_rev: "1.2606.104" + + # ======================== Config =========================== + + board_location: "Lounge" + voltage_low: 3.00 + voltage_high: 48.0 + +################################## SETUP ################################## + +# ========================== GPIO ============================= + +i2c: id: bus_a sda: GPIO2 @@ -52,19 +124,18 @@ i2c: scan: true globals: - - id: fault_active type: bool restore_value: no - initial_value: 'false' + initial_value: "false" - id: tca_state type: uint8_t restore_value: no - initial_value: '0' + initial_value: "0" +################################## SWITCH ################################## switch: - - platform: gpio id: rs485_enable pin: GPIO23 @@ -75,13 +146,171 @@ output: pin: GPIO27 id: blue_led +################################## LIGHT ################################## light: - platform: binary id: heartbeat output: blue_led -binary_sensor: +################################## TEXT SENSOR ################################## +text_sensor: + # ===================================================== + # WREN C5 FIRMWARE METADATA + # ===================================================== + + - platform: template + name: "Author" + entity_category: diagnostic + lambda: |- + return {"${author}"}; + + - platform: template + name: "Firmware Version" + entity_category: diagnostic + lambda: |- + return {"${firmware_version}"}; + + - platform: template + name: "Release Date" + entity_category: diagnostic + lambda: |- + return {"${release_date}"}; + + - platform: template + name: "Board Name" + entity_category: diagnostic + lambda: |- + return {"${board_name}"}; + + - platform: template + name: "Board MCU" + entity_category: diagnostic + lambda: |- + return {"${board_mcu}"}; + + - platform: template + name: "Board Build" + entity_category: diagnostic + lambda: |- + return {"${board_rev}"}; + + - platform: template + name: "Board Location" + entity_category: diagnostic + icon: mdi:information + update_interval: 60s + lambda: |- + return {"${board_location}"}; + + - platform: template + name: "Product" + icon: mdi:information + entity_category: diagnostic + update_interval: 60s + lambda: |- + return {"Professional Energy Monitor"}; + + - platform: template + name: "Hardware" + entity_category: diagnostic + icon: mdi:information + update_interval: 60s + lambda: |- + return {"ESP32-C5 Dual ATM90E32"}; + + - platform: template + name: "WiFi Signal Quality" + id: wifi_signal_quality + entity_category: diagnostic + update_interval: 30s + lambda: |- + if (!id(wifi_signal_db).has_state()) { + return {"No Signal"}; + } + + int rssi = abs((int)id(wifi_signal_db).state); + + if (rssi <= 30) { + return {"Signal Very Strong"}; + } else if (rssi <= 50) { + return {"Signal Excellent"}; + } else if (rssi <= 60) { + return {"Signal Healthy"}; + } else if (rssi <= 70) { + return {"Signal Very Good"}; + } else if (rssi <= 80) { + return {"Signal Good"}; + } else if (rssi <= 90) { + return {"Signal Poor - Try Moving Position"}; + } else if (rssi <= 100) { + return {"Signal Very Low - Move Position"}; + } else { + return {"No Signal"}; + } + + # ===================================================== + # VOLTAGE STATUS AND LOG + # ===================================================== + + - platform: template + name: "Supply Status" + id: supply_status + icon: mdi:power-plug + entity_category: diagnostic + update_interval: 1s + lambda: |- + float v = id(supply_voltage).state; + + constexpr float VOLTAGE_LOW = ${voltage_low}; + constexpr float VOLTAGE_HIGH = ${voltage_high}; + + // Developer. Only enable for PCB 1.2606.104 and above, as this value is now taken from +VBUS rather than P24V_DVR + // if (v >= VOLTAGE_LOW && v <= 5.5f) { + // ESP_LOGI( + // "POWER", + // "USB Power Detected - Supply Voltage %.2fV", + // v + // ); + // return {"USB Powered"}; + // } + + if (v >= 5.5f && v <= 10.0f) { + ESP_LOGI( + "POWER", + "Voltage Too Low %.2fV", + v + ); + return {"Power Fail"}; + } + + if (v >= 10.0f && v <= 20.0f) { + return {"Low Voltage"}; + } + + if (v >= 20.0f && v <= 30.0f) { + return {"Recliner"}; + } + + if (v >= 30.0f && v <= VOLTAGE_HIGH) { + char buffer[20]; + snprintf(buffer, sizeof(buffer), "%.1fV", v); + return {buffer}; + } + + if (v > 48.0f) { + ESP_LOGI( + "POWER", + "Over Voltage %.2fV", + v + ); + return {"Over Voltage"}; + } + + return {"Unknown"}; + +############################## BINARY SENSOR ############################### +binary_sensor: - platform: gpio id: in_1a name: "Motor 1 Extend" @@ -130,10 +359,8 @@ binary_sensor: on_press: then: - - logger.log: - "SFLAG INTERRUPT" - - script.execute: - fault_handler + - logger.log: "SFLAG INTERRUPT" + - script.execute: fault_handler - platform: gpio id: en1 @@ -151,21 +378,22 @@ binary_sensor: mode: input: true +################################## SENSOR ################################## sensor: - - platform: adc id: supply_voltage pin: GPIO4 name: "Supply Voltage" attenuation: auto update_interval: 30s - + entity_category: diagnostic filters: - multiply: 44.4444 - platform: tmp102 name: "Board Temperature" address: 0x4A + entity_category: diagnostic update_interval: 30s - platform: wifi_signal @@ -175,8 +403,21 @@ sensor: - platform: uptime name: "Uptime" -script: + # ===================================================== + # OTHER SENSORS + # ===================================================== + - platform: wifi_signal + name: "WiFi Signal" + id: wifi_signal_db + unit_of_measurement: "dBm" + device_class: signal_strength + state_class: measurement + entity_category: diagnostic + update_interval: 30s + +################################## SCRIPT ################################## +script: - id: fault_handler mode: single then: @@ -199,7 +440,7 @@ script: id(bus_a).write(0x21, off, 2); id(bus_a).write(0x21, off, 2); - id(bus_a).write(0x21, off, 2); + id(bus_a).write(0x21, off, 2); - repeat: count: 20 @@ -241,9 +482,8 @@ script: # ); # esp_restart(); +################################## INTERVAL ################################## interval: - - # heartbeat - interval: 1s @@ -252,13 +492,11 @@ interval: - delay: 750ms - light.turn_off: heartbeat - # motor supervisor - interval: 10ms then: - - lambda: |- // @@ -304,18 +542,16 @@ interval: // VOLTAGE CHECK // - float v=id(supply_voltage).state; + constexpr float VOLTAGE_LOW = ${voltage_low}; + constexpr float VOLTAGE_HIGH = ${voltage_high}; - if(v < 10.0f || v > 48.0f) + float v = id(supply_voltage).state; + + if (v < VOLTAGE_LOW || v > VOLTAGE_HIGH) { - ESP_LOGE( - "FAULT", - "VOLTAGE %.1f", - v - ); - id(fault_handler).execute(); - return; - + ESP_LOGE("FAULT", "Voltage %.2fV out of range", v); + id(fault_handler).execute(); + return; } uint8_t output=0; @@ -347,7 +583,6 @@ interval: if(m1b) output |= (1<<2); - // MOTOR 2 if(m2a) output |= (1<<4); @@ -365,33 +600,8 @@ interval: 2 ); - // ESP_LOGI( // "motor", // "OUT=0x%02X", // output // ); - -# ############################# - -# Enable Home Assistant API -api: - encryption: - key: "xxxx=" - -ota: - - platform: esphome - password: "xxxx" - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - - # Enable fallback hotspot (captive portal) in case wifi connection fails - ap: - ssid: "Wren-C5-Test Fallback Hotspot" - password: "xxxx" - -captive_portal: - -logger: \ No newline at end of file