217 lines
4.7 KiB
YAML
217 lines
4.7 KiB
YAML
esphome:
|
|
name: nfc-playbox-1
|
|
friendly_name: NFC Playbox_1
|
|
|
|
esp32:
|
|
board: esp32-s3-devkitc-1
|
|
flash_size: 16MB
|
|
framework:
|
|
type: esp-idf
|
|
|
|
psram:
|
|
mode: octal
|
|
speed: 80MHz
|
|
|
|
# Enable logging
|
|
logger:
|
|
|
|
# Enable Home Assistant API
|
|
api:
|
|
encryption:
|
|
key: "OQlmeshTtUZg/iavLExjuNt1H7ywTohWAYozqNym+9M="
|
|
|
|
ota:
|
|
- platform: esphome
|
|
password: "14106c281b3e5b1ac1da204b7ff99728"
|
|
|
|
wifi:
|
|
ssid: !secret wifi_ssid
|
|
password: !secret wifi_password
|
|
power_save_mode: none # stabilare link
|
|
output_power: 17dB # maxa sändarnivån
|
|
use_address: 10.0.3.29
|
|
domain: .milvert.com
|
|
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
|
ap:
|
|
ssid: "Nfc-Playbox-1 Fallback Hotspot"
|
|
password: "kQAdTCPYabwd"
|
|
|
|
captive_portal:
|
|
|
|
sensor:
|
|
- platform: wifi_signal
|
|
name: "NFC Playbox WiFi RSSI"
|
|
update_interval: 30s
|
|
|
|
- platform: uptime
|
|
name: "NFC Playbox Uptime"
|
|
|
|
script:
|
|
- id: wake_screen
|
|
mode: restart
|
|
then:
|
|
- light.turn_on:
|
|
id: backlight
|
|
brightness: 100%
|
|
# - delay: 60s
|
|
# - light.turn_off: backlight
|
|
|
|
image:
|
|
- file: "images/play.png"
|
|
id: img_playpause
|
|
type: BINARY
|
|
|
|
- file: "images/low-volume.png"
|
|
id: img_voldown
|
|
type: BINARY
|
|
|
|
- file: "images/high-volume.png"
|
|
id: img_volup
|
|
type: BINARY
|
|
|
|
|
|
globals:
|
|
- id: touch_x
|
|
type: int
|
|
initial_value: "0"
|
|
|
|
- id: touch_y
|
|
type: int
|
|
initial_value: "0"
|
|
|
|
# ---- SPI-buss till LCD
|
|
spi:
|
|
- id: spi_bus
|
|
clk_pin: 39 # LCD_SCLK
|
|
mosi_pin: 38 # LCD_MOSI
|
|
miso_pin: 40 # (MISO finns men används ej av LCD)
|
|
|
|
- id: spi_bus_rc522
|
|
clk_pin: 13
|
|
mosi_pin: 14
|
|
miso_pin: 9
|
|
|
|
rc522_spi:
|
|
spi_id: spi_bus_rc522
|
|
cs_pin: 12
|
|
reset_pin: 11
|
|
update_interval: 1s
|
|
on_tag:
|
|
then:
|
|
- logger.log:
|
|
format: "RFID Tag UID: %s"
|
|
args: [ 'x.c_str()' ]
|
|
- homeassistant.tag_scanned: !lambda 'return x;'
|
|
|
|
# ---- Bakgrundsbelysning (GPIO1 via PWM)
|
|
output:
|
|
- platform: ledc
|
|
pin: 1
|
|
id: lcd_bl
|
|
|
|
light:
|
|
- platform: monochromatic
|
|
name: "LCD Backlight"
|
|
id: backlight
|
|
output: lcd_bl
|
|
restore_mode: ALWAYS_ON
|
|
|
|
# ---- I2C för touch (CST816D)
|
|
i2c:
|
|
sda: 48 # TP_SDA
|
|
scl: 47 # TP_SCL
|
|
id: i2c_bus
|
|
scan: true
|
|
frequency: 400kHz
|
|
|
|
touchscreen:
|
|
- platform: cst816
|
|
id: tp
|
|
interrupt_pin: 46 # TP_INT
|
|
reset_pin: 21 # TP_RESET
|
|
transform:
|
|
mirror_x: false
|
|
mirror_y: true
|
|
swap_xy: true
|
|
calibration:
|
|
x_min: 0
|
|
x_max: 320
|
|
y_min: 30 # offset för min display
|
|
y_max: 240
|
|
on_touch:
|
|
then:
|
|
- lambda: |-
|
|
const int CELL_SIZE = 40;
|
|
const int ICON_R = 22; // radie på cirkeln runt ikonen
|
|
|
|
// Hjälpfunktion för att kolla träff
|
|
auto hit_circle = [&](int col, int row, int px, int py) {
|
|
int cx = (col + 1) * CELL_SIZE;
|
|
int cy = (row + 1) * CELL_SIZE;
|
|
int dx = px - cx;
|
|
int dy = py - cy;
|
|
return (dx*dx + dy*dy) <= (ICON_R * ICON_R);
|
|
};
|
|
- script.execute: wake_screen
|
|
- logger.log:
|
|
format: "Touch coordinates: (%d, %d)"
|
|
args: ["touch.x", "touch.y"]
|
|
|
|
substitutions:
|
|
SCREEN_W: "320" # från loggen: ili9xxx Dimensions: 320 x 240
|
|
SCREEN_H: "240"
|
|
ICON_W: "32"
|
|
ICON_H: "32"
|
|
MARGIN: "8"
|
|
HIT_PAD: "6"
|
|
|
|
# ---- Display (ST7789T3/ ST7789V 240x320) via moderna 'ili9xxx'
|
|
display:
|
|
- platform: ili9xxx
|
|
id: display_main
|
|
model: ST7789V
|
|
cs_pin: 45 # LCD_CS
|
|
dc_pin: 42 # LCD_DC
|
|
reset_pin: 0 # LCD_RST
|
|
spi_id: spi_bus
|
|
dimensions:
|
|
width: 240
|
|
height: 320
|
|
rotation: 90 # matchar Waveshares exempel (~EXAMPLE_LCD_ROTATION=1)
|
|
invert_colors: false
|
|
update_interval: 500ms
|
|
lambda: |-
|
|
const int CELL_SIZE = 40;
|
|
|
|
auto draw_centered_2x2 = [&](int col, int row, const esphome::display::BaseImage *img) {
|
|
const int center_x = (col + 1) * CELL_SIZE;
|
|
const int center_y = (row + 1) * CELL_SIZE;
|
|
|
|
// cirkel runt ikonen
|
|
it.circle(center_x, center_y, 22);
|
|
|
|
// rita ikonen (32x32 → offset 16)
|
|
it.image(center_x - 16, center_y - 16,
|
|
const_cast<esphome::display::BaseImage*>(img));
|
|
};
|
|
|
|
// PLAY i blocket (1,2)-(2,3)
|
|
draw_centered_2x2(1, 2, id(img_playpause));
|
|
|
|
// VOL UP i blocket (3,2)-(4,3)
|
|
draw_centered_2x2(3, 2, id(img_volup));
|
|
|
|
// VOL DOWN i blocket (5,2)-(6,3)
|
|
draw_centered_2x2(5, 2, id(img_voldown));
|
|
|
|
# ---- Klocka och font (för att visa något)
|
|
time:
|
|
- platform: sntp
|
|
id: esptime
|
|
timezone: "Europe/Stockholm"
|
|
|
|
font:
|
|
- file: "gfonts://Roboto"
|
|
id: font_small
|
|
size: 16
|