This commit is contained in:
mjallen18
2026-04-14 16:12:54 -05:00
parent c3abeb846d
commit 74b1825d4d
10 changed files with 2429 additions and 35 deletions

View File

@@ -37,8 +37,8 @@ in
baseURL = "http://${net.hosts.nas.lan}:${toString net.ports.nas.llamaCpp}/v1"; baseURL = "http://${net.hosts.nas.lan}:${toString net.ports.nas.llamaCpp}/v1";
}; };
models = { models = {
Qwen3-Coder-Next-Q4_0 = { "gemma-4-26B-A4B-it-UD-Q8_K_XL" = {
name = "Qwen3 Coder (local)"; name = "Gemma 4 26B-A4B (local)";
modalities = { modalities = {
input = [ input = [
"image" "image"
@@ -47,8 +47,8 @@ in
output = [ "text" ]; output = [ "text" ];
}; };
limit = { limit = {
context = 131072; context = 32768;
output = 32768; output = 8192;
}; };
}; };
}; };

View File

@@ -0,0 +1,202 @@
############################################################
# SmartDisplay Bedroom
# Tiles: Lights | Lamp | Fan | Air Purifier | Closet | BedJet
############################################################
substitutions:
DIRECT_ACTIONS: "true"
ROOM_NAME: "Bedroom"
TIME_24H: "false"
# ── TILE 1 Bedroom Lights (group) ─────────────────────
TILE1_ENTITY: "light.bedroom_lights"
TILE1_STATE_ENTITY: "light.bedroom_light_1"
TILE1_TITLE: "Lights"
TILE1_ICON: "\U000F0769"
TILE1_TYPE: "light"
TILE1_TAP_ACTION: "toggle"
TILE1_LONGPRESS: "auto"
TILE1_VALUE_MODE: "auto"
TILE1_LABEL_OFF: "Off"
TILE1_LABEL_ON: "On"
TILE1_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE1_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE1_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE1_ICON_DISABLED_COLOR: "0xFEC600"
TILE1_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE1_BG_DISABLED_COLOR: "0x939391"
TILE1_TITLE_ACTIVE_COLOR: "0x000000"
TILE1_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE1_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE1_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE1_TAP_SERVICE: ""
TILE1_TAP_PARAM_KEY: ""
TILE1_TAP_PARAM_VAL: ""
TILE1_LONGPRESS_OFF_VALUE: "0"
# ── TILE 2 Bedroom Lamp ────────────────────────────────
TILE2_ENTITY: "light.bedroom_lamp"
TILE2_STATE_ENTITY: "light.bedroom_lamp"
TILE2_TITLE: "Lamp"
TILE2_ICON: "\U000F06B5"
TILE2_TYPE: "light"
TILE2_TAP_ACTION: "auto"
TILE2_LONGPRESS: "auto"
TILE2_VALUE_MODE: "auto"
TILE2_LABEL_OFF: "Off"
TILE2_LABEL_ON: "On"
TILE2_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE2_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE2_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE2_ICON_DISABLED_COLOR: "0xFEC600"
TILE2_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE2_BG_DISABLED_COLOR: "0x939391"
TILE2_TITLE_ACTIVE_COLOR: "0x000000"
TILE2_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE2_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE2_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE2_TAP_SERVICE: ""
TILE2_TAP_PARAM_KEY: ""
TILE2_TAP_PARAM_VAL: ""
TILE2_LONGPRESS_OFF_VALUE: "0"
# ── TILE 3 Bedroom Fan ─────────────────────────────────
TILE3_ENTITY: "fan.bedroom_fan"
TILE3_STATE_ENTITY: "fan.bedroom_fan"
TILE3_TITLE: "Bedroom Fan"
TILE3_ICON: "\U000F0210"
TILE3_TYPE: "fan"
TILE3_TAP_ACTION: "fan_toggle_preset"
TILE3_LONGPRESS: "auto"
TILE3_VALUE_MODE: "auto"
TILE3_LABEL_OFF: "Off"
TILE3_LABEL_ON: "On"
TILE3_CIRCLE_ACTIVE_COLOR: "0x00C5EC"
TILE3_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE3_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE3_ICON_DISABLED_COLOR: "0x00C5EC"
TILE3_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE3_BG_DISABLED_COLOR: "0x939391"
TILE3_TITLE_ACTIVE_COLOR: "0x000000"
TILE3_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE3_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE3_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE3_TAP_SERVICE: "fan.toggle"
TILE3_TAP_PARAM_KEY: ""
TILE3_TAP_PARAM_VAL: ""
TILE3_LONGPRESS_OFF_VALUE: "0"
# ── TILE 4 Air Purifier ────────────────────────────────
TILE4_ENTITY: "fan.bedroom_air_purifier"
TILE4_STATE_ENTITY: "fan.bedroom_air_purifier"
TILE4_TITLE: "Air Purifier"
TILE4_ICON: "\U000F0D43"
TILE4_TYPE: "fan"
TILE4_TAP_ACTION: "fan_toggle_preset"
TILE4_LONGPRESS: "auto"
TILE4_VALUE_MODE: "auto"
TILE4_LABEL_OFF: "Off"
TILE4_LABEL_ON: "On"
TILE4_CIRCLE_ACTIVE_COLOR: "0x00C5EC"
TILE4_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE4_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE4_ICON_DISABLED_COLOR: "0x00C5EC"
TILE4_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE4_BG_DISABLED_COLOR: "0x939391"
TILE4_TITLE_ACTIVE_COLOR: "0x000000"
TILE4_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE4_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE4_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE4_TAP_SERVICE: "fan.toggle"
TILE4_TAP_PARAM_KEY: "preset_mode"
TILE4_TAP_PARAM_VAL: "auto"
TILE4_LONGPRESS_OFF_VALUE: "0"
# ── TILE 5 Front Closet Lights ────────────────────────
TILE5_ENTITY: "light.front_closet_lights"
TILE5_STATE_ENTITY: "light.front_closet_light_1"
TILE5_TITLE: "Closet"
TILE5_ICON: "\U000F1051"
TILE5_TYPE: "light"
TILE5_TAP_ACTION: "toggle"
TILE5_LONGPRESS: "none"
TILE5_VALUE_MODE: "auto"
TILE5_LABEL_OFF: "Off"
TILE5_LABEL_ON: "On"
TILE5_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE5_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE5_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE5_ICON_DISABLED_COLOR: "0xFEC600"
TILE5_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE5_BG_DISABLED_COLOR: "0x939391"
TILE5_TITLE_ACTIVE_COLOR: "0x000000"
TILE5_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE5_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE5_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE5_TAP_SERVICE: ""
TILE5_TAP_PARAM_KEY: ""
TILE5_TAP_PARAM_VAL: ""
TILE5_LONGPRESS_OFF_VALUE: "0"
# ── TILE 6 BedJet ─────────────────────────────────────
TILE6_ENTITY: "fan.bedjet_dbbf_c222"
TILE6_STATE_ENTITY: "fan.bedjet_dbbf_c222"
TILE6_TITLE: "BedJet"
TILE6_ICON: "\U000F07E4"
TILE6_TYPE: "fan"
TILE6_TAP_ACTION: "toggle"
TILE6_LONGPRESS: "auto"
TILE6_VALUE_MODE: "percentage"
TILE6_LABEL_OFF: "Off"
TILE6_LABEL_ON: "On"
TILE6_CIRCLE_ACTIVE_COLOR: "0xFF6B35"
TILE6_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE6_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE6_ICON_DISABLED_COLOR: "0xFF6B35"
TILE6_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE6_BG_DISABLED_COLOR: "0x939391"
TILE6_TITLE_ACTIVE_COLOR: "0x000000"
TILE6_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE6_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE6_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE6_TAP_SERVICE: "fan.toggle"
TILE6_TAP_PARAM_KEY: ""
TILE6_TAP_PARAM_VAL: ""
TILE6_LONGPRESS_OFF_VALUE: "0"
packages:
hw: !include cyd-base-hw.yaml
ui: !include cyd-base-ui.yaml
esphome:
name: bedroom-display
friendly_name: BedroomDisplay
on_boot:
priority: 600
then:
- script.execute: ui_refresh
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "BedroomDisplay Fallback"
password: !secret ota_password
captive_portal:

View File

@@ -0,0 +1,312 @@
############################################################
# CYD Base Hardware layer
# ESP32-2432S028 (Cheap Yellow Display)
# Include via: packages: !include cyd-base-hw.yaml
############################################################
time:
- platform: homeassistant
id: homeassistant_time
on_time:
- seconds: 0
minutes: /1
then:
- script.execute: ui_refresh
globals:
- id: active_entity
type: std::string
restore_value: no
- id: active_control_kind
type: std::string
restore_value: no
- id: active_value_suffix
type: std::string
restore_value: no
- id: overlay_slider_bg_color
type: uint32_t
restore_value: no
initial_value: '0x939391'
- id: overlay_slider_fill_color
type: uint32_t
restore_value: no
initial_value: '0xFEC600'
font:
- file: "gfonts://Roboto@500"
id: time_label
size: 18
bpp: 4
glyphs: ['0','1','2','3','4','5','6','7','8','9',':',' ','A','M','P']
- file: "gfonts://Roboto@500"
id: headline
size: 18
bpp: 4
glyphs: ['&','@','!',',','.','?','"','%','(',')','+','-','_',':','°',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'ä','ö','ü','Ä','Ö','Ü','ß','/']
- file: "gfonts://Roboto@700"
id: label
size: 11
bpp: 4
glyphs: ['&','@','!',',','.','?','"','%','(',')','+','-','_',':','°',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'ä','ö','ü','Ä','Ö','Ü','ß','/']
- file: "gfonts://Roboto@400"
id: sublabel
size: 11
bpp: 4
glyphs: ['&','@','!',',','.','?','"','%','(',')','+','-','_',':','°',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'ä','ö','ü','Ä','Ö','Ü','ß','/','…']
- file: "gfonts://Roboto@400"
id: sublabel_big
size: 14
bpp: 4
glyphs: ['&','@','!',',','.','?','"','%','(',')','+','-','_',':','°',
'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'ä','ö','ü','Ä','Ö','Ü','ß','/','…']
- file: 'fonts/materialdesignicons-webfont.ttf'
id: materialdesign_icons
size: 28
glyphs:
- "${TILE1_ICON}"
- "${TILE2_ICON}"
- "${TILE3_ICON}"
- "${TILE4_ICON}"
- "${TILE5_ICON}"
- "${TILE6_ICON}"
image:
- file: "images/home-background.png"
id: bg_home
type: RGB565
sensor:
- platform: wifi_signal
name: "Wifi Signal"
update_interval: 600s
- platform: uptime
name: "Uptime"
id: uptime_s
update_interval: 15s
- platform: homeassistant
id: tile1_brightness
entity_id: ${TILE1_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile1_percentage
entity_id: ${TILE1_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile2_brightness
entity_id: ${TILE2_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile2_percentage
entity_id: ${TILE2_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile3_brightness
entity_id: ${TILE3_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile3_percentage
entity_id: ${TILE3_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile4_brightness
entity_id: ${TILE4_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile4_percentage
entity_id: ${TILE4_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile5_brightness
entity_id: ${TILE5_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile5_percentage
entity_id: ${TILE5_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile6_brightness
entity_id: ${TILE6_ENTITY}
attribute: brightness
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile6_percentage
entity_id: ${TILE6_ENTITY}
attribute: percentage
on_value: { then: [ script.execute: ui_refresh ] }
binary_sensor:
- platform: status
name: "Node Status"
id: system_status
- platform: homeassistant
id: ha_state_tile1
entity_id: ${TILE1_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: ha_state_tile2
entity_id: ${TILE2_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: ha_state_tile3
entity_id: ${TILE3_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: ha_state_tile4
entity_id: ${TILE4_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: ha_state_tile5
entity_id: ${TILE5_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: ha_state_tile6
entity_id: ${TILE6_STATE_ENTITY}
on_state: { then: [ script.execute: ui_refresh ] }
text_sensor:
- platform: template
id: smartdisplay_action
name: "${ROOM_NAME} Action"
icon: mdi:gesture-tap-button
- platform: homeassistant
id: tile1_preset
entity_id: ${TILE1_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile2_preset
entity_id: ${TILE2_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile3_preset
entity_id: ${TILE3_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile4_preset
entity_id: ${TILE4_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile5_preset
entity_id: ${TILE5_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
- platform: homeassistant
id: tile6_preset
entity_id: ${TILE6_ENTITY}
attribute: preset_mode
on_value: { then: [ script.execute: ui_refresh ] }
switch:
- platform: restart
name: "Restart"
spi:
- id: lcd
clk_pin: GPIO14
mosi_pin: GPIO13
miso_pin: GPIO12
- id: my_touchscreen
clk_pin: GPIO25
mosi_pin: GPIO32
miso_pin: GPIO39
output:
- platform: ledc
pin: GPIO21
id: gpio_backlight_pwm
- platform: ledc
id: output_red
pin: GPIO4
inverted: true
- platform: ledc
id: output_green
pin: GPIO16
inverted: true
- platform: ledc
id: output_blue
pin: GPIO17
inverted: true
light:
- platform: monochromatic
output: gpio_backlight_pwm
name: "Power Display Backlight"
id: back_light
restore_mode: ALWAYS_ON
- platform: rgb
name: LED
red: output_red
id: led
green: output_green
blue: output_blue
restore_mode: ALWAYS_OFF
touchscreen:
platform: xpt2046
id: ts_touch
spi_id: my_touchscreen
cs_pin: 33
interrupt_pin: 36
update_interval: 20ms
threshold: 300
calibration:
x_min: 280
x_max: 3860
y_min: 340
y_max: 3860
transform:
swap_xy: true
mirror_x: false
mirror_y: false
display:
- platform: ili9xxx
id: my_display
spi_id: lcd
model: ILI9341
color_palette: 8BIT
cs_pin: 15
dc_pin: 2
invert_colors: false
update_interval: never
auto_clear_enabled: false
transform:
swap_xy: true
mirror_x: false
mirror_y: false
dimensions:
width: 320
height: 240

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,207 @@
############################################################
# SmartDisplay iOS Home appinspired Tiles UI
# Target device: ESP32-2432S028 / Cheap Yellow Display (CYD)
#
# Edit the substitutions below, then flash.
# All shared hardware/UI logic lives in:
# cyd-base-hw.yaml sensors, fonts, SPI, display, touch
# cyd-base-ui.yaml LVGL layout, scripts
############################################################
substitutions:
DIRECT_ACTIONS: "true"
ROOM_NAME: "Bedroom"
TIME_24H: "false"
# ── TILE 1 ──────────────────────────────────────────────
TILE1_ENTITY: "light.bedroom_lights"
TILE1_STATE_ENTITY: "light.bedroom_light_1"
TILE1_TITLE: "Lights"
TILE1_ICON: "\U000F0769"
TILE1_TYPE: "light"
TILE1_TAP_ACTION: "toggle"
TILE1_LONGPRESS: "auto"
TILE1_VALUE_MODE: "auto"
TILE1_LABEL_OFF: "Off"
TILE1_LABEL_ON: "On"
TILE1_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE1_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE1_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE1_ICON_DISABLED_COLOR: "0xFEC600"
TILE1_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE1_BG_DISABLED_COLOR: "0x939391"
TILE1_TITLE_ACTIVE_COLOR: "0x000000"
TILE1_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE1_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE1_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE1_TAP_SERVICE: ""
TILE1_TAP_PARAM_KEY: ""
TILE1_TAP_PARAM_VAL: ""
TILE1_LONGPRESS_OFF_VALUE: "0"
# ── TILE 2 ──────────────────────────────────────────────
TILE2_ENTITY: "light.bedroom_lamp"
TILE2_STATE_ENTITY: "light.bedroom_lamp"
TILE2_TITLE: "Lamp"
TILE2_ICON: "\U000F06B5"
TILE2_TYPE: "light"
TILE2_TAP_ACTION: "auto"
TILE2_LONGPRESS: "auto"
TILE2_VALUE_MODE: "auto"
TILE2_LABEL_OFF: "Off"
TILE2_LABEL_ON: "On"
TILE2_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE2_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE2_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE2_ICON_DISABLED_COLOR: "0xFEC600"
TILE2_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE2_BG_DISABLED_COLOR: "0x939391"
TILE2_TITLE_ACTIVE_COLOR: "0x000000"
TILE2_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE2_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE2_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE2_TAP_SERVICE: ""
TILE2_TAP_PARAM_KEY: ""
TILE2_TAP_PARAM_VAL: ""
TILE2_LONGPRESS_OFF_VALUE: "0"
# ── TILE 3 ──────────────────────────────────────────────
TILE3_ENTITY: "light.living_room_lights"
TILE3_STATE_ENTITY: "light.living_room_lights"
TILE3_TITLE: "Living Room"
TILE3_ICON: "\U000F08DD"
TILE3_TYPE: "light"
TILE3_TAP_ACTION: "auto"
TILE3_LONGPRESS: "auto"
TILE3_VALUE_MODE: "auto"
TILE3_LABEL_OFF: "Off"
TILE3_LABEL_ON: "On"
TILE3_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE3_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE3_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE3_ICON_DISABLED_COLOR: "0xFEC600"
TILE3_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE3_BG_DISABLED_COLOR: "0x939391"
TILE3_TITLE_ACTIVE_COLOR: "0x000000"
TILE3_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE3_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE3_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE3_TAP_SERVICE: ""
TILE3_TAP_PARAM_KEY: ""
TILE3_TAP_PARAM_VAL: ""
TILE3_LONGPRESS_OFF_VALUE: "0"
# ── TILE 4 ──────────────────────────────────────────────
TILE4_ENTITY: "switch.closet_lights"
TILE4_STATE_ENTITY: "switch.closet_lights"
TILE4_TITLE: "Closet Lights"
TILE4_ICON: "\U000F1051"
TILE4_TYPE: "light"
TILE4_TAP_ACTION: "auto"
TILE4_LONGPRESS: "auto"
TILE4_VALUE_MODE: "auto"
TILE4_LABEL_OFF: "Off"
TILE4_LABEL_ON: "On"
TILE4_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE4_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE4_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE4_ICON_DISABLED_COLOR: "0xFEC600"
TILE4_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE4_BG_DISABLED_COLOR: "0x939391"
TILE4_TITLE_ACTIVE_COLOR: "0x000000"
TILE4_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE4_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE4_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE4_TAP_SERVICE: ""
TILE4_TAP_PARAM_KEY: ""
TILE4_TAP_PARAM_VAL: ""
TILE4_LONGPRESS_OFF_VALUE: "0"
# ── TILE 5 ──────────────────────────────────────────────
TILE5_ENTITY: "fan.bedroom_fan"
TILE5_STATE_ENTITY: "fan.bedroom_fan"
TILE5_TITLE: "Bedroom Fan"
TILE5_ICON: "\U000F0210"
TILE5_TYPE: "fan"
TILE5_TAP_ACTION: "auto"
TILE5_LONGPRESS: "auto"
TILE5_VALUE_MODE: "auto"
TILE5_LABEL_OFF: "Off"
TILE5_LABEL_ON: "On"
TILE5_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE5_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE5_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE5_ICON_DISABLED_COLOR: "0xFEC600"
TILE5_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE5_BG_DISABLED_COLOR: "0x939391"
TILE5_TITLE_ACTIVE_COLOR: "0x000000"
TILE5_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE5_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE5_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE5_TAP_SERVICE: ""
TILE5_TAP_PARAM_KEY: ""
TILE5_TAP_PARAM_VAL: ""
TILE5_LONGPRESS_OFF_VALUE: "0"
# ── TILE 6 ──────────────────────────────────────────────
TILE6_ENTITY: "fan.bedroom_air_purifier"
TILE6_STATE_ENTITY: "fan.bedroom_air_purifier"
TILE6_TITLE: "Air Purifier"
TILE6_ICON: "\U000F0D43"
TILE6_TYPE: "fan"
TILE6_TAP_ACTION: "fan_toggle_preset"
TILE6_LONGPRESS: "auto"
TILE6_VALUE_MODE: "auto"
TILE6_LABEL_OFF: "Off"
TILE6_LABEL_ON: "On"
TILE6_CIRCLE_ACTIVE_COLOR: "0x00C5EC"
TILE6_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE6_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE6_ICON_DISABLED_COLOR: "0x00C5EC"
TILE6_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE6_BG_DISABLED_COLOR: "0x939391"
TILE6_TITLE_ACTIVE_COLOR: "0x000000"
TILE6_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE6_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE6_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE6_TAP_SERVICE: "fan.toggle"
TILE6_TAP_PARAM_KEY: "preset_mode"
TILE6_TAP_PARAM_VAL: "Auto"
TILE6_LONGPRESS_OFF_VALUE: "0"
packages:
hw: !include cyd-base-hw.yaml
ui: !include cyd-base-ui.yaml
esphome:
name: smartdisplay
friendly_name: SmartDisplay
on_boot:
priority: 600
then:
- script.execute: ui_refresh
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Smartdisplay Fallback"
password: !secret ota_password
captive_portal:

View File

@@ -0,0 +1,202 @@
############################################################
# SmartDisplay Living Room
# Tiles: Lights | Air Purifier | Vacuum | TV | Speaker | Closet
############################################################
substitutions:
DIRECT_ACTIONS: "true"
ROOM_NAME: "Living Room"
TIME_24H: "false"
# ── TILE 1 Living Room Lights ──────────────────────────
TILE1_ENTITY: "light.living_room_lights"
TILE1_STATE_ENTITY: "light.living_room_light_1"
TILE1_TITLE: "Lights"
TILE1_ICON: "\U000F08DD"
TILE1_TYPE: "light"
TILE1_TAP_ACTION: "toggle"
TILE1_LONGPRESS: "auto"
TILE1_VALUE_MODE: "auto"
TILE1_LABEL_OFF: "Off"
TILE1_LABEL_ON: "On"
TILE1_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE1_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE1_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE1_ICON_DISABLED_COLOR: "0xFEC600"
TILE1_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE1_BG_DISABLED_COLOR: "0x939391"
TILE1_TITLE_ACTIVE_COLOR: "0x000000"
TILE1_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE1_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE1_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE1_TAP_SERVICE: ""
TILE1_TAP_PARAM_KEY: ""
TILE1_TAP_PARAM_VAL: ""
TILE1_LONGPRESS_OFF_VALUE: "0"
# ── TILE 2 Living Room Air Purifier ───────────────────
TILE2_ENTITY: "fan.living_room_air_purifier"
TILE2_STATE_ENTITY: "fan.living_room_air_purifier"
TILE2_TITLE: "Air Purifier"
TILE2_ICON: "\U000F0D43"
TILE2_TYPE: "fan"
TILE2_TAP_ACTION: "fan_toggle_preset"
TILE2_LONGPRESS: "auto"
TILE2_VALUE_MODE: "auto"
TILE2_LABEL_OFF: "Off"
TILE2_LABEL_ON: "On"
TILE2_CIRCLE_ACTIVE_COLOR: "0x00C5EC"
TILE2_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE2_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE2_ICON_DISABLED_COLOR: "0x00C5EC"
TILE2_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE2_BG_DISABLED_COLOR: "0x939391"
TILE2_TITLE_ACTIVE_COLOR: "0x000000"
TILE2_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE2_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE2_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE2_TAP_SERVICE: "fan.toggle"
TILE2_TAP_PARAM_KEY: "preset_mode"
TILE2_TAP_PARAM_VAL: "auto"
TILE2_LONGPRESS_OFF_VALUE: "0"
# ── TILE 3 Garbage Goober (vacuum) ────────────────────
TILE3_ENTITY: "vacuum.garbage_goober"
TILE3_STATE_ENTITY: "binary_sensor.garbage_goober_cleaning"
TILE3_TITLE: "Vacuum"
TILE3_ICON: "\U000F09A8"
TILE3_TYPE: "switch"
TILE3_TAP_ACTION: "custom"
TILE3_LONGPRESS: "none"
TILE3_VALUE_MODE: "text"
TILE3_LABEL_OFF: "Docked"
TILE3_LABEL_ON: "Cleaning"
TILE3_CIRCLE_ACTIVE_COLOR: "0x43A047"
TILE3_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE3_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE3_ICON_DISABLED_COLOR: "0x43A047"
TILE3_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE3_BG_DISABLED_COLOR: "0x939391"
TILE3_TITLE_ACTIVE_COLOR: "0x000000"
TILE3_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE3_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE3_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE3_TAP_SERVICE: "vacuum.start_pause"
TILE3_TAP_PARAM_KEY: ""
TILE3_TAP_PARAM_VAL: ""
TILE3_LONGPRESS_OFF_VALUE: "0"
# ── TILE 4 TV (remote) ────────────────────────────────
TILE4_ENTITY: "remote.living_room"
TILE4_STATE_ENTITY: "remote.living_room"
TILE4_TITLE: "TV"
TILE4_ICON: "\U000F0502"
TILE4_TYPE: "switch"
TILE4_TAP_ACTION: "custom"
TILE4_LONGPRESS: "none"
TILE4_VALUE_MODE: "text"
TILE4_LABEL_OFF: "Off"
TILE4_LABEL_ON: "On"
TILE4_CIRCLE_ACTIVE_COLOR: "0x1565C0"
TILE4_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE4_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE4_ICON_DISABLED_COLOR: "0x1565C0"
TILE4_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE4_BG_DISABLED_COLOR: "0x939391"
TILE4_TITLE_ACTIVE_COLOR: "0x000000"
TILE4_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE4_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE4_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE4_TAP_SERVICE: "remote.toggle"
TILE4_TAP_PARAM_KEY: ""
TILE4_TAP_PARAM_VAL: ""
TILE4_LONGPRESS_OFF_VALUE: "0"
# ── TILE 5 Living Room Speaker ────────────────────────
TILE5_ENTITY: "media_player.living_room_speaker"
TILE5_STATE_ENTITY: "media_player.living_room_speaker"
TILE5_TITLE: "Speaker"
TILE5_ICON: "\U000F04C3"
TILE5_TYPE: "switch"
TILE5_TAP_ACTION: "custom"
TILE5_LONGPRESS: "none"
TILE5_VALUE_MODE: "text"
TILE5_LABEL_OFF: "Off"
TILE5_LABEL_ON: "Playing"
TILE5_CIRCLE_ACTIVE_COLOR: "0x8E24AA"
TILE5_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE5_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE5_ICON_DISABLED_COLOR: "0x8E24AA"
TILE5_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE5_BG_DISABLED_COLOR: "0x939391"
TILE5_TITLE_ACTIVE_COLOR: "0x000000"
TILE5_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE5_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE5_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE5_TAP_SERVICE: "media_player.toggle"
TILE5_TAP_PARAM_KEY: ""
TILE5_TAP_PARAM_VAL: ""
TILE5_LONGPRESS_OFF_VALUE: "0"
# ── TILE 6 Front Closet Lights ────────────────────────
TILE6_ENTITY: "light.front_closet_lights"
TILE6_STATE_ENTITY: "light.front_closet_light_1"
TILE6_TITLE: "Closet"
TILE6_ICON: "\U000F1051"
TILE6_TYPE: "light"
TILE6_TAP_ACTION: "toggle"
TILE6_LONGPRESS: "none"
TILE6_VALUE_MODE: "auto"
TILE6_LABEL_OFF: "Off"
TILE6_LABEL_ON: "On"
TILE6_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE6_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE6_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE6_ICON_DISABLED_COLOR: "0xFEC600"
TILE6_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE6_BG_DISABLED_COLOR: "0x939391"
TILE6_TITLE_ACTIVE_COLOR: "0x000000"
TILE6_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE6_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE6_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE6_TAP_SERVICE: ""
TILE6_TAP_PARAM_KEY: ""
TILE6_TAP_PARAM_VAL: ""
TILE6_LONGPRESS_OFF_VALUE: "0"
packages:
hw: !include cyd-base-hw.yaml
ui: !include cyd-base-ui.yaml
esphome:
name: livingroom-display
friendly_name: LivingroomDisplay
on_boot:
priority: 600
then:
- script.execute: ui_refresh
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "LivingroomDisplay Fallback"
password: !secret ota_password
captive_portal:

View File

@@ -0,0 +1,202 @@
############################################################
# SmartDisplay Pets
# Tiles: Joey Feed | Luci Feed | Litter Box | Fountain | Vacuum | Ftn Reset
############################################################
substitutions:
DIRECT_ACTIONS: "true"
ROOM_NAME: "Pets"
TIME_24H: "false"
# ── TILE 1 Joey Smart Feeder (manual feed) ─────────────
TILE1_ENTITY: "button.joey_smart_feeder_manual_feed"
TILE1_STATE_ENTITY: "binary_sensor.joey_smart_feeder_low_food"
TILE1_TITLE: "Joey Feed"
TILE1_ICON: "\U000F009A"
TILE1_TYPE: "script"
TILE1_TAP_ACTION: "custom"
TILE1_LONGPRESS: "none"
TILE1_VALUE_MODE: "text"
TILE1_LABEL_OFF: "Ready"
TILE1_LABEL_ON: "Fed"
TILE1_CIRCLE_ACTIVE_COLOR: "0xF4A820"
TILE1_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE1_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE1_ICON_DISABLED_COLOR: "0xF4A820"
TILE1_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE1_BG_DISABLED_COLOR: "0x939391"
TILE1_TITLE_ACTIVE_COLOR: "0x000000"
TILE1_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE1_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE1_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE1_TAP_SERVICE: "button.press"
TILE1_TAP_PARAM_KEY: ""
TILE1_TAP_PARAM_VAL: ""
TILE1_LONGPRESS_OFF_VALUE: "0"
# ── TILE 2 Luci Smart Feeder (manual feed) ─────────────
TILE2_ENTITY: "button.luci_smart_feeder_manual_feed"
TILE2_STATE_ENTITY: "binary_sensor.luci_smart_feeder_low_food"
TILE2_TITLE: "Luci Feed"
TILE2_ICON: "\U000F009A"
TILE2_TYPE: "script"
TILE2_TAP_ACTION: "custom"
TILE2_LONGPRESS: "none"
TILE2_VALUE_MODE: "text"
TILE2_LABEL_OFF: "Ready"
TILE2_LABEL_ON: "Fed"
TILE2_CIRCLE_ACTIVE_COLOR: "0xEC407A"
TILE2_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE2_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE2_ICON_DISABLED_COLOR: "0xEC407A"
TILE2_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE2_BG_DISABLED_COLOR: "0x939391"
TILE2_TITLE_ACTIVE_COLOR: "0x000000"
TILE2_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE2_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE2_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE2_TAP_SERVICE: "button.press"
TILE2_TAP_PARAM_KEY: ""
TILE2_TAP_PARAM_VAL: ""
TILE2_LONGPRESS_OFF_VALUE: "0"
# ── TILE 3 Litter-Robot 4 ──────────────────────────────
TILE3_ENTITY: "vacuum.litter_robot_4_litter_box"
TILE3_STATE_ENTITY: "binary_sensor.litter_robot_4_is_cleaning"
TILE3_TITLE: "Litter Box"
TILE3_ICON: "\U000F054D"
TILE3_TYPE: "switch"
TILE3_TAP_ACTION: "custom"
TILE3_LONGPRESS: "none"
TILE3_VALUE_MODE: "text"
TILE3_LABEL_OFF: "Docked"
TILE3_LABEL_ON: "Cycling"
TILE3_CIRCLE_ACTIVE_COLOR: "0x43A047"
TILE3_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE3_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE3_ICON_DISABLED_COLOR: "0x43A047"
TILE3_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE3_BG_DISABLED_COLOR: "0x939391"
TILE3_TITLE_ACTIVE_COLOR: "0x000000"
TILE3_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE3_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE3_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE3_TAP_SERVICE: "vacuum.start"
TILE3_TAP_PARAM_KEY: ""
TILE3_TAP_PARAM_VAL: ""
TILE3_LONGPRESS_OFF_VALUE: "0"
# ── TILE 4 Pet Fountain ────────────────────────────────
TILE4_ENTITY: "switch.dockstream_smart_rfid_fountain_wi_fi"
TILE4_STATE_ENTITY: "binary_sensor.dockstream_smart_rfid_fountain_indicator"
TILE4_TITLE: "Fountain"
TILE4_ICON: "\U000F0765"
TILE4_TYPE: "switch"
TILE4_TAP_ACTION: "toggle"
TILE4_LONGPRESS: "none"
TILE4_VALUE_MODE: "text"
TILE4_LABEL_OFF: "Off"
TILE4_LABEL_ON: "On"
TILE4_CIRCLE_ACTIVE_COLOR: "0x039BE5"
TILE4_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE4_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE4_ICON_DISABLED_COLOR: "0x039BE5"
TILE4_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE4_BG_DISABLED_COLOR: "0x939391"
TILE4_TITLE_ACTIVE_COLOR: "0x000000"
TILE4_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE4_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE4_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE4_TAP_SERVICE: ""
TILE4_TAP_PARAM_KEY: ""
TILE4_TAP_PARAM_VAL: ""
TILE4_LONGPRESS_OFF_VALUE: "0"
# ── TILE 5 Garbage Goober (vacuum) ────────────────────
TILE5_ENTITY: "vacuum.garbage_goober"
TILE5_STATE_ENTITY: "binary_sensor.garbage_goober_cleaning"
TILE5_TITLE: "Vacuum"
TILE5_ICON: "\U000F09A8"
TILE5_TYPE: "switch"
TILE5_TAP_ACTION: "custom"
TILE5_LONGPRESS: "none"
TILE5_VALUE_MODE: "text"
TILE5_LABEL_OFF: "Docked"
TILE5_LABEL_ON: "Cleaning"
TILE5_CIRCLE_ACTIVE_COLOR: "0x6D4C41"
TILE5_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE5_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE5_ICON_DISABLED_COLOR: "0x6D4C41"
TILE5_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE5_BG_DISABLED_COLOR: "0x939391"
TILE5_TITLE_ACTIVE_COLOR: "0x000000"
TILE5_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE5_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE5_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE5_TAP_SERVICE: "vacuum.start_pause"
TILE5_TAP_PARAM_KEY: ""
TILE5_TAP_PARAM_VAL: ""
TILE5_LONGPRESS_OFF_VALUE: "0"
# ── TILE 6 Fountain Cleaning Reset ────────────────────
TILE6_ENTITY: "button.dockstream_smart_rfid_fountain_cleaning_reset"
TILE6_STATE_ENTITY: "binary_sensor.dockstream_smart_rfid_fountain_wi_fi"
TILE6_TITLE: "Ftn. Reset"
TILE6_ICON: "\U000F0ECC"
TILE6_TYPE: "script"
TILE6_TAP_ACTION: "custom"
TILE6_LONGPRESS: "none"
TILE6_VALUE_MODE: "text"
TILE6_LABEL_OFF: "Offline"
TILE6_LABEL_ON: "Online"
TILE6_CIRCLE_ACTIVE_COLOR: "0x039BE5"
TILE6_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE6_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE6_ICON_DISABLED_COLOR: "0x039BE5"
TILE6_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE6_BG_DISABLED_COLOR: "0x939391"
TILE6_TITLE_ACTIVE_COLOR: "0x000000"
TILE6_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE6_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE6_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE6_TAP_SERVICE: "button.press"
TILE6_TAP_PARAM_KEY: ""
TILE6_TAP_PARAM_VAL: ""
TILE6_LONGPRESS_OFF_VALUE: "0"
packages:
hw: !include cyd-base-hw.yaml
ui: !include cyd-base-ui.yaml
esphome:
name: pets-display
friendly_name: PetsDisplay
on_boot:
priority: 600
then:
- script.execute: ui_refresh
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "PetsDisplay Fallback"
password: !secret ota_password
captive_portal:

View File

@@ -0,0 +1,202 @@
############################################################
# SmartDisplay 3D Printer (Bambu P1P)
# Tiles: Status | Chamber Light | Pause | Cooling Fan | AMS | Stop
############################################################
substitutions:
DIRECT_ACTIONS: "true"
ROOM_NAME: "Printer"
TIME_24H: "false"
# ── TILE 1 P1P Online / Force Refresh ─────────────────
TILE1_ENTITY: "button.p1p_01s00c371400147_force_refresh_data"
TILE1_STATE_ENTITY: "binary_sensor.p1p_01s00c371400147_online"
TILE1_TITLE: "P1P Status"
TILE1_ICON: "\U000F08F5"
TILE1_TYPE: "script"
TILE1_TAP_ACTION: "custom"
TILE1_LONGPRESS: "none"
TILE1_VALUE_MODE: "text"
TILE1_LABEL_OFF: "Offline"
TILE1_LABEL_ON: "Online"
TILE1_CIRCLE_ACTIVE_COLOR: "0x43A047"
TILE1_CIRCLE_DISABLED_COLOR: "0xE53935"
TILE1_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE1_ICON_DISABLED_COLOR: "0xFFFFFF"
TILE1_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE1_BG_DISABLED_COLOR: "0x939391"
TILE1_TITLE_ACTIVE_COLOR: "0x000000"
TILE1_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE1_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE1_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE1_TAP_SERVICE: "button.press"
TILE1_TAP_PARAM_KEY: ""
TILE1_TAP_PARAM_VAL: ""
TILE1_LONGPRESS_OFF_VALUE: "0"
# ── TILE 2 Chamber Light ───────────────────────────────
TILE2_ENTITY: "light.p1p_01s00c371400147_chamber_light"
TILE2_STATE_ENTITY: "light.p1p_01s00c371400147_chamber_light"
TILE2_TITLE: "Chamber"
TILE2_ICON: "\U000F0A02"
TILE2_TYPE: "light"
TILE2_TAP_ACTION: "toggle"
TILE2_LONGPRESS: "none"
TILE2_VALUE_MODE: "text"
TILE2_LABEL_OFF: "Off"
TILE2_LABEL_ON: "On"
TILE2_CIRCLE_ACTIVE_COLOR: "0xFEC600"
TILE2_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE2_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE2_ICON_DISABLED_COLOR: "0xFEC600"
TILE2_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE2_BG_DISABLED_COLOR: "0x939391"
TILE2_TITLE_ACTIVE_COLOR: "0x000000"
TILE2_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE2_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE2_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE2_TAP_SERVICE: ""
TILE2_TAP_PARAM_KEY: ""
TILE2_TAP_PARAM_VAL: ""
TILE2_LONGPRESS_OFF_VALUE: "0"
# ── TILE 3 Pause Printing ──────────────────────────────
TILE3_ENTITY: "button.p1p_01s00c371400147_pause_printing"
TILE3_STATE_ENTITY: "binary_sensor.p1p_01s00c371400147_print_error"
TILE3_TITLE: "Pause"
TILE3_ICON: "\U000F03E4"
TILE3_TYPE: "script"
TILE3_TAP_ACTION: "custom"
TILE3_LONGPRESS: "none"
TILE3_VALUE_MODE: "text"
TILE3_LABEL_OFF: "Idle"
TILE3_LABEL_ON: "Error"
TILE3_CIRCLE_ACTIVE_COLOR: "0xE53935"
TILE3_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE3_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE3_ICON_DISABLED_COLOR: "0x7B7B6F"
TILE3_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE3_BG_DISABLED_COLOR: "0x939391"
TILE3_TITLE_ACTIVE_COLOR: "0x000000"
TILE3_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE3_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE3_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE3_TAP_SERVICE: "button.press"
TILE3_TAP_PARAM_KEY: ""
TILE3_TAP_PARAM_VAL: ""
TILE3_LONGPRESS_OFF_VALUE: "0"
# ── TILE 4 Cooling Fan ────────────────────────────────
TILE4_ENTITY: "fan.p1p_01s00c371400147_cooling_fan"
TILE4_STATE_ENTITY: "fan.p1p_01s00c371400147_cooling_fan"
TILE4_TITLE: "Cooling"
TILE4_ICON: "\U000F0210"
TILE4_TYPE: "fan"
TILE4_TAP_ACTION: "toggle"
TILE4_LONGPRESS: "auto"
TILE4_VALUE_MODE: "percentage"
TILE4_LABEL_OFF: "Off"
TILE4_LABEL_ON: "On"
TILE4_CIRCLE_ACTIVE_COLOR: "0x00C5EC"
TILE4_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE4_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE4_ICON_DISABLED_COLOR: "0x00C5EC"
TILE4_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE4_BG_DISABLED_COLOR: "0x939391"
TILE4_TITLE_ACTIVE_COLOR: "0x000000"
TILE4_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE4_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE4_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE4_TAP_SERVICE: "fan.toggle"
TILE4_TAP_PARAM_KEY: ""
TILE4_TAP_PARAM_VAL: ""
TILE4_LONGPRESS_OFF_VALUE: "0"
# ── TILE 5 AMS 1 Active ───────────────────────────────
TILE5_ENTITY: "button.p1p_01s00c371400147_force_refresh_data"
TILE5_STATE_ENTITY: "binary_sensor.p1p_01s00c371400147_ams_1_active"
TILE5_TITLE: "AMS"
TILE5_ICON: "\U000F01AE"
TILE5_TYPE: "script"
TILE5_TAP_ACTION: "custom"
TILE5_LONGPRESS: "none"
TILE5_VALUE_MODE: "text"
TILE5_LABEL_OFF: "Idle"
TILE5_LABEL_ON: "Active"
TILE5_CIRCLE_ACTIVE_COLOR: "0x8E24AA"
TILE5_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE5_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE5_ICON_DISABLED_COLOR: "0x8E24AA"
TILE5_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE5_BG_DISABLED_COLOR: "0x939391"
TILE5_TITLE_ACTIVE_COLOR: "0x000000"
TILE5_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE5_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE5_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE5_TAP_SERVICE: "button.press"
TILE5_TAP_PARAM_KEY: ""
TILE5_TAP_PARAM_VAL: ""
TILE5_LONGPRESS_OFF_VALUE: "0"
# ── TILE 6 Stop Printing (red accent) ─────────────────
TILE6_ENTITY: "button.p1p_01s00c371400147_stop_printing"
TILE6_STATE_ENTITY: "binary_sensor.p1p_01s00c371400147_online"
TILE6_TITLE: "Stop"
TILE6_ICON: "\U000F04DB"
TILE6_TYPE: "script"
TILE6_TAP_ACTION: "custom"
TILE6_LONGPRESS: "none"
TILE6_VALUE_MODE: "text"
TILE6_LABEL_OFF: "Offline"
TILE6_LABEL_ON: "Ready"
TILE6_CIRCLE_ACTIVE_COLOR: "0xE53935"
TILE6_CIRCLE_DISABLED_COLOR: "0x7B7B6F"
TILE6_ICON_ACTIVE_COLOR: "0xFFFFFF"
TILE6_ICON_DISABLED_COLOR: "0xE53935"
TILE6_BG_ACTIVE_COLOR: "0xFFFFFF"
TILE6_BG_DISABLED_COLOR: "0x939391"
TILE6_TITLE_ACTIVE_COLOR: "0x000000"
TILE6_TITLE_DISABLED_COLOR: "0xFFFFFF"
TILE6_VALUE_ACTIVE_COLOR: "0x7A7A7C"
TILE6_VALUE_DISABLED_COLOR: "0xD9D9D9"
TILE6_TAP_SERVICE: "button.press"
TILE6_TAP_PARAM_KEY: ""
TILE6_TAP_PARAM_VAL: ""
TILE6_LONGPRESS_OFF_VALUE: "0"
packages:
hw: !include cyd-base-hw.yaml
ui: !include cyd-base-ui.yaml
esphome:
name: printer-display
friendly_name: PrinterDisplay
on_boot:
priority: 600
then:
- script.execute: ui_refresh
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "PrinterDisplay Fallback"
password: !secret ota_password
captive_portal:

View File

@@ -45,7 +45,7 @@ let
discoveryURL = "https://authentik.mjallen.dev/application/o/actual/.well-known/openid-configuration"; discoveryURL = "https://authentik.mjallen.dev/application/o/actual/.well-known/openid-configuration";
client_id._secret = config.sops.secrets."jallen-nas/actual/client-id".path; client_id._secret = config.sops.secrets."jallen-nas/actual/client-id".path;
client_secret._secret = config.sops.secrets."jallen-nas/actual/client-secret".path; client_secret._secret = config.sops.secrets."jallen-nas/actual/client-secret".path;
server_hostname = "https://authentik.mjallen.dev"; server_hostname = "https://actual.mjallen.dev";
authMethod = "openid"; authMethod = "openid";
}; };
}; };

View File

@@ -13,14 +13,14 @@ let
cfg = config.${namespace}.services.ai; cfg = config.${namespace}.services.ai;
ntfyModelFailScript = pkgs.writeShellScript "update-qwen-model-notify-failure" '' ntfyModelFailScript = pkgs.writeShellScript "update-gemma-model-notify-failure" ''
HOST="$(${pkgs.hostname}/bin/hostname)" HOST="$(${pkgs.hostname}/bin/hostname)"
${pkgs.curl}/bin/curl -sf \ ${pkgs.curl}/bin/curl -sf \
--user "$NTFY_USER:$NTFY_PASSWORD" \ --user "$NTFY_USER:$NTFY_PASSWORD" \
-H "Title: Qwen model update FAILED on $HOST" \ -H "Title: Gemma model update FAILED on $HOST" \
-H "Priority: high" \ -H "Priority: high" \
-H "Tags: rotating_light,robot_face" \ -H "Tags: rotating_light,robot_face" \
-d "The daily update-qwen-model job failed. Check: journalctl -u update-qwen-model.service" \ -d "The daily update-gemma-model job failed. Check: journalctl -u update-gemma-model.service" \
"https://ntfy.mjallen.dev/builds" || true "https://ntfy.mjallen.dev/builds" || true
''; '';
@@ -30,10 +30,7 @@ let
description = "AI Services"; description = "AI Services";
options = { options = {
llama-cpp = { llama-cpp = {
model = model = mkOpt types.str "gemma-4-26B-A4B-it-UD-Q8_K_XL" "";
mkOpt types.str
"models--unsloth--gemma-4-26B-A4B-it-GGUF/snapshots/b8654b48d979f2853b7a81d6541ca64eea7dc3c5/gemma-4-26B-A4B-it-UD-Q8_K_XL"
"";
}; };
}; };
moduleConfig = { moduleConfig = {
@@ -59,21 +56,17 @@ let
model = "${cfg.configDir}/llama-cpp/models/${cfg.llama-cpp.model}.gguf"; model = "${cfg.configDir}/llama-cpp/models/${cfg.llama-cpp.model}.gguf";
package = inputs.llama-cpp.packages.${system}.rocm; package = inputs.llama-cpp.packages.${system}.rocm;
extraFlags = [ extraFlags = [
"--fit"
"on"
"--seed"
"3407"
"--temp"
"0.7"
"--top-p"
"0.9"
"--min-p"
"0.05"
"--top-k"
"30"
"--jinja" "--jinja"
"--chat-template-kwargs"
"{\"enable_thinking\":true}"
"--temp"
"1.0"
"--top-p"
"0.95"
"--top-k"
"64"
"--ctx-size" "--ctx-size"
"131072" "32768"
"--threads" "--threads"
"8" "8"
"--batch-size" "--batch-size"
@@ -81,7 +74,7 @@ let
"--gpu-layers" "--gpu-layers"
"999" "999"
"--flash-attn" "--flash-attn"
"auto" "on"
"--mlock" "--mlock"
]; ];
}; };
@@ -120,16 +113,16 @@ let
# Systemd service for automatic model updates # Systemd service for automatic model updates
systemd = { systemd = {
services = { services = {
update-qwen-model = { update-gemma-model = {
description = "Update Qwen3-Coder-Next model from HuggingFace"; description = "Update Gemma 4 model from HuggingFace";
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
ExecStart = "${pkgs.writeShellScript "update-qwen-model" '' ExecStart = "${pkgs.writeShellScript "update-gemma-model" ''
set -euo pipefail set -euo pipefail
MODEL_DIR="${cfg.configDir}/llama-cpp/models" MODEL_DIR="${cfg.configDir}/llama-cpp/models"
MODEL_NAME="${cfg.llama-cpp.model}.gguf" MODEL_NAME="${cfg.llama-cpp.model}.gguf"
REPO_ID="unsloth/Qwen3-Coder-Next-GGUF" REPO_ID="unsloth/gemma-4-26B-A4B-it-GGUF"
# Create model directory if it doesn't exist # Create model directory if it doesn't exist
mkdir -p "$MODEL_DIR" mkdir -p "$MODEL_DIR"
@@ -147,13 +140,13 @@ let
Group = "jallen-nas"; Group = "jallen-nas";
EnvironmentFile = [ config.sops.templates."ntfy.env".path ]; EnvironmentFile = [ config.sops.templates."ntfy.env".path ];
}; };
unitConfig.OnFailure = "update-qwen-model-notify-failure.service"; unitConfig.OnFailure = "update-gemma-model-notify-failure.service";
# Run daily at 3 AM # Run daily at 3 AM
startAt = "*-*-* 03:00:00"; startAt = "*-*-* 03:00:00";
}; };
update-qwen-model-notify-failure = { update-gemma-model-notify-failure = {
description = "Notify ntfy on update-qwen-model failure"; description = "Notify ntfy on update-gemma-model failure";
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
ExecStart = "${ntfyModelFailScript}"; ExecStart = "${ntfyModelFailScript}";
@@ -163,8 +156,8 @@ let
# Ensure model is available before llama-cpp starts # Ensure model is available before llama-cpp starts
llama-cpp = { llama-cpp = {
after = [ "update-qwen-model.service" ]; after = [ "update-gemma-model.service" ];
wants = [ "update-qwen-model.service" ]; wants = [ "update-gemma-model.service" ];
}; };
}; };
}; };