substitutions: name: "owon-b35t" friendly_name: "OWON B35T Multimeter" device_description: "M5Stack Core 1 BLE client for OWON B35T/B35T+ multimeter with local graphical display" owon_mac_address: !secret owon_b35t_mac_address esphome: name: ${name} friendly_name: ${friendly_name} comment: ${device_description} min_version: 2024.6.0 includes: - owon_b35t.h project: name: "custom.owon-b35t-m5stack" version: "1.0" esp32: board: m5stack-core-esp32 framework: type: esp-idf advanced: minimum_chip_revision: "3.1" logger: level: INFO api: encryption: key: !secret apikey ota: platform: esphome password: !secret ota wifi: ssid: "Voltage-legacy" password: !secret voltage_legacy_psk #use_address: ${name}.home power_save_mode: none fast_connect: on min_auth_mode: WPA2 ap: ssid: "OWON B35T Fallback Hotspot" password: !secret fallback_psk # Disabled to save RAM on the M5Stack Core 1. Re-enable temporarily if Wi-Fi recovery is needed. # captive_portal: interval: - interval: 10s then: - lambda: |- ESP_LOGI("mem", "heap free=%u min_free=%u internal_free=%u internal_largest=%u dma_free=%u dma_largest=%u", static_cast(esp_get_free_heap_size()), static_cast(esp_get_minimum_free_heap_size()), static_cast(heap_caps_get_free_size(MALLOC_CAP_INTERNAL)), static_cast(heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL)), static_cast(heap_caps_get_free_size(MALLOC_CAP_DMA)), static_cast(heap_caps_get_largest_free_block(MALLOC_CAP_DMA))); esp32_ble_tracker: scan_parameters: active: true continuous: true ble_client: - mac_address: ${owon_mac_address} id: owon_ble_client on_connect: then: - lambda: |- owon_meter.on_connect(); on_disconnect: then: - lambda: |- owon_meter.on_disconnect(); spi: clk_pin: GPIO18 mosi_pin: GPIO23 miso_pin: GPIO19 output: - platform: ledc pin: GPIO32 id: lcd_backlight light: - platform: monochromatic output: lcd_backlight name: "${friendly_name} Backlight" id: backlight restore_mode: ALWAYS_ON font: - file: "fonts/Roboto-Regular.ttf" id: meter_font size: 15 glyphs: [ " ", "!", "%", "+", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "<", ">", "A", "B", "C", "D", "E", "F", "G", "H", "I", "L", "M", "N", "O", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "c", "d", "e", "f", "g", "i", "k", "m", "n", "o", "r", "s", "t", "u", "v", "w", "y", "z", "°", "µ", "Ω", ] display: - platform: ili9xxx id: lcd model: M5STACK cs_pin: GPIO14 dc_pin: GPIO27 reset_pin: GPIO33 invert_colors: true color_palette: 8BIT rotation: 0 update_interval: 500ms lambda: |- owon_meter.render(it, id(meter_font)); binary_sensor: - platform: gpio id: button_a pin: number: GPIO39 inverted: true internal: true on_press: then: - lambda: |- owon_meter.previous_button(); - platform: gpio id: button_b pin: number: GPIO38 inverted: true internal: true on_click: - min_length: 50ms max_length: 1500ms then: - logger.log: level: INFO format: "OWON short press: %s" args: ["owon_meter.selected_button_name()"] - ble_client.ble_write: id: owon_ble_client service_uuid: "0000fff0-0000-1000-8000-00805f9b34fb" characteristic_uuid: "0000fff3-0000-1000-8000-00805f9b34fb" value: !lambda |- std::vector data = {owon_meter.selected_button, 0x01}; return data; - min_length: 1500ms max_length: 5000ms then: - logger.log: level: INFO format: "OWON long press: %s" args: ["owon_meter.selected_button_name()"] - ble_client.ble_write: id: owon_ble_client service_uuid: "0000fff0-0000-1000-8000-00805f9b34fb" characteristic_uuid: "0000fff3-0000-1000-8000-00805f9b34fb" value: !lambda |- uint8_t press_type = (owon_meter.selected_button == 1 || owon_meter.selected_button == 5) ? 0x01 : 0x00; std::vector data = {owon_meter.selected_button, press_type}; return data; - platform: gpio id: button_c pin: number: GPIO37 inverted: true internal: true on_press: then: - lambda: |- owon_meter.next_button(); - platform: template name: "${friendly_name} Connected" lambda: |- return owon_meter.connected; - platform: template name: "${friendly_name} Overload" lambda: |- return owon_meter.overload; - platform: template name: "${friendly_name} Low Battery" lambda: |- return owon_meter.low_battery; sensor: - platform: ble_client type: characteristic ble_client_id: owon_ble_client id: owon_notify_source internal: true service_uuid: "0000fff0-0000-1000-8000-00805f9b34fb" characteristic_uuid: "0000fff4-0000-1000-8000-00805f9b34fb" notify: true update_interval: never lambda: |- owon_meter.handle_notify(x); return owon_meter.value(); - platform: wifi_signal name: "${friendly_name} WiFi Signal" update_interval: 60s text_sensor: - platform: template name: "${friendly_name} Reading" update_interval: 2s lambda: |- return owon_meter.reading_text(); - platform: template name: "${friendly_name} Unit" update_interval: 2s lambda: |- return std::string(owon_meter.scale()) + owon_meter.unit(); - platform: template name: "${friendly_name} Mode" update_interval: 2s lambda: |- return owon_meter.mode_text();