devices.esphome.io
ES32A08
ES32A08
Device Type: relayElectrical Standard: globalBoard: esp32Difficulty: Plug-n-flash, 2/5
Board comes without esp32 (use wroom 32 devkit)
Description
This is a very capable little automation/relay/io board from aliexpress aliexpress It runs on 12V or 24V depending on your configuration and is perfect for industrial and home automation
Basic Configuration
exposes
- 8 Relay Outputs (Labeled O1-O8)
- 8 24V Inputs (Labeled I1-I8)
- 4 Analag inputs (0-20ma) (Labeled ADC1-ADC4)
- 2 Analog inputs (0-10V) (Labeled ADC5-ADC6) (ADC7-ADC8 are not usable when using wifi)
- 4 input buttons (Labeled KEY1-KEY4)
- 1 status LED (Labeled "status LED")
- 1 4 Digit 7 Segment display (listens on configurable homeassistant text sensor) (still a little buggy)
known limitations
- 4 Digit display has problems with trailing dots
- RS485 is not enabled but would work using GPIO1 -> TXD and GPIO3 -> RXD
- my C++ is the most limiting factor here :D
- io has not been tested yet !
esphome: name: xxx
esp32: board: esp32dev framework: type: arduino # not compatible with esp idf as of now #framework: # type: esp-idf # version: recommended
# Enable logginglogger:
# Enable Home Assistant APIapi: encryption: key: "xxx"
ota: - platform: esphome password: "xxx"
wifi: ssid: !secret wifi_ssid password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Es32A08-01 Fallback Hotspot" password: "xxx"
text_sensor: - platform: homeassistant name: "Text from Home Assistant" id: home_assistant_text entity_id: input_text.test
script: - id: display_text then: - lambda: |- std::string text = id(home_assistant_text).state;
// Pad with spaces if the text is shorter than 4 characters while (text.length() < 4) { text = " " + text; }
auto clear_display = [&]() { id(G1).set_state(0); id(G2).set_state(0); id(G3).set_state(0); id(G4).set_state(0); id(DP).set_state(0); id(A).set_state(0); id(B).set_state(0); id(C).set_state(0); id(D).set_state(0); id(E).set_state(0); id(F).set_state(0); id(G).set_state(0); };
// Character to segment map const uint8_t char_map[95] = { 0b00000000, // ' ', ord 0x20 0b10110000, // '!', ord 0x21 0b00100010, // '"', ord 0x22 0b00000000, // '#', ord 0x23 0b00000000, // '$', ord 0x24 0b01001001, // '%', ord 0x25 0b00000000, // '&', ord 0x26 0b00000010, // ''', ord 0x27 0b01001110, // '(', ord 0x28 0b01111000, // ')', ord 0x29 0b01000000, // '*', ord 0x2A 0b00000000, // '+', ord 0x2B 0b00010000, // ',', ord 0x2C 0b00000001, // '-', ord 0x2D 0b10000000, // '.', ord 0x2E 0b00000000, // '/', ord 0x2F 0b01111110, // '0', ord 0x30 0b00110000, // '1', ord 0x31 0b01101101, // '2', ord 0x32 0b01111001, // '3', ord 0x33 0b00110011, // '4', ord 0x34 0b01011011, // '5', ord 0x35 0b01011111, // '6', ord 0x36 0b01110000, // '7', ord 0x37 0b01111111, // '8', ord 0x38 0b01111011, // '9', ord 0x39 0b01001000, // ':', ord 0x3A 0b01011000, // ';', ord 0x3B 0b00000000, // '<', ord 0x3C 0b00001001, // '=', ord 0x3D 0b00000000, // '>', ord 0x3E 0b01100101, // '?', ord 0x3F 0b01101111, // '@', ord 0x40 0b01110111, // 'A', ord 0x41 0b00011111, // 'B', ord 0x42 0b01001110, // 'C', ord 0x43 0b00111101, // 'D', ord 0x44 0b01001111, // 'E', ord 0x45 0b01000111, // 'F', ord 0x46 0b01011110, // 'G', ord 0x47 0b00110111, // 'H', ord 0x48 0b00110000, // 'I', ord 0x49 0b00111100, // 'J', ord 0x4A 0b00000000, // 'K', ord 0x4B 0b00001110, // 'L', ord 0x4C 0b00000000, // 'M', ord 0x4D 0b00010101, // 'N', ord 0x4E 0b01111110, // 'O', ord 0x4F 0b01100111, // 'P', ord 0x50 0b11111110, // 'Q', ord 0x51 0b00000101, // 'R', ord 0x52 0b01011011, // 'S', ord 0x53 0b00000111, // 'T', ord 0x54 0b00111110, // 'U', ord 0x55 0b00111110, // 'V', ord 0x56 0b00111111, // 'W', ord 0x57 0b00000000, // 'X', ord 0x58 0b00100111, // 'Y', ord 0x59 0b01101101, // 'Z', ord 0x5A 0b01001110, // '[', ord 0x5B 0b00000000, // '\', ord 0x5C 0b01111000, // ']', ord 0x5D 0b00000000, // '^', ord 0x5E 0b00001000, // '_', ord 0x5F 0b00100000, // '`', ord 0x60 0b01110111, // 'a', ord 0x61 0b00011111, // 'b', ord 0x62 0b00001101, // 'c', ord 0x63 0b00111101, // 'd', ord 0x64 0b01001111, // 'e', ord 0x65 0b01000111, // 'f', ord 0x66 0b01011110, // 'g', ord 0x67 0b00010111, // 'h', ord 0x68 0b00010000, // 'i', ord 0x69 0b00111100, // 'j', ord 0x6A 0b00000000, // 'k', ord 0x6B 0b00001110, // 'l', ord 0x6C 0b00000000, // 'm', ord 0x6D 0b00010101, // 'n', ord 0x6E 0b00011101, // 'o', ord 0x6F 0b01100111, // 'p', ord 0x70 0b00000000, // 'q', ord 0x71 0b00000101, // 'r', ord 0x72 0b01011011, // 's', ord 0x73 0b00000111, // 't', ord 0x74 0b00011100, // 'u', ord 0x75 0b00011100, // 'v', ord 0x76 0b00000000, // 'w', ord 0x77 0b00000000, // 'x', ord 0x78 0b00100111, // 'y', ord 0x79 0b00000000, // 'z', ord 0x7A 0b00110001, // '{', ord 0x7B 0b00000110, // '|', ord 0x7C 0b00000111, // '}', ord 0x7D 0b01100011, // '~', ord 0x7E (degree symbol) };
auto set_digit = [&](int digit, uint8_t ch, bool dot) { clear_display(); id(G1).set_state(digit == 0); id(G2).set_state(digit == 1); id(G3).set_state(digit == 2); id(G4).set_state(digit == 3);
uint8_t segments = char_map[ch]; id(DP).set_state((segments & 0b10000000) || dot); id(A).set_state(segments & 0b01000000); id(B).set_state(segments & 0b00100000); id(C).set_state(segments & 0b00010000); id(D).set_state(segments & 0b00001000); id(E).set_state(segments & 0b00000100); id(F).set_state(segments & 0b00000010); id(G).set_state(segments & 0b00000001); delay(5); };
int l = text.length(); bool dot = false; uint8_t tmp = 0;
// Iterate over each digit position (up to 4) for (int i = 0; i < 4; ++i) {
// Check if the character is a dot if (text[i] == '.') { // Display the dot on its own set_digit(i, 0, true); } else { // Character is not a dot, check if the next character is a dot if ((i + 1 < l) && (text[i + 1] == '.')) { // The next character is a dot dot = true; // Erase the dot, so it won't be processed again text.erase(i + 1, 1); // Update the length after erasure l = text.length(); } else { dot = false; }
// Adjust the character to the segment map if (text[i] < 32) { tmp = 0; } else { tmp = text[i] - 32; }
// Set the digit with or without the dot set_digit(i, tmp, dot); } }
interval: - interval: 25ms then: - script.execute: display_text
sn74hc595: - id: 'sn74hc595_hub' data_pin: GPIO13 clock_pin: GPIO27 latch_pin: GPIO14 oe_pin: GPIO4 sr_count: 3
switch: - platform: gpio name: "O1" pin: sn74hc595: sn74hc595_hub number: 16 inverted: false
- platform: gpio name: "O2" pin: sn74hc595: sn74hc595_hub number: 17 inverted: false
- platform: gpio name: "O3" pin: sn74hc595: sn74hc595_hub number: 18 inverted: false
- platform: gpio name: "O4" pin: sn74hc595: sn74hc595_hub number: 19 inverted: false
- platform: gpio name: "O5" pin: sn74hc595: sn74hc595_hub number: 20 inverted: false
- platform: gpio name: "O6" pin: sn74hc595: sn74hc595_hub number: 21 inverted: false
- platform: gpio name: "O7" pin: sn74hc595: sn74hc595_hub number: 22 inverted: false
- platform: gpio name: "O8" pin: sn74hc595: sn74hc595_hub number: 23 inverted: false
- platform: gpio name: "status LED" pin: GPIO15 inverted: True
output: - platform: gpio id: "A" pin: sn74hc595: sn74hc595_hub number: 0 inverted: false
- platform: gpio id: "B" pin: sn74hc595: sn74hc595_hub number: 1 inverted: false
- platform: gpio id: "C" pin: sn74hc595: sn74hc595_hub number: 2 inverted: false
- platform: gpio id: "D" pin: sn74hc595: sn74hc595_hub number: 3 inverted: false
- platform: gpio id: "E" pin: sn74hc595: sn74hc595_hub number: 4 inverted: false
- platform: gpio id: "F" pin: sn74hc595: sn74hc595_hub number: 5 inverted: false
- platform: gpio id: "G" pin: sn74hc595: sn74hc595_hub number: 6 inverted: false
- platform: gpio id: "DP" pin: sn74hc595: sn74hc595_hub number: 7 inverted: false
- platform: gpio id: "G1" pin: sn74hc595: sn74hc595_hub number: 8 inverted: True
- platform: gpio id: "G2" pin: sn74hc595: sn74hc595_hub number: 9 inverted: True
- platform: gpio id: "G3" pin: sn74hc595: sn74hc595_hub number: 10 inverted: True
- platform: gpio id: "G4" pin: sn74hc595: sn74hc595_hub number: 11 inverted: True
sn74hc165: - id: sn74hc165_hub clock_pin: GPIO17 data_pin: GPIO5 load_pin: GPIO16 sr_count: 1
binary_sensor: - platform: gpio name: "I1" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 0 inverted: true
- platform: gpio name: "I2" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 1 inverted: true
- platform: gpio name: "I3" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 2 inverted: true
- platform: gpio name: "I4" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 3 inverted: true
- platform: gpio name: "I5" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 4 inverted: true
- platform: gpio name: "I6" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 5 inverted: true
- platform: gpio name: "I7" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 6 inverted: true
- platform: gpio name: "I8" pin: sn74hc165: sn74hc165_hub # Use pin number 0 number: 7 inverted: true
- platform: gpio name: "KEY1" pin: number: GPIO18 inverted: True mode: input: true pullup: true filters: - delayed_off: 10ms
- platform: gpio name: "KEY2" pin: number: GPIO19 inverted: True mode: input: true pullup: true filters: - delayed_off: 10ms
- platform: gpio name: "KEY3" pin: number: GPIO21 inverted: True mode: input: true pullup: true filters: - delayed_off: 10ms
- platform: gpio name: "KEY4" pin: number: GPIO23 inverted: True mode: input: true pullup: true filters: - delayed_off: 10ms
sensor: - platform: adc pin: GPIO36 name: "ADC1 (0-20ma)" update_interval: 60s
- platform: adc pin: GPIO39 name: "ADC2 (0-20ma)" update_interval: 60s - platform: adc pin: GPIO34 name: "ADC3 (0-20ma)" update_interval: 60s - platform: adc pin: GPIO35 name: "ADC4 (0-20ma)" update_interval: 60s - platform: adc pin: GPIO32 name: "ADC5 (0-10V)" update_interval: 60s
- platform: adc pin: GPIO33 name: "ADC6 (0-10V)" update_interval: 60s
# no adc because we use wifi# - platform: adc# pin: GPIO25# name: "ADC7"# update_interval: 1s
# - platform: adc# pin: GPIO26# name: "ADC8"# update_interval: 1s
captive_portal: