additional esphome devices and fixes

This commit is contained in:
root
2026-05-23 23:53:04 +12:00
parent 5e941eea06
commit 7eb81efd93
61 changed files with 7756 additions and 354 deletions
@@ -0,0 +1 @@
х(vтOьш╚3Вяm0л
+732
View File
@@ -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"
}
}
View File
+1
View File
@@ -0,0 +1 @@
{"pid": 76431, "lock_format_version": 1, "device_builder_version": "0.1.0b51", "start_ts": 1779063562.6364732}
+130
View File
@@ -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
+73 -40
View File
@@ -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") };
+818
View File
@@ -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);
}
+154
View File
@@ -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
+316
View File
@@ -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
+13
View File
@@ -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>&copy; 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>