additional esphome devices and fixes
This commit is contained in:
@@ -0,0 +1 @@
|
||||
х(vтOьш╚3Вяm0л
|
||||
@@ -0,0 +1,732 @@
|
||||
{
|
||||
"esp-entbtproxy.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "0C:B8:15:F5:2A:CC"
|
||||
},
|
||||
"esp-spare1-athomv1.yaml": {
|
||||
"board_id": "esp8285"
|
||||
},
|
||||
"esp-centralstairs-top.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "48:3F:DA:16:51:20"
|
||||
},
|
||||
"esp-officeelvcontrol.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "5C:CF:7F:BD:7B:42"
|
||||
},
|
||||
"esp-gasheater.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-bedrm1arlecbulb.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-maindishwasherpower.yaml": {
|
||||
"board_id": "generic-esp32c3",
|
||||
"mac_address": "24:EC:4A:B0:C9:AC"
|
||||
},
|
||||
"esp-downstbathtowelrail.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-bedrm2fanswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "24:62:AB:05:A3:24"
|
||||
},
|
||||
"esp-downstmasterbedrmlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "E8:DB:84:92:DE:1C"
|
||||
},
|
||||
"esp-loungenorthswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "EC:FA:BC:5C:4C:8B"
|
||||
},
|
||||
"esp-garagelights.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "5C:CF:7F:3B:C1:97"
|
||||
},
|
||||
"esp-underhouselights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "60:01:94:84:70:87"
|
||||
},
|
||||
"esp-mainbathfancombo.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "8C:AA:B5:E0:7D:19"
|
||||
},
|
||||
"esp-entranceoutsideledlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "60:01:94:6F:91:75"
|
||||
},
|
||||
"esp-centralstairs-bottom.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "48:3F:DA:16:86:A8"
|
||||
},
|
||||
"esp-arcademachine1.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "10:52:1C:FF:D9:8E"
|
||||
},
|
||||
"esp-officedeskrightgpo.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "2C:3A:E8:0F:4E:0E"
|
||||
},
|
||||
"esp-mainhallwaymainlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "50:02:91:43:0B:7C"
|
||||
},
|
||||
"esp-downstbedrm2lights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "50:02:91:43:0C:40"
|
||||
},
|
||||
"esp-mainhallwaynorthlightswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "CC:50:E3:EE:5E:45"
|
||||
},
|
||||
"esp-garageextcornerlight.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "2C:3A:E8:0F:54:90"
|
||||
},
|
||||
"esp-downstairsdishwasher.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "78:42:1C:F2:4E:AD"
|
||||
},
|
||||
"esp-entrancebathrmlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "8C:AA:B5:E0:A1:2E"
|
||||
},
|
||||
"esp-bedrm2lights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "DC:4F:22:72:0E:C1"
|
||||
},
|
||||
"esp-weatherstation.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-garagedbcontrols.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "60:01:94:88:DD:AA"
|
||||
},
|
||||
"esp-datacupboardfans.yaml": {
|
||||
"board_id": "aspen_asp_200_smart_window_fan",
|
||||
"mac_address": "50:02:91:5F:D6:A7"
|
||||
},
|
||||
"esp-mainkitchenlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "8C:AA:B5:DF:B7:DE"
|
||||
},
|
||||
"esp-loungepelmetleds2.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-entmulti.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "E4:65:B8:77:76:EC"
|
||||
},
|
||||
"esp-occupancystair.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "0C:B8:15:C1:F1:0C"
|
||||
},
|
||||
"esp-datacupboardpower-left.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "78:42:1C:F2:70:20"
|
||||
},
|
||||
"esp-officelights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "EC:FA:BC:48:9E:A6"
|
||||
},
|
||||
"esp-mainbathroomlights.yaml": {
|
||||
"board_id": "generic-bk7231n-qfn32-tuya",
|
||||
"mac_address": "CC:8C:BF:2D:B1:C4"
|
||||
},
|
||||
"esp-loungesouthrightswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "84:CC:A8:8C:52:32"
|
||||
},
|
||||
"esp-bedrm3ceilingfan.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-laundryplugpow.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "2C:3A:E8:07:5C:88"
|
||||
},
|
||||
"esp-mainhallwaynightlights.yaml": {
|
||||
"board_id": "generic-bk7231n-qfn32-tuya",
|
||||
"mac_address": "50:8A:06:67:3E:4A"
|
||||
},
|
||||
"esp-datacupboardpower-right.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "78:42:1C:F2:6F:8B"
|
||||
},
|
||||
"esp-poolpumppower.yaml": {
|
||||
"board_id": "generic-esp32c3",
|
||||
"mac_address": "24:EC:4A:B0:C9:88"
|
||||
},
|
||||
"esp-laundrydrypow.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "5C:CF:7F:92:35:96"
|
||||
},
|
||||
"esp-loungecabinetleds.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-6buttontest-pmb.yaml": {
|
||||
"board_id": "generic-esp32"
|
||||
},
|
||||
"esp-bedrm3lights.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-laundrywashpow.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "5C:CF:7F:B4:A7:A5"
|
||||
},
|
||||
"esp-breakfastbarleds.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-laundryenv.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "5C:CF:7F:92:41:F5"
|
||||
},
|
||||
"esp-occupancyoffice.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "0C:B8:15:C0:E7:00"
|
||||
},
|
||||
"esp-flysprayer1.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "2C:F4:32:E5:22:5D"
|
||||
},
|
||||
"esp-3dprinterpow.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "5C:CF:7F:A0:36:73"
|
||||
},
|
||||
"esp-rocktumbler.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "78:42:1C:F2:5A:E7"
|
||||
},
|
||||
"esp-rgblampbulb1.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-downstloungeentry.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "50:02:91:43:0D:A3"
|
||||
},
|
||||
"esp-downstloungeoutside.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "24:62:AB:05:9B:7A"
|
||||
},
|
||||
"esp-masterbathtowelrail.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-loungeenvironment.yaml": {
|
||||
"board_id": "generic-esp32c3",
|
||||
"mac_address": "8C:D0:B2:A9:72:E5"
|
||||
},
|
||||
"esp-loungewestswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "EC:FA:BC:5C:4C:03"
|
||||
},
|
||||
"esp-lounge6chdimmer.yaml": {
|
||||
"board_id": "d1-mini-pro",
|
||||
"mac_address": "C8:C9:A3:3B:0B:59"
|
||||
},
|
||||
"esp-downstbathswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "84:CC:A8:8B:44:9D"
|
||||
},
|
||||
"esp-loungemiddleswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "24:62:AB:05:A2:BE"
|
||||
},
|
||||
"esp-officeusbhubpower.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "2C:3A:E8:0F:53:52"
|
||||
},
|
||||
"esp-leafbattery.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-garagebtproxy.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "10:06:1C:86:D0:1C"
|
||||
},
|
||||
"esp-bedrm1airfilter.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "E8:9F:6D:87:C1:5D"
|
||||
},
|
||||
"esp-downstkitchlights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "24:62:AB:05:A8:90"
|
||||
},
|
||||
"esp-garageentrylights.yaml": {
|
||||
"board_id": "generic-bk7231n-qfn32-tuya"
|
||||
},
|
||||
"esp-mainpowermonitor.yaml": {
|
||||
"board_id": "d1-mini",
|
||||
"mac_address": "2C:F4:32:4B:BC:70"
|
||||
},
|
||||
"esp-loungebookshelfleds.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-officeduallights.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-poollightpower2.yaml": {
|
||||
"board_id": "esp8285",
|
||||
"mac_address": "78:42:1C:F2:50:87"
|
||||
},
|
||||
"esp-laundrylights.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "E8:DB:84:92:D8:44"
|
||||
},
|
||||
"esp-downstloungemain.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "24:62:AB:05:A2:C3"
|
||||
},
|
||||
"esp-loungesouthleftswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "8C:AA:B5:DF:F5:ED"
|
||||
},
|
||||
"esp-attobattery.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"esp-downstairskitchleds.yaml": {
|
||||
"board_id": "generic-esp8266"
|
||||
},
|
||||
"esp-entrancelightswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "40:F5:20:E0:44:DA"
|
||||
},
|
||||
"esp-bedrm3fanswitch.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "84:F3:EB:EC:6E:3A"
|
||||
},
|
||||
"esp-bedrm2ceilingfan.yaml": {
|
||||
"board_id": "d1-mini"
|
||||
},
|
||||
"_remote_build": {
|
||||
"dashboard_id": "vhamVDnWEnx-FvAa24uVv49Wsddurh84"
|
||||
},
|
||||
"esp-entbtproxy copy.yaml": {
|
||||
"board_id": "generic-esp32"
|
||||
},
|
||||
"esp-nspanel2lounge.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "88:13:BF:68:39:2C"
|
||||
},
|
||||
"_firmware_jobs": [
|
||||
{
|
||||
"job_id": "126762467ae7",
|
||||
"configuration": "esp-nspanel1masterbdrm.yaml",
|
||||
"job_type": "install",
|
||||
"status": "completed",
|
||||
"created_at": "2026-05-17T10:36:36.272476+00:00",
|
||||
"started_at": "2026-05-17T10:36:36.272693+00:00",
|
||||
"completed_at": "2026-05-17T10:37:14.499200+00:00",
|
||||
"exit_code": 0,
|
||||
"output": [
|
||||
"\\033[32mINFO ESPHome 2026.5.0b1\\033[0m\n",
|
||||
"\\033[32mINFO Reading configuration /config/esphome/esp-nspanel1masterbdrm.yaml...\\033[0m\n",
|
||||
"\\033[32mINFO Detected timezone 'Pacific/Auckland'\\033[0m\n",
|
||||
"\\033[33mWARNING Found and merged multiple configurations for ota platform esphome port(s) [3232]\\033[0m\n",
|
||||
"\\033[32mINFO Generating C++ source...\\033[0m\n",
|
||||
"\\033[32mINFO Setting CONFIG_LWIP_MAX_SOCKETS to 13 (TCP=6 [api=3, captive_portal=3], UDP=3 [captive_portal=1, mdns=2], TCP_LISTEN=4 [api=1, ota=2, web_server_base=1])\\033[0m\n",
|
||||
"\\033[32mINFO Compiling app... Build path: /data/build/esp-nspanel1masterbdrm\\033[0m\n",
|
||||
"Processing \u001b[36m\u001b[1mesp-nspanel1masterbdrm\u001b[0m (board: esp32dev; framework: espidf; platform: https://github.com/pioarduino/platform-espressif32/releases/download/55.03.38-1/platform-espressif32.zip)\n",
|
||||
"\u001b[1m--------------------------------------------------------------------------------\u001b[0m\n",
|
||||
"\u001b[0mHARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash\n",
|
||||
"\u001b[0m - contrib-piohome @ 3.4.4 \n",
|
||||
"\u001b[0m - framework-espidf @ 3.50504.0 (5.5.4) \n",
|
||||
"\u001b[0m - tool-cmake @ 4.0.3 \n",
|
||||
"\u001b[0m - tool-esp-rom-elfs @ 2024.10.11 \n",
|
||||
"\u001b[0m - tool-esptoolpy @ 5.2.0 \n",
|
||||
"\u001b[0m - tool-ninja @ 1.13.1 \n",
|
||||
"\u001b[0m - tool-scons @ 4.40801.0 (4.8.1) \n",
|
||||
"\u001b[0m - tool-xtensa-esp-elf-gdb @ 16.3.0+20250913 \n",
|
||||
"\u001b[0m - toolchain-xtensa-esp-elf @ 14.2.0+20260121\n",
|
||||
"\u001b[33m\u001b[2mUsing Python 3.12.10 environment at: /root/.platformio/penv/.espidf-5.5.4\u001b[0m\n",
|
||||
"\u001b[0mReading CMake configuration...\n",
|
||||
"\u001b[0mNo dependencies\n",
|
||||
"\u001b[0mRAM: [== ] 19.9% (used 65232 bytes from 327680 bytes)\n",
|
||||
"\u001b[0mFlash: [====== ] 61.5% (used 1127679 bytes from 1835008 bytes)\n",
|
||||
"========================= [\u001b[32m\u001b[1mSUCCESS\u001b[0m] Took 20.43 seconds =========================\u001b[0m\n",
|
||||
"\\033[32mINFO Build Info: config_hash=0xb6775f3e build_time_str=2026-05-17 22:24:40 +1200\\033[0m\n",
|
||||
"\\033[32mINFO Successfully compiled program.\\033[0m\n",
|
||||
"\\033[32mINFO Connecting to 172.31.11.183 port 3232...\\033[0m\n",
|
||||
"\\033[32mINFO Connected to 172.31.11.183\\033[0m\n",
|
||||
"\\033[32mINFO Uploading /data/build/esp-nspanel1masterbdrm/.pioenvs/esp-nspanel1masterbdrm/firmware.bin (1128080 bytes)\\033[0m\n",
|
||||
"\r",
|
||||
"Uploading: [ ] 0% \r",
|
||||
"Uploading: [= ] 1% \r",
|
||||
"Uploading: [= ] 2% \r",
|
||||
"Uploading: [== ] 3% \r",
|
||||
"Uploading: [=== ] 4% \r",
|
||||
"Uploading: [=== ] 5% \r",
|
||||
"Uploading: [==== ] 6% \r",
|
||||
"Uploading: [==== ] 7% \r",
|
||||
"Uploading: [===== ] 8% \r",
|
||||
"Uploading: [====== ] 9% \r",
|
||||
"Uploading: [====== ] 10% \r",
|
||||
"Uploading: [======= ] 11% \r",
|
||||
"Uploading: [======= ] 12% \r",
|
||||
"Uploading: [======== ] 13% \r",
|
||||
"Uploading: [========= ] 14% \r",
|
||||
"Uploading: [========= ] 15% \r",
|
||||
"Uploading: [========== ] 16% \r",
|
||||
"Uploading: [========== ] 17% \r",
|
||||
"Uploading: [=========== ] 18% \r",
|
||||
"Uploading: [============ ] 19% \r",
|
||||
"Uploading: [============ ] 20% \r",
|
||||
"Uploading: [============= ] 21% \r",
|
||||
"Uploading: [============== ] 22% \r",
|
||||
"Uploading: [============== ] 23% \r",
|
||||
"Uploading: [=============== ] 24% \r",
|
||||
"Uploading: [=============== ] 25% \r",
|
||||
"Uploading: [================ ] 26% \r",
|
||||
"Uploading: [================= ] 27% \r",
|
||||
"Uploading: [================= ] 28% \r",
|
||||
"Uploading: [================= ] 29% \r",
|
||||
"Uploading: [================== ] 30% \r",
|
||||
"Uploading: [=================== ] 31% \r",
|
||||
"Uploading: [==================== ] 32% \r",
|
||||
"Uploading: [==================== ] 33% \r",
|
||||
"Uploading: [==================== ] 34% \r",
|
||||
"Uploading: [===================== ] 35% \r",
|
||||
"Uploading: [====================== ] 36% \r",
|
||||
"Uploading: [====================== ] 37% \r",
|
||||
"Uploading: [======================= ] 38% \r",
|
||||
"Uploading: [======================== ] 39% \r",
|
||||
"Uploading: [======================== ] 40% \r",
|
||||
"Uploading: [========================= ] 41% \r",
|
||||
"Uploading: [========================= ] 42% \r",
|
||||
"Uploading: [========================== ] 43% \r",
|
||||
"Uploading: [=========================== ] 44% \r",
|
||||
"Uploading: [=========================== ] 45% \r",
|
||||
"Uploading: [============================ ] 46% \r",
|
||||
"Uploading: [============================ ] 47% \r",
|
||||
"Uploading: [============================= ] 48% \r",
|
||||
"Uploading: [============================== ] 49% \r",
|
||||
"Uploading: [============================== ] 50% \r",
|
||||
"Uploading: [=============================== ] 51% \r",
|
||||
"Uploading: [=============================== ] 52% \r",
|
||||
"Uploading: [================================ ] 53% \r",
|
||||
"Uploading: [================================= ] 54% \r",
|
||||
"Uploading: [================================= ] 55% \r",
|
||||
"Uploading: [================================== ] 56% \r",
|
||||
"Uploading: [================================== ] 57% \r",
|
||||
"Uploading: [=================================== ] 58% \r",
|
||||
"Uploading: [==================================== ] 59% \r",
|
||||
"Uploading: [==================================== ] 60% \r",
|
||||
"Uploading: [===================================== ] 61% \r",
|
||||
"Uploading: [===================================== ] 62% \r",
|
||||
"Uploading: [====================================== ] 63% \r",
|
||||
"Uploading: [======================================= ] 64% \r",
|
||||
"Uploading: [======================================= ] 65% \r",
|
||||
"Uploading: [======================================== ] 66% \r",
|
||||
"Uploading: [========================================= ] 67% \r",
|
||||
"Uploading: [========================================= ] 68% \r",
|
||||
"Uploading: [========================================== ] 69% \r",
|
||||
"Uploading: [========================================== ] 70% \r",
|
||||
"Uploading: [=========================================== ] 71% \r",
|
||||
"Uploading: [============================================ ] 72% \r",
|
||||
"Uploading: [============================================ ] 73% \r",
|
||||
"Uploading: [============================================ ] 74% \r",
|
||||
"Uploading: [============================================= ] 75% \r",
|
||||
"Uploading: [============================================== ] 76% \r",
|
||||
"Uploading: [=============================================== ] 77% \r",
|
||||
"Uploading: [=============================================== ] 78% \r",
|
||||
"Uploading: [=============================================== ] 79% \r",
|
||||
"Uploading: [================================================ ] 80% \r",
|
||||
"Uploading: [================================================= ] 81% \r",
|
||||
"Uploading: [================================================= ] 82% \r",
|
||||
"Uploading: [================================================== ] 83% \r",
|
||||
"Uploading: [=================================================== ] 84% \r",
|
||||
"Uploading: [=================================================== ] 85% \r",
|
||||
"Uploading: [==================================================== ] 86% \r",
|
||||
"Uploading: [==================================================== ] 87% \r",
|
||||
"Uploading: [===================================================== ] 88% \r",
|
||||
"Uploading: [====================================================== ] 89% \r",
|
||||
"Uploading: [====================================================== ] 90% \r",
|
||||
"Uploading: [======================================================= ] 91% \r",
|
||||
"Uploading: [======================================================= ] 92% \r",
|
||||
"Uploading: [======================================================== ] 93% \r",
|
||||
"Uploading: [========================================================= ] 94% \r",
|
||||
"Uploading: [========================================================= ] 95% \r",
|
||||
"Uploading: [========================================================== ] 96% \r",
|
||||
"Uploading: [========================================================== ] 97% \r",
|
||||
"Uploading: [=========================================================== ] 98% \r",
|
||||
"Uploading: [============================================================] 99% \r",
|
||||
"Uploading: [============================================================] 100% Done...\r\n",
|
||||
"\n",
|
||||
"\\033[32mINFO Upload took 7.41 seconds, waiting for result...\\033[0m\n",
|
||||
"\\033[32mINFO OTA successful\\033[0m\n",
|
||||
"\\033[32mINFO Successfully uploaded program.\\033[0m\n"
|
||||
],
|
||||
"error": null,
|
||||
"port": "OTA",
|
||||
"new_name": "",
|
||||
"progress": 100,
|
||||
"remote_peer": "",
|
||||
"remote_job_id": "",
|
||||
"remote_peer_label": "",
|
||||
"device_name": "",
|
||||
"device_friendly_name": "",
|
||||
"source": "local",
|
||||
"source_pin_sha256": "",
|
||||
"source_label": "",
|
||||
"source_esphome_version": ""
|
||||
},
|
||||
{
|
||||
"job_id": "0eb2b3a49a5f",
|
||||
"configuration": "esp-nspanel2lounge.yaml",
|
||||
"job_type": "compile",
|
||||
"status": "cancelled",
|
||||
"created_at": "2026-05-17T08:44:50.516947+00:00",
|
||||
"started_at": "2026-05-17T08:44:50.517123+00:00",
|
||||
"completed_at": "2026-05-17T08:47:51.180084+00:00",
|
||||
"exit_code": -15,
|
||||
"output": [
|
||||
"\\033[32mINFO ESPHome 2026.5.0b1\\033[0m\n",
|
||||
"\\033[32mINFO Reading configuration /config/esphome/esp-nspanel2lounge.yaml...\\033[0m\n",
|
||||
"\\033[32mINFO Updating https://github.com/edwardtfn/NSPanel-Easy@v2026.5.5\\033[0m\n",
|
||||
"\\033[32mINFO Updating https://github.com/edwardtfn/NSPanel-Easy@v2026.5.5\\033[0m\n",
|
||||
"\\033[32mINFO Detected timezone 'Pacific/Auckland'\\033[0m\n",
|
||||
"\\033[33mWARNING Found and merged multiple configurations for ota platform esphome port(s) [3232]\\033[0m\n",
|
||||
"\\033[32mINFO Generating C++ source...\\033[0m\n",
|
||||
"\\033[32mINFO Setting CONFIG_LWIP_MAX_SOCKETS to 13 (TCP=6 [api=3, captive_portal=3], UDP=3 [captive_portal=1, mdns=2], TCP_LISTEN=4 [api=1, ota=2, web_server_base=1])\\033[0m\n",
|
||||
"\\033[32mINFO Compiling app... Build path: /data/build/esp-nspanel2lounge\\033[0m\n",
|
||||
"Processing \u001b[36m\u001b[1mesp-nspanel2lounge\u001b[0m (board: esp32dev; framework: espidf; platform: https://github.com/pioarduino/platform-espressif32/releases/download/55.03.38-1/platform-espressif32.zip)\n",
|
||||
"\u001b[1m--------------------------------------------------------------------------------\u001b[0m\n",
|
||||
"\u001b[0mHARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash\n",
|
||||
"\u001b[0m - contrib-piohome @ 3.4.4 \n",
|
||||
"\u001b[0m - framework-espidf @ 3.50504.0 (5.5.4) \n",
|
||||
"\u001b[0m - tool-cmake @ 4.0.3 \n",
|
||||
"\u001b[0m - tool-esp-rom-elfs @ 2024.10.11 \n",
|
||||
"\u001b[0m - tool-esptoolpy @ 5.2.0 \n",
|
||||
"\u001b[0m - tool-ninja @ 1.13.1 \n",
|
||||
"\u001b[0m - tool-scons @ 4.40801.0 (4.8.1) \n",
|
||||
"\u001b[0m - tool-xtensa-esp-elf-gdb @ 16.3.0+20250913 \n",
|
||||
"\u001b[0m - toolchain-xtensa-esp-elf @ 14.2.0+20260121\n",
|
||||
"\u001b[33m\u001b[2mUsing Python 3.12.10 environment at: /root/.platformio/penv/.espidf-5.5.4\u001b[0m\n",
|
||||
"\u001b[0mReading CMake configuration...\n",
|
||||
"\u001b[0mGenerating assembly for certificate bundle...\n",
|
||||
"\u001b[0mNo dependencies\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/adc/adc_sensor_common.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/adc/adc_sensor_esp32.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_buffer.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_connection.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_frame_helper.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_frame_helper_plaintext.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_overflow_buffer.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_pb2.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_pb2_service.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/api_server.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/list_entities.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/proto.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/subscribe_state.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/api/user_services.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/binary_sensor/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/binary_sensor/binary_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/binary_sensor/filter.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/button/button.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/captive_portal/captive_portal.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/captive_portal/dns_server_esp32_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/display/display.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/display/display_buffer.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/display/rect.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/core.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/crash_handler.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/gpio.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/hal.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/helpers.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/preferences.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/printf_stubs.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esp32/throw_stubs.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/esphome/ota/ota_esphome.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/gpio/switch/gpio_switch.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/homeassistant/text_sensor/homeassistant_text_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/homeassistant/time/homeassistant_time.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ledc/ledc_output.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/logger/logger.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/logger/logger_esp32.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/logger/task_log_buffer_esp32.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/md5/md5.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/mdns/mdns_component.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/mdns/mdns_esp32.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/network/util.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/nextion.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/nextion_commands.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/nextion_component.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/nextion_upload.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/nextion_upload_esp32.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nextion/text_sensor/nextion_textsensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/addon_climate.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/addon_display_light.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/addon_upload_tft.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/base.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/chips.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/ha_components.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/hw_display.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/nextion_components.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_climate.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_entities.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_media_player.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_notification.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_popup_select.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_screensaver.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/page_utilities.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/pages.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/text.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/versioning.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/nspanel_easy/weather.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ntc/ntc.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/number/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/number/number.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/number/number_call.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/number/number_traits.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ota/ota_backend.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ota/ota_backend_esp_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ota/ota_bootloader_esp_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/ota/ota_partitions_esp_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/output/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/output/float_output.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/psram/psram.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/resistance/resistance_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/restart/button/restart_button.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/rtttl/rtttl.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/safe_mode/safe_mode.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/script/script.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/select/select.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/select/select_call.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/select/select_traits.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/sensor/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/sensor/filter.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/sensor/sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/sha256/sha256.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/socket/bsd_sockets_impl.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/socket/socket.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/switch/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/switch/switch.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/template/binary_sensor/template_binary_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/template/number/template_number.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/template/select/template_select.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/template/switch/template_switch.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/template/text_sensor/template_text_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/text_sensor/filter.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/text_sensor/text_sensor.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/time/automation.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/time/posix_tz.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/time/real_time_clock.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/uart/uart.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/uart/uart_component.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/uart/uart_component_esp_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/uart/uart_debugger.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/watchdog/watchdog.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/web_server/ota/ota_web_server.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/web_server_base/web_server_base.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/web_server_idf/multipart.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/web_server_idf/utils.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/web_server_idf/web_server_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/wifi/wifi_component.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/components/wifi/wifi_component_esp_idf.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/alloc_helpers.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/application.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/build_info_data.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/color.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/component.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/component_iterator.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/controller_registry.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/entity_base.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/gpio.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/helpers.cpp.o\n",
|
||||
"\u001b[0mCompiling .pioenvs/esp-nspanel2lounge/src/esphome/core/log.cpp.o\n"
|
||||
],
|
||||
"error": null,
|
||||
"port": "",
|
||||
"new_name": "",
|
||||
"progress": null,
|
||||
"remote_peer": "",
|
||||
"remote_job_id": "",
|
||||
"remote_peer_label": "",
|
||||
"device_name": "",
|
||||
"device_friendly_name": "",
|
||||
"source": "local",
|
||||
"source_pin_sha256": "",
|
||||
"source_label": "",
|
||||
"source_esphome_version": ""
|
||||
},
|
||||
{
|
||||
"job_id": "e4433a434baf",
|
||||
"configuration": "esp-nspanel1masterbdrm.yaml",
|
||||
"job_type": "clean",
|
||||
"status": "completed",
|
||||
"created_at": "2026-05-17T09:55:46.641871+00:00",
|
||||
"started_at": "2026-05-17T09:55:46.642053+00:00",
|
||||
"completed_at": "2026-05-17T09:55:49.036615+00:00",
|
||||
"exit_code": 0,
|
||||
"output": [
|
||||
"\\033[32mINFO ESPHome 2026.5.0b1\\033[0m\n",
|
||||
"\\033[32mINFO Reading configuration /config/esphome/esp-nspanel1masterbdrm.yaml...\\033[0m\n",
|
||||
"\\033[32mINFO Detected timezone 'Pacific/Auckland'\\033[0m\n",
|
||||
"\\033[33mWARNING Found and merged multiple configurations for ota platform esphome port(s) [3232]\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/.pioenvs\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/.piolibdeps\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/dependencies.lock\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/managed_components\\033[0m\n",
|
||||
"\\033[32mINFO Deleting PlatformIO cache /data/cache/platformio/cache\\033[0m\n",
|
||||
"\\033[32mINFO Done!\\033[0m\n"
|
||||
],
|
||||
"error": null,
|
||||
"port": "",
|
||||
"new_name": "",
|
||||
"progress": null,
|
||||
"remote_peer": "",
|
||||
"remote_job_id": "",
|
||||
"remote_peer_label": "",
|
||||
"device_name": "",
|
||||
"device_friendly_name": "",
|
||||
"source": "local",
|
||||
"source_pin_sha256": "",
|
||||
"source_label": "",
|
||||
"source_esphome_version": ""
|
||||
},
|
||||
{
|
||||
"job_id": "1cb834d6b311",
|
||||
"configuration": "esp-nspanel1masterbdrm.yaml",
|
||||
"job_type": "clean",
|
||||
"status": "completed",
|
||||
"created_at": "2026-05-17T09:30:13.803940+00:00",
|
||||
"started_at": "2026-05-17T09:30:13.804128+00:00",
|
||||
"completed_at": "2026-05-17T09:30:16.052388+00:00",
|
||||
"exit_code": 0,
|
||||
"output": [
|
||||
"\\033[32mINFO ESPHome 2026.5.0b1\\033[0m\n",
|
||||
"\\033[32mINFO Reading configuration /config/esphome/esp-nspanel1masterbdrm.yaml...\\033[0m\n",
|
||||
"\\033[32mINFO Detected timezone 'Pacific/Auckland'\\033[0m\n",
|
||||
"\\033[33mWARNING Found and merged multiple configurations for ota platform esphome port(s) [3232]\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/.pioenvs\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/dependencies.lock\\033[0m\n",
|
||||
"\\033[32mINFO Deleting /data/build/esp-nspanel1masterbdrm/managed_components\\033[0m\n",
|
||||
"\\033[32mINFO Deleting PlatformIO cache /data/cache/platformio/cache\\033[0m\n",
|
||||
"\\033[32mINFO Done!\\033[0m\n"
|
||||
],
|
||||
"error": null,
|
||||
"port": "",
|
||||
"new_name": "",
|
||||
"progress": null,
|
||||
"remote_peer": "",
|
||||
"remote_job_id": "",
|
||||
"remote_peer_label": "",
|
||||
"device_name": "",
|
||||
"device_friendly_name": "",
|
||||
"source": "local",
|
||||
"source_pin_sha256": "",
|
||||
"source_label": "",
|
||||
"source_esphome_version": ""
|
||||
}
|
||||
],
|
||||
"esp-nspanel2lounge copy.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "88:13:BF:68:39:2C"
|
||||
},
|
||||
"esp-nspanel1masterbdrm.yaml": {
|
||||
"board_id": "generic-esp32",
|
||||
"mac_address": "24:D7:EB:0D:E7:FC"
|
||||
},
|
||||
"esp-ledmatrix1.yaml": {
|
||||
"board_id": "generic-esp8266",
|
||||
"mac_address": "5C:CF:7F:A0:36:73"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 76431, "lock_format_version": 1, "device_builder_version": "0.1.0b51", "start_ts": 1779063562.6364732}
|
||||
@@ -0,0 +1,130 @@
|
||||
substitutions:
|
||||
############################################################################################
|
||||
# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS
|
||||
# If NOT using a secrets file, just replace these with the passwords etc (in quotes)
|
||||
###########################################################################################
|
||||
wifi_ssid: !secret ha_wifi_ssid
|
||||
wifi_password: !secret ha_wifi_password
|
||||
fallback_ap_password: !secret fallback_ap_password
|
||||
|
||||
# Enables faster network connections, with last connected SSID being connected to and no full scan for SSID being undertaken
|
||||
wifi_fast_connect: "false"
|
||||
|
||||
# Define a domain for this device to use. i.e. iot.home.lan (so device will appear as athom-smart-plug-v2.iot.home.lan in DNS/DHCP logs)
|
||||
dns_domain: ".local"
|
||||
|
||||
# Automatically add the mac address to the name
|
||||
# eg so you can use a single firmware for all devices
|
||||
add_mac_suffix: "false"
|
||||
|
||||
# Enable or disable the use of IPv6 networking on the device
|
||||
ipv6_enable: "false"
|
||||
|
||||
# Add these if we are giving it a static ip, or remove them in the Wifi section
|
||||
static_ip_subnet: !secret ha_wifi_subnet
|
||||
static_ip_gateway: !secret ha_wifi_gateway
|
||||
static_ip_dns1: !secret ha_wifi_dns1
|
||||
static_ip_dns2: !secret ha_wifi_dns2
|
||||
|
||||
# Network reconnect every x hours to ensure best access point
|
||||
base_interval_hours: "23" # Base interval in hours
|
||||
random_offset_max_minutes: "59" # Max random offset in minutes
|
||||
|
||||
###########################################################################################
|
||||
# Common Wifi Settings
|
||||
# https://esphome.io/components/wifi.html
|
||||
#
|
||||
# Power Save mode (can reduce wifi reliability)
|
||||
# NONE (least power saving, Default for ESP8266)
|
||||
# LIGHT (Default for ESP32)
|
||||
# HIGH (most power saving)
|
||||
###########################################################################################
|
||||
wifi:
|
||||
networks:
|
||||
- ssid: ${wifi_ssid}
|
||||
password: ${wifi_password}
|
||||
manual_ip: # optional static IP address
|
||||
static_ip: ${local_static_ip_address}
|
||||
gateway: ${static_ip_gateway}
|
||||
subnet: ${static_ip_subnet}
|
||||
dns1: ${static_ip_dns1}
|
||||
dns2: ${static_ip_dns2}
|
||||
|
||||
#enable_rrm: true # (ESP32 only) enable 802.11k Radio Resource Management
|
||||
#enable_btm: true # (ESP32 only) enable 802.11v BSS Transition Management
|
||||
power_save_mode: none # https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||
use_address: ${local_current_ip_address}
|
||||
ap: # Details for fallback hotspot in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||
ssid: ${local_device_name}
|
||||
password: ${fallback_ap_password}
|
||||
ap_timeout: 10min # Time until it brings up fallback AP. default is 1min
|
||||
|
||||
# Allow rapid re-connection to previously connected WiFi SSID, skipping scan of all SSIDs
|
||||
fast_connect: ${wifi_fast_connect}
|
||||
|
||||
# Define dns domain / suffix to add to hostname
|
||||
domain: ${dns_domain}
|
||||
min_auth_mode: WPA2
|
||||
|
||||
# Reboot eventually when Wi-Fi is down (default is 15min)
|
||||
reboot_timeout: 56h
|
||||
|
||||
captive_portal: # extra fallback mechanism for when connecting if the configured WiFi fails
|
||||
|
||||
###########################################################################################
|
||||
# Enable Over the Air Update Capability
|
||||
# https://esphome.io/components/ota.html?highlight=ota
|
||||
###########################################################################################
|
||||
ota:
|
||||
- platform: esphome
|
||||
password: ${local_ota_pass}
|
||||
version: 2
|
||||
#- platform: web_server # Uncomment if you want to be able to do OTA with the web interface
|
||||
|
||||
###########################################################################################
|
||||
# Safe Mode
|
||||
# Safe mode will detect boot loops
|
||||
# https://esphome.io/components/safe_mode
|
||||
###########################################################################################
|
||||
safe_mode:
|
||||
|
||||
###########################################################################################
|
||||
# Network
|
||||
# global configuration for all types of networks
|
||||
# https://esphome.io/components/network.html
|
||||
###########################################################################################
|
||||
network:
|
||||
enable_ipv6: ${ipv6_enable}
|
||||
|
||||
##########################################################################################
|
||||
# Interval
|
||||
# Restart Networking every x hours + rand mins
|
||||
# This ensure that the device is connected to the best AP
|
||||
##########################################################################################
|
||||
#script:
|
||||
# - id: random_reconnect
|
||||
# mode: restart
|
||||
# then:
|
||||
# - lambda: |-
|
||||
# // Compute total delay: base hours + random offset minutes
|
||||
# uint32_t extra;
|
||||
# #if defined(ESP32)
|
||||
# // ESP32 (both Arduino & IDF builds) uses esp_random()
|
||||
# extra = esp_random() % (${random_offset_max_minutes} + 1);
|
||||
# #elif defined(ESP8266)
|
||||
# // ESP8266 Arduino core
|
||||
# extra = os_random() % (${random_offset_max_minutes} + 1);
|
||||
# #else
|
||||
# // Fallback to esp_random() on other platforms
|
||||
# extra = esp_random() % (${random_offset_max_minutes} + 1);
|
||||
# #endif
|
||||
# uint32_t total_s = ${base_interval_hours} * 3600 + extra * 60;
|
||||
# ESP_LOGI("random_reconnect", "Next reconnect in %u seconds", total_s);
|
||||
# // Delay inside lambda (blocks script execution but OK for reconnect timing)
|
||||
# delay(total_s * 1000);
|
||||
# - logger.log: "network_check: performing reconnect"
|
||||
# - wifi.disable: {}
|
||||
# - delay: 1s
|
||||
# - wifi.enable: {}
|
||||
# - script.execute: random_reconnect
|
||||
|
||||
@@ -1,104 +1,129 @@
|
||||
############################################################################################
|
||||
# SPECIFIC DEVICE VARIABLE SUBSTITUTIONS
|
||||
# If NOT using a secrets file, just replace
|
||||
# these with the values (in quotes)
|
||||
###########################################################################################
|
||||
#:########################################################################################:#
|
||||
# TITLE: COMMON SNTP TIME SOURCE
|
||||
# zorruno.com common ESPHome include
|
||||
#:########################################################################################:#
|
||||
# FILE:
|
||||
# common/sntp_common.yaml
|
||||
#:########################################################################################:#
|
||||
# VERSIONS:
|
||||
# V1.1 2026-05-23 Fixed offline fallback clock so it increments from assumed noon boot time
|
||||
# V1.0 Initial common SNTP time source and diagnostic sensors
|
||||
#:########################################################################################:#
|
||||
# PURPOSE:
|
||||
# - Provides an SNTP time source for ESPHome devices.
|
||||
# - Stores the current time as minutes since midnight in current_mins.
|
||||
# - Provides a simple fallback clock if SNTP is not available.
|
||||
# - Publishes diagnostic text sensors for last restart, current/internal time, and sync status.
|
||||
#:########################################################################################:#
|
||||
# OPERATION NOTES:
|
||||
# - SNTP time is stored in id(sntp_time).
|
||||
# - Current minutes since midnight are stored in id(current_mins).
|
||||
# - If SNTP is valid, current_mins follows the real SNTP time.
|
||||
# - If SNTP is invalid, current_mins increments once per minute from the assumed boot time.
|
||||
# - The fallback assumes the device was powered on at 12:00 noon.
|
||||
# - If accurate offline time is needed, power-cycle the device at 12:00 noon.
|
||||
#:########################################################################################:#
|
||||
|
||||
#:########################################################################################:#
|
||||
# SUBSTITUTIONS: Specific SNTP variable substitutions
|
||||
# If NOT using a secrets file, replace these values directly in quotes.
|
||||
#:########################################################################################:#
|
||||
substitutions:
|
||||
timezone: "Pacific/Auckland"
|
||||
sntp_update_interval: 6h # Set the duration between the sntp service polling
|
||||
# Network time servers https://www.ntppool.org/zone/@
|
||||
sntp_update_interval: 6h
|
||||
|
||||
# Network time servers
|
||||
# https://www.ntppool.org/zone/@
|
||||
sntp_server_1: !secret ntp_server_1
|
||||
sntp_server_2: !secret ntp_server_2
|
||||
sntp_server_3: !secret ntp_server_3
|
||||
|
||||
###########################################################################################
|
||||
# Internal clock fallback support
|
||||
# If SNTP is invalid, we fall back to a simple internal minute counter
|
||||
# We assume user powers on the device at 12:00 noon
|
||||
# => 12 * 60 = 720 minutes from midnight.
|
||||
# Not restored, so it resets each boot.
|
||||
# Therefore, if no network and you still need timing functions, switch on ay noon.
|
||||
###########################################################################################
|
||||
#:########################################################################################:#
|
||||
# GLOBALS: Internal clock fallback support
|
||||
#:########################################################################################:#
|
||||
globals:
|
||||
- id: current_mins
|
||||
type: int
|
||||
restore_value: no
|
||||
initial_value: "720" # 720 is 12:00 Noon
|
||||
restore_value: false
|
||||
initial_value: "720" # 720 minutes from midnight is 12:00 noon.
|
||||
|
||||
#:########################################################################################:#
|
||||
# INTERVAL: Keep current_mins updated
|
||||
#:########################################################################################:#
|
||||
interval:
|
||||
- interval: 60s
|
||||
then:
|
||||
- lambda: |-
|
||||
// If SNTP valid, store minutes since midnight.
|
||||
// If SNTP is valid, store real minutes since midnight.
|
||||
auto now = id(sntp_time).now();
|
||||
if (now.is_valid()) {
|
||||
id(current_mins) = (now.hour * 60) + now.minute;
|
||||
} else {
|
||||
// Fallback: minutes since boot.
|
||||
id(current_mins) = (int)(millis() / 60000UL);
|
||||
// Fallback: increment from the assumed startup time.
|
||||
// Initial value is 720, so offline boot assumes 12:00 noon.
|
||||
id(current_mins) = (id(current_mins) + 1) % 1440;
|
||||
}
|
||||
|
||||
###########################################################################################
|
||||
# Real time clock time source for ESPHome
|
||||
# If it's invalid, we fall back to an internal clock
|
||||
#:########################################################################################:#
|
||||
# TIME: Real time clock source for ESPHome
|
||||
# https://esphome.io/components/time/index.html
|
||||
# https://esphome.io/components/time/sntp
|
||||
###########################################################################################
|
||||
#:########################################################################################:#
|
||||
time:
|
||||
- platform: sntp
|
||||
id: sntp_time
|
||||
# Define the timezone of the device
|
||||
timezone: "${timezone}"
|
||||
# Change sync interval from default 5min to 6 hours (or as set in substitutions)
|
||||
update_interval: ${sntp_update_interval}
|
||||
# Set specific sntp servers to use
|
||||
servers:
|
||||
- "${sntp_server_1}"
|
||||
- "${sntp_server_2}"
|
||||
- "${sntp_server_3}"
|
||||
# Publish the time the device was last restarted
|
||||
on_time_sync:
|
||||
then:
|
||||
- logger.log: "Synchronised SNTP clock"
|
||||
|
||||
- text_sensor.template.publish:
|
||||
id: time_sync
|
||||
state: "SNTP clock Syncd"
|
||||
# Update last restart time, but only once.
|
||||
state: "SNTP clock synced"
|
||||
|
||||
# Update last restart time once only, after the first successful SNTP sync.
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return id(device_last_restart).state == "";'
|
||||
lambda: |-
|
||||
return id(device_last_restart).state.empty();
|
||||
then:
|
||||
- text_sensor.template.publish:
|
||||
id: device_last_restart
|
||||
#state: !lambda 'return id(sntp_time).now().strftime("%a %d %b %Y - %I:%M:%S %p");'
|
||||
state: !lambda |-
|
||||
// grab the current SNTP time
|
||||
auto now = id(sntp_time).now();
|
||||
// format it as e.g. "Fri 23 May 2025 - 03:45:12 PM"
|
||||
return now.strftime("%a %d %b %Y - %I:%M:%S %p");
|
||||
|
||||
#:########################################################################################:#
|
||||
# TEXT SENSOR COMPONENT:
|
||||
# https://esphome.io/components/text_sensor/
|
||||
#:########################################################################################:#
|
||||
text_sensor:
|
||||
# Creates a sensor showing when the device was last restarted
|
||||
# Shows when the device was last restarted, based on the first successful SNTP sync.
|
||||
- platform: template
|
||||
name: "Time: Last Restart"
|
||||
id: device_last_restart
|
||||
icon: mdi:clock
|
||||
entity_category: diagnostic
|
||||
#device_class: timestamp
|
||||
update_interval: never
|
||||
|
||||
# Shows the current SNTP time if valid, otherwise the internal fallback time.
|
||||
- platform: template
|
||||
name: "Time: Internal Time"
|
||||
id: time_text
|
||||
update_interval: "1min"
|
||||
icon: mdi:clock-outline
|
||||
update_interval: 1min
|
||||
entity_category: diagnostic
|
||||
lambda: |-
|
||||
// If SNTP time is valid, show real time/date.
|
||||
if (id(sntp_time).now().is_valid()) {
|
||||
auto t = id(sntp_time).now().strftime("%H:%M:%S - %d-%m-%Y");
|
||||
return { t };
|
||||
}
|
||||
|
||||
// Fallback: show internal clock based on current_mins (minutes from midnight).
|
||||
int mins = id(current_mins);
|
||||
if (mins < 0) mins = 0;
|
||||
if (mins >= 1440) mins = mins % 1440;
|
||||
@@ -110,8 +135,16 @@ text_sensor:
|
||||
snprintf(buff, sizeof(buff), "%02d:%02d (fallback)", hour, minute);
|
||||
return { std::string(buff) };
|
||||
|
||||
# Shows whether the device is using SNTP or the fallback clock.
|
||||
- platform: template
|
||||
name: "Time: Sync Status"
|
||||
id: time_sync
|
||||
update_interval: "1min"
|
||||
icon: mdi:clock-check-outline
|
||||
update_interval: 1min
|
||||
entity_category: diagnostic
|
||||
lambda: |-
|
||||
if (id(sntp_time).now().is_valid()) {
|
||||
return { std::string("SNTP clock synced") };
|
||||
}
|
||||
|
||||
return { std::string("Using fallback internal clock") };
|
||||
@@ -0,0 +1,818 @@
|
||||
#:########################################################################################:#
|
||||
# TITLE: LED MATRIX 1
|
||||
# zorruno.com layout v1.1 2026
|
||||
# ESP32-C3 SuperMini MAX7219 LED matrix clock and scroll display.
|
||||
# Original Project Reference https://github.com/RealDeco/matrixclock-esphome
|
||||
#:########################################################################################:#
|
||||
# REPO:
|
||||
# https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-ledmatrix1.yaml
|
||||
#:########################################################################################:#
|
||||
# VERSIONS:
|
||||
# V1.1 2026-05-23 Updated yaml to zorruno layout V1.1, cleaned comments, fixed SNTP time IDs,
|
||||
# added current_mins fallback display, removed unused MQTT topic, and fixed
|
||||
# blank scroll handling.
|
||||
# V1.0 2026-05-23 Initial Version
|
||||
#:########################################################################################:#
|
||||
# HARDWARE:
|
||||
# - ESP32-C3 SuperMini.
|
||||
# - MAX7219 4-chip LED matrix display, typically 32 x 8 pixels.
|
||||
# - SPI wiring configured below:
|
||||
# - MOSI: GPIO8
|
||||
# - CS: GPIO9
|
||||
# - SCK: GPIO10
|
||||
# - Power note: 4 MAX7219 modules may need a suitable external 5 V supply.
|
||||
# - Keep ESP32-C3 GND and matrix power supply GND connected together.
|
||||
#:########################################################################################:#
|
||||
# FONTS:
|
||||
# Dragon Font: https://www.freebestfonts.com/eight-bit-dragon-font
|
||||
# 5x8 Font: https://developer.lasec.com.mx/armando/rpi-rgb-led-matrix/-/blob/master/fonts/5x8.bdf
|
||||
#:########################################################################################:#
|
||||
# OPERATION NOTES:
|
||||
# - Displays the current time from common/sntp_common.yaml using id(sntp_time).
|
||||
# - If SNTP is invalid, the display falls back to id(current_mins) from common/sntp_common.yaml.
|
||||
# - 12h/24h display mode is selectable from Home Assistant or MQTT.
|
||||
# - Display brightness is exposed as a Home Assistant light entity.
|
||||
# - Brightness accepts values 0..15 where 0 turns the display off and 1..15 sets intensity.
|
||||
# - Scroll Text is exposed as a Home Assistant text entity and clears itself after use.
|
||||
# - Before any scroll starts, the clock slides down and off the display.
|
||||
# - After scroll ends, the selected re-entry effect runs: Slide up, Slide down, or Pixel fall.
|
||||
# - Pixel fall hides the clock until the effect finishes, avoiding a clock-under-particles look.
|
||||
# - Scroll speed is adjustable using the Scroll Delay number entity.
|
||||
#:########################################################################################:#
|
||||
# MQTT COMMANDS:
|
||||
# - ${mqtt_command_topic}/scroll : Text payload to scroll once across the display.
|
||||
# - ${mqtt_command_topic}/mode : Payload 12 or 24 to select clock format.
|
||||
# - ${mqtt_command_topic}/bright : Payload 0 turns display off, 1-15 sets brightness.
|
||||
# - ${mqtt_status_topic}/status : Publishes online/offline status.
|
||||
#:########################################################################################:#
|
||||
# OFFLINE NOTES:
|
||||
# a) Home Assistant offline, but WiFi/network and MQTT online:
|
||||
# - Clock display should continue using SNTP if the NTP servers are reachable.
|
||||
# - MQTT scroll, brightness, and 12h/24h mode commands should still work.
|
||||
#
|
||||
# b) MQTT offline, but WiFi/network and Home Assistant API online:
|
||||
# - Home Assistant text, light, number, and select entities should still work.
|
||||
# - Clock display should continue using SNTP if the NTP servers are reachable.
|
||||
#
|
||||
# c) Entire WiFi/network offline:
|
||||
# - SNTP will not be available after boot.
|
||||
# - Clock display will use the current_mins fallback from common/sntp_common.yaml.
|
||||
# - Accurate time is needed for the clock, so fallback time will drift.
|
||||
# - For a rough reset, power-cycle the device at 12:00 noon.
|
||||
# - Home Assistant and MQTT controls will not be available while offline.
|
||||
#:########################################################################################:#
|
||||
|
||||
#:########################################################################################:#
|
||||
# SUBSTITUTIONS: Specific device variable substitutions
|
||||
# If NOT using a secrets file, just replace these with the passwords etc in quotes.
|
||||
#:########################################################################################:#
|
||||
substitutions:
|
||||
# Device Naming
|
||||
device_name: "esp-ledmatrix1"
|
||||
friendly_name: "LED Matrix Display"
|
||||
description_comment: "LED Matrix Display (Layout V1.1)"
|
||||
device_area: "Lounge" # Allows ESP device to be automatically linked to an Area in Home Assistant.
|
||||
|
||||
# Project Naming
|
||||
project_name: "Generic.ESP32 Supermini"
|
||||
project_version: "v1.1"
|
||||
|
||||
# Passwords & Secrets
|
||||
api_key: !secret esp-api_key
|
||||
ota_pass: !secret esp-ota_pass
|
||||
static_ip_address: !secret esp-ledmatrix1_ip # Substitutions cannot be used inside secret names.
|
||||
mqtt_command_main_topic: !secret mqtt_command_main_topic
|
||||
mqtt_status_main_topic: !secret mqtt_status_main_topic
|
||||
|
||||
# If changing IP addresses, update current_ip_address here, otherwise it remains static_ip_address.
|
||||
# Do not forget to switch it back when the address change is complete.
|
||||
current_ip_address: ${static_ip_address}
|
||||
|
||||
# MQTT LOCAL Controls
|
||||
mqtt_device_name: "ledmatrix1"
|
||||
mqtt_command_topic: "${mqtt_command_main_topic}/${mqtt_device_name}"
|
||||
mqtt_status_topic: "${mqtt_status_main_topic}/${mqtt_device_name}"
|
||||
|
||||
# Device Settings
|
||||
log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG, VERBOSE, VERY_VERBOSE
|
||||
update_interval: "60s"
|
||||
|
||||
# Matrix Display Settings
|
||||
pin_mosi: GPIO8
|
||||
pin_cs: GPIO9
|
||||
pin_sck: GPIO10
|
||||
num_chips: "4"
|
||||
scroll_delay_ms: "15" # ms between scroll steps
|
||||
y_offset: "0"
|
||||
y_scroll_offset: "0"
|
||||
|
||||
#:########################################################################################:#
|
||||
# PACKAGES: Included Common Packages
|
||||
# https://esphome.io/components/packages.html
|
||||
#:########################################################################################:#
|
||||
packages:
|
||||
#### WIFI, Network (Static/DHCP/IPV6 etc), Fallback AP, Safemode ####
|
||||
common_wifi: !include
|
||||
file: common/network_common.yaml
|
||||
vars:
|
||||
local_device_name: "${device_name}"
|
||||
local_static_ip_address: "${static_ip_address}"
|
||||
local_ota_pass: "${ota_pass}"
|
||||
local_current_ip_address: "${current_ip_address}"
|
||||
|
||||
#### HOME ASSISTANT API (choose encryption or no encryption options) ####
|
||||
common_api: !include
|
||||
file: common/api_common.yaml
|
||||
#file: common/api_common_noencryption.yaml
|
||||
vars:
|
||||
local_api_key: "${api_key}"
|
||||
|
||||
#### MQTT ####
|
||||
common_mqtt: !include
|
||||
file: common/mqtt_common.yaml
|
||||
vars:
|
||||
local_device_name: "${device_name}"
|
||||
|
||||
#### WEB PORTAL ####
|
||||
common_webportal: !include common/webportal_common.yaml
|
||||
|
||||
#### SNTP (Needed for the clock display) ####
|
||||
common_sntp: !include common/sntp_common.yaml
|
||||
|
||||
#### DIAGNOSTICS Sensors ####
|
||||
diag_basic: !include common/include_basic_diag_sensors.yaml
|
||||
#diag_more: !include common/include_more_diag_sensors.yaml
|
||||
#diag_debug: !include common/include_debug_diag_sensors.yaml
|
||||
#diag_resetcount: !include common/include_resetcount_diag_sensors.yaml
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESPHOME:
|
||||
# https://esphome.io/components/esphome.html
|
||||
#:########################################################################################:#
|
||||
esphome:
|
||||
name: "${device_name}"
|
||||
friendly_name: "${friendly_name}"
|
||||
comment: "${description_comment}" # Appears on the ESPHome page in Home Assistant.
|
||||
area: "${device_area}"
|
||||
project:
|
||||
name: "${project_name}"
|
||||
version: "${project_version}"
|
||||
on_boot:
|
||||
priority: 600
|
||||
then:
|
||||
# Ensure Home Assistant shows the text box as empty rather than unknown.
|
||||
- delay: 500ms
|
||||
- lambda: |-
|
||||
id(ha_scroll_text).publish_state("");
|
||||
- component.update: matrix
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESP PLATFORM AND FRAMEWORK:
|
||||
# https://esphome.io/components/esp32/
|
||||
#:########################################################################################:#
|
||||
esp32:
|
||||
variant: esp32c3
|
||||
framework:
|
||||
type: esp-idf
|
||||
version: recommended
|
||||
|
||||
#:########################################################################################:#
|
||||
# LOGGER: ESPHome Logging Enable
|
||||
# https://esphome.io/components/logger.html
|
||||
#:########################################################################################:#
|
||||
logger:
|
||||
level: "${log_level}" # INFO suggested, or DEBUG for testing.
|
||||
#baud_rate: 0 # Set to 0 for no UART logging if UART is used for another device.
|
||||
#esp8266_store_log_strings_in_flash: false
|
||||
#tx_buffer_size: 64
|
||||
|
||||
#:########################################################################################:#
|
||||
# GLOBALS:
|
||||
# https://esphome.io/components/globals.html
|
||||
#:########################################################################################:#
|
||||
globals:
|
||||
# Text currently being scrolled across the matrix.
|
||||
- id: scroll_text
|
||||
type: std::string
|
||||
initial_value: ""
|
||||
|
||||
# Current X position of the scrolling text.
|
||||
- id: scroll_x
|
||||
type: int
|
||||
initial_value: '0'
|
||||
|
||||
# True while a scroll message is active.
|
||||
- id: scrolling
|
||||
type: bool
|
||||
initial_value: 'false'
|
||||
|
||||
# False = 24h mode, true = 12h mode.
|
||||
- id: use_12h_mode
|
||||
type: bool
|
||||
restore_value: true
|
||||
initial_value: 'false'
|
||||
|
||||
# Runtime scroll delay, controlled by the Scroll Delay number entity.
|
||||
- id: scroll_delay_runtime
|
||||
type: int
|
||||
restore_value: true
|
||||
initial_value: '${scroll_delay_ms}'
|
||||
|
||||
# MAX7219 intensity: 0=OFF, 1..15=ON. Driven by the HA light entity.
|
||||
- id: matrix_intensity
|
||||
type: int
|
||||
restore_value: false
|
||||
initial_value: '2'
|
||||
|
||||
# Brightness sync loop protection for HA light <-> MQTT brightness updates.
|
||||
- id: suppress_mqtt_bright_sync
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: 'false'
|
||||
|
||||
- id: target_mqtt_bright
|
||||
type: int
|
||||
restore_value: false
|
||||
initial_value: '-1'
|
||||
|
||||
- id: last_mqtt_bright
|
||||
type: int
|
||||
restore_value: false
|
||||
initial_value: '-1'
|
||||
|
||||
# Re-entry effect after scrolling: 0=Slide up, 1=Slide down, 2=Pixel fall.
|
||||
- id: transition_mode
|
||||
type: int
|
||||
restore_value: true
|
||||
initial_value: '0'
|
||||
|
||||
# Slide transition state.
|
||||
- id: transition_active
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: 'false'
|
||||
|
||||
- id: transition_y
|
||||
type: int
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
# Pixel-fall transition state.
|
||||
- id: pixel_fall_active
|
||||
type: bool
|
||||
restore_value: false
|
||||
initial_value: 'false'
|
||||
|
||||
- id: pixel_fall_gen
|
||||
type: int
|
||||
restore_value: false
|
||||
initial_value: '0'
|
||||
|
||||
#:########################################################################################:#
|
||||
# FONT COMPONENT:
|
||||
# https://esphome.io/components/font/
|
||||
#:########################################################################################:#
|
||||
font:
|
||||
# Clock digits. Keep glyphs limited to reduce firmware size.
|
||||
- file: "fonts/Eight-Bit-Dragon.ttf"
|
||||
id: digit5
|
||||
size: 8
|
||||
glyphs: ["0123456789: -"]
|
||||
|
||||
# General 5x8 font for scroll text.
|
||||
- file: "fonts/5x8.bdf"
|
||||
id: font5x8
|
||||
size: 8
|
||||
|
||||
#:########################################################################################:#
|
||||
# SPI COMPONENT:
|
||||
# https://esphome.io/components/spi.html
|
||||
#:########################################################################################:#
|
||||
spi:
|
||||
clk_pin: ${pin_sck}
|
||||
mosi_pin: ${pin_mosi}
|
||||
|
||||
#:########################################################################################:#
|
||||
# MQTT: Device-specific MQTT command triggers
|
||||
# This adds device-specific MQTT command triggers to the common MQTT configuration.
|
||||
#:########################################################################################:#
|
||||
mqtt:
|
||||
discovery: false
|
||||
birth_message:
|
||||
topic: "${mqtt_status_topic}/status"
|
||||
payload: "online"
|
||||
qos: 0
|
||||
retain: true
|
||||
will_message:
|
||||
topic: "${mqtt_status_topic}/status"
|
||||
payload: "offline"
|
||||
qos: 0
|
||||
retain: true
|
||||
on_message:
|
||||
# Scroll a text payload once across the matrix.
|
||||
- topic: "${mqtt_command_topic}/scroll"
|
||||
then:
|
||||
- lambda: |-
|
||||
std::string s = x.c_str();
|
||||
s.erase(std::remove(s.begin(), s.end(), '\r'), s.end());
|
||||
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
|
||||
s.erase(std::remove_if(s.begin(), s.end(),
|
||||
[](unsigned char c){ return c < 0x20; }), s.end());
|
||||
|
||||
// Ignore empty MQTT scroll commands completely.
|
||||
if (s.empty()) return;
|
||||
|
||||
id(scroll_text) = s;
|
||||
id(scroll_x) = ${num_chips} * 8;
|
||||
id(start_scroll_sequence).execute();
|
||||
|
||||
# Set 12h or 24h clock mode from MQTT.
|
||||
- topic: "${mqtt_command_topic}/mode"
|
||||
then:
|
||||
- lambda: |-
|
||||
if (x == "12") {
|
||||
id(use_12h_mode) = true;
|
||||
} else if (x == "24") {
|
||||
id(use_12h_mode) = false;
|
||||
}
|
||||
- component.update: clock_format_select
|
||||
- component.update: matrix
|
||||
|
||||
# Brightness from MQTT. 0=OFF, 1..15=ON brightness level.
|
||||
- topic: "${mqtt_command_topic}/bright"
|
||||
then:
|
||||
- lambda: |-
|
||||
std::string s = x.c_str();
|
||||
s.erase(std::remove_if(s.begin(), s.end(),
|
||||
[](unsigned char c){ return c < 0x20 || c == 0x7F; }), s.end());
|
||||
s.erase(s.begin(), std::find_if(s.begin(), s.end(),
|
||||
[](unsigned char ch){ return !std::isspace(ch); }));
|
||||
s.erase(std::find_if(s.rbegin(), s.rend(),
|
||||
[](unsigned char ch){ return !std::isspace(ch); }).base(), s.end());
|
||||
|
||||
if (s.empty() || !std::all_of(s.begin(), s.end(),
|
||||
[](unsigned char c){ return std::isdigit(c); })) return;
|
||||
|
||||
int v = atoi(s.c_str());
|
||||
if (v < 0) v = 0;
|
||||
if (v > 15) v = 15;
|
||||
|
||||
id(suppress_mqtt_bright_sync) = true;
|
||||
|
||||
if (v == 0) {
|
||||
id(matrix_light).turn_off().perform();
|
||||
} else {
|
||||
auto call = id(matrix_light).turn_on();
|
||||
call.set_brightness((float) v / 15.0f);
|
||||
call.perform();
|
||||
}
|
||||
|
||||
id(last_mqtt_bright) = v;
|
||||
id(suppress_mqtt_bright_sync) = false;
|
||||
|
||||
#:########################################################################################:#
|
||||
# TEXT COMPONENT:
|
||||
# https://esphome.io/components/text/template/
|
||||
#:########################################################################################:#
|
||||
text:
|
||||
- platform: template
|
||||
id: ha_scroll_text
|
||||
name: "${friendly_name} Scroll Text"
|
||||
icon: "mdi:message-text-outline"
|
||||
mode: text
|
||||
max_length: 80
|
||||
optimistic: false
|
||||
set_action:
|
||||
- lambda: |-
|
||||
std::string s = x.c_str();
|
||||
|
||||
s.erase(std::remove(s.begin(), s.end(), '\r'), s.end());
|
||||
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
|
||||
s.erase(std::remove_if(s.begin(), s.end(),
|
||||
[](unsigned char c){ return c < 0x20; }), s.end());
|
||||
|
||||
// Publish the cleaned text so the HA UI updates immediately.
|
||||
id(ha_scroll_text).publish_state(s.c_str());
|
||||
|
||||
// Empty text only clears the entity. It should not start a scroll.
|
||||
if (s.empty()) return;
|
||||
|
||||
id(scroll_text) = s;
|
||||
id(scroll_x) = ${num_chips} * 8;
|
||||
id(start_scroll_sequence).execute();
|
||||
id(clear_scroll_text_box).execute();
|
||||
|
||||
#:########################################################################################:#
|
||||
# NUMBER COMPONENT:
|
||||
# https://esphome.io/components/number/template/
|
||||
#:########################################################################################:#
|
||||
number:
|
||||
- platform: template
|
||||
id: scroll_delay_number
|
||||
name: "${friendly_name} Scroll Delay"
|
||||
icon: "mdi:timer-outline"
|
||||
unit_of_measurement: "ms"
|
||||
min_value: 1
|
||||
max_value: 100
|
||||
step: 1
|
||||
restore_value: true
|
||||
initial_value: ${scroll_delay_ms}
|
||||
optimistic: true
|
||||
set_action:
|
||||
- lambda: |-
|
||||
id(scroll_delay_runtime) = (int) x;
|
||||
|
||||
#:########################################################################################:#
|
||||
# OUTPUT COMPONENT:
|
||||
# https://esphome.io/components/output/
|
||||
#:########################################################################################:#
|
||||
output:
|
||||
# Template output lets the HA light slider control MAX7219 intensity.
|
||||
- platform: template
|
||||
id: matrix_brightness_out
|
||||
type: float
|
||||
write_action:
|
||||
- lambda: |-
|
||||
int pub = 0;
|
||||
|
||||
if (state <= 0.001f) {
|
||||
id(matrix_intensity) = 0;
|
||||
id(matrix).turn_on_off(false);
|
||||
pub = 0;
|
||||
} else {
|
||||
int v = (int) lroundf(state * 15.0f);
|
||||
if (v < 1) v = 1;
|
||||
if (v > 15) v = 15;
|
||||
|
||||
id(matrix_intensity) = v;
|
||||
id(matrix).turn_on_off(true);
|
||||
pub = v;
|
||||
}
|
||||
|
||||
id(target_mqtt_bright) = pub;
|
||||
|
||||
- component.update: matrix
|
||||
|
||||
# Publish brightness back to MQTT unless this update came from MQTT.
|
||||
- if:
|
||||
condition:
|
||||
lambda: |-
|
||||
return !id(suppress_mqtt_bright_sync)
|
||||
&& (id(target_mqtt_bright) != id(last_mqtt_bright));
|
||||
then:
|
||||
- mqtt.publish:
|
||||
topic: "${mqtt_command_topic}/bright"
|
||||
payload: !lambda |-
|
||||
char buf[6];
|
||||
snprintf(buf, sizeof(buf), "%d", id(target_mqtt_bright));
|
||||
return std::string(buf);
|
||||
qos: 0
|
||||
retain: true
|
||||
- lambda: |-
|
||||
id(last_mqtt_bright) = id(target_mqtt_bright);
|
||||
|
||||
#:########################################################################################:#
|
||||
# LIGHT COMPONENT:
|
||||
# https://esphome.io/components/light/monochromatic/
|
||||
#:########################################################################################:#
|
||||
light:
|
||||
- platform: monochromatic
|
||||
id: matrix_light
|
||||
name: "${friendly_name} Display"
|
||||
icon: "mdi:brightness-6"
|
||||
output: matrix_brightness_out
|
||||
gamma_correct: 1.0
|
||||
default_transition_length: 0s
|
||||
restore_mode: RESTORE_DEFAULT_ON
|
||||
|
||||
#:########################################################################################:#
|
||||
# SELECT COMPONENT:
|
||||
# https://esphome.io/components/select/template/
|
||||
#:########################################################################################:#
|
||||
select:
|
||||
- platform: template
|
||||
id: clock_format_select
|
||||
name: "${friendly_name} Clock Format"
|
||||
icon: "mdi:clock-time-three-outline"
|
||||
options:
|
||||
- "24"
|
||||
- "12"
|
||||
lambda: |-
|
||||
return esphome::optional<std::string>(std::string(id(use_12h_mode) ? "12" : "24"));
|
||||
set_action:
|
||||
- lambda: |-
|
||||
id(use_12h_mode) = (x == "12");
|
||||
- component.update: clock_format_select
|
||||
- component.update: matrix
|
||||
|
||||
- platform: template
|
||||
id: transition_select
|
||||
name: "${friendly_name} Transition Effect"
|
||||
icon: "mdi:transition"
|
||||
options:
|
||||
- "Slide up"
|
||||
- "Slide down"
|
||||
- "Pixel fall"
|
||||
lambda: |-
|
||||
if (id(transition_mode) == 2) return std::string("Pixel fall");
|
||||
if (id(transition_mode) == 1) return std::string("Slide down");
|
||||
return std::string("Slide up");
|
||||
set_action:
|
||||
- lambda: |-
|
||||
if (x == "Pixel fall") id(transition_mode) = 2;
|
||||
else if (x == "Slide down") id(transition_mode) = 1;
|
||||
else id(transition_mode) = 0;
|
||||
- component.update: transition_select
|
||||
|
||||
#:########################################################################################:#
|
||||
# SCRIPT COMPONENT:
|
||||
# https://esphome.io/components/script.html
|
||||
#:########################################################################################:#
|
||||
script:
|
||||
# Clear the HA text box shortly after a scroll request has been accepted.
|
||||
- id: clear_scroll_text_box
|
||||
mode: restart
|
||||
then:
|
||||
- delay: 400ms
|
||||
- lambda: |-
|
||||
id(ha_scroll_text).publish_state("");
|
||||
|
||||
# Sequence: exit slide-down -> scroll -> selected re-entry.
|
||||
- id: start_scroll_sequence
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
id(scrolling) = false;
|
||||
id(pixel_fall_active) = false;
|
||||
- component.update: matrix
|
||||
- script.execute: clock_exit_down
|
||||
- script.wait: clock_exit_down
|
||||
- lambda: |-
|
||||
id(scrolling) = true;
|
||||
- script.execute: do_scroll
|
||||
|
||||
# Scroll the stored text until it has moved fully off the left side.
|
||||
- id: do_scroll
|
||||
mode: restart
|
||||
then:
|
||||
- while:
|
||||
condition:
|
||||
lambda: |-
|
||||
return id(scrolling);
|
||||
then:
|
||||
- lambda: |-
|
||||
id(scroll_x) -= 1;
|
||||
const int end_limit = - (int(id(scroll_text).length()) * 6);
|
||||
if (id(scroll_x) < end_limit) {
|
||||
id(scrolling) = false;
|
||||
|
||||
if (id(transition_mode) == 1) {
|
||||
id(clock_slide_down_entry).execute();
|
||||
} else if (id(transition_mode) == 2) {
|
||||
id(clock_pixel_fall_transition).execute();
|
||||
} else {
|
||||
id(clock_slide_up_entry).execute();
|
||||
}
|
||||
}
|
||||
- component.update: matrix
|
||||
- delay: !lambda |-
|
||||
return (uint32_t) id(scroll_delay_runtime);
|
||||
|
||||
# Exit: slide clock down off-screen and hold it there to prevent a one-frame flash.
|
||||
- id: clock_exit_down
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_active) = true;
|
||||
id(transition_y) = ${y_offset};
|
||||
- repeat:
|
||||
count: 9
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_y) += 1;
|
||||
- component.update: matrix
|
||||
- delay: 45ms
|
||||
- lambda: |-
|
||||
id(transition_active) = true;
|
||||
id(transition_y) = 8;
|
||||
- component.update: matrix
|
||||
|
||||
# Re-entry: clock slides down into place from above.
|
||||
- id: clock_slide_down_entry
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_active) = true;
|
||||
id(transition_y) = -8;
|
||||
- repeat:
|
||||
count: 9
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_y) += 1;
|
||||
- component.update: matrix
|
||||
- delay: 60ms
|
||||
- lambda: |-
|
||||
id(transition_active) = false;
|
||||
id(transition_y) = ${y_offset};
|
||||
- component.update: matrix
|
||||
|
||||
# Re-entry: clock slides up into place from below.
|
||||
- id: clock_slide_up_entry
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_active) = true;
|
||||
id(transition_y) = 8;
|
||||
- repeat:
|
||||
count: 9
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_y) -= 1;
|
||||
- component.update: matrix
|
||||
- delay: 60ms
|
||||
- lambda: |-
|
||||
id(transition_active) = false;
|
||||
id(transition_y) = ${y_offset};
|
||||
- component.update: matrix
|
||||
|
||||
# Re-entry: falling pixels effect before the clock redraws.
|
||||
- id: clock_pixel_fall_transition
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
id(transition_active) = false;
|
||||
id(transition_y) = ${y_offset};
|
||||
id(pixel_fall_active) = true;
|
||||
id(pixel_fall_gen) += 1;
|
||||
- repeat:
|
||||
count: 18
|
||||
then:
|
||||
- component.update: matrix
|
||||
- delay: 55ms
|
||||
- lambda: |-
|
||||
id(pixel_fall_active) = false;
|
||||
id(transition_active) = false;
|
||||
id(transition_y) = ${y_offset};
|
||||
- component.update: matrix
|
||||
|
||||
#:########################################################################################:#
|
||||
# DISPLAY COMPONENT:
|
||||
# https://esphome.io/components/display/max7219digit/
|
||||
#:########################################################################################:#
|
||||
display:
|
||||
- platform: max7219digit
|
||||
id: matrix
|
||||
cs_pin: ${pin_cs}
|
||||
num_chips: ${num_chips}
|
||||
intensity: 2
|
||||
update_interval: 500ms
|
||||
rotate_chip: 0
|
||||
reverse_enable: false
|
||||
flip_x: false
|
||||
|
||||
lambda: |-
|
||||
// Apply brightness only when it changes to reduce flicker.
|
||||
static int last_brightness = -1;
|
||||
if (id(matrix_intensity) != last_brightness) {
|
||||
if (id(matrix_intensity) > 0) {
|
||||
int v = id(matrix_intensity);
|
||||
if (v > 15) v = 15;
|
||||
it.intensity((uint8_t) v);
|
||||
}
|
||||
last_brightness = id(matrix_intensity);
|
||||
}
|
||||
|
||||
if (id(matrix_intensity) == 0) return;
|
||||
|
||||
it.clear();
|
||||
|
||||
// Scroll text has priority over clock display.
|
||||
if (id(scrolling)) {
|
||||
it.print(id(scroll_x), ${y_scroll_offset}, id(font5x8), id(scroll_text).c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
// Pixel fall shows only particles while active.
|
||||
if (id(pixel_fall_active)) {
|
||||
static int last_gen = -1;
|
||||
static int px[24];
|
||||
static int py[24];
|
||||
static uint32_t rng = 1;
|
||||
|
||||
auto rand_u32 = [&]() -> uint32_t {
|
||||
rng = rng * 1664525u + 1013904223u;
|
||||
return rng;
|
||||
};
|
||||
|
||||
if (last_gen != id(pixel_fall_gen)) {
|
||||
last_gen = id(pixel_fall_gen);
|
||||
rng = 0xA5A5A5A5u ^ (uint32_t) id(pixel_fall_gen);
|
||||
for (int i = 0; i < 24; i++) {
|
||||
px[i] = (int)(rand_u32() % 32);
|
||||
py[i] = - (int)(rand_u32() % 16);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 24; i++) {
|
||||
int spd = 1 + (int)(rand_u32() % 2);
|
||||
py[i] += spd;
|
||||
|
||||
if (py[i] > 10) {
|
||||
px[i] = (int)(rand_u32() % 32);
|
||||
py[i] = - (int)(rand_u32() % 10);
|
||||
}
|
||||
|
||||
for (int t = 0; t < 2; t++) {
|
||||
int yy = py[i] - t;
|
||||
int xx = px[i];
|
||||
if (xx >= 0 && xx <= 31 && yy >= 0 && yy <= 7) {
|
||||
it.draw_pixel_at(xx, yy, Color::WHITE);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Prefer real SNTP time. Fall back to current_mins from common/sntp_common.yaml.
|
||||
auto now = id(sntp_time).now();
|
||||
bool time_valid = now.is_valid();
|
||||
|
||||
int raw_hour = 0;
|
||||
int minute_to_show = 0;
|
||||
int second_to_show = 0;
|
||||
|
||||
if (time_valid) {
|
||||
raw_hour = now.hour;
|
||||
minute_to_show = now.minute;
|
||||
second_to_show = now.second;
|
||||
} else {
|
||||
int mins = id(current_mins);
|
||||
if (mins < 0) mins = 0;
|
||||
if (mins >= 1440) mins = mins % 1440;
|
||||
|
||||
raw_hour = mins / 60;
|
||||
minute_to_show = mins % 60;
|
||||
second_to_show = 0;
|
||||
}
|
||||
|
||||
int hour_to_show = raw_hour;
|
||||
if (id(use_12h_mode)) {
|
||||
hour_to_show = raw_hour % 12;
|
||||
if (hour_to_show == 0) hour_to_show = 12;
|
||||
}
|
||||
|
||||
char hh[3], mm[3];
|
||||
snprintf(hh, sizeof(hh), "%02d", hour_to_show);
|
||||
snprintf(mm, sizeof(mm), "%02d", minute_to_show);
|
||||
|
||||
const int x_h1 = 3;
|
||||
const int x_h2 = 9;
|
||||
const int x_m1 = 17;
|
||||
const int x_m2 = 23;
|
||||
|
||||
const int y = (id(transition_active) ? id(transition_y) : ${y_offset});
|
||||
|
||||
char ch[2] = { hh[0], 0 };
|
||||
it.print(x_h1, y, id(digit5), ch);
|
||||
ch[0] = hh[1];
|
||||
it.print(x_h2, y, id(digit5), ch);
|
||||
|
||||
ch[0] = mm[0];
|
||||
it.print(x_m1, y, id(digit5), ch);
|
||||
ch[0] = mm[1];
|
||||
it.print(x_m2, y, id(digit5), ch);
|
||||
|
||||
// In 12h mode, draw a tiny A or P indicator at the far right.
|
||||
if (id(use_12h_mode)) {
|
||||
const bool is_pm = raw_hour >= 12;
|
||||
|
||||
const uint8_t A_rows[4] = { 2, 5, 7, 5 };
|
||||
const uint8_t P_rows[4] = { 6, 5, 6, 4 };
|
||||
const uint8_t *L = is_pm ? P_rows : A_rows;
|
||||
|
||||
const int x_ampm = 29;
|
||||
const int y_ampm = y + 4;
|
||||
|
||||
for (int r = 0; r < 4; r++) {
|
||||
uint8_t row = L[r];
|
||||
for (int c = 0; c < 3; c++) {
|
||||
if (row & (1 << (2 - c))) {
|
||||
int xx = x_ampm + c;
|
||||
int yy = y_ampm + r;
|
||||
if (yy >= 0 && yy <= 7 && xx >= 0 && xx <= 31) {
|
||||
it.draw_pixel_at(xx, yy, Color::WHITE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Blink the colon when SNTP is valid. Keep it solid during fallback time.
|
||||
const bool colon_on = time_valid ? ((second_to_show % 2) == 0) : true;
|
||||
if (colon_on) {
|
||||
const int x_col = (x_h2 + x_m1) / 2 + 2;
|
||||
int y1 = y + 2;
|
||||
int y2 = y + 5;
|
||||
if (y1 >= 0 && y1 <= 7) it.draw_pixel_at(x_col, y1, Color::WHITE);
|
||||
if (y2 >= 0 && y2 <= 7) it.draw_pixel_at(x_col, y2, Color::WHITE);
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
#:########################################################################################:#
|
||||
# TITLE: MASTER BEDROOM NSPANEL 1
|
||||
# zorruno.com layout v1.1 2026
|
||||
#:########################################################################################:#
|
||||
# REPO:
|
||||
#
|
||||
#:########################################################################################:#
|
||||
# VERSIONS:
|
||||
# V1.0 2026-05-16 Initial version
|
||||
#:########################################################################################:#
|
||||
# HARDWARE:
|
||||
# - Sonoff NS Panel
|
||||
#:########################################################################################:#
|
||||
# OPERATION NOTES:
|
||||
# -
|
||||
#:########################################################################################:#
|
||||
# OFFLINE NOTES:
|
||||
#
|
||||
#:########################################################################################:#
|
||||
|
||||
#:########################################################################################:#
|
||||
# SUBSTITUTIONS: Specific device variable substitutions
|
||||
# If NOT using a secrets file, just replace these with the passwords etc (in quotes)
|
||||
#:########################################################################################:#
|
||||
substitutions:
|
||||
# Device Naming
|
||||
device_name: "esp-nspanel1masterbdrm"
|
||||
friendly_name: "Master Bedroom NSPanel Touchscreen"
|
||||
description_comment: "Master Bedroom NSPanel Touchscreen"
|
||||
device_area: "Master Bedroom" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant.
|
||||
|
||||
# Removed as the remote package will pull this in correctly for the blueprint
|
||||
# Project Naming
|
||||
#project_name: "Lounge NSPanel Touchscreen.Sonoff NS Panel"
|
||||
#project_version: "v1.0"
|
||||
|
||||
# Passwords & Secrets (unfortunately you can't use substitutions inside secrets names)
|
||||
api_key: !secret esp-api_key
|
||||
ota_pass: !secret esp-ota_pass
|
||||
ota_password: "${ota_pass}" #this is for NSPanel Only as a workaround
|
||||
static_ip_address: !secret esp-nspanel1masterbdrm_ip
|
||||
|
||||
# If we are changing IP addresses, you must update the current IP address here, otherwise it remains
|
||||
# Don't forget to switch it back when changed.
|
||||
current_ip_address: ${static_ip_address}
|
||||
|
||||
# Device Settings
|
||||
log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE
|
||||
update_interval: "60s" # update time for general sensors etc
|
||||
|
||||
## NSPanel Specifics
|
||||
upload_tft_automatically: true
|
||||
boot_sound: false
|
||||
|
||||
#:########################################################################################:#
|
||||
# PACKAGES: Included Common Packages
|
||||
# https://esphome.io/components/packages.html
|
||||
#:########################################################################################:#
|
||||
packages:
|
||||
#### WIFI, Network (Static/DHCP/IPV6 etc), Fallback AP, Safemode ####
|
||||
common_wifi: !include
|
||||
file: common/network_common_esp32.yaml
|
||||
vars:
|
||||
local_device_name: "${device_name}"
|
||||
local_static_ip_address: "${static_ip_address}"
|
||||
local_ota_pass: "${ota_pass}"
|
||||
local_current_ip_address: "${current_ip_address}"
|
||||
|
||||
#### HOME ASSISTANT API (choose encryption or no encryption options) ####
|
||||
#common_api: !include
|
||||
# file: common/api_common.yaml
|
||||
# #file: common/api_common_noencryption.yaml
|
||||
# vars:
|
||||
# local_api_key: "${api_key}"
|
||||
|
||||
#### MQTT ####
|
||||
#common_mqtt: !include
|
||||
# file: common/mqtt_common.yaml
|
||||
# vars:
|
||||
# local_device_name: "${device_name}"
|
||||
|
||||
#### WEB PORTAL ####
|
||||
#common_webportal: !include common/webportal_common.yaml
|
||||
|
||||
#### SNTP (Only use if you want/need accurate timeclocks) ####
|
||||
#common_sntp: !include common/sntp_common.yaml
|
||||
|
||||
#### DIAGNOSTICS Sensors ####
|
||||
#diag_basic: !include common/include_basic_diag_sensors.yaml
|
||||
#diag_more: !include common/include_more_diag_sensors.yaml
|
||||
#diag_debug: !include common/include_debug_diag_sensors.yaml
|
||||
#diag_resetcount: !include common/include_resetcount_diag_sensors.yaml
|
||||
|
||||
# Core and optional configurations
|
||||
remote_package:
|
||||
url: https://github.com/edwardtfn/NSPanel-Easy
|
||||
ref: v2026.5.5
|
||||
refresh: 300s
|
||||
files:
|
||||
- nspanel_esphome.yaml # Basic package
|
||||
# Optional advanced and add-on configurations
|
||||
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||
# - esphome/nspanel_esphome_addon_cover.yaml
|
||||
# - esphome/nspanel_esphome_addon_display_light.yaml # Show the display as a light in Home Assistant
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESPHOME:
|
||||
# https://esphome.io/components/esphome.html
|
||||
#:########################################################################################:#
|
||||
esphome:
|
||||
name: "${device_name}"
|
||||
friendly_name: "${friendly_name}"
|
||||
comment: "${description_comment}" # appears on the esphome page in HA
|
||||
area: "${device_area}"
|
||||
min_version: 2024.6.0
|
||||
#project:
|
||||
# name: "${project_name}"
|
||||
# version: "${project_version}"
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESP PLATFORM AND FRAMEWORK:
|
||||
# https://esphome.io/components/esp32.html
|
||||
#:########################################################################################:#
|
||||
esp32:
|
||||
board: esp32dev
|
||||
framework:
|
||||
type: esp-idf # Suggested ESP-IDF framework
|
||||
version: recommended
|
||||
advanced:
|
||||
#minimum_chip_revision: "3.1" # This makes the binary slightly smaller
|
||||
sram1_as_iram: true
|
||||
|
||||
#:########################################################################################:#
|
||||
# LOGGING:
|
||||
# https://esphome.io/components/logger.html
|
||||
#:########################################################################################:#
|
||||
logger:
|
||||
level: "${log_level}"
|
||||
#baud_rate: 0 # set to 0 for no logging via UART if you want
|
||||
|
||||
#:########################################################################################:#
|
||||
# BLUETOOTH:
|
||||
# https://esphome.io/components/bluetooth_proxy.html
|
||||
# https://esphome.io/components/esp32_ble_tracker.html
|
||||
#:########################################################################################:#
|
||||
#bluetooth_proxy:
|
||||
# active: true
|
||||
|
||||
#esp32_ble_tracker:
|
||||
# scan_parameters:
|
||||
# # Defaults used so Bluetooth can co-exist with WiFi
|
||||
# active: true
|
||||
@@ -0,0 +1,316 @@
|
||||
#:########################################################################################:#
|
||||
# TITLE: LOUNGE NSPANEL 2
|
||||
# zorruno.com layout v1.1 2026
|
||||
#:########################################################################################:#
|
||||
# REPO:
|
||||
#
|
||||
#:########################################################################################:#
|
||||
# VERSIONS:
|
||||
# V1.0 2026-05-16 Initial version
|
||||
#:########################################################################################:#
|
||||
# HARDWARE:
|
||||
# - Sonoff NS Panel
|
||||
#:########################################################################################:#
|
||||
# OPERATION NOTES:
|
||||
# -
|
||||
#:########################################################################################:#
|
||||
# OFFLINE NOTES:
|
||||
#
|
||||
#:########################################################################################:#
|
||||
|
||||
#:########################################################################################:#
|
||||
# SUBSTITUTIONS: Specific device variable substitutions
|
||||
# If NOT using a secrets file, just replace these with the passwords etc (in quotes)
|
||||
#:########################################################################################:#
|
||||
substitutions:
|
||||
# Device Naming
|
||||
device_name: "esp-nspanel2lounge"
|
||||
friendly_name: "Lounge NSPanel Touchscreen"
|
||||
description_comment: "D1 Mini ESP32 outside entranceway with BT Proxy (Layout V1.1)"
|
||||
device_area: "Lounge" # Allows ESP device to be automatically linked to an 'Area' in Home Assistant.
|
||||
|
||||
# Removed as the remote package will pull this in correctly for the blueprint
|
||||
# Project Naming
|
||||
#project_name: "Lounge NSPanel Touchscreen.Sonoff NS Panel"
|
||||
#project_version: "v1.0"
|
||||
|
||||
# Passwords & Secrets (unfortunately you can't use substitutions inside secrets names)
|
||||
api_key: !secret esp-api_key
|
||||
ota_pass: !secret esp-ota_pass
|
||||
ota_password: "${ota_pass}" #this is for NSPanel Only as a workaround
|
||||
static_ip_address: !secret esp-nspanel2lounge_ip
|
||||
|
||||
# If we are changing IP addresses, you must update the current IP address here, otherwise it remains
|
||||
# Don't forget to switch it back when changed.
|
||||
current_ip_address: ${static_ip_address}
|
||||
|
||||
# Device Settings
|
||||
log_level: "INFO" # NONE, ERROR, WARN, INFO, DEBUG (Default), VERBOSE, VERY_VERBOSE
|
||||
update_interval: "60s" # update time for general sensors etc
|
||||
|
||||
## NSPanel Specifics
|
||||
upload_tft_automatically: true
|
||||
boot_sound: false
|
||||
|
||||
#:########################################################################################:#
|
||||
# PACKAGES: Included Common Packages
|
||||
# https://esphome.io/components/packages.html
|
||||
#:########################################################################################:#
|
||||
packages:
|
||||
#### WIFI, Network (Static/DHCP/IPV6 etc), Fallback AP, Safemode ####
|
||||
common_wifi: !include
|
||||
file: common/network_common_esp32.yaml
|
||||
vars:
|
||||
local_device_name: "${device_name}"
|
||||
local_static_ip_address: "${static_ip_address}"
|
||||
local_ota_pass: "${ota_pass}"
|
||||
local_current_ip_address: "${current_ip_address}"
|
||||
|
||||
#### HOME ASSISTANT API (choose encryption or no encryption options) ####
|
||||
#common_api: !include
|
||||
# file: common/api_common.yaml
|
||||
#file: common/api_common_noencryption.yaml
|
||||
# vars:
|
||||
# local_api_key: "${api_key}"
|
||||
|
||||
#### MQTT ####
|
||||
#common_mqtt: !include
|
||||
# file: common/mqtt_common.yaml
|
||||
# vars:
|
||||
# local_device_name: "${device_name}"
|
||||
|
||||
#### WEB PORTAL ####
|
||||
#common_webportal: !include common/webportal_common.yaml
|
||||
|
||||
#### SNTP (Only use if you want/need accurate timeclocks) ####
|
||||
#common_sntp: !include common/sntp_common.yaml
|
||||
|
||||
#### DIAGNOSTICS Sensors ####
|
||||
#diag_basic: !include common/include_basic_diag_sensors.yaml
|
||||
#diag_more: !include common/include_more_diag_sensors.yaml
|
||||
#diag_debug: !include common/include_debug_diag_sensors.yaml
|
||||
#diag_resetcount: !include common/include_resetcount_diag_sensors.yaml
|
||||
|
||||
# Core and optional configurations
|
||||
remote_package:
|
||||
url: https://github.com/edwardtfn/NSPanel-Easy
|
||||
ref: v2026.5.5
|
||||
refresh: 300s
|
||||
files:
|
||||
- nspanel_esphome.yaml # Basic package
|
||||
# Optional advanced and add-on configurations
|
||||
# - esphome/nspanel_esphome_addon_climate_cool.yaml
|
||||
# - esphome/nspanel_esphome_addon_climate_heat.yaml
|
||||
# - esphome/nspanel_esphome_addon_climate_dual.yaml
|
||||
# - esphome/nspanel_esphome_addon_cover.yaml
|
||||
# - esphome/nspanel_esphome_addon_display_light.yaml # Show the display as a light in Home Assistant
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESPHOME:
|
||||
# https://esphome.io/components/esphome.html
|
||||
#:########################################################################################:#
|
||||
esphome:
|
||||
name: "${device_name}"
|
||||
friendly_name: "${friendly_name}"
|
||||
comment: "${description_comment}" # appears on the esphome page in HA
|
||||
area: "${device_area}"
|
||||
min_version: 2024.6.0
|
||||
#project:
|
||||
# name: "${project_name}"
|
||||
# version: "${project_version}"
|
||||
|
||||
#:########################################################################################:#
|
||||
# ESP PLATFORM AND FRAMEWORK:
|
||||
# https://esphome.io/components/esp32.html
|
||||
#:########################################################################################:#
|
||||
esp32:
|
||||
board: esp32dev
|
||||
framework:
|
||||
type: esp-idf # Suggested ESP-IDF framework
|
||||
version: recommended
|
||||
advanced:
|
||||
minimum_chip_revision: "3.1" # This makes the binary slightly smaller
|
||||
sram1_as_iram: true
|
||||
|
||||
|
||||
#uart:
|
||||
# id: tf_uart
|
||||
# tx_pin: GPIO16
|
||||
# rx_pin: GPIO17
|
||||
# baud_rate: 115200
|
||||
|
||||
|
||||
#:########################################################################################:#
|
||||
# LOGGING:
|
||||
# https://esphome.io/components/logger.html
|
||||
#:########################################################################################:#
|
||||
logger:
|
||||
level: "${log_level}"
|
||||
#baud_rate: 0 # set to 0 for no logging via UART if you want
|
||||
|
||||
#:########################################################################################:#
|
||||
# HOME ASSISTANT STATE IMPORT:
|
||||
# Import the last remembered lounge scene from Home Assistant.
|
||||
#:########################################################################################:#
|
||||
text_sensor:
|
||||
- platform: homeassistant
|
||||
id: lounge_last_scene
|
||||
entity_id: input_text.lounge_last_scene
|
||||
internal: true
|
||||
|
||||
#:########################################################################################:#
|
||||
# NSPANEL BUTTON / RELAY LABELS:
|
||||
# Extend existing NSPanel Easy entities rather than redefining GPIOs.
|
||||
#:########################################################################################:#
|
||||
binary_sensor:
|
||||
- id: !extend right_button
|
||||
name: "Lounge Stair Downlights Button"
|
||||
|
||||
switch:
|
||||
- id: !extend relay_2
|
||||
name: "Lounge Stair Downlights"
|
||||
|
||||
- platform: template
|
||||
id: nspanel_ha_loss_test
|
||||
name: "HA Loss Test"
|
||||
optimistic: true
|
||||
restore_mode: RESTORE_DEFAULT_OFF
|
||||
|
||||
#:########################################################################################:#
|
||||
# NSPANEL HARDWARE BUTTON LOCAL / HA ACTIONS:
|
||||
#
|
||||
# Behaviour:
|
||||
# - HA connected and HA Loss Test OFF:
|
||||
# - Left button toggles lounge scene between Bright and All Off
|
||||
# - Left relay is forced ON
|
||||
# - Right button toggles Relay 2 / Lounge Stair Downlights
|
||||
#
|
||||
# - HA disconnected OR HA Loss Test ON:
|
||||
# - Left button toggles Relay 1
|
||||
# - Right button toggles Relay 2 / Lounge Stair Downlights
|
||||
#
|
||||
# Notes:
|
||||
# - Uses NSPanel Easy script IDs and relay IDs.
|
||||
# - Avoid enabling Relay 1 local mode in the NSPanel blueprint, otherwise the package
|
||||
# may toggle Relay 1 before this custom logic can handle the press.
|
||||
#:########################################################################################:#
|
||||
script:
|
||||
- id: nspanel_lounge_force_left_relay_on_when_ha_connected
|
||||
mode: restart
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
lambda: |-
|
||||
const bool actual_ha_online =
|
||||
wifi_component->is_connected() &&
|
||||
api_server->is_connected_with_state_subscription();
|
||||
|
||||
const bool effective_ha_online =
|
||||
actual_ha_online && !id(nspanel_ha_loss_test).state;
|
||||
|
||||
return effective_ha_online;
|
||||
then:
|
||||
- switch.turn_on: relay_1
|
||||
|
||||
- id: nspanel_lounge_left_button_action
|
||||
mode: restart
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
lambda: |-
|
||||
const bool actual_ha_online =
|
||||
wifi_component->is_connected() &&
|
||||
api_server->is_connected_with_state_subscription();
|
||||
|
||||
const bool effective_ha_online =
|
||||
actual_ha_online && !id(nspanel_ha_loss_test).state;
|
||||
|
||||
return effective_ha_online;
|
||||
then:
|
||||
- script.execute: nspanel_lounge_force_left_relay_on_when_ha_connected
|
||||
|
||||
- if:
|
||||
condition:
|
||||
lambda: |-
|
||||
return id(lounge_last_scene).has_state() &&
|
||||
id(lounge_last_scene).state != "All Off";
|
||||
then:
|
||||
- homeassistant.action:
|
||||
action: script.lounge_set_scene
|
||||
data:
|
||||
scene_name: "All Off"
|
||||
else:
|
||||
- homeassistant.action:
|
||||
action: script.lounge_set_scene
|
||||
data:
|
||||
scene_name: "Bright"
|
||||
|
||||
else:
|
||||
- lambda: |-
|
||||
const bool actual_ha_online =
|
||||
wifi_component->is_connected() &&
|
||||
api_server->is_connected_with_state_subscription();
|
||||
|
||||
// If NSPanel Easy relay local mode already handled the press, do not double toggle.
|
||||
if (id(hardware_settings).relay1_local) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is a real HA/API outage and NSPanel Easy fallback already handled it,
|
||||
// do not double toggle. HA Loss Test still toggles here because HA is actually online.
|
||||
if (id(hardware_settings).relay1_fallback && !actual_ha_online) {
|
||||
return;
|
||||
}
|
||||
|
||||
relay_1->toggle();
|
||||
|
||||
- id: nspanel_lounge_right_button_action
|
||||
mode: restart
|
||||
then:
|
||||
- lambda: |-
|
||||
const bool actual_ha_online =
|
||||
wifi_component->is_connected() &&
|
||||
api_server->is_connected_with_state_subscription();
|
||||
|
||||
// If NSPanel Easy relay local mode already handled the press, do not double toggle.
|
||||
if (id(hardware_settings).relay2_local) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is a real HA/API outage and NSPanel Easy fallback already handled it,
|
||||
// do not double toggle. HA Loss Test still toggles here because HA is actually online.
|
||||
if (id(hardware_settings).relay2_fallback && !actual_ha_online) {
|
||||
return;
|
||||
}
|
||||
|
||||
relay_2->toggle();
|
||||
|
||||
- id: !extend button_left_press_short
|
||||
then:
|
||||
- script.execute: nspanel_lounge_left_button_action
|
||||
|
||||
- id: !extend button_right_press_short
|
||||
then:
|
||||
- script.execute: nspanel_lounge_right_button_action
|
||||
|
||||
#:########################################################################################:#
|
||||
# INTERVAL:
|
||||
# Keep Relay 1 ON whenever Home Assistant is effectively connected.
|
||||
#:########################################################################################:#
|
||||
interval:
|
||||
- interval: 5s
|
||||
then:
|
||||
- script.execute: nspanel_lounge_force_left_relay_on_when_ha_connected
|
||||
|
||||
#:########################################################################################:#
|
||||
# BLUETOOTH:
|
||||
# https://esphome.io/components/bluetooth_proxy.html
|
||||
# https://esphome.io/components/esp32_ble_tracker.html
|
||||
#:########################################################################################:#
|
||||
#bluetooth_proxy:
|
||||
# active: true
|
||||
|
||||
#esp32_ble_tracker:
|
||||
# scan_parameters:
|
||||
# # Defaults used so Bluetooth can co-exist with WiFi
|
||||
# active: true
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><link rel="canonical" href="https://www.freebestfonts.com/eight-bit-dragon-font"/>
|
||||
|
||||
<title>Eight Bit Dragon free font</title><link href="/Content/Site.css" rel="stylesheet" type="text/css">
|
||||
<meta name="description" content="Eight Bit Dragon font download " />
|
||||
<meta name="keywords" content="Eight Bit Dragon, Eight Bit Dragon font, Eight Bit Dragon fonts, Eight Bit Dragon font download, Eight Bit Dragon free font" />
|
||||
<link rel="shortcut icon" href="/favicon.ico"><link rel="dns-prefetch" href="https://www.freebestfonts.com"><link rel="dns-prefetch" href="//ajax.googleapis.com"><link rel="dns-prefetch" href="https://pagead2.googlesyndication.com"><link rel="dns-prefetch" href="https://www.google.com"><link rel="dns-prefetch" href="https://www.googletagservices.com"><link rel="dns-prefetch" href="https://securepubads.g.doubleclick.net"><link rel="dns-prefetch" href="https://fonts.googleapis.com"><link rel="dns-prefetch" href="https://cdn.insurads.com"><link rel="dns-prefetch" href="https://cdnjs.cloudflare.com"><link rel="dns-prefetch" href="https://tpc.googlesyndication.com">
|
||||
</head><body>
|
||||
<form action="/eight-bit-dragon-font" enctype="multipart/form-data" method="post"><header><div class="logoZe"><a href="/" class="logo" title="free best fonts"><img src="/images/best-free-fonts.jpg" width="159" height="156" alt="Free Best Fonts"/></a></div><div class="loYa"><div class="arama"><label><input name="araText" id="araText" type="text" placeholder="" tabindex="0"/></label><input id="Button1" type="submit" value="Search"/></div><nav class="menuUl"><a href="/new-fonts" title="New Fonts">New Fonts</a><a href="/free-fonts-1001" title="1001 Free Fonts">1001 Free Fonts</a><a href="/fonts-google" title="Google Fonts">Google Fonts</a><a href="/free-font-family" title="Font Family">Font Family</a></nav></div></header><div class="fontOrta"><div class="oniz"><table><tr><th>Preview</th><th>Size</th><th>Fonts</th><th></th></tr><tr><td><input name="oniz" id="oniz" type="text" placeholder="Text" value="" /></td><td><select id="fontSz" name="fontSz"><option value="30">Small</option><option value="60" selected>Medium</option><option value="85">Large</option></select></td><td><select id="rowsCount" name="rowsCount" ><option value="12" >12</option><option value="24" >24</option><option value="48" >48</option></select></td><td><input id="Button1" type="submit" /></td></tr></table></div><div class="fntLst01"><div class="sonE"><h3 class="sola"><strong>Eight Bit Dragon</strong> - .TTF</h3><a class='sola' href="lcd-free-fonts"> Lcd - Modern</a><span class='sola'></span><div class="fntSag"><span class="say">13279 Downloads</span><a class="down" href="/download?fn=7414" title="Eight Bit Dragon download"> Download</a></div></div><div class="fntLst03"><div class="prev1" style="background-image:url(/yone/fontsim/Eight-Bit-Dragon.jpg);"></div></div></div><div class="aciklama"><h1>Eight Bit Dragon Lcd - Modern</h1><h2>Eight Bit Dragon font</h2><img loading="lazy" width="950" height="550" alt='Eight Bit Dragon font' src='/yone/prev/eight-bit-dragon.jpg'/><img loading="lazy" width="950" height="550" alt='Eight Bit Dragon font big' src='/yone/prev/eight-bit-dragon-b.jpg'/><img loading="lazy" width="950" height="550" alt='Eight Bit Dragon font text' src='/yone/prev/eight-bit-dragon-text.jpg'/><img loading="lazy" width="950" height="550" alt='Eight Bit Dragon font 1' src='/yone/prev/eight-bit-dragon-1.jpg'/><table><tr><th><strong>Font Name</strong></th><th><strong>Date</strong></th><th><strong>File Size</strong></th></tr><tr><td>eight_bit_dragon.png</td><td> 2018-10-10</td><td> 8 KB</td></tr><tr><td>Eight-Bit-Dragon.ttf</td><td> 2018-10-10</td><td> 34 KB</td></tr></table></div><hr /><div class="aciklama"><div class="prev2" style="background-image:url(https://www.freebestfonts.com/yone/fontharf/Eight-Bit-Dragon.jpg);"></div><hr /><h2>Font Details</h2><p>Concielian Classic version 2 Truetype Font for Windows<br><br><br><br>2017 Iconian Fonts - Daniel Zadorozny<br><br>http://www.iconian.com/<br><br><br><br>This font comes with the following 5 versions: Regular, Bold, Condensed, Expanded and 3d.<br><br><br>This font may be freely distributed and is free for all non-commercial uses. Use of the fonts are at your own risk.<br><br>For commercial use of the font please visit http://iconian.com/commercial.html for additional information.<br><br>or e-mail me at iconian@aol.com<br></p> Eight Bit Dragonfont download, Eight Bit Dragon font.</div></div></form>;
|
||||
<div class="reklam04_1"></div>
|
||||
<div class="reklam05_1"></div>
|
||||
<footer><p>© 2026 - Best Free Fonts - Best Fonts</p></footer>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics --><script async src="https://www.googletagmanager.com/gtag/js?id=UA-131832151-1"></script><script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-131832151-1');</script><script data-ad-client="ca-pub-2059603307933699" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> </body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user