From f8cd58097962d2d9533ee1424a0f3dfc6cbb1315 Mon Sep 17 00:00:00 2001 From: Dave Williams | DitroniX | G8PUO <20687856+DitroniX@users.noreply.github.com> Date: Thu, 18 Jun 2026 15:57:36 +0100 Subject: [PATCH] Update wren-c5-esphome.yaml --- YAML Examples/WREN C5/wren-c5-esphome.yaml | 332 ++++++++++++++++++++- 1 file changed, 318 insertions(+), 14 deletions(-) diff --git a/YAML Examples/WREN C5/wren-c5-esphome.yaml b/YAML Examples/WREN C5/wren-c5-esphome.yaml index 04cc24d..5114d63 100644 --- a/YAML Examples/WREN C5/wren-c5-esphome.yaml +++ b/YAML Examples/WREN C5/wren-c5-esphome.yaml @@ -1,13 +1,74 @@ + esphome: name: wren-c5 + on_boot: + priority: 800 + then: + + - lambda: |- + + uint8_t cfg[2] = {0x03,0x00}; + id(bus_a).write(0x21,cfg,2); + + uint8_t pol[2] = {0x02,0x00}; + id(bus_a).write(0x21,pol,2); + + uint8_t out[2] = {0x01,0x00}; + id(bus_a).write(0x21,out,2); + + ESP_LOGI( + "tca", + "TCA6408A initialized" + ); + + + - delay: 500ms + + - if: + condition: + binary_sensor.is_on: sflag + then: + - logger.log: + "SFLAG ACTIVE AFTER BOOT" + - script.execute: + fault_handler + esp32: - board: esp32-c5-devkitc-1 + + board: esp32-c5-devkitc-1 variant: esp32c5 + framework: type: esp-idf - -# WREN C5 Test + +i2c: + + id: bus_a + + sda: GPIO2 + scl: GPIO3 + + scan: true + +globals: + + - id: fault_active + type: bool + restore_value: no + initial_value: 'false' + + - id: tca_state + type: uint8_t + restore_value: no + initial_value: '0' + +switch: + + - platform: gpio + id: rs485_enable + pin: GPIO23 + restore_mode: ALWAYS_ON output: - platform: gpio @@ -16,18 +77,14 @@ output: light: - platform: binary - output: blue_led id: heartbeat - -interval: - - interval: 500ms - then: - - light.toggle: heartbeat + output: blue_led binary_sensor: + - platform: gpio id: in_1a - name: "IN 1A" + name: "Motor 1 Extend" pin: number: GPIO8 mode: @@ -35,8 +92,9 @@ binary_sensor: pulldown: true - platform: gpio + id: in_1b - name: "IN 1B" + name: "Motor 1 Retract" pin: number: GPIO9 mode: @@ -45,7 +103,7 @@ binary_sensor: - platform: gpio id: in_2a - name: "IN 2A" + name: "Motor 2 Extend" pin: number: GPIO14 mode: @@ -54,7 +112,7 @@ binary_sensor: - platform: gpio id: in_2b - name: "IN 2B" + name: "Motor 2 Retract" pin: number: GPIO13 mode: @@ -68,7 +126,253 @@ binary_sensor: number: GPIO10 mode: input: true - pulldown: true + pulldown: true + + on_press: + then: + - logger.log: + "SFLAG INTERRUPT" + - script.execute: + fault_handler + + - platform: gpio + id: en1 + name: "EN1 Feedback" + pin: + number: GPIO5 + mode: + input: true + + - platform: gpio + id: en2 + name: "EN2 Feedback" + pin: + number: GPIO6 + mode: + input: true + +sensor: + + - platform: adc + id: supply_voltage + pin: GPIO4 + name: "Supply Voltage" + attenuation: auto + update_interval: 30s + + filters: + - multiply: 44.4444 + + - platform: tmp102 + name: "Board Temperature" + address: 0x4A + update_interval: 30s + + - platform: wifi_signal + name: "WiFi RSSI" + update_interval: 60s + + - platform: uptime + name: "Uptime" + +script: + + - id: fault_handler + mode: single + then: + - lambda: |- + + if(id(fault_active)) + return; + + id(fault_active)=true; + + ESP_LOGE( + "FAULT - IMMEDIATE FAULT SHUTDOWN", + "MOTOR STOP - TCA OUTPUT LOW. POWER CYCLE TO RE-ENABLE WREN" + "HAVE A GREAT DAY!" + ); + + uint8_t off[2]; + off[0]=0x01; + off[1]=0x00; + + id(bus_a).write(0x21, off, 2); + id(bus_a).write(0x21, off, 2); + id(bus_a).write(0x21, off, 2); + + - repeat: + count: 20 + then: + - lambda: |- + + uint8_t led[2]; + led[0]=0x01; + + // TCA BIT7 ON + led[1]=0x80; + + id(bus_a).write( + 0x21, + led, + 2 + ); + + - delay: 1000ms + - lambda: |- + + uint8_t led[2]; + led[0]=0x01; + + // ALL OFF + led[1]=0x00; + + id(bus_a).write( + 0x21, + led, + 2 + ); + - delay: 100ms + + # - lambda: |- + # ESP_LOGE( + # "FAULT", + # "RESTARTING" + # ); + # esp_restart(); + +interval: + + + # heartbeat + + - interval: 1s + then: + - light.turn_on: heartbeat + - delay: 750ms + - light.turn_off: heartbeat + + + # motor supervisor + + - interval: 10ms + + then: + + - lambda: |- + + // + // HARD SFLAG CHECK + // + + if(id(sflag).state) + { + ESP_LOGE( + "FAULT", + "SFLAG HIGH" + ); + + id(fault_handler).execute(); + return; + } + + + if(id(sflag).state) + { + id(fault_handler).execute(); + return; + } + + // + // LATCHED FAULT + // + + if(id(fault_active)) + { + uint8_t off[2]={0x01,0x00}; + + id(bus_a).write( + 0x21, + off, + 2 + ); + + return; + } + + // + // VOLTAGE CHECK + // + + float v=id(supply_voltage).state; + + if(v < 10.0f || v > 48.0f) + { + ESP_LOGE( + "FAULT", + "VOLTAGE %.1f", + v + ); + id(fault_handler).execute(); + return; + + } + + uint8_t output=0; + bool m1a=id(in_1a).state; + bool m1b=id(in_1b).state; + bool m2a=id(in_2a).state; + bool m2b=id(in_2b).state; + + bool active = + m1a || + m1b || + m2a || + m2b; + + // + // BOTH ENABLES TOGETHER + // + + if(active) + { + output |= (1<<0); // EN1 + output |= (1<<3); // EN2 + } + + // MOTOR 1 + if(m1a) + output |= (1<<1); + + if(m1b) + output |= (1<<2); + + + // MOTOR 2 + if(m2a) + output |= (1<<4); + + if(m2b) + output |= (1<<5); + + uint8_t buf[2]; + buf[0]=0x01; + buf[1]=output; + + id(bus_a).write( + 0x21, + buf, + 2 + ); + + + // ESP_LOGI( + // "motor", + // "OUT=0x%02X", + // output + // ); + +# ############################# # Enable Home Assistant API api: