Files
homeassistant-config/esphome/archive/owon-b35t-m5stack-core1.yaml
T

294 lines
6.7 KiB
YAML

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-m5stack-core1.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<unsigned>(esp_get_free_heap_size()),
static_cast<unsigned>(esp_get_minimum_free_heap_size()),
static_cast<unsigned>(heap_caps_get_free_size(MALLOC_CAP_INTERNAL)),
static_cast<unsigned>(heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL)),
static_cast<unsigned>(heap_caps_get_free_size(MALLOC_CAP_DMA)),
static_cast<unsigned>(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();
- logger.log:
level: WARN
format: "OWON BLE meter disconnected; restarting M5Stack to reclaim heap"
- delay: 1s
- lambda: |-
esp_restart();
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",
"h",
"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<uint8_t> 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<uint8_t> 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();