294 lines
6.7 KiB
YAML
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.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();
|