diff --git a/.ha_run.lock b/.ha_run.lock index 7c21484..9cfebf2 100644 --- a/.ha_run.lock +++ b/.ha_run.lock @@ -1 +1 @@ -{"pid": 71, "version": 1, "ha_version": "2026.7.2", "start_ts": 1784512870.0398877} \ No newline at end of file +{"pid": 71, "version": 1, "ha_version": "2026.7.2", "start_ts": 1784593872.104367} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 55482c3..e4cd10b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -39,6 +39,19 @@ You MUST follow these rules strictly: - Make the change anyway - Try to convince them otherwise +## Project Context Protocol + +- Treat every user request as related to a tracked project. +- Identify the project by ID or name before beginning work. +- If the project is unclear, ask the user which project applies. +- Read `PROJECTS.md` and the relevant project section before investigating or making recommendations. +- Keep project IDs stable. +- Record durable decisions, changes, verification results, blockers, and next steps under the relevant project. +- Follow the existing approval rules before writing context updates. +- Never mark a project `Complete` unless the user explicitly confirms completion. +- When a project appears complete, ask: "Should I close Pxxx?" +- Do not store secrets, credentials, or large transient logs in project context. + ## Environment Context - You are running inside the OpenCode app diff --git a/PROJECTS.md b/PROJECTS.md new file mode 100644 index 0000000..f28f2af --- /dev/null +++ b/PROJECTS.md @@ -0,0 +1,138 @@ +# Project Tracker + +Use this file as the source of truth for projects being worked on with OpenCode. + +- Associate each user request with a project ID before beginning work. +- Ask the user which project applies when the request is ambiguous. +- Keep project IDs stable and use the relevant section to store durable context. +- Update context as work progresses, subject to the approval rules in `AGENTS.md`. +- Never mark a project complete unless the user explicitly confirms it is complete. +- Ask the user before closing a project that appears complete. +- Use these statuses: `Active`, `Paused`, and `Complete`. + +| ID | Project | Status | Next Step | Last Updated | +| --- | --- | --- | --- | --- | +| P001 | Bedside panel alarm audio | Active | Deploy and verify alarm audio and volume behavior. | 2026-07-20 | +| P002 | reTerminal E1001 dashboard | Active | Test display refresh, wake buttons, MQTT control, and deep sleep. | 2026-07-20 | +| P003 | ESPHome MQTT topic normalization | Active | Deploy paired devices and verify retained synchronization and external clients. | 2026-07-20 | +| P004 | Appliance completion announcements | Active | Test an appliance cycle and resolve feed/timestamp inconsistencies. | 2026-07-20 | +| P005 | Jobs and Chore Tracker V2.3 | Active | Test completion boundaries and resolve stale or duplicated entities. | 2026-07-20 | +| P006 | Bedside rain forecast | Active | Verify forecast boundaries and API-failure handling. | 2026-07-20 | +| P007 | Bedtime stair shutdown | Active | Verify both stair relays during a bedtime run. | 2026-07-20 | +| P008 | Spook unused entity cleanup | Complete | None. | 2026-07-21 | +| P009 | Lounge front-door camera layout | Complete | None. | 2026-07-21 | +| P010 | Main-page Jobs timing gauges | Complete | None. | 2026-07-21 | +| P011 | Downstairs occupancy helper cleanup | Complete | None. | 2026-07-21 | +| P012 | EdgeRouter X SNMP monitoring | Active | Investigate the current EdgeOS failure and v3.0.x-compatible SNMP approach. | 2026-07-21 | + +## P001: Bedside Panel Alarm Audio + +- Objective: Provide reliable local alarm audio and user-adjustable volume on the bedside panel. +- Current context: ES8311 and I2S output, amplifier control, persistent volume, and Beep/Alarm/Stop controls were added and repeatedly tuned. Compilation, deployment, and hardware behavior have not been confirmed. +- Key files: `esphome/esp-bedside-panel.yaml`. +- Known issue: The file changelog records V1.47 while `project_version` still reports v1.46. +- Next step: Compile and deploy, then test startup noise, Beep/Alarm/Stop, volume endpoints, persistence, and amplifier shutdown. +- Activity: 2026-07-20 - Implemented and tuned the alarm-audio feature through V1.47. + +## P002: reTerminal E1001 Dashboard + +- Objective: Build a low-power e-paper dashboard for job and appliance status. +- Current context: Added ESP32-S3 hardware support, Jobs and Appliances pages, Home Assistant entity imports, icons, buttons, MQTT controls, change-only refresh, retained page hashes, wake-source handling, and deep sleep. Runtime behavior has not been confirmed. +- Key files: `esphome/esp-reterminal-e1001.yaml`. +- Next step: Compile and deploy, then test entity data, rendering, page buttons, timer and button wake, MQTT keep-awake control, fallback sleep, and battery usage. +- Activity: 2026-07-20 - Created the device configuration and developed it through v0.6.1. + +## P003: ESPHome MQTT Topic Normalization + +- Objective: Simplify MQTT command and status topics across related ESPHome devices while preserving synchronization. +- Current context: Flattened component-specific MQTT topics to logical device roots across eleven devices. Updated paired lounge and master-bedroom consumers and restored direct pantry-light control. Deployment and external-client compatibility have not been confirmed. +- Key files: Related device configurations under `esphome/`, including lounge, kitchen, office, bedroom, breakfast-bar, and master-bedroom devices. +- Next step: Compile and deploy paired devices together, verify root commands and retained state, audit external MQTT consumers, and remove stale retained messages from superseded topics when safe. +- Activity: 2026-07-20 - Applied the MQTT topic normalization across the related devices. + +## P004: Appliance Completion Announcements + +- Objective: Route appliance completion events to configured announcement channels and MQTT activity feeds. +- Current context: Added per-appliance announcement settings, payloads, channels, LED-matrix indicators, MQTT feed suffixes, suppression logging, retained attributes, and expanded washer, dryer, dishwasher, and EV-charger handling. +- Key files: `packages/Appliance_Monitoring/appliance_monitor_processor.yaml`, `packages/Appliance_Monitoring/appliances_status_monitoring.yaml`, `packages/view_road_announcement_router.yaml`, and `packages/appliance_status_mqttfeed.yaml`. +- Known issues: MQTT feed channels may not yet be enabled for each appliance, and timestamp sensors may receive time-only payloads. +- Next step: Resolve the feed and timestamp inconsistencies, then test a complete appliance cycle end to end. +- Activity: 2026-07-20 - Expanded appliance monitoring and completion-feed routing. + +## P005: Jobs and Chore Tracker V2.3 + +- Objective: Maintain household jobs through a registry-driven tracker with discovery entities and completion windows. +- Current context: Centralized five jobs, added generic completion routing, morning and evening dog-feeding windows, MQTT Discovery entities, summary and count entities, manual buttons, missed-job handling, and completion-window expiry. +- Key files: `packages/Job_Chore_Tracking/jobs_tracker_jobs.yaml` and `packages/Job_Chore_Tracking/jobs_tracker_processor.yaml`. +- Known issue: Some count entities may be stale or have duplicated `jobs_tracker` naming. +- Next step: Test completion-window boundaries and clean up stale or double-prefixed entities after confirming which entities are current. +- Activity: 2026-07-20 - Implemented the V2.3 registry and processor changes. + +## P006: Bedside Rain Forecast + +- Objective: Supply the bedside panel with useful rain-chance forecasts for today and tomorrow. +- Current context: Added Open-Meteo REST sensors for today's remaining forecast period and tomorrow's daylight period using the Home zone coordinates. +- Key files: `packages/open_meteo_rain_chance.yaml` and `esphome/esp-bedside-panel.yaml`. +- Next step: Verify sunrise and sunset boundary behavior, stale-data handling, and API-failure recovery. +- Activity: 2026-07-20 - Added the Open-Meteo rain forecast package and bedside-panel inputs. + +## P007: Bedtime Stair Shutdown + +- Objective: Ensure the central stair lighting turns off as part of bedtime mode. +- Current context: Added the lower main stair lights and stair footer lights to the bedtime shutdown sequence with no delay. +- Key files: `packages/bedtime_mode_actions.yaml`. +- Next step: Run bedtime mode and verify both relays switch off as intended. +- Activity: 2026-07-20 - Added both central stair relays to bedtime shutdown. + +## P008: Spook Unused Entity Cleanup + +- Objective: Resolve Spook warnings caused by stale entity references. +- Current context: The Master Bedroom Echo Show Environment view now uses the live Bedroom 1 Environment (Z19TH) temperature and humidity entities, and the related Spook repair has cleared. +- Replacement entities: `sensor.bedroom_1_environment_z19th_temperature` and `sensor.bedroom_1_environment_z19th_humidity`. +- Verification: The stored card definitions reference the replacement entities, and Spook no longer reports the Master Bedroom Echo Show issue. Automated visual verification was unavailable because the screenshot tool is disabled. +- Next step: None. +- Activity: 2026-07-21 - Created the project and selected the live Bedroom 1 Environment (Z19TH) sensor pair. +- Activity: 2026-07-21 - Replaced both stale dashboard references and confirmed that the Spook repair cleared. +- Activity: 2026-07-21 - User confirmed completion. + +## P009: Lounge Front-Door Camera Layout + +- Objective: Display the Front Door Camera in landscape orientation on the Lounge dashboard. +- Current context: The Lounge Home view now displays the live `camera.camera2` card at a 4:3 landscape aspect ratio. +- Verification: The saved view retains all seven cards and the Front Door Camera live-view settings, and `camera.camera2` is streaming. Automated visual verification was unavailable because the screenshot tool is disabled. +- Next step: None. +- Activity: 2026-07-21 - Created the project and identified the Front Door Camera card on the Lounge Home view. +- Activity: 2026-07-21 - Changed the Front Door Camera card from 3:4 to 4:3 and verified the saved dashboard configuration. +- Activity: 2026-07-21 - User confirmed completion. + +## P010: Main-Page Jobs Timing Gauges + +- Objective: Make the Lounge Home dog-feeding and depooping gauges use timing from the Jobs routine. +- Current context: The gauges now use Jobs-derived template sensors. Dog feeding uses the latest morning/evening completion, and depooping uses the weekly job completion. +- Selected design: Keep two gauges. Dog feeding uses the latest morning/evening completion; depooping uses the weekly job completion. +- Key file: `packages/pet_feeding_and_jobs.yaml`. +- Verification: Home Assistant accepted the configuration, both template sensors loaded, the feeding gauge reports 17 hours, the depooping gauge reports 156 hours, and all other Home view cards were preserved. Automated visual verification was unavailable because the screenshot tool is disabled. +- Next step: None. +- Activity: 2026-07-21 - Created the project and selected the two-gauge Jobs-derived design. +- Activity: 2026-07-21 - Added the Jobs-derived sensors, reloaded templates, and updated both Lounge Home gauges. +- Activity: 2026-07-21 - User confirmed completion. + +## P011: Downstairs Occupancy Helper Cleanup + +- Objective: Eliminate the duplicate downstairs guest occupancy helper. +- Canonical helper: `input_boolean.downstairs_flat_occupied`, which is YAML-managed and used by the downstairs lockout behavior. +- Removed duplicate: `input_boolean.guest_area_occupied`, which was UI-managed and referenced only by the Test dashboard. +- Current context: All nine stored Test dashboard references now use the canonical helper, the duplicate helper has been deleted, and the Lounge row of eight downstairs-flat light icons now greys out and blocks taps while occupied. +- Verification: The duplicate returns entity not found, the canonical helper remains available with its automation and script relationships, no Test dashboard broken-reference repair was created, and the saved Lounge templates render both the enabled and occupied branches correctly. Automated visual verification was unavailable because the screenshot tool is disabled. +- Next step: None. +- Activity: 2026-07-21 - Created the project and completed the dependency audit. +- Activity: 2026-07-21 - Migrated the Test dashboard references and deleted the duplicate helper. +- Activity: 2026-07-21 - Added occupancy-driven greying and tap blocking to the Lounge downstairs-flat light row. +- Activity: 2026-07-21 - User verified the Lounge lockout and confirmed completion. + +## P012: EdgeRouter X SNMP Monitoring + +- Objective: Restore EdgeRouter X monitoring on firmware v3.0.x using a compatible SNMP-based approach. +- Current context: The existing EdgeRouter interface is not working after the router moved to firmware v3.0.x. Prior EdgeRouter/SNMP work was not recorded in project context. +- Next step: Inspect the current configuration, entities, errors, and documentation without changing runtime behavior. +- Activity: 2026-07-21 - Created the project and began the compatibility investigation. diff --git a/config.boot b/config.boot new file mode 100644 index 0000000..39a09ec --- /dev/null +++ b/config.boot @@ -0,0 +1,1386 @@ +firewall { + all-ping enable + broadcast-ping disable + group { + address-group High_Address_Range_Group_DHCP { + address 192.168.2.230-192.168.2.254 + description "25 DHCP addresses on 2.230-2.254" + } + address-group LAN_Interfaces_for_NAT { + address 192.168.1.0/24 + address 192.168.2.0/24 + address 192.168.3.0/24 + address 172.31.0.0/16 + description "all 4 LAN interfaces" + } + address-group Low_Address_Range_DHCP { + address 192.168.2.1-192.168.2.9 + description "9 DHCP addresses on 2.1-2.9" + } + } + ipv6-name LANv6 { + default-action accept + } + ipv6-receive-redirects disable + ipv6-src-route disable + ip-src-route disable + log-martians enable + name WAN_IN { + default-action drop + description "WAN to internal" + rule 10 { + action accept + description "Allow established/related" + state { + established enable + related enable + } + } + rule 20 { + action drop + description "Drop invalid state" + state { + invalid enable + } + } + } + name WAN_LOCAL { + default-action drop + description "WAN to router" + rule 10 { + action accept + description "Allow established/related" + state { + established enable + related enable + } + } + rule 20 { + action drop + description "Drop invalid state" + state { + invalid enable + } + } + } + name WAN_OUT { + default-action accept + rule 1 { + action accept + description "Drop access to Note 8 Phone (Testing)" + log disable + protocol all + source { + mac-address 8c:45:00:04:03:54 + } + } + rule 3 { + action drop + description "Drop Access to Mollies Macbook Pro" + log disable + protocol all + source { + mac-address 00:23:12:55:00:99 + } + } + rule 4 { + action accept + description "Drop Access to Mollies iPad Mini" + log disable + protocol all + source { + mac-address 54:99:63:24:10:10 + } + } + rule 6 { + action drop + description "Drop Access to Mollies iPhone 12 2023" + log disable + protocol all + source { + mac-address f6:b5:d8:df:b7:20 + } + } + rule 7 { + action drop + description "Drop Access to Mollies Chromebook Intel" + log disable + protocol all + source { + mac-address 00:bb:60:d0:29:b5 + } + } + rule 8 { + action drop + description "Drop DHCP non-assigned 1-9" + disable + log disable + protocol all + source { + group { + address-group Low_Address_Range_DHCP + } + } + } + rule 10 { + action drop + description "Drop DHCP non-assigned 230-254" + disable + log disable + protocol all + source { + group { + address-group High_Address_Range_Group_DHCP + } + } + } + } + options { + mss-clamp { + mss 1412 + } + } + receive-redirects disable + send-redirects enable + source-validation disable + syn-cookies enable +} +interfaces { + ethernet eth0 { + duplex auto + speed auto + vif 10 { + description "Internet (PPPoE)" + pppoe 0 { + default-route auto + firewall { + in { + name WAN_IN + } + local { + name WAN_LOCAL + } + out { + name WAN_OUT + } + } + mtu 1492 + name-server auto + password + user-id user@spark.co.nz + } + } + } + ethernet eth1 { + address 192.168.1.25/24 + address fd00:1234:5678:1::1/64 + description "eth1 - Home LAN" + duplex auto + ipv6 { + dup-addr-detect-transmits 1 + router-advert { + cur-hop-limit 64 + link-mtu 0 + managed-flag false + max-interval 600 + other-config-flag false + prefix fd00:1234:5678:1::/64 { + autonomous-flag true + on-link-flag true + valid-lifetime 2592000 + } + reachable-time 0 + retrans-timer 0 + send-advert true + } + } + speed auto + } + ethernet eth2 { + description "eth2 - Home Wireless" + duplex auto + speed auto + } + ethernet eth3 { + address 192.168.3.25/24 + address fd00:1234:5678:3::1/64 + description "eth3 - Home Automation" + duplex auto + ipv6 { + dup-addr-detect-transmits 1 + router-advert { + cur-hop-limit 64 + link-mtu 0 + managed-flag false + max-interval 600 + other-config-flag false + prefix fd00:1234:5678:3::/64 { + autonomous-flag true + on-link-flag true + valid-lifetime 2592000 + } + reachable-time 0 + retrans-timer 0 + send-advert true + } + } + speed auto + } + ethernet eth4 { + address 172.31.4.25/16 + address fd00:1234:5678:4::1/64 + description "eth4 - (Home Automation)" + duplex auto + ipv6 { + dup-addr-detect-transmits 1 + router-advert { + cur-hop-limit 64 + link-mtu 0 + managed-flag false + max-interval 600 + other-config-flag false + prefix fd00:1234:5678:4::/64 { + autonomous-flag true + on-link-flag true + valid-lifetime 2592000 + } + reachable-time 0 + retrans-timer 0 + send-advert true + } + } + poe { + output off + } + speed auto + } + loopback lo { + } + switch switch0 { + address 192.168.2.25/24 + description Local + mtu 1500 + switch-port { + interface eth2 { + } + vlan-aware disable + } + } +} +port-forward { + auto-firewall enable + hairpin-nat enable + lan-interface eth1 + lan-interface switch0 + lan-interface eth2 + lan-interface eth3 + lan-interface eth4 + rule 1 { + description "plex - ostrich" + forward-to { + address 192.168.1.210 + port 32400 + } + original-port 32406 + protocol tcp_udp + } + rule 2 { + description "transmission - giraffe" + forward-to { + address 192.168.1.210 + port 51413 + } + original-port 51413 + protocol tcp_udp + } + rule 3 { + description ipsec-vpn + forward-to { + address 192.168.3.200 + } + original-port 500 + protocol udp + } + rule 4 { + description ipsec-vpn + forward-to { + address 192.168.3.200 + } + original-port 4500 + protocol udp + } + rule 5 { + description "x2go - ferret" + forward-to { + address 192.168.1.84 + port 22 + } + original-port 26 + protocol tcp_udp + } + rule 6 { + description "tor - ferret" + forward-to { + address 192.168.1.84 + port 1298 + } + original-port 1298 + protocol tcp_udp + } + rule 7 { + description "deluge - ferret" + forward-to { + address 192.168.1.84 + port 6882 + } + original-port 6882 + protocol tcp_udp + } + rule 8 { + description openvpn + forward-to { + address 192.168.3.200 + } + original-port 1194 + protocol udp + } + rule 9 { + description openvpn-2 + forward-to { + address 192.168.3.200 + } + original-port 9443 + protocol tcp_udp + } + rule 10 { + description openvpn-www + forward-to { + address 192.168.3.200 + port 943 + } + original-port 943 + protocol tcp + } + rule 11 { + description "transmission - nas1" + forward-to { + address 192.168.1.237 + port 51500 + } + original-port 51500 + protocol tcp_udp + } + rule 12 { + description "traefik - panda" + forward-to { + address 192.168.3.200 + port 443 + } + original-port 443 + protocol tcp + } + rule 13 { + description "traefik - panda" + forward-to { + address 192.168.3.200 + port 80 + } + original-port 80 + protocol tcp + } + rule 14 { + description "transmission - goat" + forward-to { + address 192.168.2.44 + port 51418 + } + original-port 51418 + protocol tcp_udp + } + rule 15 { + description "transmission - donkey" + forward-to { + address 192.168.2.24 + port 41419 + } + original-port 41419 + protocol tcp_udp + } + rule 16 { + description wireguard + forward-to { + address 192.168.3.200 + port 51820 + } + original-port 51820 + protocol udp + } + rule 17 { + description rustdesk-5 + forward-to { + address 192.168.3.200 + port 21115 + } + original-port 21115 + protocol tcp_udp + } + rule 18 { + description rustdesk-6 + forward-to { + address 192.168.3.200 + port 21116 + } + original-port 21116 + protocol tcp_udp + } + rule 19 { + description rustdesk-7 + forward-to { + address 192.168.3.200 + port 21117 + } + original-port 21117 + protocol tcp_udp + } + rule 20 { + description rustdesk-8 + forward-to { + address 192.168.3.200 + port 21118 + } + original-port 21118 + protocol tcp_udp + } + rule 21 { + description rustdesk-9 + forward-to { + address 192.168.3.200 + port 21119 + } + original-port 21119 + protocol tcp_udp + } + wan-interface pppoe0 +} +service { + dhcp-server { + disabled false + hostfile-update enable + shared-network-name Home_Automation_eth3 { + authoritative disable + subnet 192.168.3.0/24 { + default-router 192.168.3.25 + dns-server 192.168.3.25 + lease 86400 + start 192.168.3.51 { + stop 192.168.3.99 + } + static-mapping panda { + ip-address 192.168.3.200 + mac-address c0:3f:d5:6d:90:80 + } + } + } + shared-network-name LAN1 { + authoritative enable + subnet 192.168.1.0/24 { + default-router 192.168.1.25 + dns-server 192.168.3.200 + dns-server 192.168.1.25 + lease 86400 + start 192.168.1.38 { + stop 192.168.1.99 + } + static-mapping AVTech-Camera { + ip-address 192.168.1.131 + mac-address 00:0e:53:26:8f:51 + } + static-mapping Alarm_Mega { + ip-address 192.168.1.230 + mac-address de:ad:be:ef:fe:ed + } + static-mapping CCTV-DVR1 { + ip-address 192.168.1.225 + mac-address 00:12:41:08:cd:e8 + } + static-mapping Cam1-Garage { + ip-address 192.168.1.112 + mac-address 00:12:41:24:8d:8d + } + static-mapping Cam2-Frontdoor { + ip-address 192.168.1.113 + mac-address 00:12:31:5e:75:53 + } + static-mapping Cam3-GarageSide { + ip-address 192.168.1.115 + mac-address 00:12:41:24:8d:99 + } + static-mapping Cam4-Driveway { + ip-address 192.168.1.116 + mac-address 00:12:31:42:15:90 + } + static-mapping Cam5-Trailer { + ip-address 192.168.1.117 + mac-address 00:12:41:24:8d:bb + } + static-mapping Cam6-Drive_Lower { + ip-address 192.168.1.119 + mac-address 00:12:41:24:8D:8F + } + static-mapping Cam7-Drive_Upper { + ip-address 192.168.1.118 + mac-address 00:12:16:bc:a0:48 + } + static-mapping Cam8-Patio { + ip-address 192.168.1.114 + mac-address 00:12:41:24:99:AB + } + static-mapping HDHomerun-12304BC9 { + ip-address 192.168.1.221 + mac-address 00:18:dd:23:04:bc + } + static-mapping MainTV-Chromecast-Ultra { + ip-address 192.168.1.223 + mac-address 44:09:b8:61:bf:ca + } + static-mapping Panasonic_Viera_COM-MID1 { + ip-address 192.168.1.224 + mac-address 04:20:9a:4d:4a:6b + } + static-mapping Pi-Photobooth { + ip-address 192.168.1.205 + mac-address b8:27:eb:3f:10:f5 + } + static-mapping RaspiPlex2 { + ip-address 192.168.1.204 + mac-address b8:27:eb:12:f4:fe + } + static-mapping Sony_TV_Lounge { + ip-address 192.168.1.226 + mac-address 88:c9:e8:03:53:85 + } + static-mapping Tuya_bulb_1--ESP_B9DA3A { + ip-address 192.168.1.51 + mac-address 50:02:91:b9:da:3a + } + static-mapping Tuya_kogan_smartplug1 { + ip-address 192.168.1.52 + mac-address d4:a6:51:2a:a8:f5 + } + static-mapping ferret { + ip-address 192.168.1.222 + mac-address b8:ca:3a:7e:3f:5f + } + static-mapping guineapig { + ip-address 192.168.1.220 + mac-address 24:be:05:17:a4:d7 + } + static-mapping homeassistant { + ip-address 192.168.1.42 + mac-address 44:8a:5b:b6:41:58 + } + static-mapping odroidxu4 { + ip-address 192.168.1.237 + mac-address 00:1e:06:32:b7:81 + } + static-mapping ostrich { + ip-address 192.168.1.210 + mac-address 70:85:c2:72:b8:56 + } + static-mapping viewrd-opizerologger { + ip-address 192.168.1.208 + mac-address 3e:bd:5c:0e:1c:d8 + } + } + } + shared-network-name LAN2 { + authoritative enable + subnet 192.168.2.0/24 { + default-router 192.168.2.25 + dns-server 192.168.3.200 + dns-server 192.168.2.25 + lease 86400 + start 192.168.2.231 { + stop 192.168.2.249 + } + static-mapping ChromeCast-FoxholeBedroom { + ip-address 192.168.2.216 + mac-address 6c:ad:f8:85:83:1b + } + static-mapping ChromeCast-OfficeTV { + ip-address 192.168.2.213 + mac-address f4:f5:e8:5e:ac:78 + } + static-mapping ChromeClock-LenovoBedroom { + ip-address 192.168.2.214 + mac-address 84:b8:b8:20:7f:fb + } + static-mapping ChromeTic-FoxholeSpeaker { + ip-address 192.168.2.207 + mac-address 6c:5a:b5:54:f0:9c + } + static-mapping ChromeTic-LoungeSpeaker { + ip-address 192.168.2.210 + mac-address 6c:5a:b5:54:e4:3c + } + static-mapping ChromeTic-Mollie { + ip-address 192.168.2.215 + mac-address 6c:5a:b5:54:f7:05 + } + static-mapping ChromeTic-Mollie2-White { + ip-address 192.168.2.211 + mac-address 6c:5a:b5:55:43:3d + } + static-mapping Chromecast-Ultra { + ip-address 192.168.2.212 + mac-address 00:f6:20:70:0b:d6 + } + static-mapping ESP_3b1a59 { + ip-address 192.168.2.200 + mac-address c8:c9:a3:3b:1a:59 + } + static-mapping Foxhole-Bedroom-Androidbox { + ip-address 192.168.2.51 + mac-address e0:76:d0:56:7c:aa + } + static-mapping Foxhole-TV-JVC { + ip-address 192.168.2.52 + mac-address d4:3a:2e:9c:c3:aa + } + static-mapping Galaxy-A72 { + ip-address 192.168.2.32 + mac-address 52:c6:ae:32:75:a4 + } + static-mapping Howard-MiPhone { + ip-address 192.168.2.45 + mac-address fa:80:35:67:60:1a + } + static-mapping Howard-iPad { + ip-address 192.168.2.41 + mac-address a8:5b:78:b1:f1:d9 + } + static-mapping Howards-iPad-Air2023 { + ip-address 192.168.2.43 + mac-address b0:e5:ef:a2:f0:58 + } + static-mapping Howard-Dell17inch-Chromebook { + ip-address 192.168.2.46 + mac-address 2C:6E:85:C5:34:C9 + } + static-mapping Kims-AppleWatch4 { + ip-address 192.168.2.37 + mac-address 62:d0:8b:94:d5:21 + } + static-mapping Kims-Applewatch3 { + ip-address 192.168.2.40 + mac-address be:bb:ba:6e:c3:21 + } + static-mapping Kims-BuzzybeiPhone15 { + ip-address 192.168.2.38 + mac-address 78:a7:c7:98:3b:23 + } + static-mapping Kims-iPad { + ip-address 192.168.2.36 + mac-address fa:71:97:8a:ee:48 + } + static-mapping Kims-iPad-2 { + ip-address 192.168.2.39 + mac-address 88:cb:87:ba:cd:52 + } + static-mapping Mollies-Air { + ip-address 192.168.2.33 + mac-address 60:3e:5f:0c:f8:f8 + } + static-mapping MolliesiPadMini { + ip-address 192.168.2.30 + mac-address 54:99:63:24:10:10 + } + static-mapping Mollies-iphone12-2023 { + ip-address 192.168.2.34 + mac-address 9a:d8:d8:28:e8:2f + } + static-mapping Natalies-iPhone { + ip-address 192.168.2.47 + mac-address 90:a2:5b:eb:64:9c + } + static-mapping Natalies_Macbook_2025 { + ip-address 192.168.2.27 + mac-address 8e:41:e8:ae:94:98 + } + static-mapping Natalies_iPhone_2025 { + ip-address 192.168.2.23 + mac-address 76:c5:f8:36:ca:b0 + } + static-mapping Nintendo-Wii { + ip-address 192.168.2.48 + mac-address 58:bd:a3:83:61:3b + } + static-mapping Oven-GEMODULE5413 { + ip-address 192.168.2.49 + mac-address d8:28:c9:c8:6e:4c + } + static-mapping Ring-Front_Door-80c0c1 { + ip-address 192.168.2.50 + mac-address 34:3e:a4:80:c0:c1 + } + static-mapping amazon-echodot-masterbed-33QG { + ip-address 192.168.2.218 + mac-address 1c:4d:66:f4:67:3e + } + static-mapping amazon-echodot-office-341E { + ip-address 192.168.2.217 + mac-address 40:a2:db:b3:31:8a + } + static-mapping amazon-echoshow-mollie-68af115a435f4c7c { + ip-address 192.168.2.223 + mac-address 44:3d:54:ba:2b:c2 + } + static-mapping amazon-echoshow_kitchen-dcc473ae2 { + ip-address 192.168.2.219 + mac-address 48:b4:23:b0:02:22 + } + static-mapping android-460d2c8f8783d9d3-HP-Tablet { + ip-address 192.168.2.18 + mac-address 88:33:14:bd:15:9f + } + static-mapping beaver { + ip-address 192.168.2.26 + mac-address bc:85:56:36:88:19 + } + static-mapping brother-mfcj5720dw { + ip-address 192.168.2.20 + mac-address 2c:33:7a:31:e8:76 + } + static-mapping capybara { + ip-address 192.168.2.22 + mac-address 50:81:40:2D:84:02 + } + static-mapping cctv-quad1 { + ip-address 192.168.2.53 + mac-address b8:27:eb:26:de:ad + } + static-mapping cctv-quad2 { + ip-address 192.168.2.54 + mac-address b8:27:eb:f4:48:92 + } + static-mapping deco-E4R-8 { + ip-address 192.168.2.196 + mac-address e8:48:b8:33:b2:14 + } + static-mapping deco-E4R-9 { + ip-address 192.168.2.197 + mac-address e8:48:b8:33:b2:7c + } + static-mapping deco-M4R-11 { + ip-address 192.168.2.195 + mac-address e4:c3:2a:2f:29:e4 + } + static-mapping deco-M5-1 { + ip-address 192.168.2.201 + mac-address b0:4e:26:7c:71:39 + } + static-mapping deco-M5-2 { + ip-address 192.168.2.202 + mac-address b0:4e:26:7c:6c:84 + } + static-mapping deco-M5-3 { + ip-address 192.168.2.203 + mac-address b0:4e:26:49:b3:4e + } + static-mapping deco-M5-4 { + ip-address 192.168.2.204 + mac-address b0:4e:26:7c:7e:ef + } + static-mapping deco-M5-5 { + ip-address 192.168.2.206 + mac-address b0:4e:26:7c:74:5e + } + static-mapping deco-M5-6 { + ip-address 192.168.2.205 + mac-address b0:4e:26:7c:78:8c + } + static-mapping deco-X20-7 { + ip-address 192.168.2.199 + mac-address 10:27:f5:80:15:d0 + } + static-mapping deco-X20-10 { + ip-address 192.168.2.198 + mac-address 10:27:f5:80:13:18 + } + static-mapping deco-X20-13 { + ip-address 192.168.2.194 + mac-address e4:c3:2a:c7:fe:08 + } + static-mapping deco-X20-x { + ip-address 192.168.2.208 + mac-address e8:48:b8:22:1a:9c + } + static-mapping deco-X20-y { + ip-address 192.168.2.209 + mac-address e8:48:b8:22:29:b0 + } + static-mapping donkey { + ip-address 192.168.2.24 + mac-address 50:3E:AA:16:7C:F0 + } + static-mapping esp-attobat { + ip-address 192.168.2.176 + mac-address a4:e5:7c:bc:6b:0c + } + static-mapping esp-entbtproxy { + ip-address 192.168.2.165 + mac-address 0c:b8:15:f5:2a:cc + } + static-mapping esp-entmulti { + ip-address 192.168.2.169 + mac-address e4:65:b8:77:76:ec + } + static-mapping esp-leafbat { + ip-address 192.168.2.168 + mac-address a4:e5:7c:bc:93:0b + } + static-mapping esp-mainovenmonitor { + ip-address 192.168.2.177 + mac-address 5c:cf:7f:bd:7b:36 + } + static-mapping esp-midesklamp1s { + ip-address 192.168.2.166 + mac-address d4:f0:ea:7a:ec:93 + } + static-mapping esp-netcupfan2 { + ip-address 192.168.2.173 + mac-address 58:bf:25:da:e9:d9 + } + static-mapping esp-occupancyoffice { + ip-address 192.168.2.179 + mac-address 0c:b8:15:c0:e7:00 + } + static-mapping esp-occupancystair { + ip-address 192.168.2.178 + mac-address 0c:b8:15:c1:f1:0c + } + static-mapping esp-weatherstation { + ip-address 192.168.2.171 + mac-address 40:f5:20:28:2b:3e + } + static-mapping espresense-garage { + ip-address 192.168.2.161 + mac-address 0c:b8:15:f7:44:10 + } + static-mapping esp-bt-fridge-temps { + ip-address 192.168.2.174 + mac-address 24:6f:28:b9:a6:10 + } + static-mapping esp-nfcaccess1-33ad74 { + ip-address 192.168.2.175 + mac-address 5c:cf:7f:33:ad:74 + } + static-mapping howard-2025lap-wifi-IT459996 { + ip-address 192.168.2.57 + mac-address 4c:0f:3e:8f:36:35 + } + static-mapping howard-2025lap-wired-IT459996 { + ip-address 192.168.2.58 + mac-address b4:e9:b8:9f:ca:30 + } + static-mapping howard-OnePlus-12 { + ip-address 192.168.2.42 + mac-address ac:c0:48:66:21:a7 + } + static-mapping howard-gwatch5pro-SM-R925F { + ip-address 192.168.2.44 + mac-address d2:3e:3c:19:34:28 + } + static-mapping k1c-ingenic-EFF9 { + ip-address 192.168.2.31 + mac-address fc:ee:28:05:ef:f9 + } + static-mapping kim-dhl-laptop2 { + ip-address 192.168.2.159 + mac-address e8:bf:b8:2c:61:36 + } + static-mapping kim-iPhone-13dhl { + ip-address 192.168.2.56 + mac-address 3c:3b:77:cb:98:27 + } + static-mapping loungedisplay-ethernet { + ip-address 192.168.2.29 + mac-address 00:01:80:78:b2:73 + } + static-mapping loungedisplay-wireless { + ip-address 192.168.2.28 + mac-address 00:25:d3:76:58:d3 + } + static-mapping obk-ks811t-006D-garageentry { + ip-address 192.168.2.193 + mac-address 50:8a:06:81:de:6d + } + static-mapping obk-ks811t-B1C4-mainbath1 { + ip-address 192.168.2.192 + mac-address cc:8c:bf:2d:b1:c4 + } + static-mapping openmqtt-1-esp32-AAC2CC { + ip-address 192.168.2.185 + mac-address 0c:8b:95:aa:c2:cc + } + static-mapping panasonic-heat-pump-bedroom3 { + ip-address 192.168.2.226 + mac-address e8:c7:cf:59:bc:cc + } + static-mapping panasonic-heat-pump-lounge { + ip-address 192.168.2.225 + mac-address e8:c7:cf:63:f4:ce + } + static-mapping panasonic-heat-pump-masterbedroom { + ip-address 192.168.2.227 + mac-address e8:c7:cf:54:df:70 + } + static-mapping sonoff-ifan02-bed2-7042 { + ip-address 192.168.2.114 + mac-address 60:01:94:ac:db:82 + } + static-mapping sony-playstation4 { + ip-address 192.168.2.19 + mac-address 0c:fe:45:4e:3c:28 + } + static-mapping squeezelite-8a390 { + ip-address 192.168.2.221 + mac-address 24:0a:c4:8a:03:90 + } + static-mapping tasmota-athbulb-2152-1 { + ip-address 192.168.2.121 + mac-address 80:64:6f:9e:28:68 + } + static-mapping tasmota-lc4chan-7725-loungedisplay { + ip-address 192.168.2.148 + mac-address d8:bf:c0:fc:3e:2d + } + static-mapping tasmo-H801-4469-outsideent_lights { + ip-address 192.168.2.125 + mac-address 60:01:94:6f:91:75 + } + static-mapping tasmo-H801-loungeled1-6180-6180 { + ip-address 192.168.2.70 + mac-address 60:01:94:6f:98:24 + } + static-mapping tasmo-arlecrgb-3522-bulb-3-2522 { + ip-address 192.168.2.60 + mac-address ec:fa:bc:72:c9:da + } + static-mapping tasmo-arlec-1923-bulb-2-1923 { + ip-address 192.168.2.117 + mac-address f4:cf:a2:55:c7:83 + } + static-mapping tasmo-arlec-6600-bulb-1-6600 { + ip-address 192.168.2.97 + mac-address f4:cf:a2:5d:19:c8 + } + static-mapping tasmo-hw622-5799-netcupboardfan { + ip-address 192.168.2.64 + mac-address 50:02:91:5f:d6:a7 + } + static-mapping tasmo-ifan02-3793-bedrm1-1 { + ip-address 192.168.2.101 + mac-address 84:0D:8E:47:AE:D1 + } + static-mapping tasmo-ifan03-2541-foxholekitchen { + ip-address 192.168.2.105 + mac-address dc:4f:22:b0:49:ed + } + static-mapping tasmo-kkettle-3773-portable-377 { + ip-address 192.168.2.112 + mac-address e8:68:e7:60:6e:bd + } + static-mapping tasmo-ks811d-1043-hallway-2 { + ip-address 192.168.2.81 + mac-address 2c:f4:32:06:e4:13 + } + static-mapping tasmo-ks811d-1242-entrance-1242 { + ip-address 192.168.2.118 + mac-address 40:f5:20:e0:44:da + } + static-mapping tasmo-ks811d-1701-stairs-2 { + ip-address 192.168.2.86 + mac-address 48:3f:da:16:86:a8 + } + static-mapping tasmo-ks811d-2552-lounge-2-2552 { + ip-address 192.168.2.138 + mac-address 8c:aa:b5:e0:29:f8 + } + static-mapping tasmo-ks811d-3777-bedrm2-1-3777 { + ip-address 192.168.2.77 + mac-address dc:4f:22:72:0e:c1 + } + static-mapping tasmo-ks811d-4381-stairs-1 { + ip-address 192.168.2.82 + mac-address 48:3f:da:16:51:20 + } + static-mapping tasmo-ks811d-5613-lounge-4 { + ip-address 192.168.2.67 + mac-address 8c:aa:b5:df:f5:ed + } + static-mapping tasmo-ks811d-7244-bdrm3-1-7244 { + ip-address 192.168.2.84 + mac-address cc:50:e3:ee:5c:4c + } + static-mapping tasmo-ks811d-7449-mainbath-2 { + ip-address 192.168.2.151 + mac-address 8c:aa:b5:e0:7d:19 + } + static-mapping tasmo-ks811d-7749-hallway-3-774 { + ip-address 192.168.2.85 + mac-address cc:50:e3:ee:5e:45 + } + static-mapping tasmo-ks811s-2940-hallway-1-294 { + ip-address 192.168.2.80 + mac-address 50:02:91:43:0b:7c + } + static-mapping tasmo-ks811s-3075-lounge-1-3075 { + ip-address 192.168.2.98 + mac-address ec:fa:bc:5c:4c:03 + } + static-mapping tasmo-ks811s-3136-downstbed2-1- { + ip-address 192.168.2.75 + mac-address 50:02:91:43:0c:40 + } + static-mapping tasmo-ks811s-3211-lounge-2 { + ip-address 192.168.2.107 + mac-address ec:fa:bc:5c:4c:8b + } + static-mapping tasmo-ks811s-3491-downstloun-1 { + ip-address 192.168.2.73 + mac-address 50:02:91:43:0d:a3 + } + static-mapping tasmo-ks811t-0702-lounge-3-0702 { + ip-address 192.168.2.116 + mac-address 24:62:ab:05:a2:be + } + static-mapping tasmo-ks811t-0707-lounge-2 { + ip-address 192.168.2.83 + mac-address 24:62:ab:05:a2:c3 + } + static-mapping tasmo-ks811t-0804-bedrm2-2 { + ip-address 192.168.2.141 + mac-address 24:62:ab:05:a3:24 + } + static-mapping tasmo-ks811t-3647-bedrm1-1 { + ip-address 192.168.2.78 + mac-address 84:F3:EB:EC:6E:3F + } + static-mapping tasmo-ks811t-3680-bedrm1-2-3680 { + ip-address 192.168.2.95 + mac-address 84:f3:eb:ec:6e:60 + } + static-mapping tasmo-ks811t-4658-lounge-5 { + ip-address 192.168.2.66 + mac-address 84:cc:a8:8c:52:32 + } + static-mapping tasmo-mhled-4905-loungecupboard { + ip-address 192.168.2.109 + mac-address c4:4f:33:d2:53:29 + } + static-mapping tasmo-mhled-5012-breakfastbar { + ip-address 192.168.2.89 + mac-address 24:62:ab:6e:d3:94 + } + static-mapping tasmo-mhled-5436-bookshelves { + ip-address 192.168.2.102 + mac-address 24:62:ab:6e:d5:3c + } + static-mapping tasmo-nspnl-2044-lounge-1-2044 { + ip-address 192.168.2.149 + mac-address 24:d7:eb:0d:e7:fc + } + static-mapping tasmo-ptled-1540-bed3leds { + ip-address 192.168.2.126 + mac-address ac:0b:fb:d3:86:04 + } + static-mapping tasmo-ptled-7673-leds { + ip-address 192.168.2.127 + mac-address ac:0b:fb:d3:1d:f9 + } + static-mapping tasmo-s4chan-7594-garage-1-7594 { + ip-address 192.168.2.92 + mac-address 60:01:94:88:dd:aa + } + static-mapping tasmo-sbasic-5264-garageextlight-1 { + ip-address 192.168.2.87 + mac-address 2c:3a:e8:0f:54:90 + } + static-mapping tasmo-sbas-0407-garagelight-040 { + ip-address 192.168.2.111 + mac-address 5c:cf:7f:3b:c1:97 + } + static-mapping tasmo-sbas-3598-officegpo-2-359 { + ip-address 192.168.2.63 + mac-address 2c:3a:e8:0f:4e:0e + } + static-mapping tasmo-sbas-5072-cupboard1-5072 { + ip-address 192.168.2.94 + mac-address 5c:cf:7f:bb:13:d0 + } + static-mapping tasmo-sbas-7363-officemultiusb- { + ip-address 192.168.2.99 + mac-address 5c:cf:7f:3b:bc:c3 + } + static-mapping tasmo-sdev-0501-laundryenv { + ip-address 192.168.2.124 + mac-address 5c:cf:7f:92:41:f5 + } + static-mapping tasmo-sdev-0778-switch-2-0778 { + ip-address 192.168.2.91 + mac-address 5c:cf:7f:92:43:0a + } + static-mapping tasmo-sdev-8126-gasheater { + ip-address 192.168.2.103 + mac-address 5c:cf:7f:92:3f:be + } + static-mapping tasmo-sdual-4231-underhouselights { + ip-address 192.168.2.122 + mac-address 60:01:94:84:70:87 + } + static-mapping tasmo-slusb-0768-1 { + ip-address 192.168.2.72 + mac-address 2c:f4:32:e5:23:00 + } + static-mapping tasmo-sonrf-0022 { + ip-address 192.168.2.115 + mac-address 60:01:94:8b:60:16 + } + static-mapping tasmo-spow-1957-laundrywash-195 { + ip-address 192.168.2.69 + mac-address 5c:cf:7f:b4:a7:a5 + } + static-mapping tasmo-spow-5526-laundrydry { + ip-address 192.168.2.88 + mac-address 5c:cf:7f:92:35:96 + } + static-mapping tasmo-spow-5747-poolpump-5747 { + ip-address 192.168.2.93 + mac-address 5c:cf:7f:a0:36:73 + } + static-mapping tasmo-wemosd1-7280-powermon-1-7 { + ip-address 192.168.2.96 + mac-address 2c:f4:32:4b:bc:70 + } + static-mapping tasmo-wemoskogan-5020-powermon- { + ip-address 192.168.2.119 + mac-address 2c:f4:32:4b:33:9c + } + static-mapping tasmo-ytfir-a25e21-office-1-771 { + ip-address 192.168.2.113 + mac-address e0:98:06:a2:5e:21 + } + static-mapping tasmo-zigb-6440-1 { + ip-address 192.168.2.104 + mac-address 84:cc:a8:9c:99:28 + } + static-mapping tuya-kogan-smartplug-1-A8F5 { + ip-address 192.168.2.157 + mac-address d4:a6:51:2a:a8:f5 + } + static-mapping tuya-kogan-smartplug-2-C39A { + ip-address 192.168.2.158 + mac-address d4:a6:51:2a:c3:9a + } + static-mapping wled-1-loungedisplay { + ip-address 192.168.2.180 + mac-address 5c:cf:7f:06:53:6d + } + } + } + shared-network-name temp_LAN4 { + authoritative disable + subnet 172.31.0.0/16 { + default-router 172.31.4.25 + dns-server 172.31.4.25 + lease 86400 + start 172.31.25.1 { + stop 172.31.25.254 + } + static-mapping homeassistant { + ip-address 172.31.6.42 + mac-address 44:8a:5b:b6:41:58 + } + static-mapping openhasp_lounge1 { + ip-address 172.31.8.2 + mac-address 98:a3:16:e7:ea:fc + } + } + } + static-arp disable + use-dnsmasq enable + } + dns { + forwarding { + cache-size 150 + listen-on eth1 + listen-on pppoe0 + listen-on switch0 + listen-on eth3 + } + } + gui { + http-port 80 + https-port 443 + older-ciphers enable + } + mdns { + repeater { + interface eth1 + interface switch0 + interface eth3 + interface eth4 + interface eth2 + } + } + nat { + rule 5010 { + description "masquerade for WAN" + log disable + outbound-interface pppoe0 + protocol all + source { + group { + address-group LAN_Interfaces_for_NAT + } + } + type masquerade + } + } + snmp { + community { + authorization ro + client 172.31.6.42 + } + listen-address 192.168.1.25 { + port 161 + } + } + ssh { + port 22 + protocol-version v2 + } + unms { + disable + } +} +system { + analytics-handler { + send-analytics-report false + } + crash-handler { + send-crash-report false + } + domain-name foxhome + host-name ubnt + ipv6 { + } + login { + user automated_rules { + authentication { + encrypted-password + plaintext-password "" + public-keys edgerouterfirewall { + key AAAAB3NzaC1yc2EAAAADAQABAAABgQDCtS6cCLDEXkVTYkh0ihU3YZ5pGh5ehgr2OJjC7Vwf3cA+ppWqVYVvVnV0UguLEqOLFGBKbgQ9izrz29aDVhFfGfoL3n/6zf5YbMOwbh2K8xgK3lZYhTOcW0wO/nBsI2bU2UNgNbl2wVQ90M0bc629mRgp3FDX0sekDYmOBsXw84uEkk38+eyGuI38oBMEZiVOgF4OAnd1KG5eWgH20ygEIqSYHAeCR24xLKUWJj+wds2JOFasAc1bAGEN3rG2dau94z8g0X1a728pVyrPcfl6hcSuAUfgbX2vfa4tAoe4KBEIRroW8SIFhPqtFO6XG2bX/vjHOQfzTfpSz9P1OjMvEBlt2OEYHJiKBldGgIipJO7tX+LolmYbdOOHWY9kxQv6ecTvZ8Jli7hxzxqwCdwn37XHP+ND09HGMP9GuxRCwpIXCMgOGi+9R/bjB7HQ340QNq4gawxjsPt/8ho0MIUbmv5m2nMZE0EQSpkefjtAscs8Od6pnl5g3xqplAsdSuM= + type ssh-rsa + } + public-keys linux { + key AAAAB3NzaC1yc2EAAAADAQABAAABgQDCtS6cCLDEXkVTYkh0ihU3YZ5pGh5ehgr2OJjC7Vwf3cA+ppWqVYVvVnV0UguLEqOLFGBKbgQ9izrz29aDVhFfGfoL3n/6zf5YbMOwbh2K8xgK3lZYhTOcW0wO/nBsI2bU2UNgNbl2wVQ90M0bc629mRgp3FDX0sekDYmOBsXw84uEkk38+eyGuI38oBMEZiVOgF4OAnd1KG5eWgH20ygEIqSYHAeCR24xLKUWJj+wds2JOFasAc1bAGEN3rG2dau94z8g0X1a728pVyrPcfl6hcSuAUfgbX2vfa4tAoe4KBEIRroW8SIFhPqtFO6XG2bX/vjHOQfzTfpSz9P1OjMvEBlt2OEYHJiKBldGgIipJO7tX+LolmYbdOOHWY9kxQv6ecTvZ8Jli7hxzxqwCdwn37XHP+ND09HGMP9GuxRCwpIXCMgOGi+9R/bjB7HQ340QNq4gawxjsPt/8ho0MIUbmv5m2nMZE0EQSpkefjtAscs8Od6pnl5g3xqplAsdSuM==edgerouterfirewall + type ssh-rsa + } + } + full-name automated_rules + level admin + } + user homeassistant { + authentication { + encrypted-password + plaintext-password "" + } + full-name zorruno + level operator + } + user zorruno { + authentication { + encrypted-password + plaintext-password "" + public-keys donkey { + key AAAAB3NzaC1yc2EAAAADAQABAAABgQDusoL6L/UtdQLswOlF/RQMjx1FGnM6lbjYVfnM9vWGHPg5m0Adx0SQQOIL4oAIj1UwJOvkzXl9UxvyW4rGjJGpkWeypGRcwJeoO3RcnjSHBNKz2IwMaMyRzqQL9GqMa9FvAzQVzk6ndDkBgQoNfn3oeid1PxSCbt6qDfVGqOWlTHUbRrgMlulwq3nkjHWFtu45i0VcySZYSl3byWuc/xpx6SWz0otVuXEzD+pc2PSO67kLNGPxE/Jq4FS8YWQszyw1yWg/rw9QNS+ft8cc0KkxjXjUTjuYMpdcMyLLrq+dgzcB8vUTcYMZx1L5gtBLDqEOK6wPLQgjauPdUPxw7xgQwrB2BXY3U+z+AzQHMu/EFoLtZiYOhyMaWS4xwiERzGbw0M6fb9YXjLo2nK3HlXNuwqka0fptHv3HFNoTMqzRJ5arukaEdqDZIsTI/myan7p8Sq9sqnu3MqFmoCkOjTaNBofDXwRsR1FAJwAzCmVq4ucSUQqYt87Ybjn/LHLvDU0== + type ssh-rsa + } + public-keys howard@donkey { + key AAAAB3NzaC1yc2EAAAADAQABAAABgQCiGMm9Tsm108FmXFM86NQwVKJgEg3U+QPTzde0UXj11rCnDkVHM4JmfgZ6qGbQbeYF0IZ7/Rx3lncS7v6VQ1Mg75uEmSy9U8TfYDKnYb97RhK8rD8oFCJjekF1q9zLP2oWI9zlVNkwO8YTZy/5KvJxgzI9THx60RlNieMgUzAma7FtUsuYniPlUfle92I9s4BFHIp/9kDhTBxVUUofU01+JPWceAdVyzaEp651z5Vxzpce8iLkoXyw86tWb6jCDHo4K9nDsIqYzMTqSJXcM00Ak5ZU7ZTpI/6xs1P5K0nvz8Oi1QRHYEhZivEdpAgPHR2ldPi2Nkh7f2+1mi5iT8ytunrpk24Qj4ePQqzNkl8NNue5dlsLLyBpiIpa4DNyT3x2XV5mQtruSixZn/bTX0LidviYBJulKfZm2/Wd0Z1xfpmB+Iid3vXuv4j8YdhCLiDj7jmU0O3qD+1SiAOHeL/7KvxLCn00JhsSOYbOBR33sVWlRIPUji3a1qUOEr7VxdM= + type ssh-rsa + } + } + full-name zorruno + level admin + } + } + name-server 127.0.0.1 + name-server 8.8.8.8 + ntp { + server 0.ubnt.pool.ntp.org { + } + server 1.ubnt.pool.ntp.org { + } + server 2.ubnt.pool.ntp.org { + } + server 3.ubnt.pool.ntp.org { + } + } + offload { + hwnat enable + ipsec enable + } + package { + repository blacklist { + components main + description "Britannic blacklist debian stretch repository" + distribution stretch + password "" + url https://raw.githubusercontent.com/britannic/debian-repo/master/blacklist/public/ + username "" + } + } + static-host-mapping { + host-name homeassistant.local { + alias homeassistant + inet 192.168.1.42 + } + host-name panda.foxhome3 { + alias panda + inet 192.168.3.200 + } + } + syslog { + global { + facility all { + level notice + } + facility protocols { + level debug + } + } + } + task-scheduler { + task update_blacklists { + executable { + arguments 10800 + path /config/scripts/update-dnsmasq-cronjob.sh + } + interval 1d + } + } + time-zone Pacific/Auckland + traffic-analysis { + dpi enable + export enable + } +} + + +/* Warning: Do not remove the following line. */ +/* === vyatta-config-version: "config-management@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:firewall@5:ipsec@5:nat@3:qos@1:quagga@2:suspend@1:system@5:ubnt-l2tp@1:ubnt-pptp@1:ubnt-udapi-server@1:ubnt-unms@2:ubnt-util@1:vrrp@1:vyatta-netflow@1:webgui@1:webproxy@1:zone-policy@1" === */ +/* Release version: v3.0.1.5862409.250924.1407 */ diff --git a/esphome/.device-builder.json b/esphome/.device-builder.json index afe78fb..22fe814 100644 --- a/esphome/.device-builder.json +++ b/esphome/.device-builder.json @@ -308,6 +308,626 @@ "mac_address": "88:13:BF:68:39:2C" }, "_firmware_jobs": [ + { + "job_id": "5cfc6d1dc02a", + "configuration": "esp-masterbdrmwest.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T09:03:34.013797+00:00", + "started_at": "2026-07-20T09:08:58.549201+00:00", + "completed_at": "2026-07-20T09:09:08.270080+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "f5ecdaeb1d69", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "f5ecdaeb1d69", + "configuration": "esp-masterbdrmwest.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T09:03:34.013755+00:00", + "started_at": "2026-07-20T09:06:19.511859+00:00", + "completed_at": "2026-07-20T09:08:58.540276+00:00", + "compile_started_at": "2026-07-20T09:06:25.930377+00:00", + "compile_ended_at": "2026-07-20T09:08:56.990920+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "b04d7383a73f", + "configuration": "esp-masterbdrmsouth.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T09:03:22.968319+00:00", + "started_at": "2026-07-20T09:06:19.501552+00:00", + "completed_at": "2026-07-20T09:06:30.078899+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "9617094cc6a6", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "9617094cc6a6", + "configuration": "esp-masterbdrmsouth.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T09:03:22.968271+00:00", + "started_at": "2026-07-20T09:03:22.970233+00:00", + "completed_at": "2026-07-20T09:06:19.493744+00:00", + "compile_started_at": "2026-07-20T09:03:28.138116+00:00", + "compile_ended_at": "2026-07-20T09:06:17.090328+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "b427c2a8499e", + "configuration": "esp-downstkitchlights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:48:16.496050+00:00", + "started_at": "2026-07-20T08:50:45.500555+00:00", + "completed_at": "2026-07-20T08:50:56.441411+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "16e36ad6f796", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "16e36ad6f796", + "configuration": "esp-downstkitchlights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:48:16.495987+00:00", + "started_at": "2026-07-20T08:48:16.498296+00:00", + "completed_at": "2026-07-20T08:50:45.497048+00:00", + "compile_started_at": "2026-07-20T08:48:21.877738+00:00", + "compile_ended_at": "2026-07-20T08:50:43.966593+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "736f6141ba91", + "configuration": "esp-downstloungemain.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:41:47.799198+00:00", + "started_at": "2026-07-20T08:44:47.438272+00:00", + "completed_at": "2026-07-20T08:44:57.932070+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "085d3fabdcb5", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "085d3fabdcb5", + "configuration": "esp-downstloungemain.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:41:47.799134+00:00", + "started_at": "2026-07-20T08:41:47.806247+00:00", + "completed_at": "2026-07-20T08:44:47.429014+00:00", + "compile_started_at": "2026-07-20T08:41:52.853397+00:00", + "compile_ended_at": "2026-07-20T08:44:45.722370+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "28dee800d7c2", + "configuration": "esp-officeusbhubpower.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:33:05.411299+00:00", + "started_at": "2026-07-20T08:35:36.156794+00:00", + "completed_at": "2026-07-20T08:36:01.696597+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "e4e258aa612f", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "e4e258aa612f", + "configuration": "esp-officeusbhubpower.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:33:05.411253+00:00", + "started_at": "2026-07-20T08:33:05.416522+00:00", + "completed_at": "2026-07-20T08:35:36.152979+00:00", + "compile_started_at": "2026-07-20T08:33:19.152039+00:00", + "compile_ended_at": "2026-07-20T08:35:34.655962+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "dbb56801323f", + "configuration": "esp-downstairskitchleds.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:18:45.106585+00:00", + "started_at": "2026-07-20T08:21:23.046877+00:00", + "completed_at": "2026-07-20T08:21:32.148501+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "89d79d494317", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "89d79d494317", + "configuration": "esp-downstairskitchleds.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:18:45.106479+00:00", + "started_at": "2026-07-20T08:18:45.113570+00:00", + "completed_at": "2026-07-20T08:21:23.043426+00:00", + "compile_started_at": "2026-07-20T08:18:49.360681+00:00", + "compile_ended_at": "2026-07-20T08:21:21.490071+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "d576416094cf", + "configuration": "esp-bedrm1arlecbulb.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:10:46.656756+00:00", + "started_at": "2026-07-20T08:13:29.746975+00:00", + "completed_at": "2026-07-20T08:13:40.396735+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "27302f6523fa", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "27302f6523fa", + "configuration": "esp-bedrm1arlecbulb.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:10:46.656697+00:00", + "started_at": "2026-07-20T08:10:46.661566+00:00", + "completed_at": "2026-07-20T08:13:29.743338+00:00", + "compile_started_at": "2026-07-20T08:10:55.976946+00:00", + "compile_ended_at": "2026-07-20T08:13:28.202911+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "66f3405a34b1", + "configuration": "esp-breakfastbarleds.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T08:00:12.777131+00:00", + "started_at": "2026-07-20T08:02:50.531339+00:00", + "completed_at": "2026-07-20T08:03:05.328705+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "7096c1f5db87", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "7096c1f5db87", + "configuration": "esp-breakfastbarleds.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T08:00:12.777077+00:00", + "started_at": "2026-07-20T08:00:12.778226+00:00", + "completed_at": "2026-07-20T08:02:50.494861+00:00", + "compile_started_at": "2026-07-20T08:00:16.967400+00:00", + "compile_ended_at": "2026-07-20T08:02:49.024614+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "44e005ab28f0", + "configuration": "esp-loungecabinetleds.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T07:46:59.158167+00:00", + "started_at": "2026-07-20T07:49:53.770447+00:00", + "completed_at": "2026-07-20T07:50:02.783804+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "d43d5a1893bb", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "d43d5a1893bb", + "configuration": "esp-loungecabinetleds.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T07:46:59.158093+00:00", + "started_at": "2026-07-20T07:46:59.167588+00:00", + "completed_at": "2026-07-20T07:49:53.764283+00:00", + "compile_started_at": "2026-07-20T07:47:03.437943+00:00", + "compile_ended_at": "2026-07-20T07:49:52.276749+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "5140540630af", + "configuration": "esp-loungebookshelfleds.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-07-20T07:30:29.625862+00:00", + "started_at": "2026-07-20T07:33:19.760662+00:00", + "completed_at": "2026-07-20T07:33:34.495897+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 0, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "f2a3a74432bb", + "dependency_released": true, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, + { + "job_id": "f2a3a74432bb", + "configuration": "esp-loungebookshelfleds.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-07-20T07:30:29.625809+00:00", + "started_at": "2026-07-20T07:30:29.631255+00:00", + "completed_at": "2026-07-20T07:33:19.756329+00:00", + "compile_started_at": "2026-07-20T07:30:43.542928+00:00", + "compile_ended_at": "2026-07-20T07:33:18.264623+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "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": "", + "target_esphome_version": "", + "failure_reason": "" + }, { "job_id": "73f5241b3ffb", "configuration": "esp-reterminal-e1001.yaml", @@ -1517,68 +2137,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "ff244f220584", - "configuration": "esp-officeusbhubpower.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-24T11:50:26.904336+00:00", - "started_at": "2026-06-24T14:21:34.990710+00:00", - "completed_at": "2026-06-24T14:21:47.199113+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "7e346e30ea89", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "7e346e30ea89", - "configuration": "esp-officeusbhubpower.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-24T11:50:26.904301+00:00", - "started_at": "2026-06-24T14:18:28.824836+00:00", - "completed_at": "2026-06-24T14:21:34.989852+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "51cb8f902478", "configuration": "esp-occupancyoffice.yaml", @@ -2881,130 +3439,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "d2d3b330e2d6", - "configuration": "esp-loungecabinetleds.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-24T11:48:06.677575+00:00", - "started_at": "2026-06-24T12:57:43.781432+00:00", - "completed_at": "2026-06-24T12:57:52.144522+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "9bf3f1ea0c1b", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "9bf3f1ea0c1b", - "configuration": "esp-loungecabinetleds.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-24T11:48:06.677539+00:00", - "started_at": "2026-06-24T12:54:25.676460+00:00", - "completed_at": "2026-06-24T12:57:43.777736+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "ecb7fbae380d", - "configuration": "esp-loungebookshelfleds.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-24T11:48:01.942230+00:00", - "started_at": "2026-06-24T12:54:25.659385+00:00", - "completed_at": "2026-06-24T12:54:36.106800+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "139efa28f4cf", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "139efa28f4cf", - "configuration": "esp-loungebookshelfleds.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-24T11:48:01.942189+00:00", - "started_at": "2026-06-24T12:50:56.804405+00:00", - "completed_at": "2026-06-24T12:54:25.658460+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "6b7ad893bea2", "configuration": "esp-ledmatrix1.yaml", @@ -3811,68 +4245,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "c0441f500aba", - "configuration": "esp-breakfastbarleds.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-24T11:46:20.681040+00:00", - "started_at": "2026-06-24T11:49:58.512648+00:00", - "completed_at": "2026-06-24T11:50:09.188769+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "3187da75fea4", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "3187da75fea4", - "configuration": "esp-breakfastbarleds.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-24T11:46:20.680999+00:00", - "started_at": "2026-06-24T11:46:20.681902+00:00", - "completed_at": "2026-06-24T11:49:58.505113+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "639845a1773f", "configuration": "esp-datacupboardpower-right.yaml", @@ -4183,130 +4555,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "dfabed27adf5", - "configuration": "esp-masterbdrmwest.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-12T10:19:14.926585+00:00", - "started_at": "2026-06-12T10:22:25.692593+00:00", - "completed_at": "2026-06-12T10:22:49.018883+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "b03c87e5954e", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "b03c87e5954e", - "configuration": "esp-masterbdrmwest.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-12T10:19:14.926538+00:00", - "started_at": "2026-06-12T10:20:08.467305+00:00", - "completed_at": "2026-06-12T10:22:25.683155+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "0dc6aca98f76", - "configuration": "esp-masterbdrmsouth.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-12T10:17:56.852471+00:00", - "started_at": "2026-06-12T10:20:08.462596+00:00", - "completed_at": "2026-06-12T10:20:24.266523+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "b299a38f73d6", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "b299a38f73d6", - "configuration": "esp-masterbdrmsouth.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-12T10:17:56.852426+00:00", - "started_at": "2026-06-12T10:17:56.853172+00:00", - "completed_at": "2026-06-12T10:20:08.461368+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "0a4602631e6e", "configuration": "esp-nspanel1masterbdrm.yaml", @@ -4400,68 +4648,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "af97c828d58a", - "configuration": "esp-downstkitchlights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-06-05T04:25:30.974561+00:00", - "started_at": "2026-06-05T04:25:44.710401+00:00", - "completed_at": "2026-06-05T04:25:58.902563+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "OTA", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "bd7bbeb99660", - "dependency_released": true, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "bd7bbeb99660", - "configuration": "esp-downstkitchlights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-06-05T04:25:30.974521+00:00", - "started_at": "2026-06-05T04:25:30.977331+00:00", - "completed_at": "2026-06-05T04:25:44.702151+00:00", - "compile_started_at": null, - "compile_ended_at": null, - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "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": "", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "c7846a63cc3b", "configuration": "esp-ledmatrix1.yaml", diff --git a/packages/16a_ev_charging_controls.yaml b/packages/16a_ev_charging_controls.yaml index ba7a74b..fe64b09 100644 --- a/packages/16a_ev_charging_controls.yaml +++ b/packages/16a_ev_charging_controls.yaml @@ -4,17 +4,60 @@ # PACKAGE: 16A EV Charger Control ############################################################################### # +# FILE: +# packages/16a_ev_charging_controls.yaml +# # VERSION: +# V1.2 2026-07-20 +# - Added structured mode, timing, and restart behavior documentation. +# # V1.1 2026-05-15 # - Reworked 1hr topup logic to use a hard deadline and watchdog. # - Removed dependency on timer.finished event for relay shutoff. # - Offpeak until charged now continues past offpeak end until charging stops. -# - 1hr topup now now rolls into Normal Offpeak if the hour ends during +# - 1hr topup now rolls into Normal Offpeak if the hour ends during # the offpeak window, without switching the relay off and back on. # # V1.0 2026-05-11 # - Initial package for 16A EV charger offpeak and charge-until-full control. # +# PURPOSE: +# Controls the Leaf 16A charger relay using scheduled offpeak operation and +# user-selectable immediate or charge-until-full modes. +# +# DEPENDENCIES: +# - switch.garage_db_control_16a_wallcharger_operation controls charger power. +# - binary_sensor.garage_db_control_16a_wallcharger_charging reports whether +# the vehicle is actively charging. +# +# CHARGE MODES: +# - Normal (Offpeak) turns the relay on and off at the configured offpeak +# start and end times. Selecting this mode takes no immediate action. +# - Offpeak until charged starts at the offpeak time, or immediately if +# selected during offpeak, and may continue beyond offpeak end until the +# vehicle stops charging. +# - 1hr topup now turns the relay on immediately and records a hard deadline +# one hour ahead. +# - Charge now until full turns the relay on immediately and keeps it on until +# the vehicle stops charging. +# - Stop charging now turns the relay off immediately and returns the selector +# to Normal (Offpeak). +# +# TIMING AND COMPLETION: +# - Charge-until-full modes allow five minutes for charging to start. This +# also handles a vehicle that is already full. +# - Charging is considered complete after the charging sensor remains off for +# five minutes. +# - The one-hour topup deadline is stored in input_datetime and checked every +# minute and when Home Assistant starts. +# - If a topup ends during offpeak, the relay remains on and the mode returns +# to Normal (Offpeak), avoiding an off/on relay cycle. +# - Equal offpeak start and end times are interpreted as an all-day window. +# +# OPERATION NOTES: +# - Normal offpeak start and end use exact-time triggers. +# - There is no startup catch-up if Home Assistant is offline at either time. +# # PACKAGE SETTINGS: # Car display name: # - Leaf diff --git a/packages/Pool_Controls/pool_light_operation.yaml b/packages/Pool_Controls/pool_light_operation.yaml index a917c24..e304a6a 100644 --- a/packages/Pool_Controls/pool_light_operation.yaml +++ b/packages/Pool_Controls/pool_light_operation.yaml @@ -6,12 +6,16 @@ # Pool Light Operation # # FILE: -# packages/pool_light_boost_switch.yaml +# packages/Pool_Controls/pool_light_operation.yaml # # VERSION: -# V1.1 2026-06-29 +# V1.2 2026-07-20 # # VERSION HISTORY: +# V1.2 2026-07-20 +# - Corrected the documented package filename. +# - Documented the relationship with the native ESPHome controls. +# # V1.1 2026-06-29 # - Tidied layout, comments, naming and automation IDs. # - Added structured package header and section comments. @@ -38,8 +42,15 @@ # Operation topic: # viewroad-commands/poollight-timer/operation # +# DEPENDENCIES: +# - switch.esp_poollightpower2_switch provides the real output state. +# - The ESPHome pool light device subscribes to the MQTT operation topic. +# - Native ESPHome mode, boost, and pool-light-mode entities coexist with +# this one-tap control. +# # NOTES: # The input_boolean.timer_light_midnight_pending helper is internal to this package. +# Dashboard cards currently use input_boolean.poollights_mode_switch. # #:########################################################################################:# diff --git a/packages/Pool_Controls/pool_pump_operation.yaml b/packages/Pool_Controls/pool_pump_operation.yaml index ba1631e..01da89d 100644 --- a/packages/Pool_Controls/pool_pump_operation.yaml +++ b/packages/Pool_Controls/pool_pump_operation.yaml @@ -1,10 +1,68 @@ -# packages/poolpump_operation.yaml +#:########################################################################################:# +# Pool Pump Operation Package # +#:########################################################################################:# +# +# TITLE: +# Pool Pump Operation +# +# FILE: +# packages/Pool_Controls/pool_pump_operation.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured package documentation and section comments. +# - Documented the relationship with the native ESPHome controls. +# +# V1.0 +# - Initial package. +# - Provides a Home Assistant UI switch for pool pump BOOST / OFF behaviour. +# - Sends TIMER mode again at midnight when required. +# +# PURPOSE: +# Provides a one-tap Home Assistant UI switch for controlling the pool pump. +# +# Behaviour: +# - Turning the UI switch ON sends BOOST if the real pump output is OFF. +# - Turning the UI switch OFF sends OFF if the real pump output is ON. +# - After OFF is requested, TIMER mode is restored at midnight. +# - The UI switch follows the real ESPHome output without publishing MQTT. +# +# MQTT: +# Operation topic: +# viewroad-commands/poolpump-timer/operation +# +# Payloads used by this package: +# BOOST +# OFF +# TIMER +# +# DEPENDENCIES: +# - switch.esp_poolpumppower_power_output provides the real output state. +# - The ESPHome pool pump device subscribes to the MQTT operation topic. +# - Native ESPHome mode and boost entities coexist with this one-tap control. +# +# NOTES: +# - input_boolean.timer_midnight_pending is internal to this package. +# - Dashboard cards currently use input_boolean.poolpump_mode_switch. +# +#:########################################################################################:# + +#:########################################################################################:# +# Home Assistant Customisation # +#:########################################################################################:# homeassistant: customize: input_boolean.poolpump_mode_switch: icon: mdi:pump +#:########################################################################################:# +# Input Booleans # +#:########################################################################################:# + input_boolean: poolpump_mode_switch: name: "Pool Pump Operation" @@ -14,6 +72,10 @@ input_boolean: name: "Send TIMER at Midnight" initial: false +#:########################################################################################:# +# Automations # +#:########################################################################################:# + automation: - alias: "Pool Pump → send BOOST when user turns UI switch ON" trigger: diff --git a/packages/Pool_Controls/pool_timers_selections.yaml b/packages/Pool_Controls/pool_timers_selections.yaml index 4ce2b33..70d305d 100644 --- a/packages/Pool_Controls/pool_timers_selections.yaml +++ b/packages/Pool_Controls/pool_timers_selections.yaml @@ -6,12 +6,16 @@ # Pool Timer Selection # # FILE: -# pool_timer_selection.yaml +# packages/Pool_Controls/pool_timers_selections.yaml # # VERSION: -# V1.0 2026-06-29 +# V1.1 2026-07-20 # # VERSION HISTORY: +# V1.1 2026-07-20 +# - Corrected the documented package filename. +# - Documented command selectors versus ESPHome timer feedback. +# # V1.0 2026-06-29 # - Initial package. # - Adds Home Assistant input_select helpers for Pool Pump and Pool Light timer times. @@ -36,6 +40,16 @@ # # Payload format is HH:MM. # +# STATUS AND FEEDBACK: +# - These input_select helpers send retained MQTT commands to ESPHome. +# - They do not synchronize their displayed options from the ESPHome devices. +# - The ESPHome Timeclock sensors are authoritative for the currently applied +# timer values. +# - A selector displaying "Default" does not prove that the device currently +# uses its default time. +# - Native ESPHome mode controls coexist with this package, while timer +# schedule changes continue to use the MQTT topics above. +# # IMPORTANT: # The current ESPHome timer logic only handles same-day timer windows: # current_mins >= on_time AND current_mins < off_time diff --git a/packages/alexa_tplink_actions.yaml b/packages/alexa_tplink_actions.yaml index d0ac97c..a36f524 100644 --- a/packages/alexa_tplink_actions.yaml +++ b/packages/alexa_tplink_actions.yaml @@ -1,5 +1,52 @@ +#:########################################################################################:# +# Alexa TP-Link Guest Wi-Fi Package # +#:########################################################################################:# +# +# TITLE: +# Alexa TP-Link Guest Wi-Fi +# +# FILE: +# packages/alexa_tplink_actions.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation and automation descriptions. +# +# V1.0 +# - Initial Alexa-mediated TP-Link guest-network controls. +# +# PURPOSE: +# Enables or disables the TP-Link guest Wi-Fi network by sending custom Alexa +# requests through the kitchen Echo Show. +# +# DEPENDENCIES: +# - input_boolean.wifi_guest_network is a UI-managed helper that represents +# the requested guest-network state. +# - media_player.view_rd_kitchen_echo_show must be available through the Alexa +# Media Player integration. +# - The Alexa account must have a working, linked TP-Link skill. +# +# ALEXA REQUESTS: +# - On: ask t.p.link to enable guest network +# - Off: ask t.p.link to disable guest network +# +# OPERATION NOTES: +# - The helper records requested state; it does not confirm router state. +# - If Alexa or the TP-Link skill fails, the helper can disagree with the +# actual guest-network state. +# - After the helper remains on for two hours, it is turned off. That state +# change then sends the Alexa disable request. +# - The two-hour state-trigger period does not persist through a Home Assistant +# restart or automation reload. +# +#:########################################################################################:# + automation: - alias: "Turn on the Wifi Guest Network" + description: "Asks the linked TP-Link Alexa skill to enable the guest Wi-Fi network." mode: single triggers: - trigger: state @@ -14,6 +61,7 @@ automation: media_content_id: ask t.p.link to enable guest network - alias: "Turn off the Wifi Guest Network" + description: "Asks the linked TP-Link Alexa skill to disable the guest Wi-Fi network." mode: single triggers: - trigger: state @@ -28,6 +76,7 @@ automation: media_content_id: ask t.p.link to disable guest network - alias: "Switch guest network off after time" + description: "Turns off the guest-network helper after it remains on for two hours." mode: single triggers: - trigger: state diff --git a/packages/bedroom_1_ikea_air_filter.yaml b/packages/bedroom_1_ikea_air_filter.yaml index 8caae44..4bdc90d 100644 --- a/packages/bedroom_1_ikea_air_filter.yaml +++ b/packages/bedroom_1_ikea_air_filter.yaml @@ -1,8 +1,8 @@ ############################################################################### # Bedroom 1 Ikea Air Filter Package # File: /config/packages/bedroom_1_ikea_air_filter.yaml -# Version: 1.1 -# Date: 2026-05-08 +# Version: 1.2 +# Date: 2026-07-20 # # Purpose: # - Creates a dropdown helper called "Bedroom 1 Ikea Fan". @@ -11,7 +11,7 @@ # # Behaviour notes: # - Quiet time turning on sets fan speed to 2. -# - Bedside lamp turning on sets fan speed to 2. +# - Bedside lamp or Jump Fade control turning on sets fan speed to 2. # - Bedside lamp turning off does not change the fan speed. # - There is no 10-minute re-check, so the fan will not ramp back up just # because the bedside lamp was switched off. @@ -80,12 +80,16 @@ automation: entity_id: input_boolean.quiet_time to: "on" - # Bedside lamp only forces low when it turns on. - # Turning the lamp off does not change the fan speed. + # The lamp state catches direct light control. - trigger: state entity_id: light.master_bedroom_bedside_lamp_arlec_bulb_master_bedroom_bedside_lamp_arlec_bulb to: "on" + # The Jump Fade switch catches a bedside press while the lamp is already on. + - trigger: state + entity_id: switch.master_bedroom_bedside_lamp_arlec_bulb_master_bedroom_bedside_lamp_arlec_bulb_jump_fade_up_down + to: "on" + # Main timing boundaries. - trigger: time at: @@ -104,9 +108,10 @@ automation: - variables: trigger_entity: "{{ trigger.entity_id | default('') }}" bedside_lamp_entity: light.master_bedroom_bedside_lamp_arlec_bulb_master_bedroom_bedside_lamp_arlec_bulb + bedside_lamp_switch_entity: switch.master_bedroom_bedside_lamp_arlec_bulb_master_bedroom_bedside_lamp_arlec_bulb_jump_fade_up_down bedside_lamp_on_trigger: >- {{ - trigger_entity == bedside_lamp_entity + trigger_entity in [bedside_lamp_entity, bedside_lamp_switch_entity] and trigger.to_state is defined and trigger.to_state.state == 'on' }} diff --git a/packages/downstairs_bulk_lights_on_from_stairs.yaml b/packages/downstairs_bulk_lights_on_from_stairs.yaml index 4044b03..32f94ee 100644 --- a/packages/downstairs_bulk_lights_on_from_stairs.yaml +++ b/packages/downstairs_bulk_lights_on_from_stairs.yaml @@ -1,9 +1,9 @@ ################################################################################ # PACKAGE: Downstairs Lights Bulk Activation -# FILE: packages/downstairs_lights_bulk_activation.yaml +# FILE: packages/downstairs_bulk_lights_on_from_stairs.yaml # -# Version: 1.0 -# Date: 2026-04-26 +# Version: 1.1 +# Date: 2026-07-20 # # Notes: # - Uses the virtual switch: @@ -16,16 +16,16 @@ # Turns OFF the listed downstairs lights, but only if each light is currently ON. # # - No action is taken unless: -# input_boolean.downstairs_flat_occupied is ON. +# input_boolean.downstairs_flat_occupied is OFF. ################################################################################ automation: - id: downstairs_lights_bulk_activation alias: "Downstairs Lights Bulk Activation" description: > - V1.0 - 2026-04-26: Bulk ON/OFF control for downstairs lights from the + V1.1 - 2026-07-20: Bulk ON/OFF control for downstairs lights from the central stair lightswitch virtual switch. Only operates when the downstairs - flat occupied input_boolean is ON. + flat is not occupied. mode: single diff --git a/packages/firewall_control.yaml b/packages/firewall_control.yaml index d8f2436..38eefc3 100644 --- a/packages/firewall_control.yaml +++ b/packages/firewall_control.yaml @@ -1,3 +1,50 @@ +#:########################################################################################:# +# Firewall Internet Control Package # +#:########################################################################################:# +# +# TITLE: +# Firewall Internet Control +# +# FILE: +# packages/firewall_control.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured MQTT and external-firewall documentation. +# +# V1.0 +# - Initial persistent and temporary internet-blocking controls. +# +# PURPOSE: +# Provides Home Assistant controls for persistent and temporary internet +# blocking of Mollie's devices through an external MQTT firewall service. +# +# PERSISTENT CONTROL: +# - Blocked enables persistent internet blocking. +# - Unblocked disables persistent internet blocking. +# - The switch state is reported by the external firewall service. +# +# TEMPORARY CONTROLS: +# - One-hour block publishes Blocked to the temporary-block topic. +# - 15-minute unblock publishes Unblocked to the temporary-unblock topic. +# - One-hour unblock publishes Unblocked to its one-hour topic. +# +# EXTERNAL DEPENDENCY: +# - Home Assistant only publishes command requests. +# - The external firewall service implements temporary durations, restores the +# appropriate state afterward, and publishes persistent switch feedback. +# +# MQTT NOTES: +# - All commands are non-retained. +# - No availability topic is configured for these entities. +# - The persistent status topic retains the legacy device label +# block-unblock-mollie-iphone8. +# +#:########################################################################################:# + mqtt: switch: - unique_id: mollies.internet diff --git a/packages/grocy_api.yaml b/packages/grocy_api.yaml.old similarity index 100% rename from packages/grocy_api.yaml rename to packages/grocy_api.yaml.old diff --git a/packages/ha_summary.yaml b/packages/ha_summary.yaml index fc14d08..38b6cf9 100644 --- a/packages/ha_summary.yaml +++ b/packages/ha_summary.yaml @@ -1,11 +1,54 @@ #:########################################################################################:# -# Home Assistant Summary Package - V2 # +# Home Assistant Summary Package - V2 # #:########################################################################################:# # -# Uses V2 entity IDs to avoid stale/ghost entities from earlier versions. +# TITLE: +# Home Assistant Summary V2 # -# Dashboard entity prefix: -# sensor.ha_summary_v2_... +# FILE: +# packages/ha_summary.yaml +# +# VERSION: +# V2.1 2026-07-20 +# +# VERSION HISTORY: +# V2.1 2026-07-20 +# - Added structured documentation for refresh behavior and counting rules. +# - Documented heuristic classifications and their limitations. +# +# V2.0 +# - Introduced V2 entity IDs to avoid stale entities from earlier versions. +# +# PURPOSE: +# Provides dashboard summary sensors for Home Assistant entities, devices, +# areas, cameras, scenes, scripts, automations, add-ons, and updates. +# +# It also provides device and entity counts for ESPHome, Tasmota, ZHA, +# Zigbee2MQTT, Matter, and selected cloud integrations. +# +# OUTPUTS: +# Dashboard entity prefix: +# sensor.ha_summary_v2_... +# +# REFRESH: +# Sensors refresh when Home Assistant starts, when the entity, device, or area +# registries change, when core configuration changes, and every five minutes. +# +# COUNTING NOTES: +# - Total devices counts distinct device IDs associated with current entities. +# Devices without entities are not included. +# - Broken entities are entities whose state is unknown or unavailable. +# - Add-ons are inferred from Supervisor update entities, excluding the Core, +# Supervisor, and Operating System update entities. +# - Zigbee2MQTT devices and entities are identified by searching MQTT device +# metadata for "zigbee2mqtt". +# - Matter Wi-Fi and Thread classifications search device metadata for known +# transport terms. These are heuristics rather than authoritative transport +# data, and a device can match both categories. +# - Matter unclassified counts subtract Wi-Fi and Thread counts from totals, so +# overlapping classifications can affect the result. +# - Cloud counts use the explicit integration list in the final two sensors. +# Add or remove integration domains there when maintaining cloud coverage. # template: diff --git a/packages/heat_pump_master_bedroom_schedules.yaml b/packages/heat_pump_master_bedroom_schedules.yaml index 6b11a56..dbe301a 100644 --- a/packages/heat_pump_master_bedroom_schedules.yaml +++ b/packages/heat_pump_master_bedroom_schedules.yaml @@ -1,5 +1,57 @@ ########################################################################################## -# heat_pump_master_bedroom_schedules.yaml +# Master Bedroom Heat Pump Schedules +########################################################################################## +# +# TITLE: +# Master Bedroom Heat Pump Schedules +# +# FILE: +# packages/heat_pump_master_bedroom_schedules.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation for schedules, boost, and helper behavior. +# +# V1.0 +# - Initial master bedroom heat pump schedules and boost controls. +# +# PURPOSE: +# Provides optional 21:00 start and midnight stop schedules, a combined Night +# Power mode, and a manual one-hour boost for the master bedroom heat pump. +# +# DEPENDENCIES: +# - climate.master_bedroom provides the Panasonic Comfort Cloud heat pump. +# - The climate entity must support the "boost" and "none" preset modes. +# - packages/heat_pump_master_bedroom_helpers.yaml provides companion +# dashboard, setpoint, HVAC mode, profile, and sleep-timer controls. +# +# SCHEDULE MODES: +# - Night Power Mode turns the heat pump on at 21:00, applies boost for 30 +# minutes, returns it to the normal preset, and turns it off at midnight. +# - 9pm On turns the heat pump on at 21:00 without changing its preset. +# - Midnight Off turns the heat pump off at midnight. +# - Enabling Night Power disables the separate 9pm On and Midnight Off modes. +# - Enabling either separate mode disables Night Power. The separate 9pm On +# and Midnight Off modes may be enabled together. +# +# MANUAL BOOST: +# - script.master_bedroom_boost_1hr applies boost for one hour. +# - If the heat pump was off when boost started, it is turned off afterward. +# - If it was already running, boost ends by restoring the normal preset and +# leaving the heat pump running. +# +# INTERNAL STATE: +# - input_boolean.master_bedroom_boost_restore_off records whether manual +# boost should restore the heat pump to off. +# - timer.master_bedroom_boost_timer controls manual and scheduled boost time. +# +# OPERATION NOTES: +# - The 21:00 and midnight schedules use exact-time triggers. +# - There is no startup catch-up if Home Assistant is offline at either time. +# ########################################################################################## ########################################################################################## diff --git a/packages/lounge_lighting_scenes.yaml b/packages/lounge_lighting_scenes.yaml index 5a27207..b84d278 100644 --- a/packages/lounge_lighting_scenes.yaml +++ b/packages/lounge_lighting_scenes.yaml @@ -126,7 +126,7 @@ script: #switch.esp_loungemiddleswitch_relay_3_downlights_north: "on" switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "on" # non dimmable pair light.esp_breakfastbarleds_breakfast_bar_leds: 90 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 90 + light.esp_loungecabinetleds_lounge_cabinet_leds: 90 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 90 switch.lounge_cupboard_dual_usb_xus09_l2: "on" switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "on" @@ -146,7 +146,7 @@ script: light.esp_lounge6chdimmer_lounge_downlights_south: 60 light.esp_lounge6chdimmer_lounge_rafter_buttons: 40 light.esp_breakfastbarleds_breakfast_bar_leds: 60 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 60 + light.esp_loungecabinetleds_lounge_cabinet_leds: 60 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 60 #switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair @@ -167,7 +167,7 @@ script: light.esp_lounge6chdimmer_lounge_downlights_south: 40 light.esp_lounge6chdimmer_lounge_rafter_buttons: 30 light.esp_breakfastbarleds_breakfast_bar_leds: 50 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 50 + light.esp_loungecabinetleds_lounge_cabinet_leds: 50 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 50 #switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair @@ -188,7 +188,7 @@ script: light.esp_lounge6chdimmer_lounge_downlights_south: 30 light.esp_lounge6chdimmer_lounge_rafter_buttons: 0 light.esp_breakfastbarleds_breakfast_bar_leds: 40 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 40 + light.esp_loungecabinetleds_lounge_cabinet_leds: 40 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 40 #switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair @@ -228,7 +228,7 @@ script: light.esp_lounge6chdimmer_lounge_downlights_south: 0 light.esp_lounge6chdimmer_lounge_rafter_buttons: 0 light.esp_breakfastbarleds_breakfast_bar_leds: 5 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 5 + light.esp_loungecabinetleds_lounge_cabinet_leds: 5 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 5 #switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair @@ -246,7 +246,7 @@ script: light.esp_lounge6chdimmer_couch_spots_right: 20 light.esp_lounge6chdimmer_lounge_rafter_buttons: 15 light.esp_breakfastbarleds_breakfast_bar_leds: 25 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 30 + light.esp_loungecabinetleds_lounge_cabinet_leds: 30 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 30 #light.tasmo_h801_loungeled1_6180_a: 25 #light.tasmo_h801_loungeled1_6180_b: 25 @@ -270,7 +270,7 @@ script: #switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair light.esp_breakfastbarleds_breakfast_bar_leds: 0 - light.esp_loungecabinetleds2_lounge_cabinet_leds: 0 + light.esp_loungecabinetleds_lounge_cabinet_leds: 0 light.esp_loungebookshelfleds_lounge_bookshelf_leds: 0 switch.lounge_cupboard_dual_usb_xus09_l2: "off" switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off" diff --git a/packages/low_battery_device_quantity.yaml b/packages/low_battery_device_quantity.yaml index aad13a6..a05d570 100644 --- a/packages/low_battery_device_quantity.yaml +++ b/packages/low_battery_device_quantity.yaml @@ -1,3 +1,40 @@ +#:########################################################################################:# +# Low Battery Device Summary Package # +#:########################################################################################:# +# +# TITLE: +# Low Battery Device Summary +# +# FILE: +# packages/low_battery_device_quantity.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Changed the low-battery threshold from 97% to 20%. +# - Added structured documentation for scope, exclusions, and outputs. +# +# V1.0 +# - Initial low-battery count and list sensors. +# +# PURPOSE: +# Finds numeric sensor entities with device_class battery whose value is 20% +# or lower, then exposes a count and a human-readable device list. +# +# SCOPE AND EXCLUSIONS: +# - Only entities in the sensor domain with device_class battery are checked. +# - Unknown, unavailable, non-numeric, and "Ok" states are excluded. +# - Battery entities in other domains are not included. +# +# OUTPUTS: +# - sensor.devices_with_low_battery reports the number of matching sensors. +# - sensor.devices_with_low_battery_list reports names and percentages. +# - The list sensor also exposes count, entities, and names attributes. +# +#:########################################################################################:# + template: - sensor: - name: "Devices with low battery" @@ -9,7 +46,7 @@ template: {% if s.attributes.device_class == 'battery' %} {% set st = s.state %} {% if st not in ['unknown', 'unavailable', 'Ok'] %} - {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% if st | int(-1) != -1 and (st | int(0)) <= 20 %} {% set ns.c = ns.c + 1 %} {% endif %} {% endif %} @@ -37,7 +74,7 @@ template: {% if s.attributes.device_class == 'battery' %} {% set st = s.state %} {% if st not in ['unknown', 'unavailable', 'Ok'] %} - {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% if st | int(-1) != -1 and (st | int(0)) <= 20 %} {% set ns.names = ns.names + [s.name ~ ' (' ~ (st | int(0)) ~ '%)'] %} {% endif %} {% endif %} @@ -56,7 +93,7 @@ template: {% if s.attributes.device_class == 'battery' %} {% set st = s.state %} {% if st not in ['unknown', 'unavailable', 'Ok'] %} - {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% if st | int(-1) != -1 and (st | int(0)) <= 20 %} {% set ns.e = ns.e + [s.entity_id] %} {% endif %} {% endif %} @@ -69,7 +106,7 @@ template: {% if s.attributes.device_class == 'battery' %} {% set st = s.state %} {% if st not in ['unknown', 'unavailable', 'Ok'] %} - {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% if st | int(-1) != -1 and (st | int(0)) <= 20 %} {% set ns.n = ns.n + [s.name] %} {% endif %} {% endif %} diff --git a/packages/low_battery_device_quantity.yaml.bak b/packages/low_battery_device_quantity.yaml.bak new file mode 100644 index 0000000..aad13a6 --- /dev/null +++ b/packages/low_battery_device_quantity.yaml.bak @@ -0,0 +1,78 @@ +template: + - sensor: + - name: "Devices with low battery" + unique_id: devices_with_low_battery_count + unit_of_measurement: "devices" + state: > + {% set ns = namespace(c=0) %} + {% for s in states.sensor %} + {% if s.attributes.device_class == 'battery' %} + {% set st = s.state %} + {% if st not in ['unknown', 'unavailable', 'Ok'] %} + {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% set ns.c = ns.c + 1 %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {{ ns.c }} + icon: > + {% if this.state | int(0) == 0 %} + mdi:check-circle + {% else %} + mdi:battery-alert + {% endif %} + + - name: "Devices with low battery list" + unique_id: devices_with_low_battery_list + icon: > + {% if states('sensor.devices_with_low_battery') | int(0) == 0 %} + mdi:check-circle + {% else %} + mdi:battery-alert + {% endif %} + state: > + {% set ns = namespace(names=[]) %} + {% for s in states.sensor %} + {% if s.attributes.device_class == 'battery' %} + {% set st = s.state %} + {% if st not in ['unknown', 'unavailable', 'Ok'] %} + {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% set ns.names = ns.names + [s.name ~ ' (' ~ (st | int(0)) ~ '%)'] %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% if ns.names | length == 0 %} + None + {% else %} + {{ ns.names | join(', ') }} + {% endif %} + attributes: + count: "{{ states('sensor.devices_with_low_battery') | int(0) }}" + entities: > + {% set ns = namespace(e=[]) %} + {% for s in states.sensor %} + {% if s.attributes.device_class == 'battery' %} + {% set st = s.state %} + {% if st not in ['unknown', 'unavailable', 'Ok'] %} + {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% set ns.e = ns.e + [s.entity_id] %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {{ ns.e }} + names: > + {% set ns = namespace(n=[]) %} + {% for s in states.sensor %} + {% if s.attributes.device_class == 'battery' %} + {% set st = s.state %} + {% if st not in ['unknown', 'unavailable', 'Ok'] %} + {% if st | int(-1) != -1 and (st | int(0)) <= 97 %} + {% set ns.n = ns.n + [s.name] %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {{ ns.n }} diff --git a/packages/main_sony_tv_automations.yaml b/packages/main_sony_tv_automations.yaml index 1ca3acc..c9cabd5 100644 --- a/packages/main_sony_tv_automations.yaml +++ b/packages/main_sony_tv_automations.yaml @@ -1,7 +1,52 @@ +#:########################################################################################:# +# Main Sony TV Automations Package # +#:########################################################################################:# +# +# TITLE: +# Main Sony TV Automations +# +# FILE: +# packages/main_sony_tv_automations.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation and automation descriptions. +# +# V1.0 +# - Initial MQTT TV-off and surround-amplifier following automations. +# +# PURPOSE: +# Accepts an MQTT command to turn off the lounge TV and keeps the loft +# surround-amplifier power synchronized with the TV remote state. +# +# MQTT COMMAND: +# Topic: +# viewroad-commands/maintv/action +# +# Payload: +# OFF +# +# The payload is uppercase and this package does not provide an MQTT ON action. +# +# AMPLIFIER FOLLOWING: +# - remote.lounge_tv is the source-of-truth state for the amplifier. +# - The remote state must remain on or off for five seconds before action. +# - Restart mode cancels the previous wait when another state change occurs, +# preventing brief transitions from toggling amplifier power. +# +# DEPENDENCIES: +# - remote.lounge_tv controls and reports the Sony lounge TV state. +# - switch.tv_surround_amp_power_in_loft_x27pp controls amplifier power. +# +#:########################################################################################:# + automation: - id: "1669966515993" alias: Turn off Lounge TV - description: "" + description: "Turns off the lounge TV when the MQTT OFF command is received." trigger: - platform: mqtt topic: viewroad-commands/maintv/action @@ -16,6 +61,7 @@ automation: - id: tv_amp_follow_remote_state alias: Lounge surround amp follows TV remote (5s debounce) + description: "Follows the stable lounge TV remote state after a five-second debounce." mode: restart trigger: - platform: state diff --git a/packages/moonraker_3dprinter.yaml b/packages/moonraker_3dprinter.yaml index d8a7dde..2737535 100644 --- a/packages/moonraker_3dprinter.yaml +++ b/packages/moonraker_3dprinter.yaml @@ -1,4 +1,72 @@ -# === Add friendly names, icons, and area for printer controls === +#:########################################################################################:# +# Moonraker 3D Printer Package # +#:########################################################################################:# +# +# TITLE: +# Moonraker 3D Printer +# +# FILE: +# packages/moonraker_3dprinter.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation for setup, polling, outputs, and safety. +# - Recorded that the Creality printer is not currently connected. +# +# V1.0 +# - Initial Moonraker REST sensors, commands, and customizations. +# +# PURPOSE: +# Reads Klipper and Moonraker printer data and provides Home Assistant REST +# commands for controlling a Creality K1C 3D printer. +# +# CURRENT STATUS: +# - As of 2026-07-20, this configuration no longer connects to the printer. +# - It is retained as a reference for future reconnection work. +# - Before reconnecting, verify the printer address, Moonraker availability, +# queried Klipper object names, and companion template entities. +# +# DEPENDENCIES: +# - A reachable Moonraker server for the Klipper printer. +# - Current configured endpoint: http://192.168.2.31:7125 +# - Companion templates: templates/moonraker_3dprinter.yaml +# - The queried sensors and object names must match the Klipper configuration. +# +# POLLING: +# - Full printer status, printer info, and server data poll every second. +# - Current print file metadata polls every five seconds. +# +# RAW REST OUTPUTS: +# - sensor.printer_3d_sensor provides printer object status attributes. +# - sensor.printer_3d_info provides printer state and state message. +# - sensor.printer_3d_server provides Mainsail server configuration data. +# - sensor.printer_3d_file_metadata provides current-file metadata. +# - Companion templates derive user-facing sensors from these raw entities. +# +# CONTROLS: +# - Emergency stop immediately halts the printer. +# - Firmware restart restarts the Klipper firmware process. +# - Cancel stops the current print; pause and resume control print progress. +# +# SAFETY AND NETWORK: +# - Emergency stop, firmware restart, and cancel are disruptive actions and +# should only be exposed through dashboard controls with confirmation. +# - The configured endpoint uses unencrypted HTTP without authentication and +# assumes Moonraker is available only on a trusted local network. +# +# USER CONFIGURATION: +# - If the printer address changes, update every Moonraker URL in this file. +# - Confirm the filament and chamber sensor object names before reconnecting. +# +#:########################################################################################:# + +#:########################################################################################:# +# Home Assistant Customizations # +#:########################################################################################:# + homeassistant: customize: rest_command.3d_printer_emergency_stop: diff --git a/packages/office_media_buttons.yaml b/packages/office_media_buttons.yaml index 85ca457..9fa8abd 100644 --- a/packages/office_media_buttons.yaml +++ b/packages/office_media_buttons.yaml @@ -1,3 +1,49 @@ +#:########################################################################################:# +# Office Media Buttons Package # +#:########################################################################################:# +# +# TITLE: +# Office Media Buttons +# +# FILE: +# packages/office_media_buttons.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation and automation descriptions. +# - Identified the active ZHA implementation and disabled alternatives. +# +# V1.0 +# - Initial office media-button automations. +# +# PURPOSE: +# Controls office TV playback from a Zigbee media button using direct ZHA +# click events. +# +# ACTIVE BUTTON MAPPING: +# - Single press pauses playback. +# - Double press starts or resumes playback. +# - Triple press seeks backward by 30 seconds. +# +# DEPENDENCIES: +# - ZHA event source: device IEEE 00:15:8d:00:06:79:46:c8. +# - media_player.office_tv provides the current playback position. +# - The media actions target the office TV device registered in Home Assistant. +# +# NOTES: +# - seek_amount is not normally provided by the event and defaults to -30. +# - Commented MQTT and entity-state implementations below are disabled +# historical alternatives retained for reference. +# +#:########################################################################################:# + +#:########################################################################################:# +# Historical Disabled MQTT Sensor # +#:########################################################################################:# + #mqtt: # sensor: # - unique_id: office_media_button_1 @@ -6,10 +52,14 @@ # unit_of_measurement: "Press" # value_template: "{{ value_json.ZbReceived.Office_Media_Button.Power }}" +#:########################################################################################:# +# Active ZHA Automations # +#:########################################################################################:# + automation: - id: pause_office_tv_on_media_button alias: Pause Office TV on Media Button - description: "" + description: "Pauses the office TV when the media button is pressed once." trigger: - platform: event event_type: zha_event @@ -26,7 +76,7 @@ automation: mode: single - id: play_office_tv_on_media_button alias: Play Office TV on Media Button - description: "" + description: "Starts or resumes office TV playback when the media button is pressed twice." trigger: - platform: event event_type: zha_event @@ -43,7 +93,7 @@ automation: mode: single - id: seek_office_tv_on_media_button alias: Seek Office TV on Media Button - description: "" + description: "Seeks office TV playback backward 30 seconds when the media button is pressed three times." trigger: - platform: event event_type: zha_event @@ -62,6 +112,8 @@ automation: target: device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa mode: single + + # Historical disabled MQTT and entity-state alternatives. # - id: "1629271273958" # alias: Pause office TV on MQTT # description: "" @@ -90,6 +142,7 @@ automation: # seek_position: 30 # mode: single +# Historical disabled entity-state automation block. #automation: # - id: "1629271273952" # unique_id: pause_office_tv_on_media_button diff --git a/packages/outdoor_lighting_control.yaml b/packages/outdoor_lighting_control.yaml index 8bda922..95ec09b 100644 --- a/packages/outdoor_lighting_control.yaml +++ b/packages/outdoor_lighting_control.yaml @@ -3,6 +3,9 @@ ############################################################################### # # Version: +# 2026-07-20 v0.3 +# - Synchronized the documented Number 16 schedule with the implementation. +# # 2026-05-09 v0.2 # - Refactored scheduled control to use editable schedule lists. # - Switched lights now use explicit ON/OFF schedule entries instead of @@ -527,8 +530,8 @@ script: # EDIT SCHEDULE HERE # Format: trigger, offset_minutes/at, target_brightness, ramp_minutes # Current schedule: - # - sunset -30, 80, 30 - # - 20:00, 50, 30 + # - sunset -30, 60, 30 + # - 20:00, 50, 120 # - 01:00, 20, 120 # - 06:00, 0, 120 ########################################################################### diff --git a/packages/pet_feeding_and_jobs.yaml b/packages/pet_feeding_and_jobs.yaml index a69ca4d..9a15203 100644 --- a/packages/pet_feeding_and_jobs.yaml +++ b/packages/pet_feeding_and_jobs.yaml @@ -24,3 +24,37 @@ mqtt: name: "Hours Since DePooped" state_topic: "viewroad-tele/petfeeding/hoursSinceDePooped" unit_of_measurement: "Hours" + +template: + - sensor: + - name: "Jobs Tracker Hours Since Dog Fed" + unique_id: "jobs_tracker_hours_since_dog_fed" + device_class: duration + state_class: measurement + unit_of_measurement: "h" + icon: "mdi:dog-side" + availability: >- + {{ + state_attr('sensor.jobs_tracker_dog_feeding_morning', 'hours_since_completed') is not none + or state_attr('sensor.jobs_tracker_dog_feeding_evening', 'hours_since_completed') is not none + }} + state: >- + {{ + [ + state_attr('sensor.jobs_tracker_dog_feeding_morning', 'hours_since_completed') | float(999999), + state_attr('sensor.jobs_tracker_dog_feeding_evening', 'hours_since_completed') | float(999999) + ] + | min + | round(0) + }} + + - name: "Jobs Tracker Hours Since Dog Depooped" + unique_id: "jobs_tracker_hours_since_dog_depooped" + device_class: duration + state_class: measurement + unit_of_measurement: "h" + icon: "mdi:emoticon-poop" + availability: >- + {{ state_attr('sensor.jobs_tracker_dog_depooping', 'hours_since_completed') is not none }} + state: >- + {{ state_attr('sensor.jobs_tracker_dog_depooping', 'hours_since_completed') | float(none) }} diff --git a/packages/pet_feeding_and_jobs.yaml.bak b/packages/pet_feeding_and_jobs.yaml.bak new file mode 100644 index 0000000..a69ca4d --- /dev/null +++ b/packages/pet_feeding_and_jobs.yaml.bak @@ -0,0 +1,26 @@ +mqtt: + sensor: + - unique_id: dog_fed_activity + name: "Dog Fed" + state_topic: "viewroad-status/activityfeed/dogfed" + icon: mdi:dog + - unique_id: depooped_activity + name: "DePooped" + state_topic: "viewroad-status/activityfeed/depooped" + icon: mdi:emoticon-poop + - unique_id: jobs_done_activity + name: "Jobs Done" + state_topic: "viewroad-status/activityfeed/jobsdone" + icon: mdi:notebook + - unique_id: hours_since_jobs_done + name: "Hours Since Jobs Done" + state_topic: "viewroad-tele/petfeeding/hoursSinceJobsDone" + unit_of_measurement: "Hours" + - unique_id: hours_since_zorro_fed + name: "Hours Since Zorro Fed" + state_topic: "viewroad-tele/petfeeding/hoursSinceDogFed" + unit_of_measurement: "Hours" + - unique_id: hours_since_depooped + name: "Hours Since DePooped" + state_topic: "viewroad-tele/petfeeding/hoursSinceDePooped" + unit_of_measurement: "Hours" diff --git a/packages/quiet_time.yaml b/packages/quiet_time.yaml index e66fa38..ceab341 100644 --- a/packages/quiet_time.yaml +++ b/packages/quiet_time.yaml @@ -5,7 +5,17 @@ # TITLE: # Quiet Time # -# VERSIONS: +# FILE: +# quiet_time.yaml +# +# VERSION: +# V1.4 2026-07-20 +# +# VERSION HISTORY: +# V1.4 2026-07-20 +# - Updated documentation for the standalone Quiet Time actions package. +# - Documented the current flattened MQTT status topic. +# # V1.3 2026-06-07 # - Added quiet time start and stop entity action lists. # - Turns the LED matrix display OFF when quiet time starts. @@ -13,7 +23,8 @@ # # V1.2 2026-05-21 # - Added MQTT publishing when input_boolean.quiet_time changes. -# - Publishes quiet_time state to viewroad-status/homeassistant/quiet-time. +# - Published quiet_time state to viewroad-status/homeassistant/quiet-time. +# This was the historical topic; the current topic is documented below. # # V1.1 2026-05-21 # - Reduced daily reset check frequency from every minute to every 30 minutes. @@ -33,20 +44,13 @@ # will automatically be turned OFF. # - Default reset time is 07:00. # - The quiet_time state is published to MQTT whenever it changes. -# - When quiet_time changes, editable entity lists can turn things on or off. +# - The companion package handles local actions when quiet_time changes. # -# QUIET TIME ACTION LISTS: -# - quiet_time_start_turn_off_entities: -# Entities to turn OFF when quiet time starts. -# -# - quiet_time_start_turn_on_entities: -# Entities to turn ON when quiet time starts. -# -# - quiet_time_stop_turn_off_entities: -# Entities to turn OFF when quiet time ends. -# -# - quiet_time_stop_turn_on_entities: -# Entities to turn ON when quiet time ends. +# COMPANION PACKAGE: +# - quiet_time_on_off_actions.yaml owns the editable entity action lists and +# other local actions that run when Quiet Time starts or ends. +# - This package owns input_boolean.quiet_time, the daily reset behaviour, +# and MQTT status publishing. # # MQTT STATUS: # - Topic: diff --git a/packages/raspberry_pi_monitor.yaml b/packages/raspberry_pi_monitor.yaml index 4236183..55130e6 100644 --- a/packages/raspberry_pi_monitor.yaml +++ b/packages/raspberry_pi_monitor.yaml @@ -1,3 +1,67 @@ +#:########################################################################################:# +# Raspberry Pi CCTV Monitor Package # +#:########################################################################################:# +# +# TITLE: +# Raspberry Pi CCTV Monitor +# +# FILE: +# packages/raspberry_pi_monitor.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation for MQTT, availability, and controls. +# +# V1.0 +# - Initial monitoring and remote-control configuration. +# +# PURPOSE: +# Monitors the cctvquad1 and cctvquad2 Raspberry Pi hosts and provides remote +# reboot and shutdown controls through MQTT. +# +# EXTERNAL DEPENDENCY: +# - Each Raspberry Pi requires an external process that publishes telemetry +# and state, consumes command topics, and performs the requested actions. +# - This package does not install or manage that external process. +# +# MQTT STATUS: +# Topic pattern: +# viewroad-status/rpis// +# +# Fields: +# cpu-temp, cpu-use, ram-use, disk-use, uptime, last-seen, ipv4-address, +# reboot, and shutdown. +# +# The last-seen payload must be a timestamp that Home Assistant can parse with +# as_timestamp(). +# +# MQTT COMMANDS: +# Topic pattern: +# viewroad-commands/rpis//reboot/set +# viewroad-commands/rpis//shutdown/set +# +# Commands use the default MQTT switch ON/OFF payloads, QoS 1, and are not +# retained. The external process must publish matching switch state feedback. +# +# AVAILABILITY: +# - A host is considered available when its last-seen timestamp is valid and +# no more than 180 seconds old. +# - The template uses now(), so Home Assistant periodically re-evaluates age. +# +# GROUPS: +# - group.pi_cctvquad1_on collects Quad1 telemetry and controls. +# - group.pi_cctvquad2_on collects Quad2 telemetry and controls. +# +# SAFETY: +# - Reboot and shutdown interrupt CCTV services and host availability. +# - Shutdown may require physical access to power the host back on. +# - Dashboard controls should require confirmation before sending commands. +# +#:########################################################################################:# + mqtt: sensor: - unique_id: cctvquad1_cpu_temp diff --git a/packages/room_fan_control.yaml b/packages/room_fan_control.yaml index 782f693..0618e22 100644 --- a/packages/room_fan_control.yaml +++ b/packages/room_fan_control.yaml @@ -1,9 +1,55 @@ ########################################################################################## -# MASTER BEDROOM FAN (Tasmota / Sonoff iFan02) -# Improvements: -# - Numeric speed entity (0-3) reflecting actual device state via MQTT -# - Button to cycle speed 1,2,3,0 -# - Keep input_select in sync with actual FanSpeed (incl after reboots) +# Room Fan Control +########################################################################################## +# +# TITLE: +# Room Fan Control +# +# FILE: +# packages/room_fan_control.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation for all three bedroom fans. +# - Documented the master-bedroom feedback loop and command-only controls. +# +# V1.0 +# - Initial Tasmota and Sonoff iFan02 fan controls. +# +# PURPOSE: +# Controls the master-bedroom, Bedroom 2, and Bedroom 3 ceiling-fan speeds +# through Tasmota MQTT commands and Home Assistant dropdown helpers. +# +# SPEED MAPPING: +# - 0 = Off +# - 1 = Low +# - 2 = Medium +# - 3 = High +# +# MASTER BEDROOM: +# - Queries FanSpeed when Home Assistant starts. +# - Listens to Tasmota RESULT and STATE topics for device feedback. +# - Synchronizes the numeric and dropdown helpers with actual device state. +# - Uses optimistic local updates until MQTT feedback corrects the helpers. +# - Provides a button that cycles through speeds 1, 2, 3, and 0. +# +# BEDROOMS 2 AND 3: +# - Dropdown changes publish FanSpeed commands to each Tasmota device. +# - These controls are command-only and do not synchronize from feedback. +# - Their displayed dropdown state may not reflect physical or external changes. +# +# MQTT COMMAND TOPICS: +# - Master bedroom: cmnd/tasmo-ifan02-3793-bedrm1-1/FanSpeed +# - Bedroom 2: cmnd/tasmo-ifan02-7042-bedrm2/FanSpeed +# - Bedroom 3: cmnd/tasmo-ifan02-3497-bedrm3/FanSpeed +# +# DEPENDENCIES: +# - The three Tasmota devices must accept FanSpeed values from 0 through 3. +# - Master-bedroom feedback uses its RESULT and STATE MQTT topics. +# ########################################################################################## input_select: @@ -75,6 +121,7 @@ automation: - id: master_bedroom_fan_query_on_ha_start initial_state: true alias: Master Bedroom Fan - Query FanSpeed on HA Start + description: "Requests the current master-bedroom FanSpeed when Home Assistant starts." trigger: - platform: homeassistant event: start @@ -90,6 +137,7 @@ automation: - id: master_bedroom_fan_sync_from_mqtt initial_state: true alias: Master Bedroom Fan - Sync Helpers From MQTT FanSpeed + description: "Synchronizes the master-bedroom fan helpers from Tasmota MQTT feedback." trigger: - platform: mqtt topic: stat/tasmo-ifan02-3793-bedrm1-1/RESULT @@ -122,6 +170,7 @@ automation: - id: set_the_master_bedroom_fan initial_state: true alias: Set the Master Bedroom Fan + description: "Publishes master-bedroom fan speed changes and updates the numeric helper optimistically." trigger: - platform: state entity_id: input_select.master_bedroom_fan_set @@ -145,11 +194,12 @@ automation: value: "{{ desired }}" ######################################################################################## - # BEDROOM 2 FAN - Unchanged + # BEDROOM 2 FAN - Command Only ######################################################################################## - id: set_bedroom_2_fan initial_state: true alias: Set Bedroom 2 Fan Speed + description: "Publishes Bedroom 2 fan speed dropdown changes to Tasmota." trigger: entity_id: input_select.bedroom_2_fan_set platform: state @@ -163,11 +213,12 @@ automation: ' ######################################################################################## - # BEDROOM 3 FAN - Unchanged + # BEDROOM 3 FAN - Command Only ######################################################################################## - id: set_bedroom_3_fan initial_state: true alias: Set Bedroom 3 Fan Speed + description: "Publishes Bedroom 3 fan speed dropdown changes to Tasmota." trigger: entity_id: input_select.bedroom_3_fan_set platform: state diff --git a/packages/security_and_notifications.yaml b/packages/security_and_notifications.yaml index b263c44..31d499e 100644 --- a/packages/security_and_notifications.yaml +++ b/packages/security_and_notifications.yaml @@ -1,7 +1,8 @@ input_boolean: - quiet_time: - name: Quiet time for no notifications - icon: mdi:shield-moon + # Legacy duplicate retained temporarily for verification. + # quiet_time: + # name: Quiet time for no notifications + # icon: mdi:shield-moon away_occupied_routine: name: Automation for Lights etc when away icon: mdi:shield-lock diff --git a/packages/shower_controls.yaml b/packages/shower_controls.yaml index 3c121cb..fa44fe1 100644 --- a/packages/shower_controls.yaml +++ b/packages/shower_controls.yaml @@ -1,3 +1,52 @@ +#:########################################################################################:# +# Main Bathroom Shower Detection Package # +#:########################################################################################:# +# +# TITLE: +# Main Bathroom Shower Detection +# +# FILE: +# packages/shower_controls.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added structured documentation and automation descriptions. +# - Documented current indicator-only usage. +# +# V1.0 +# - Initial humidity-rate shower detection. +# +# PURPOSE: +# Detects shower use from the main-bathroom humidity level and its rate of +# change, then maintains input_boolean.main_bathroom_shower as an indicator. +# +# DEPENDENCY: +# sensor.main_bathroom_environment_zth10_humidity_2 provides humidity in %. +# +# DERIVATIVE SENSOR: +# - Calculates humidity change in % per minute over a 15-minute time window. +# - Rounds the result to 0.1. +# +# DETECTION: +# - Humidity change must remain above 0.6 %/min for five minutes. +# - Current humidity must also be above 63%. +# +# CLEARING: +# - Humidity change must remain below 0.2 %/min for 15 minutes. +# - No absolute-humidity condition is required to clear the indicator. +# - The gap between activation and clearing thresholds provides hysteresis +# and prevents rapid toggling near one threshold. +# +# CURRENT USE: +# - The package only maintains input_boolean.main_bathroom_shower. +# - No other user-YAML automation, script, or package currently consumes it. +# - This package does not directly control a bathroom fan or other device. +# +#:########################################################################################:# + input_boolean: main_bathroom_shower: name: Main Bathroom Shower @@ -14,6 +63,7 @@ sensor: automation: - id: main_bathroom_shower_detected alias: Main Bathroom - Shower detected (humidity rate + min humidity) + description: "Turns on the shower indicator after a sustained humidity rise above the minimum humidity." mode: single trigger: - platform: numeric_state @@ -31,6 +81,7 @@ automation: - id: main_bathroom_shower_cleared alias: Main Bathroom - Shower cleared (humidity rate) + description: "Turns off the shower indicator after the humidity change rate remains low for 15 minutes." mode: single trigger: - platform: numeric_state diff --git a/packages/waste_collection.yaml b/packages/waste_collection.yaml index 4688173..1e33855 100644 --- a/packages/waste_collection.yaml +++ b/packages/waste_collection.yaml @@ -1,8 +1,61 @@ +#:########################################################################################:# +# Auckland Council Waste Collection Package # +#:########################################################################################:# +# +# TITLE: +# Auckland Council Waste Collection +# +# FILE: +# packages/waste_collection.yaml +# +# VERSION: +# V1.1 2026-07-20 +# +# VERSION HISTORY: +# V1.1 2026-07-20 +# - Added source setup, schedule, MQTT, and maintenance documentation. +# +# V1.0 +# - Initial Auckland Council schedules and MQTT bin-status sensors. +# +# PURPOSE: +# Provides Auckland Council rubbish, recycling, and food-waste collection +# schedules, plus independent MQTT sensors indicating whether bins are out. +# +# DEPENDENCY: +# Requires the Waste Collection Schedule custom integration and its +# aucklandcouncil_govt_nz source. +# +# AREA NUMBER SETUP: +# - Open the Auckland Council rubbish and recycling collection-day finder. +# - Select the property address. +# - Use the displayed assessment number as area_number below. +# - Source documentation: +# https://github.com/mampfes/hacs_waste_collection_schedule/blob/master/doc/source/aucklandcouncil_govt_nz.md +# +# SCHEDULE SENSORS: +# - Types are rubbish, recycle, and food-waste. +# - Each sensor returns one upcoming collection with a one-day lead time. +# - details_format is upcoming and add_days_to adds relative-day text. +# +# MQTT BIN-OUT SENSORS: +# - These sensors are independent of the council collection schedules. +# - An external publisher must send status to the configured MQTT topics. +# - Payloads remain raw sensor strings such as "true"; these are not binary +# sensor entities and no boolean conversion is performed here. +# +# CURRENT STATUS: +# - As of 2026-07-20, the rubbish schedule resolves correctly. +# - Recycling and food-waste report unknown; review the source type names when +# investigating those schedules. +# +#:########################################################################################:# + waste_collection_schedule: sources: - name: aucklandcouncil_govt_nz args: - area_number: 12344403722 # see 'How to get the source argument below' + area_number: 12344403722 # Auckland Council assessment number. sensor: - platform: waste_collection_schedule