diff --git a/.cache/brands/integrations/bermuda/dark_icon.png b/.cache/brands/integrations/bermuda/dark_icon.png index 5b49bdd..c59651c 100644 Binary files a/.cache/brands/integrations/bermuda/dark_icon.png and b/.cache/brands/integrations/bermuda/dark_icon.png differ diff --git a/.cache/brands/integrations/bermuda/icon.png b/.cache/brands/integrations/bermuda/icon.png index 6a0d307..a2d1987 100644 Binary files a/.cache/brands/integrations/bermuda/icon.png and b/.cache/brands/integrations/bermuda/icon.png differ diff --git a/.cache/brands/integrations/byd_vehicle/dark_icon.png b/.cache/brands/integrations/byd_vehicle/dark_icon.png index a86a688..a31c107 100644 Binary files a/.cache/brands/integrations/byd_vehicle/dark_icon.png and b/.cache/brands/integrations/byd_vehicle/dark_icon.png differ diff --git a/.cache/brands/integrations/edgeos/icon.png b/.cache/brands/integrations/edgeos/icon.png index 357b54a..787ea81 100644 Binary files a/.cache/brands/integrations/edgeos/icon.png and b/.cache/brands/integrations/edgeos/icon.png differ diff --git a/.cache/brands/integrations/google/dark_icon.png b/.cache/brands/integrations/google/dark_icon.png index 70fd449..23c389d 100644 Binary files a/.cache/brands/integrations/google/dark_icon.png and b/.cache/brands/integrations/google/dark_icon.png differ diff --git a/.cache/brands/integrations/google/icon.png b/.cache/brands/integrations/google/icon.png index 70fd449..23c389d 100644 Binary files a/.cache/brands/integrations/google/icon.png and b/.cache/brands/integrations/google/icon.png differ diff --git a/.cache/brands/integrations/ipp/dark_icon.png b/.cache/brands/integrations/ipp/dark_icon.png index 27877b6..ecf0d5b 100644 Binary files a/.cache/brands/integrations/ipp/dark_icon.png and b/.cache/brands/integrations/ipp/dark_icon.png differ diff --git a/.cache/brands/integrations/ipp/icon.png b/.cache/brands/integrations/ipp/icon.png index 27877b6..ecf0d5b 100644 Binary files a/.cache/brands/integrations/ipp/icon.png and b/.cache/brands/integrations/ipp/icon.png differ diff --git a/.cache/brands/integrations/motioneye/dark_icon.png b/.cache/brands/integrations/motioneye/dark_icon.png index 3a74676..cd1cccb 100644 Binary files a/.cache/brands/integrations/motioneye/dark_icon.png and b/.cache/brands/integrations/motioneye/dark_icon.png differ diff --git a/.cache/brands/integrations/motioneye/icon.png b/.cache/brands/integrations/motioneye/icon.png index 3a74676..cd1cccb 100644 Binary files a/.cache/brands/integrations/motioneye/icon.png and b/.cache/brands/integrations/motioneye/icon.png differ diff --git a/.cache/brands/integrations/mpd/dark_icon.png b/.cache/brands/integrations/mpd/dark_icon.png index f01afa4..977d124 100644 Binary files a/.cache/brands/integrations/mpd/dark_icon.png and b/.cache/brands/integrations/mpd/dark_icon.png differ diff --git a/.cache/brands/integrations/mpd/icon.png b/.cache/brands/integrations/mpd/icon.png index f01afa4..977d124 100644 Binary files a/.cache/brands/integrations/mpd/icon.png and b/.cache/brands/integrations/mpd/icon.png differ diff --git a/.cache/brands/integrations/nzbget/dark_icon.png b/.cache/brands/integrations/nzbget/dark_icon.png index 75733bd..9ff48ef 100644 Binary files a/.cache/brands/integrations/nzbget/dark_icon.png and b/.cache/brands/integrations/nzbget/dark_icon.png differ diff --git a/.cache/brands/integrations/nzbget/icon.png b/.cache/brands/integrations/nzbget/icon.png index 75733bd..9ff48ef 100644 Binary files a/.cache/brands/integrations/nzbget/icon.png and b/.cache/brands/integrations/nzbget/icon.png differ diff --git a/.cache/brands/integrations/waste_collection_schedule/icon.png b/.cache/brands/integrations/waste_collection_schedule/icon.png index 4db5580..4ad7e66 100644 Binary files a/.cache/brands/integrations/waste_collection_schedule/icon.png and b/.cache/brands/integrations/waste_collection_schedule/icon.png differ diff --git a/.ha_run.lock b/.ha_run.lock index 18c2a6e..a863ab1 100644 --- a/.ha_run.lock +++ b/.ha_run.lock @@ -1 +1 @@ -{"pid": 71, "version": 1, "ha_version": "2026.8.3", "start_ts": 1788051080.3314128} \ No newline at end of file +{"pid": 71, "version": 1, "ha_version": "2026.9.2", "start_ts": 1789211351.1286738} \ No newline at end of file diff --git a/docs/tplink_deco_guest_wifi_recovery.txt b/docs/tplink_deco_guest_wifi_recovery.txt new file mode 100644 index 0000000..acd3b03 --- /dev/null +++ b/docs/tplink_deco_guest_wifi_recovery.txt @@ -0,0 +1,67 @@ +TP-Link Deco Guest Wi-Fi Recovery Archive +========================================== + +Version: 1.0.0 +Created: 2026-09-02 +Project: P026 Flounder downstairs guest-area controls + +Purpose +------- + +This archive preserves the locally maintained TP-Link Deco Guest Wi-Fi +customisation. The upstream tplink_deco integration does not provide this +service or sensor. Reinstalling or overwriting custom_components/tplink_deco +can remove them. + +Archive +------- + +File: docs/tplink_deco_guest_wifi_recovery_2026-09-02.tgz +SHA-256: 452ed7b7be5e8c469dc7740d5297959179204d24593a22c965f1915ca727c48d + +Contents +-------- + +- custom_components/tplink_deco/api.py +- custom_components/tplink_deco/__init__.py +- custom_components/tplink_deco/const.py +- custom_components/tplink_deco/services.yaml +- custom_components/tplink_deco/coordinator.py +- custom_components/tplink_deco/binary_sensor.py +- packages/tplink_deco_guest_wifi.yaml + +Behaviour Preserved +------------------- + +- Service: tplink_deco.set_guest_network +- Service field: enable (boolean) +- Router state: binary_sensor.data_cupboard_new_sundamage_12_deco_guest_network +- Requested state: input_boolean.wifi_guest_network +- Flounder control: the requested-state helper; the package reconciles it to + the router-confirmed sensor. +- Write protocol: read each returned wireless band, retain its host, guest and + backhaul settings, set only guest.enable, add radio.channel from host.channel, + write each band separately, then read back and verify every written band. +- Deco firmware can return a malformed successful response containing + {"error_code": 0}; the integration accepts that response only for writes and + relies on the read-back verification as the final confirmation. + +Recovery Procedure +------------------ + +1. Stop before updating, reinstalling, or deleting custom_components/tplink_deco. +2. Verify the archive checksum above. +3. Extract the archive from /homeassistant, preserving the listed paths. +4. Run Home Assistant configuration validation and Python compilation for the + restored integration files. +5. Restart Home Assistant. A restart is required for custom integration code. +6. Confirm tplink_deco.set_guest_network is registered and the Guest Network + binary sensor is available before operating Guest Wi-Fi. + +Update Policy +------------- + +Do not replace custom_components/tplink_deco with an upstream or HACS update +without first comparing it to this archive and deliberately reapplying the +Guest Wi-Fi customisation. The archive contains no credentials, tokens, session +cookies, or router address. diff --git a/docs/tplink_deco_guest_wifi_recovery_2026-09-02.tgz b/docs/tplink_deco_guest_wifi_recovery_2026-09-02.tgz new file mode 100644 index 0000000..28d3a1a Binary files /dev/null and b/docs/tplink_deco_guest_wifi_recovery_2026-09-02.tgz differ diff --git a/esphome/.device-builder.json b/esphome/.device-builder.json index 31fc300..363ad2e 100644 --- a/esphome/.device-builder.json +++ b/esphome/.device-builder.json @@ -316,6 +316,2176 @@ "mac_address": "88:13:BF:68:39:2C" }, "_firmware_jobs": [ + { + "job_id": "618e0988ca79", + "configuration": "esp-downstbathtowelrail.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:23:21.987949+00:00", + "started_at": "2026-09-12T23:56:06.440610+00:00", + "completed_at": "2026-09-12T23:56:20.083210+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": "594659d60caa", + "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": "594659d60caa", + "configuration": "esp-downstbathtowelrail.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:23:21.987914+00:00", + "started_at": "2026-09-12T23:53:46.735759+00:00", + "completed_at": "2026-09-12T23:56:06.437620+00:00", + "compile_started_at": "2026-09-12T23:53:50.237620+00:00", + "compile_ended_at": "2026-09-12T23:56:04.900635+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": "585da7bce1f8", + "configuration": "esp-downstbathswitch.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:23:13.681748+00:00", + "started_at": "2026-09-12T23:53:46.728571+00:00", + "completed_at": "2026-09-12T23:53:58.901129+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": "0953424b0469", + "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": "0953424b0469", + "configuration": "esp-downstbathswitch.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:23:13.681708+00:00", + "started_at": "2026-09-12T23:52:10.652582+00:00", + "completed_at": "2026-09-12T23:53:46.725825+00:00", + "compile_started_at": "2026-09-12T23:52:14.030999+00:00", + "compile_ended_at": "2026-09-12T23:53:45.166985+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": "59ab2e968919", + "configuration": "esp-datacupboardpower-right.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:23:06.418829+00:00", + "started_at": "2026-09-12T23:52:10.642191+00:00", + "completed_at": "2026-09-12T23:52:24.646802+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": "9f7116f5a1bd", + "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": "9f7116f5a1bd", + "configuration": "esp-datacupboardpower-right.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:23:06.418795+00:00", + "started_at": "2026-09-12T23:50:35.097766+00:00", + "completed_at": "2026-09-12T23:52:10.639792+00:00", + "compile_started_at": "2026-09-12T23:50:38.407704+00:00", + "compile_ended_at": "2026-09-12T23:52:09.080656+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": "caf3ab4c0a15", + "configuration": "esp-datacupboardpower-left.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:23:02.388955+00:00", + "started_at": "2026-09-12T23:50:35.080512+00:00", + "completed_at": "2026-09-12T23:50:43.138869+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": "899f70894368", + "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": "899f70894368", + "configuration": "esp-datacupboardpower-left.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:23:02.388921+00:00", + "started_at": "2026-09-12T23:48:58.695581+00:00", + "completed_at": "2026-09-12T23:50:35.077844+00:00", + "compile_started_at": "2026-09-12T23:49:03.091159+00:00", + "compile_ended_at": "2026-09-12T23:50:33.514123+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": "b7fdf427525f", + "configuration": "esp-datacupboardfans.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:51.256044+00:00", + "started_at": "2026-09-12T23:48:58.681869+00:00", + "completed_at": "2026-09-12T23:49:05.926694+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": "676583d83546", + "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": "676583d83546", + "configuration": "esp-datacupboardfans.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:51.256006+00:00", + "started_at": "2026-09-12T23:46:34.627146+00:00", + "completed_at": "2026-09-12T23:48:58.679041+00:00", + "compile_started_at": "2026-09-12T23:46:37.987709+00:00", + "compile_ended_at": "2026-09-12T23:48:57.114425+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": "446e881fc143", + "configuration": "esp-centralstairs-top.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:47.737501+00:00", + "started_at": "2026-09-12T23:46:34.620878+00:00", + "completed_at": "2026-09-12T23:46:45.932806+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": "3e770f0d809a", + "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": "3e770f0d809a", + "configuration": "esp-centralstairs-top.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:47.737462+00:00", + "started_at": "2026-09-12T23:44:58.929187+00:00", + "completed_at": "2026-09-12T23:46:34.618211+00:00", + "compile_started_at": "2026-09-12T23:45:02.139915+00:00", + "compile_ended_at": "2026-09-12T23:46:33.078590+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": "f82fa3e37659", + "configuration": "esp-centralstairs-bottom.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:44.156720+00:00", + "started_at": "2026-09-12T23:44:58.899261+00:00", + "completed_at": "2026-09-12T23:45:06.906080+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": "1c0cacdab02e", + "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": "1c0cacdab02e", + "configuration": "esp-centralstairs-bottom.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:44.156684+00:00", + "started_at": "2026-09-12T23:43:21.177889+00:00", + "completed_at": "2026-09-12T23:44:58.896891+00:00", + "compile_started_at": "2026-09-12T23:43:24.410919+00:00", + "compile_ended_at": "2026-09-12T23:44:57.345886+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": "83d48795b21e", + "configuration": "esp-breakfastbarleds.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:38.526122+00:00", + "started_at": "2026-09-12T23:43:21.170712+00:00", + "completed_at": "2026-09-12T23:43:31.660995+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": "2307f810c666", + "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": "2307f810c666", + "configuration": "esp-breakfastbarleds.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:38.526081+00:00", + "started_at": "2026-09-12T23:41:30.828054+00:00", + "completed_at": "2026-09-12T23:43:21.167271+00:00", + "compile_started_at": "2026-09-12T23:41:33.748693+00:00", + "compile_ended_at": "2026-09-12T23:43:19.659544+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": "1867735c182d", + "configuration": "esp-bedrm3fanswitch.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:21.116877+00:00", + "started_at": "2026-09-12T23:41:30.818866+00:00", + "completed_at": "2026-09-12T23:41:45.409000+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": "f45562cb3c7c", + "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": "f45562cb3c7c", + "configuration": "esp-bedrm3fanswitch.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:21.116839+00:00", + "started_at": "2026-09-12T23:39:10.199874+00:00", + "completed_at": "2026-09-12T23:41:30.816592+00:00", + "compile_started_at": "2026-09-12T23:39:13.404116+00:00", + "compile_ended_at": "2026-09-12T23:41:29.265702+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": "cc8dac42ae9a", + "configuration": "esp-bedrm2lights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:09.334396+00:00", + "started_at": "2026-09-12T23:39:10.192820+00:00", + "completed_at": "2026-09-12T23:39:48.726870+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": "4e25ccb88822", + "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": "4e25ccb88822", + "configuration": "esp-bedrm2lights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:09.334359+00:00", + "started_at": "2026-09-12T23:37:34.679246+00:00", + "completed_at": "2026-09-12T23:39:10.189359+00:00", + "compile_started_at": "2026-09-12T23:37:38.034619+00:00", + "compile_ended_at": "2026-09-12T23:39:08.624751+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": "5f74ee1f4ec2", + "configuration": "esp-bedrm2fanswitch.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:04.057268+00:00", + "started_at": "2026-09-12T23:37:34.672739+00:00", + "completed_at": "2026-09-12T23:37:47.878818+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": "030c1edb3163", + "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": "030c1edb3163", + "configuration": "esp-bedrm2fanswitch.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:04.056680+00:00", + "started_at": "2026-09-12T23:35:56.477656+00:00", + "completed_at": "2026-09-12T23:37:34.668495+00:00", + "compile_started_at": "2026-09-12T23:35:59.856791+00:00", + "compile_ended_at": "2026-09-12T23:37:33.102537+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": "864b45130bdb", + "configuration": "esp-bedrm2ceilingfan.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:22:01.280799+00:00", + "started_at": "2026-09-12T23:35:56.459155+00:00", + "completed_at": "2026-09-12T23:36:24.896861+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": "9188568ce8f8", + "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": "9188568ce8f8", + "configuration": "esp-bedrm2ceilingfan.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:22:01.280762+00:00", + "started_at": "2026-09-12T23:34:04.458267+00:00", + "completed_at": "2026-09-12T23:35:56.456621+00:00", + "compile_started_at": "2026-09-12T23:34:07.893027+00:00", + "compile_ended_at": "2026-09-12T23:35:54.886394+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": "409465d247ca", + "configuration": "esp-bedrm1airfilter.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:21:53.520649+00:00", + "started_at": "2026-09-12T23:34:04.451459+00:00", + "completed_at": "2026-09-12T23:34:14.438419+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": "6beebf8e6d8c", + "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": "6beebf8e6d8c", + "configuration": "esp-bedrm1airfilter.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:21:53.520610+00:00", + "started_at": "2026-09-12T23:31:40.398017+00:00", + "completed_at": "2026-09-12T23:34:04.444789+00:00", + "compile_started_at": "2026-09-12T23:31:43.651737+00:00", + "compile_ended_at": "2026-09-12T23:34:02.898633+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": "e721401843ae", + "configuration": "esp-arcademachine1.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:21:50.582235+00:00", + "started_at": "2026-09-12T23:31:40.387415+00:00", + "completed_at": "2026-09-12T23:31:50.439423+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": "63c2a346dee0", + "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": "63c2a346dee0", + "configuration": "esp-arcademachine1.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:21:50.582202+00:00", + "started_at": "2026-09-12T23:29:12.520550+00:00", + "completed_at": "2026-09-12T23:31:40.384259+00:00", + "compile_started_at": "2026-09-12T23:29:15.789766+00:00", + "compile_ended_at": "2026-09-12T23:31:38.785279+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": "75ef68653e70", + "configuration": "esp-lounge6chdimmer.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:21:46.961540+00:00", + "started_at": "2026-09-12T23:29:12.510000+00:00", + "completed_at": "2026-09-12T23:29:20.441491+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": "5e99e973a5d5", + "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": "5e99e973a5d5", + "configuration": "esp-lounge6chdimmer.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:21:46.961494+00:00", + "started_at": "2026-09-12T23:26:39.516459+00:00", + "completed_at": "2026-09-12T23:29:12.507650+00:00", + "compile_started_at": "2026-09-12T23:26:44.008966+00:00", + "compile_ended_at": "2026-09-12T23:29:10.897072+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": "5a1d3dadc874", + "configuration": "esp-3dprinterpow.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:21:40.154710+00:00", + "started_at": "2026-09-12T23:26:39.504923+00:00", + "completed_at": "2026-09-12T23:27:00.916714+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": "c9afab6e5a27", + "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": "c9afab6e5a27", + "configuration": "esp-3dprinterpow.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:21:40.154662+00:00", + "started_at": "2026-09-12T23:21:40.155916+00:00", + "completed_at": "2026-09-12T23:26:39.500848+00:00", + "compile_started_at": "2026-09-12T23:21:46.442931+00:00", + "compile_ended_at": "2026-09-12T23:26:37.942446+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": "229622cc5ffc", + "configuration": "esp-officelights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:20:59.125636+00:00", + "started_at": "2026-09-12T23:21:05.052080+00:00", + "completed_at": "2026-09-12T23:21:16.180500+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": "9a04d2b4c990", + "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": "9a04d2b4c990", + "configuration": "esp-officelights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:20:59.125599+00:00", + "started_at": "2026-09-12T23:20:59.126658+00:00", + "completed_at": "2026-09-12T23:21:05.050231+00:00", + "compile_started_at": "2026-09-12T23:21:02.910185+00:00", + "compile_ended_at": "2026-09-12T23:21:04.809112+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": "b7f724669502", + "configuration": "esp-officeduallights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T23:20:33.581619+00:00", + "started_at": "2026-09-12T23:20:39.540983+00:00", + "completed_at": "2026-09-12T23:20:54.943137+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": "c25f94dd7a3b", + "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": "c25f94dd7a3b", + "configuration": "esp-officeduallights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T23:20:33.581581+00:00", + "started_at": "2026-09-12T23:20:33.582447+00:00", + "completed_at": "2026-09-12T23:20:39.538813+00:00", + "compile_started_at": "2026-09-12T23:20:37.387423+00:00", + "compile_ended_at": "2026-09-12T23:20:39.273945+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": "e1730cc77ccf", + "configuration": "esp-mainhallwaynorthlightswitch.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T11:15:50.349004+00:00", + "started_at": "2026-09-12T11:28:28.315963+00:00", + "completed_at": "2026-09-12T11:28:46.038361+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": "dcafd9291672", + "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": "dcafd9291672", + "configuration": "esp-mainhallwaynorthlightswitch.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T11:15:50.348961+00:00", + "started_at": "2026-09-12T11:27:05.240423+00:00", + "completed_at": "2026-09-12T11:28:28.313368+00:00", + "compile_started_at": "2026-09-12T11:27:08.183051+00:00", + "compile_ended_at": "2026-09-12T11:28:26.813732+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": "517706b1d08a", + "configuration": "esp-mainpowermonitor.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T11:11:40.162826+00:00", + "started_at": "2026-09-12T11:27:05.222316+00:00", + "completed_at": "2026-09-12T11:27:17.190737+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": "6ffbb7001cfb", + "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": "6ffbb7001cfb", + "configuration": "esp-mainpowermonitor.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T11:11:40.162781+00:00", + "started_at": "2026-09-12T11:21:01.242253+00:00", + "completed_at": "2026-09-12T11:27:05.219398+00:00", + "compile_started_at": "2026-09-12T11:21:05.110767+00:00", + "compile_ended_at": "2026-09-12T11:27:03.683676+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": "963872123038", + "configuration": "esp-masterbathtowelrail.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T11:11:18.540148+00:00", + "started_at": "2026-09-12T11:21:01.232818+00:00", + "completed_at": "2026-09-12T11:21:14.385118+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": "56dc6e230a22", + "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": "56dc6e230a22", + "configuration": "esp-masterbathtowelrail.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T11:11:18.540106+00:00", + "started_at": "2026-09-12T11:19:22.416394+00:00", + "completed_at": "2026-09-12T11:21:01.230748+00:00", + "compile_started_at": "2026-09-12T11:19:25.813209+00:00", + "compile_ended_at": "2026-09-12T11:20:59.647977+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": "72d3143d5d9c", + "configuration": "esp-mainkitchenlights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T11:11:01.493588+00:00", + "started_at": "2026-09-12T11:19:22.402134+00:00", + "completed_at": "2026-09-12T11:19:39.779136+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": "22e7a3471a90", + "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": "22e7a3471a90", + "configuration": "esp-mainkitchenlights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T11:11:01.493544+00:00", + "started_at": "2026-09-12T11:17:57.942382+00:00", + "completed_at": "2026-09-12T11:19:22.399266+00:00", + "compile_started_at": "2026-09-12T11:18:00.950164+00:00", + "compile_ended_at": "2026-09-12T11:19:20.883770+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": "85664a25c3ae", + "configuration": "esp-officeelvcontrol.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:47:07.386407+00:00", + "started_at": "2026-09-12T11:16:20.565658+00:00", + "completed_at": "2026-09-12T11:16:44.849975+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": "a0c18a5e95e0", + "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": "a0c18a5e95e0", + "configuration": "esp-officeelvcontrol.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:47:07.386369+00:00", + "started_at": "2026-09-12T11:14:54.269819+00:00", + "completed_at": "2026-09-12T11:16:20.563450+00:00", + "compile_started_at": "2026-09-12T11:14:57.230414+00:00", + "compile_ended_at": "2026-09-12T11:16:19.024912+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": "38f041c3dc0b", + "configuration": "esp-officedeskrightgpo.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:47:04.617744+00:00", + "started_at": "2026-09-12T11:14:54.218349+00:00", + "completed_at": "2026-09-12T11:15:35.012065+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": "d6e77dcba853", + "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": "d6e77dcba853", + "configuration": "esp-officedeskrightgpo.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:47:04.617703+00:00", + "started_at": "2026-09-12T11:13:26.257507+00:00", + "completed_at": "2026-09-12T11:14:54.217407+00:00", + "compile_started_at": "2026-09-12T11:13:29.163973+00:00", + "compile_ended_at": "2026-09-12T11:14:52.712580+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": "e748535d5b9e", + "configuration": "esp-entmulti.yaml", + "job_type": "upload", + "status": "failed", + "created_at": "2026-09-12T10:46:45.951725+00:00", + "started_at": "2026-09-12T11:11:20.508640+00:00", + "completed_at": "2026-09-12T11:11:40.065689+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": 1, + "error": null, + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "1a93c797c8cd", + "dependency_released": true, + "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": "1a93c797c8cd", + "configuration": "esp-entmulti.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:45.951685+00:00", + "started_at": "2026-09-12T11:07:52.777308+00:00", + "completed_at": "2026-09-12T11:11:20.506732+00:00", + "compile_started_at": "2026-09-12T11:08:12.289539+00:00", + "compile_ended_at": "2026-09-12T11:11:20.252683+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "249afd83443d", + "configuration": "esp-entbtproxy.yaml", + "job_type": "upload", + "status": "cancelled", + "created_at": "2026-09-12T10:46:32.662036+00:00", + "started_at": null, + "completed_at": "2026-09-12T11:07:52.752936+00:00", + "compile_started_at": null, + "compile_ended_at": null, + "exit_code": null, + "error": "device is offline; update queued for when it reconnects", + "port": "OTA", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "a61713d404e2", + "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": "a61713d404e2", + "configuration": "esp-entbtproxy.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:32.661993+00:00", + "started_at": "2026-09-12T11:04:17.368414+00:00", + "completed_at": "2026-09-12T11:07:52.752185+00:00", + "compile_started_at": "2026-09-12T11:04:39.019202+00:00", + "compile_ended_at": "2026-09-12T11:07:52.548603+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": true, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "6396c6a50dfb", + "configuration": "esp-officeusbhubpower.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:46:23.945155+00:00", + "started_at": "2026-09-12T11:04:17.348839+00:00", + "completed_at": "2026-09-12T11:04:32.089664+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": "44f5aea98557", + "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": "44f5aea98557", + "configuration": "esp-officeusbhubpower.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:23.945115+00:00", + "started_at": "2026-09-12T11:02:51.339905+00:00", + "completed_at": "2026-09-12T11:04:17.346571+00:00", + "compile_started_at": "2026-09-12T11:02:54.496478+00:00", + "compile_ended_at": "2026-09-12T11:04:15.881060+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": "559fda03e278", + "configuration": "esp-occupancyoffice.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:46:16.839362+00:00", + "started_at": "2026-09-12T11:02:51.330844+00:00", + "completed_at": "2026-09-12T11:03:14.015644+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": "47cc008df107", + "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": "47cc008df107", + "configuration": "esp-occupancyoffice.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:16.839307+00:00", + "started_at": "2026-09-12T10:59:13.937431+00:00", + "completed_at": "2026-09-12T11:02:51.327188+00:00", + "compile_started_at": "2026-09-12T10:59:36.379218+00:00", + "compile_ended_at": "2026-09-12T11:02:51.123567+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "9339723fe605", + "configuration": "esp-poollightpower2.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:46:11.341107+00:00", + "started_at": "2026-09-12T10:59:13.923522+00:00", + "completed_at": "2026-09-12T10:59:24.650267+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": "ace1b5b39791", + "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": "ace1b5b39791", + "configuration": "esp-poollightpower2.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:11.341069+00:00", + "started_at": "2026-09-12T10:56:53.954874+00:00", + "completed_at": "2026-09-12T10:59:13.920751+00:00", + "compile_started_at": "2026-09-12T10:56:57.661219+00:00", + "compile_ended_at": "2026-09-12T10:59:12.376792+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": "19e867f1532e", + "configuration": "esp-poolpumppower.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:46:08.030200+00:00", + "started_at": "2026-09-12T10:56:53.945340+00:00", + "completed_at": "2026-09-12T10:57:40.926456+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": "0b62c61ea63a", + "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": "0b62c61ea63a", + "configuration": "esp-poolpumppower.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:46:08.030160+00:00", + "started_at": "2026-09-12T10:53:11.201347+00:00", + "completed_at": "2026-09-12T10:56:53.943229+00:00", + "compile_started_at": "2026-09-12T10:53:36.417424+00:00", + "compile_ended_at": "2026-09-12T10:56:53.695632+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "15353fbc45b9", + "configuration": "esp-rocktumbler.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:45:41.356778+00:00", + "started_at": "2026-09-12T10:53:11.194960+00:00", + "completed_at": "2026-09-12T10:53:28.364907+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": "91314b1da25c", + "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": "91314b1da25c", + "configuration": "esp-rocktumbler.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:45:41.356735+00:00", + "started_at": "2026-09-12T10:50:58.623548+00:00", + "completed_at": "2026-09-12T10:53:11.193015+00:00", + "compile_started_at": "2026-09-12T10:51:02.406367+00:00", + "compile_ended_at": "2026-09-12T10:53:09.682077+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": "d985ed0c1710", + "configuration": "esp-occupancystair.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:45:35.878417+00:00", + "started_at": "2026-09-12T10:50:58.606229+00:00", + "completed_at": "2026-09-12T10:51:16.678361+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": "fc69295210f9", + "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": "fc69295210f9", + "configuration": "esp-occupancystair.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:45:35.878370+00:00", + "started_at": "2026-09-12T10:47:44.048173+00:00", + "completed_at": "2026-09-12T10:50:58.603769+00:00", + "compile_started_at": "2026-09-12T10:48:09.132721+00:00", + "compile_ended_at": "2026-09-12T10:50:58.359749+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "d1cd8fca7f39", + "configuration": "esp-underhouselights.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-12T10:45:30.538981+00:00", + "started_at": "2026-09-12T10:47:44.036702+00:00", + "completed_at": "2026-09-12T10:48:02.316821+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": "8e3b4fb91ab0", + "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": "8e3b4fb91ab0", + "configuration": "esp-underhouselights.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-12T10:45:30.538851+00:00", + "started_at": "2026-09-12T10:45:30.540004+00:00", + "completed_at": "2026-09-12T10:47:44.034050+00:00", + "compile_started_at": "2026-09-12T10:45:39.783311+00:00", + "compile_ended_at": "2026-09-12T10:47:42.536641+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": "fc1a155e7b45", + "configuration": "esp-bedside-panel.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-04T05:10:27.642583+00:00", + "started_at": "2026-09-04T05:16:04.647283+00:00", + "completed_at": "2026-09-04T05:16:44.506093+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": "2a8a7f7fb391", + "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": "2a8a7f7fb391", + "configuration": "esp-bedside-panel.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-04T05:10:27.642537+00:00", + "started_at": "2026-09-04T05:10:27.643636+00:00", + "completed_at": "2026-09-04T05:16:04.645001+00:00", + "compile_started_at": "2026-09-04T05:11:17.293845+00:00", + "compile_ended_at": "2026-09-04T05:16:03.489967+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 99, + "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": "ce9370057b08", + "configuration": "esp-reterminal-e1001.yaml", + "job_type": "upload", + "status": "completed", + "created_at": "2026-09-04T04:35:06.623108+00:00", + "started_at": "2026-09-04T04:35:12.869913+00:00", + "completed_at": "2026-09-04T04:35:27.678830+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": "a73a80137c29", + "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": "a73a80137c29", + "configuration": "esp-reterminal-e1001.yaml", + "job_type": "compile", + "status": "completed", + "created_at": "2026-09-04T04:35:06.623066+00:00", + "started_at": "2026-09-04T04:35:06.623553+00:00", + "completed_at": "2026-09-04T04:35:12.867674+00:00", + "compile_started_at": "2026-09-04T04:35:11.331729+00:00", + "compile_ended_at": "2026-09-04T04:35:12.600109+00:00", + "exit_code": 0, + "error": null, + "port": "", + "flash_bootloader": false, + "is_deferred_install": false, + "new_name": "", + "depends_on": "", + "dependency_released": false, + "progress": 93, + "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": "2cd50350cbc3", "configuration": "esp-ledmatrix1.yaml", @@ -378,37 +2548,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "c4506c3b55c4", - "configuration": "esp-reterminal-e1001.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:37:55.752509+00:00", - "started_at": "2026-08-29T00:37:55.768623+00:00", - "completed_at": "2026-08-29T00:38:23.632536+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": "", - "dependency_released": false, - "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": "1b8de3463e62", "configuration": "esp-garagedbcontrols.yaml", @@ -657,68 +2796,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "161794d5366d", - "configuration": "esp-bedside-panel.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:32:56.735547+00:00", - "started_at": "2026-08-29T00:41:26.237524+00:00", - "completed_at": "2026-08-29T00:41:53.070560+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": "4a02934b5a69", - "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": "4a02934b5a69", - "configuration": "esp-bedside-panel.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:32:56.735506+00:00", - "started_at": "2026-08-29T00:38:58.094129+00:00", - "completed_at": "2026-08-29T00:41:26.236032+00:00", - "compile_started_at": "2026-08-29T00:39:09.607613+00:00", - "compile_ended_at": "2026-08-29T00:41:25.025989+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 78, - "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": "44809a6bfacf", "configuration": "esp-downstloungeoutside.yaml", @@ -781,68 +2858,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "026f55ea0ab9", - "configuration": "esp-arcademachine1.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:32:37.162822+00:00", - "started_at": "2026-08-29T00:39:14.882642+00:00", - "completed_at": "2026-08-29T00:39:27.549440+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": "96e7a927b84a", - "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": "96e7a927b84a", - "configuration": "esp-arcademachine1.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:32:37.162780+00:00", - "started_at": "2026-08-29T00:36:54.787097+00:00", - "completed_at": "2026-08-29T00:39:14.879161+00:00", - "compile_started_at": "2026-08-29T00:37:05.265564+00:00", - "compile_ended_at": "2026-08-29T00:39:11.090558+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "b225403c1a50", "configuration": "esp-entrancebathrmlights.yaml", @@ -1029,657 +3044,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "1001015f3ab1", - "configuration": "esp-entmulti.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:22:08.698093+00:00", - "started_at": "2026-08-29T00:35:30.755795+00:00", - "completed_at": "2026-08-29T00:38:49.289237+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": "477266a2cdd0", - "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": "477266a2cdd0", - "configuration": "esp-entmulti.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:22:08.698055+00:00", - "started_at": "2026-08-29T00:31:32.126828+00:00", - "completed_at": "2026-08-29T00:35:30.751842+00:00", - "compile_started_at": "2026-08-29T00:32:01.128110+00:00", - "compile_ended_at": "2026-08-29T00:35:22.368188+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 99, - "remote_peer": "", - "remote_job_id": "", - "remote_peer_label": "", - "device_name": "", - "device_friendly_name": "", - "source": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "535e50834ab3", - "configuration": "esp-reterminal-e1001.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:54.472064+00:00", - "started_at": "2026-08-29T00:29:23.430289+00:00", - "completed_at": "2026-08-29T00:34:07.997775+00:00", - "compile_started_at": "2026-08-29T00:29:43.680126+00:00", - "compile_ended_at": "2026-08-29T00:34:07.691959+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": true, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 99, - "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": "5904b1e09e46", - "configuration": "esp-poolpumppower.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:21:49.612768+00:00", - "started_at": "2026-08-29T00:31:32.126630+00:00", - "completed_at": "2026-08-29T00:32:31.708947+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": "2e5d17fb59c6", - "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": "2e5d17fb59c6", - "configuration": "esp-poolpumppower.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:49.612728+00:00", - "started_at": "2026-08-29T00:27:20.249459+00:00", - "completed_at": "2026-08-29T00:31:32.124845+00:00", - "compile_started_at": "2026-08-29T00:27:58.427601+00:00", - "compile_ended_at": "2026-08-29T00:31:21.853126+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 99, - "remote_peer": "", - "remote_job_id": "", - "remote_peer_label": "", - "device_name": "", - "device_friendly_name": "", - "source": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "910445e88e59", - "configuration": "esp-poollightpower2.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:21:45.807855+00:00", - "started_at": "2026-08-29T00:29:23.422032+00:00", - "completed_at": "2026-08-29T00:29:47.377263+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": "b29c61e957b2", - "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": "b29c61e957b2", - "configuration": "esp-poollightpower2.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:45.807809+00:00", - "started_at": "2026-08-29T00:26:17.351067+00:00", - "completed_at": "2026-08-29T00:29:23.417551+00:00", - "compile_started_at": "2026-08-29T00:26:20.310670+00:00", - "compile_ended_at": "2026-08-29T00:29:21.807162+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": "f02592eba146", - "configuration": "esp-rocktumbler.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:21:36.093006+00:00", - "started_at": "2026-08-29T00:27:20.249221+00:00", - "completed_at": "2026-08-29T00:27:34.134362+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": "137ef7c2ed93", - "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": "137ef7c2ed93", - "configuration": "esp-rocktumbler.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:36.092964+00:00", - "started_at": "2026-08-29T00:26:02.437738+00:00", - "completed_at": "2026-08-29T00:27:20.242490+00:00", - "compile_started_at": "2026-08-29T00:26:11.656896+00:00", - "compile_ended_at": "2026-08-29T00:27:16.745643+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "fba48f738cee", - "configuration": "esp-occupancystair.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:21:33.230863+00:00", - "started_at": "2026-08-29T00:26:17.306253+00:00", - "completed_at": "2026-08-29T00:26:33.188710+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": "71b54e307235", - "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": "71b54e307235", - "configuration": "esp-occupancystair.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:33.230820+00:00", - "started_at": "2026-08-29T00:24:41.582691+00:00", - "completed_at": "2026-08-29T00:26:17.304440+00:00", - "compile_started_at": "2026-08-29T00:24:45.758672+00:00", - "compile_ended_at": "2026-08-29T00:26:17.063063+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 42, - "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": "33d16bd0cde9", - "configuration": "esp-underhouselights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:21:23.309749+00:00", - "started_at": "2026-08-29T00:24:41.579263+00:00", - "completed_at": "2026-08-29T00:24:57.276684+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": "294597e0347f", - "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": "294597e0347f", - "configuration": "esp-underhouselights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:21:23.309708+00:00", - "started_at": "2026-08-29T00:22:54.740384+00:00", - "completed_at": "2026-08-29T00:24:41.571514+00:00", - "compile_started_at": "2026-08-29T00:22:57.852664+00:00", - "compile_ended_at": "2026-08-29T00:24:40.026902+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": "0102ec4b2c16", - "configuration": "esp-officeusbhubpower.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:04:39.074220+00:00", - "started_at": "2026-08-29T00:26:02.437491+00:00", - "completed_at": "2026-08-29T00:26:13.173436+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": "6000a7ab9a9c", - "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": "6000a7ab9a9c", - "configuration": "esp-officeusbhubpower.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:04:39.074186+00:00", - "started_at": "2026-08-29T00:22:14.590089+00:00", - "completed_at": "2026-08-29T00:26:02.433263+00:00", - "compile_started_at": "2026-08-29T00:22:23.222496+00:00", - "compile_ended_at": "2026-08-29T00:25:58.503017+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "bccabfe5b865", - "configuration": "esp-officelights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:04:35.224166+00:00", - "started_at": "2026-08-29T00:22:54.726210+00:00", - "completed_at": "2026-08-29T00:23:05.564246+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": "10e05d8734ae", - "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": "10e05d8734ae", - "configuration": "esp-officelights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:04:35.224113+00:00", - "started_at": "2026-08-29T00:21:06.659194+00:00", - "completed_at": "2026-08-29T00:22:54.724030+00:00", - "compile_started_at": "2026-08-29T00:21:08.993198+00:00", - "compile_ended_at": "2026-08-29T00:22:53.146982+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": "6bd542a7369b", - "configuration": "esp-officedeskrightgpo.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:04:31.046057+00:00", - "started_at": "2026-08-29T00:21:06.631829+00:00", - "completed_at": "2026-08-29T00:22:27.131623+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": "4f469deda1a6", - "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": "4f469deda1a6", - "configuration": "esp-officedeskrightgpo.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:04:31.046017+00:00", - "started_at": "2026-08-29T00:19:18.459386+00:00", - "completed_at": "2026-08-29T00:21:06.629752+00:00", - "compile_started_at": "2026-08-29T00:19:20.719067+00:00", - "compile_ended_at": "2026-08-29T00:21:05.051464+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": "44ca711e1ad9", - "configuration": "esp-officeelvcontrol.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:04:27.766116+00:00", - "started_at": "2026-08-29T00:19:18.450932+00:00", - "completed_at": "2026-08-29T00:19:29.146943+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": "0780a367c3a8", - "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": "0780a367c3a8", - "configuration": "esp-officeelvcontrol.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:04:27.766071+00:00", - "started_at": "2026-08-29T00:17:34.127124+00:00", - "completed_at": "2026-08-29T00:19:18.448569+00:00", - "compile_started_at": "2026-08-29T00:17:36.424684+00:00", - "compile_ended_at": "2026-08-29T00:19:16.900382+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": "eebe19862d4d", "configuration": "esp-masterbdrmwest.yaml", @@ -1804,130 +3168,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "c2c31e12227f", - "configuration": "esp-mainkitchenlights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:04:01.146914+00:00", - "started_at": "2026-08-29T00:14:01.515480+00:00", - "completed_at": "2026-08-29T00:14:10.551996+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": "22cc83653c75", - "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": "22cc83653c75", - "configuration": "esp-mainkitchenlights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:04:01.146872+00:00", - "started_at": "2026-08-29T00:12:16.720666+00:00", - "completed_at": "2026-08-29T00:14:01.512729+00:00", - "compile_started_at": "2026-08-29T00:12:19.664045+00:00", - "compile_ended_at": "2026-08-29T00:13:59.774057+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": "ba5609857649", - "configuration": "esp-mainpowermonitor.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-29T00:03:57.930772+00:00", - "started_at": "2026-08-29T00:22:14.589884+00:00", - "completed_at": "2026-08-29T00:22:26.593718+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": "3023b045dbdc", - "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": "3023b045dbdc", - "configuration": "esp-mainpowermonitor.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-29T00:03:57.930731+00:00", - "started_at": "2026-08-29T00:10:17.379235+00:00", - "completed_at": "2026-08-29T00:22:14.571658+00:00", - "compile_started_at": "2026-08-29T00:10:28.889058+00:00", - "compile_ended_at": "2026-08-29T00:22:11.068323+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, { "job_id": "1c9cbe8db40f", "configuration": "esp-mainhallwaynightlights.yaml", @@ -2238,68 +3478,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "7439685de152", - "configuration": "esp-mainhallwaynorthlightswitch.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T23:38:48.668799+00:00", - "started_at": "2026-08-28T23:58:04.531031+00:00", - "completed_at": "2026-08-28T23:58:14.540698+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": "f5966ba29c9a", - "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": "f5966ba29c9a", - "configuration": "esp-mainhallwaynorthlightswitch.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T23:38:48.668758+00:00", - "started_at": "2026-08-28T23:56:22.997984+00:00", - "completed_at": "2026-08-28T23:58:04.528282+00:00", - "compile_started_at": "2026-08-28T23:56:25.274343+00:00", - "compile_ended_at": "2026-08-28T23:58:02.971325+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": "632b31b7f3b7", "configuration": "esp-mainbathfancombo.yaml", @@ -3292,812 +4470,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "0a1ce75abbdf", - "configuration": "esp-downstbathswitch.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T23:28:50.752680+00:00", - "started_at": "2026-08-28T23:32:24.985010+00:00", - "completed_at": "2026-08-28T23:32:34.710352+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": "394db5df063f", - "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": "394db5df063f", - "configuration": "esp-downstbathswitch.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T23:28:50.752635+00:00", - "started_at": "2026-08-28T23:30:35.849909+00:00", - "completed_at": "2026-08-28T23:32:24.982750+00:00", - "compile_started_at": "2026-08-28T23:30:38.391707+00:00", - "compile_ended_at": "2026-08-28T23:32:23.404349+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": "dfa3d82ef8f1", - "configuration": "esp-datacupboardpower-right.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T23:28:46.268665+00:00", - "started_at": "2026-08-28T23:30:35.819745+00:00", - "completed_at": "2026-08-28T23:30:45.031129+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": "e7b8aa487fbb", - "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": "e7b8aa487fbb", - "configuration": "esp-datacupboardpower-right.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T23:28:46.268625+00:00", - "started_at": "2026-08-28T23:28:46.269787+00:00", - "completed_at": "2026-08-28T23:30:35.817493+00:00", - "compile_started_at": "2026-08-28T23:28:49.429645+00:00", - "compile_ended_at": "2026-08-28T23:30:34.221600+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": "55e44bd0d28f", - "configuration": "esp-datacupboardpower-left.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:38:24.561117+00:00", - "started_at": "2026-08-28T22:57:44.435848+00:00", - "completed_at": "2026-08-28T22:57:51.604813+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": "111626be2f5e", - "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": "111626be2f5e", - "configuration": "esp-datacupboardpower-left.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:38:24.561079+00:00", - "started_at": "2026-08-28T22:55:02.592056+00:00", - "completed_at": "2026-08-28T22:57:44.433414+00:00", - "compile_started_at": "2026-08-28T22:55:06.845044+00:00", - "compile_ended_at": "2026-08-28T22:57:42.865485+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": "e556ba5cd1fd", - "configuration": "esp-datacupboardfans.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:38:20.431519+00:00", - "started_at": "2026-08-28T22:55:02.582061+00:00", - "completed_at": "2026-08-28T22:55:09.550787+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": "f4a1bb3c1648", - "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": "f4a1bb3c1648", - "configuration": "esp-datacupboardfans.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:38:20.431479+00:00", - "started_at": "2026-08-28T22:52:17.830169+00:00", - "completed_at": "2026-08-28T22:55:02.579489+00:00", - "compile_started_at": "2026-08-28T22:52:20.553740+00:00", - "compile_ended_at": "2026-08-28T22:55:00.969041+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": "2205eb5a5c50", - "configuration": "esp-centralstairs-top.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:38:14.919756+00:00", - "started_at": "2026-08-28T22:55:17.818414+00:00", - "completed_at": "2026-08-28T22:55:39.925740+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": "69dba8560c1f", - "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": "69dba8560c1f", - "configuration": "esp-centralstairs-top.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:38:14.919718+00:00", - "started_at": "2026-08-28T22:51:15.721508+00:00", - "completed_at": "2026-08-28T22:55:17.816818+00:00", - "compile_started_at": "2026-08-28T22:51:26.237353+00:00", - "compile_ended_at": "2026-08-28T22:55:14.435179+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "84a3ad4bdc0a", - "configuration": "esp-centralstairs-bottom.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:38:11.925580+00:00", - "started_at": "2026-08-28T22:52:17.814396+00:00", - "completed_at": "2026-08-28T22:52:25.165177+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": "1912ad318614", - "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": "1912ad318614", - "configuration": "esp-centralstairs-bottom.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:38:11.925543+00:00", - "started_at": "2026-08-28T22:50:30.431123+00:00", - "completed_at": "2026-08-28T22:52:17.812768+00:00", - "compile_started_at": "2026-08-28T22:50:33.004266+00:00", - "compile_ended_at": "2026-08-28T22:52:16.246053+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": "a7169fe004db", - "configuration": "esp-bedrm2fanswitch.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:49.860439+00:00", - "started_at": "2026-08-28T22:50:30.413687+00:00", - "completed_at": "2026-08-28T22:50:41.685019+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": "15e4df02b05a", - "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": "15e4df02b05a", - "configuration": "esp-bedrm2fanswitch.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:49.860402+00:00", - "started_at": "2026-08-28T22:48:47.642079+00:00", - "completed_at": "2026-08-28T22:50:30.411941+00:00", - "compile_started_at": "2026-08-28T22:48:50.254347+00:00", - "compile_ended_at": "2026-08-28T22:50:28.907753+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": "7988b9705aaa", - "configuration": "esp-bedrm2lights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:45.433782+00:00", - "started_at": "2026-08-28T22:48:47.622651+00:00", - "completed_at": "2026-08-28T22:48:59.097977+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": "14bea85319f0", - "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": "14bea85319f0", - "configuration": "esp-bedrm2lights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:45.433745+00:00", - "started_at": "2026-08-28T22:47:02.488786+00:00", - "completed_at": "2026-08-28T22:48:47.620270+00:00", - "compile_started_at": "2026-08-28T22:47:05.038011+00:00", - "compile_ended_at": "2026-08-28T22:48:46.140733+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": "99db2cf0179e", - "configuration": "esp-bedrm3fanswitch.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:38.830523+00:00", - "started_at": "2026-08-28T22:51:15.721309+00:00", - "completed_at": "2026-08-28T22:51:41.269887+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": "a1973d37b37f", - "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": "a1973d37b37f", - "configuration": "esp-bedrm3fanswitch.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:38.830486+00:00", - "started_at": "2026-08-28T22:45:12.247787+00:00", - "completed_at": "2026-08-28T22:51:15.718498+00:00", - "compile_started_at": "2026-08-28T22:45:20.568070+00:00", - "compile_ended_at": "2026-08-28T22:51:12.248547+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "206414cefaa0", - "configuration": "esp-bedrm1airfilter.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:23.488719+00:00", - "started_at": "2026-08-28T22:45:12.247603+00:00", - "completed_at": "2026-08-28T22:45:20.920864+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": "42faa3d28e53", - "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": "42faa3d28e53", - "configuration": "esp-bedrm1airfilter.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:23.488680+00:00", - "started_at": "2026-08-28T22:43:57.788779+00:00", - "completed_at": "2026-08-28T22:45:12.245889+00:00", - "compile_started_at": "2026-08-28T22:44:05.931059+00:00", - "compile_ended_at": "2026-08-28T22:45:08.889755+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "fa81bded85a4", - "configuration": "esp-3dprinterpow.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:15.746570+00:00", - "started_at": "2026-08-28T22:47:02.482724+00:00", - "completed_at": "2026-08-28T22:47:16.228012+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": "fa281d7e8ea8", - "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": "fa281d7e8ea8", - "configuration": "esp-3dprinterpow.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:15.746532+00:00", - "started_at": "2026-08-28T22:39:25.205173+00:00", - "completed_at": "2026-08-28T22:47:02.478065+00:00", - "compile_started_at": "2026-08-28T22:39:32.153528+00:00", - "compile_ended_at": "2026-08-28T22:47:00.845099+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": "c2570954fa79", - "configuration": "esp-lounge6chdimmer.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:37:10.295884+00:00", - "started_at": "2026-08-28T22:43:57.788565+00:00", - "completed_at": "2026-08-28T22:44:05.768266+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": "e01dc19e7e73", - "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": "e01dc19e7e73", - "configuration": "esp-lounge6chdimmer.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:37:10.295845+00:00", - "started_at": "2026-08-28T22:37:10.296545+00:00", - "completed_at": "2026-08-28T22:43:57.780896+00:00", - "compile_started_at": "2026-08-28T22:37:36.386442+00:00", - "compile_ended_at": "2026-08-28T22:43:53.976088+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": "remote", - "source_pin_sha256": "11faf1169a008873b779b7223309fd7d8def200d1548f7b62955f71a67796a12", - "source_label": "Panda ESPHome Builder", - "source_esphome_version": "2026.7.2", - "target_esphome_version": "", - "failure_reason": "" - }, - { - "job_id": "2f73254d89ba", - "configuration": "esp-occupancyoffice.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-28T22:36:21.344008+00:00", - "started_at": "2026-08-28T22:39:25.196425+00:00", - "completed_at": "2026-08-28T22:39:39.895776+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": "166ab276cf5c", - "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": "166ab276cf5c", - "configuration": "esp-occupancyoffice.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-28T22:36:21.343950+00:00", - "started_at": "2026-08-28T22:36:21.346327+00:00", - "completed_at": "2026-08-28T22:39:25.193718+00:00", - "compile_started_at": "2026-08-28T22:36:40.640515+00:00", - "compile_ended_at": "2026-08-28T22:39:24.984005+00:00", - "exit_code": 0, - "error": null, - "port": "", - "flash_bootloader": false, - "is_deferred_install": false, - "new_name": "", - "depends_on": "", - "dependency_released": false, - "progress": 99, - "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": "8bfd4a699e19", "configuration": "esp-loungenorthswitch.yaml", @@ -4284,130 +4656,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "7b96967e1489", - "configuration": "esp-bedrm2ceilingfan.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-20T11:48:47.854312+00:00", - "started_at": "2026-08-20T11:54:34.561746+00:00", - "completed_at": "2026-08-20T11:54:51.160299+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": "66f06d50086c", - "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": "66f06d50086c", - "configuration": "esp-bedrm2ceilingfan.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-20T11:48:47.854269+00:00", - "started_at": "2026-08-20T11:51:35.613774+00:00", - "completed_at": "2026-08-20T11:54:34.560822+00:00", - "compile_started_at": "2026-08-20T11:51:38.997391+00:00", - "compile_ended_at": "2026-08-20T11:54:32.958041+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": "e1aba04685af", - "configuration": "esp-officeduallights.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-08-16T05:31:47.346007+00:00", - "started_at": "2026-08-16T05:34:18.649544+00:00", - "completed_at": "2026-08-16T05:34:33.344242+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": "8714f3d9487f", - "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": "8714f3d9487f", - "configuration": "esp-officeduallights.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-08-16T05:31:47.345962+00:00", - "started_at": "2026-08-16T05:31:47.347180+00:00", - "completed_at": "2026-08-16T05:34:18.641802+00:00", - "compile_started_at": "2026-08-16T05:31:49.819610+00:00", - "compile_ended_at": "2026-08-16T05:34:16.649062+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": "5fd0b20d888b", "configuration": "esp-spare1-athomv1.yaml", @@ -4439,68 +4687,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "d62458de05ec", - "configuration": "esp-breakfastbarleds.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-07-26T06:42:52.861266+00:00", - "started_at": "2026-07-26T06:45:26.478990+00:00", - "completed_at": "2026-07-26T06:45:37.963383+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": "317466d86d94", - "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": "317466d86d94", - "configuration": "esp-breakfastbarleds.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-07-26T06:42:52.861220+00:00", - "started_at": "2026-07-26T06:42:52.862506+00:00", - "completed_at": "2026-07-26T06:45:26.475796+00:00", - "compile_started_at": "2026-07-26T06:43:12.444578+00:00", - "compile_ended_at": "2026-07-26T06:45:24.984824+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": "dd12f1e54f45", "configuration": "esp-loungebookshelfleds.yaml", @@ -4811,68 +4997,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "9cbf97897874", - "configuration": "esp-masterbathtowelrail.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-07-26T05:41:18.333607+00:00", - "started_at": "2026-07-26T05:49:22.865064+00:00", - "completed_at": "2026-07-26T05:49:36.537045+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": "e87b47b137f2", - "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": "e87b47b137f2", - "configuration": "esp-masterbathtowelrail.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-07-26T05:41:18.333568+00:00", - "started_at": "2026-07-26T05:45:59.071634+00:00", - "completed_at": "2026-07-26T05:49:22.862189+00:00", - "compile_started_at": "2026-07-26T05:46:07.978340+00:00", - "compile_ended_at": "2026-07-26T05:49:21.151759+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": "37af0913c0d4", "configuration": "esp-loungepelmetleds2.yaml", @@ -4997,68 +5121,6 @@ "target_esphome_version": "", "failure_reason": "" }, - { - "job_id": "f646f488d5a7", - "configuration": "esp-downstbathtowelrail.yaml", - "job_type": "upload", - "status": "completed", - "created_at": "2026-07-25T10:26:28.758052+00:00", - "started_at": "2026-07-25T10:45:52.053193+00:00", - "completed_at": "2026-07-25T10:46:05.296181+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": "ba76dab81aec", - "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": "ba76dab81aec", - "configuration": "esp-downstbathtowelrail.yaml", - "job_type": "compile", - "status": "completed", - "created_at": "2026-07-25T10:26:28.758008+00:00", - "started_at": "2026-07-25T10:43:06.713031+00:00", - "completed_at": "2026-07-25T10:45:52.051274+00:00", - "compile_started_at": "2026-07-25T10:43:12.577772+00:00", - "compile_ended_at": "2026-07-25T10:45:50.513198+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": "c84bad09993e", "configuration": "esp-espnow_test_transmitter1.yaml", diff --git a/esphome/patch b/esphome/patch new file mode 100644 index 0000000..597e992 --- /dev/null +++ b/esphome/patch @@ -0,0 +1,223 @@ +--- a/esp-bedside-panel.yaml ++++ b/esp-bedside-panel.yaml +@@ -5,6 +5,7 @@ + # https://home.fox.co.nz/gitea/zorruno/zorruno-homeassistant/src/branch/master/esphome/esp-bedside-panel.yaml + #:########################################################################################:# + # VERSIONS: ++# V1.56 2026-09-04 Added latched blackout after 10 seconds below 1 lx with immediate exit + # V1.55 2026-08-16 Show only Clock time and date in Blackout ambient-light mode + # V1.54 2026-08-16 Dimmed Clock time and date palette in Blackout ambient-light mode +@@ -248,7 +249,6 @@ + # Bright light: approximately 642-643 lx + ambient_lux_multiplier_default: "200" +- +- display_blackout_lux_threshold_default: "2" + display_dark_lux_threshold_default: "20" + display_bright_lux_threshold_default: "250" +@@ -921,21 +921,6 @@ + step: 5 + mode: box + +- - platform: template +- id: display_blackout_lux_threshold +- name: "${friendly_name} Blackout Lux Threshold" +- icon: mdi:brightness-1 +- entity_category: config +- optimistic: true +- restore_value: true +- initial_value: "${display_blackout_lux_threshold_default}" +- unit_of_measurement: "lx" +- min_value: 0 +- max_value: 20 +- step: 0.5 +- mode: box +- + - platform: template + id: display_dark_lux_threshold +@@ -1228,6 +1213,45 @@ + update_interval: 3s + lambda: |- + const float voltage = id(ambient_light_voltage).state; ++ ++ if (isnan(voltage)) { ++ return NAN; ++ } ++ ++ float multiplier = id(ambient_lux_multiplier).state; ++ ++ if (isnan(multiplier) || multiplier <= 0.0f) { ++ multiplier = 200.0f; ++ } ++ ++ return voltage * multiplier; ++ on_value: ++ then: ++ - if: ++ condition: ++ lambda: |- ++ return !isnan(x) && x >= 1.0f; ++ then: ++ - script.stop: latch_display_blackout ++ - lambda: |- ++ id(display_blackout_active) = false; ++ - if: ++ condition: ++ lambda: |- ++ return id(lvgl_ready) && id(display_is_dimmed); ++ then: ++ - script.execute: apply_dim_backlight ++ else: ++ - if: ++ condition: ++ lambda: |- ++ return id(lvgl_ready); ++ then: ++ - script.execute: apply_active_backlight ++ else: ++ - if: ++ condition: ++ lambda: |- ++ return !isnan(x) && x < 1.0f && !id(display_blackout_active); ++ then: ++ - script.execute: latch_display_blackout +- float multiplier = id(ambient_lux_multiplier).state; +- +- if (isnan(voltage)) { +- return NAN; +- } +- +- if (isnan(multiplier) || multiplier <= 0.0f) { +- multiplier = 200.0f; +- } +- +- return voltage * multiplier; + + - platform: homeassistant +@@ -1918,6 +1942,12 @@ + restore_value: false + initial_value: "false" + ++ # True after ambient light remains below 1 lx for 10 continuous seconds. ++ - id: display_blackout_active ++ type: bool ++ restore_value: false ++ initial_value: "false" ++ + # True only while the Security page is visible. +@@ -3133,31 +3163,52 @@ +- # Four ambient ranges are used: +- # Blackout: lux < Blackout Lux Threshold +- # Dark: Blackout threshold to Dark Lux Threshold +- # Normal: between Dark and Bright thresholds +- # Bright: lux >= Bright Lux Threshold ++ # Blackout latches after ambient light remains below 1 lx for 10 seconds and ++ # exits immediately when ambient light reaches 1 lx. The remaining ranges are: ++ # Dark: lux <= Dark Lux Threshold ++ # Normal: between Dark and Bright thresholds ++ # Bright: lux >= Bright Lux Threshold + # + # The active and clock/idle brightness levels are independently adjustable + # and restored after reboot. + ++ - id: latch_display_blackout ++ mode: single ++ then: ++ - delay: 10s ++ - if: ++ condition: ++ lambda: |- ++ const float lux = id(ambient_light_illuminance).state; ++ return !isnan(lux) && lux < 1.0f; ++ then: ++ - lambda: |- ++ id(display_blackout_active) = true; ++ - if: ++ condition: ++ lambda: |- ++ return id(lvgl_ready) && id(display_is_dimmed); ++ then: ++ - script.execute: apply_dim_backlight ++ else: ++ - if: ++ condition: ++ lambda: |- ++ return id(lvgl_ready); ++ then: ++ - script.execute: apply_active_backlight ++ + # Keep the idle Clock unobtrusive at the minimum usable backlight level. + - id: apply_clock_blackout_palette +@@ -3146,15 +3197,7 @@ + - if: + condition: + lambda: |- +- const float lux = id(ambient_light_illuminance).state; +- float blackout_threshold = +- id(display_blackout_lux_threshold).state; +- +- if (isnan(blackout_threshold)) { +- blackout_threshold = 2.0f; +- } +- +- return !isnan(lux) && lux < blackout_threshold; ++ return id(display_blackout_active); +@@ -3212,22 +3255,12 @@ + brightness: !lambda |- + const float lux = id(ambient_light_illuminance).state; + +- float blackout_threshold = +- id(display_blackout_lux_threshold).state; + float dark_threshold = + id(display_dark_lux_threshold).state; + float bright_threshold = + id(display_bright_lux_threshold).state; + +- if (isnan(blackout_threshold)) { +- blackout_threshold = 2.0f; +- } +- + if ( + isnan(dark_threshold) || +- dark_threshold <= blackout_threshold ++ dark_threshold <= 0.0f + ) { + dark_threshold = 20.0f; + } +@@ -3239,7 +3272,7 @@ + + float brightness_percent; + +- if (!isnan(lux) && lux < blackout_threshold) { ++ if (id(display_blackout_active)) { + brightness_percent = + id(display_blackout_brightness).state; +@@ -3280,22 +3313,12 @@ + brightness: !lambda |- + const float lux = id(ambient_light_illuminance).state; + +- float blackout_threshold = +- id(display_blackout_lux_threshold).state; + float dark_threshold = + id(display_dark_lux_threshold).state; + float bright_threshold = + id(display_bright_lux_threshold).state; + +- if (isnan(blackout_threshold)) { +- blackout_threshold = 2.0f; +- } +- + if ( + isnan(dark_threshold) || +- dark_threshold <= blackout_threshold ++ dark_threshold <= 0.0f + ) { + dark_threshold = 20.0f; + } +@@ -3307,7 +3330,7 @@ + + float brightness_percent; + +- if (!isnan(lux) && lux < blackout_threshold) { ++ if (id(display_blackout_active)) { + brightness_percent = + id(display_blackout_brightness).state; diff --git a/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml b/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml index a668183..25c764b 100644 --- a/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml +++ b/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml @@ -1,26 +1,28 @@ #:########################################################################################:# # PACKAGE: Office Lights Home Assistant Fallback Synchronization # FILE: Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml -# VERSION: v1.0.0 -# DATE: 2026-08-16 +# VERSION: v1.2.0 +# DATE: 2026-09-12 #:########################################################################################:# # # PURPOSE: -# Provides the Home Assistant API transport for Office two-way light control -# when MQTT is unavailable. Direct MQTT remains the HA-down transport. +# Provides Home Assistant-primary synchronization for the Office two-way +# light controls. Direct MQTT peer control is the HA-down transport. # # OPERATION: # - Synchronizes the Office bunker and overhead control pairs in both directions. -# - Uses idempotent Home Assistant actions, so MQTT and HA may both be online -# without creating a control loop. +# - ESPHome permits direct MQTT peer synchronization only while HA's native +# API state subscription is disconnected, preventing competing controllers. # - Does not reconcile state during Home Assistant startup, preventing a stale # restored entity state from changing a physical light. # # DEPENDENCIES: # - Blueprint: zorruno/two_three_way_sync.yaml -# - esp-officelights and esp-officeduallights native ESPHome API connections. +# - esp-officelights v3.2 and esp-officeduallights v3.0 or later. # # VERSION HISTORY: +# - v1.2.0 (2026-09-12): Enable after guarded HA-primary firmware deployment. +# - v1.1.0 (2026-09-12): Disabled until guarded HA-primary firmware deployment. # - v1.0.0 (2026-08-16): Initial MQTT-down HA fallback for Office lights. #:########################################################################################:# diff --git a/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml.bak b/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml.bak new file mode 100644 index 0000000..a6da287 --- /dev/null +++ b/packages/Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml.bak @@ -0,0 +1,57 @@ +#:########################################################################################:# +# PACKAGE: Office Lights Home Assistant Fallback Synchronization +# FILE: Lighting_2Way_Sync/office_lights_ha_fallback_sync.yaml +# VERSION: v1.1.0 +# DATE: 2026-09-12 +#:########################################################################################:# +# +# PURPOSE: +# Provides the Home Assistant API transport for Office two-way light control +# when MQTT is unavailable. Direct MQTT remains the HA-down transport. +# +# OPERATION: +# - Synchronizes the Office bunker and overhead control pairs in both directions. +# - The automations remain disabled until both ESPHome devices enforce the +# HA-primary/MQTT-fallback authority boundary. +# - Does not reconcile state during Home Assistant startup, preventing a stale +# restored entity state from changing a physical light. +# +# DEPENDENCIES: +# - Blueprint: zorruno/two_three_way_sync.yaml +# - esp-officelights and esp-officeduallights native ESPHome API connections. +# +# VERSION HISTORY: +# - v1.1.0 (2026-09-12): Disable until guarded HA-primary firmware is deployed. +# - v1.0.0 (2026-08-16): Initial MQTT-down HA fallback for Office lights. +#:########################################################################################:# + +automation: + #:##########################################################################:# + # BUNKER LIGHTS + #:##########################################################################:# + - id: office_bunker_lights_ha_fallback_sync + alias: "Office Bunker Lights HA Fallback Sync" + initial_state: false + use_blueprint: + path: zorruno/two_three_way_sync.yaml + input: + members: + - switch.office_office_main_lightswitch_3_relay_1_bunker_lights + - light.esp_officeduallights_light_1_right_hand_bunker_light + sync_on_start: false + startup_delay: 5 + + #:##########################################################################:# + # OVERHEAD LIGHTS + #:##########################################################################:# + - id: office_overhead_lights_ha_fallback_sync + alias: "Office Overhead Lights HA Fallback Sync" + initial_state: false + use_blueprint: + path: zorruno/two_three_way_sync.yaml + input: + members: + - switch.office_office_main_lightswitch_3_relay_2_overhead_lights + - light.esp_officeduallights_light_2_cool_white_overhead_lights + sync_on_start: false + startup_delay: 5 diff --git a/packages/Pool_Controls/pool_light_operation.yaml b/packages/Pool_Controls/pool_light_operation.yaml index e984708..948f267 100644 --- a/packages/Pool_Controls/pool_light_operation.yaml +++ b/packages/Pool_Controls/pool_light_operation.yaml @@ -9,9 +9,13 @@ # packages/Pool_Controls/pool_light_operation.yaml # # VERSION: -# V1.2 2026-07-20 +# V1.3 2026-09-06 # # VERSION HISTORY: +# V1.3 2026-09-06 +# - Treat the colour selector's "0= OFF" as a true Operation Mode OFF and +# arm the midnight TIMER reset. +# # V1.2 2026-07-20 # - Corrected the documented package filename. # - Documented the relationship with the native ESPHome controls. @@ -151,6 +155,40 @@ automation: target: entity_id: input_boolean.timer_light_midnight_pending + - id: pool_light_schedule_timer_when_operation_mode_off + alias: "Pool Light - Schedule TIMER When Operation Mode Is OFF" + description: "Arms the midnight TIMER reset for direct Operation Mode OFF commands." + mode: single + + trigger: + - platform: state + entity_id: select.esp_poollightpower2_operation_mode + to: "OFF" + + action: + - action: input_boolean.turn_on + target: + entity_id: input_boolean.timer_light_midnight_pending + + - id: pool_light_send_off_when_colour_off_selected + alias: "Pool Light - Send OFF When Colour Off Is Selected" + description: "Converts colour selector 0= OFF into Operation Mode OFF with midnight reset." + mode: restart + + trigger: + - platform: state + entity_id: select.esp_poollightpower2_pool_light_mode + to: "0= OFF" + + action: + - action: mqtt.publish + data: + topic: "viewroad-commands/poollight-timer/operation" + payload: "OFF" + - action: input_boolean.turn_on + target: + entity_id: input_boolean.timer_light_midnight_pending + - id: pool_light_sync_ui_switch_with_real_output alias: "Pool Light - Sync UI Switch With Real Output" description: "Keeps the UI switch aligned with the real ESPHome pool light output without sending MQTT commands." diff --git a/packages/byd_lock_button.yaml b/packages/byd_lock_button.yaml new file mode 100644 index 0000000..d966588 --- /dev/null +++ b/packages/byd_lock_button.yaml @@ -0,0 +1,24 @@ +# Package: BYD Lock Button +# Purpose: +# Provides a voice-assistant-safe BYD lock control that can only issue a lock command. +# Notes: +# The icon reflects the live state of the underlying BYD lock. This button has no +# unlock action. +# Version history: +# - 1.0.0: Initial lock-only BYD button. +# +#:########################################################################################:# +# Template Button +#:########################################################################################:# +template: + - button: + - name: "BYD Lock" + unique_id: byd_lock_button + default_entity_id: button.byd_lock + availability: "{{ has_value('lock.atto_3_lock') }}" + icon: >- + {{ 'mdi:lock' if is_state('lock.atto_3_lock', 'locked') else 'mdi:lock-open' }} + press: + - action: lock.lock + target: + entity_id: lock.atto_3_lock diff --git a/packages/energy_cost_monitoring.yaml b/packages/energy_cost_monitoring.yaml index 6e8fe6a..b08d721 100644 --- a/packages/energy_cost_monitoring.yaml +++ b/packages/energy_cost_monitoring.yaml @@ -2,8 +2,8 @@ # PACKAGE: Energy Cost Monitoring ################################################################################ # -# Version: 1.3.0 -# Date: 2026-08-23 +# Version: 1.3.1 +# Date: 2026-09-01 # # Purpose: # Track GST-inclusive electricity costs for the three-phase grid supply and @@ -18,6 +18,8 @@ # boundary without averaging the old and new rates. # # Version history: +# 1.3.1 (2026-09-01): Move Downstairs Fridge and Freezer shared power-cost +# telemetry from X41PP to X68PM. # 1.3.0 (2026-08-24): Add Drinks Fridge and Vertical Freezer energy and # cost monitoring. # 1.2.0 (2026-08-23): Add Downstairs Lounge North GPO (X48PM) energy and @@ -326,11 +328,11 @@ template: unique_id: energy_cost_downstairs_fridge_rate unit_of_measurement: "NZD/h" state_class: measurement - availability: "{{ has_value('sensor.downstairs_fridge_power_x41pp_power') }}" + availability: "{{ has_value('sensor.downstairs_fridge_gpo_power_x68pm_power') }}" state: >- {{ ( - states('sensor.downstairs_fridge_power_x41pp_power') | float(0) + states('sensor.downstairs_fridge_gpo_power_x68pm_power') | float(0) / 1000 * states('sensor.electricity_current_price') | float(0) ) | round(6) diff --git a/packages/fridge_freezer_monitoring.yaml b/packages/fridge_freezer_monitoring.yaml index 0f18ea5..b5fbd73 100644 --- a/packages/fridge_freezer_monitoring.yaml +++ b/packages/fridge_freezer_monitoring.yaml @@ -1,7 +1,13 @@ #:########################################################################################:# # PACKAGE: Fridge and Freezer Monitoring # FILE: packages/fridge_freezer_monitoring.yaml -# VERSION: v1.11.0 2026-08-30 +# VERSION: v1.13.0 2026-09-03 +# - Moves Downstairs Freezer temperature, humidity, and battery monitoring +# from X62TS to X70TS. +# - Moves shared Downstairs Fridge and Freezer power monitoring from X41PP to +# the metering-only X68PM GPO. +# - Reports an unavailable Main Kitchen Fridge battery monitor explicitly, +# rather than showing an unqualified issue. # - Moves Main Kitchen Fridge temperature, humidity, and battery monitoring to # X65TS and adds X64LS illuminance-based door monitoring. # - v1.10.0 2026-08-29: Adds Downstairs Freezer temperature, battery, door, humidity, and shared @@ -61,8 +67,7 @@ # - Seven configured fridge/freezer temperature and battery monitor pairs. # - switch.upstairs_fridge_power_x31pp # - sensor.upstairs_fridge_power_x31pp_power -# - switch.downstairs_fridge_power_x41pp -# - sensor.downstairs_fridge_power_x41pp_power +# - sensor.downstairs_fridge_gpo_power_x68pm_power # - switch.drinks_fridge_power_x59pm # - sensor.drinks_fridge_power_x59pm_power # - switch.vertical_freezer_power_x60pm @@ -173,7 +178,7 @@ sensor: - platform: statistics name: "Downstairs Freezer Temperature Average 7 Days" unique_id: downstairs_freezer_temperature_average_7_days - entity_id: sensor.downstairs_freezer_temperature_x62ts_temperature + entity_id: sensor.downstairs_freezer_temperature_x70ts_temperature state_characteristic: average_step max_age: days: 7 @@ -182,7 +187,7 @@ sensor: - platform: statistics name: "Downstairs Freezer Temperature 95th Percentile 7 Days" unique_id: downstairs_freezer_temperature_95th_percentile_7_days - entity_id: sensor.downstairs_freezer_temperature_x62ts_temperature + entity_id: sensor.downstairs_freezer_temperature_x70ts_temperature state_characteristic: percentile percentile: 95 max_age: @@ -192,7 +197,7 @@ sensor: - platform: derivative name: "Downstairs Freezer Temperature Change Rate" unique_id: downstairs_freezer_temperature_change_rate - source: sensor.downstairs_freezer_temperature_x62ts_temperature + source: sensor.downstairs_freezer_temperature_x70ts_temperature unit_time: h time_window: "00:30:00" max_sub_interval: "00:05:00" @@ -414,11 +419,10 @@ template: unique_id: downstairs_fridge_power_draw_lost device_class: problem state: >- - {% set power = states('sensor.downstairs_fridge_power_x41pp_power') | float(none) %} - {% set changed = states.sensor.downstairs_fridge_power_x41pp_power.last_changed %} + {% set power = states('sensor.downstairs_fridge_gpo_power_x68pm_power') | float(none) %} + {% set changed = states.sensor.downstairs_fridge_gpo_power_x68pm_power.last_changed %} {{ - is_state('switch.downstairs_fridge_power_x41pp', 'on') - and power is not none + power is not none and power < 1 and (now() - changed).total_seconds() >= 4 * 60 * 60 }} @@ -450,7 +454,11 @@ template: {{ temperature_missing or illuminance_missing - or (states('sensor.main_kitchen_fridge_temperature_x65ts_battery') | float(-1)) <= 20 + or battery_missing + or ( + not battery_missing + and (states('sensor.main_kitchen_fridge_temperature_x65ts_battery') | float(0)) <= 20 + ) or is_state('binary_sensor.main_kitchen_fridge_door_open_too_long', 'on') or ( not temperature_missing @@ -477,7 +485,9 @@ template: {% if illuminance_missing %} {% set ns.items = ns.items + ['Door monitor unavailable'] %} {% endif %} - {% if not battery_missing and (states('sensor.main_kitchen_fridge_temperature_x65ts_battery') | float(-1)) <= 20 %} + {% if battery_missing %} + {% set ns.items = ns.items + ['Battery monitor unavailable'] %} + {% elif (states('sensor.main_kitchen_fridge_temperature_x65ts_battery') | float(0)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} {% endif %} {% if states('switch.upstairs_fridge_power_x31pp') in ['unknown', 'unavailable'] or power_missing %} @@ -596,7 +606,6 @@ template: {% set threshold = [9, percentile + 0.5] | min if percentile is not none else 9 %} {{ temperature_missing - or battery_missing or (states('sensor.lcd_temp_humidity_btt04_battery') | float(-1)) <= 20 or (not temperature_missing and (states('sensor.lcd_temp_humidity_btt04_temperature') | float(0)) > threshold) }} @@ -608,8 +617,8 @@ template: {% set battery_missing = not has_value('sensor.lcd_temp_humidity_btt04_battery') %} {% set percentile = states('sensor.wine_fridge_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [9, percentile + 0.5] | min if percentile is not none else 9 %} - {% if temperature_missing or battery_missing %} - {% set ns.items = ns.items + ['Monitor offline'] %} + {% if temperature_missing %} + {% set ns.items = ns.items + ['Temperature monitor unavailable'] %} {% endif %} {% if not battery_missing and (states('sensor.lcd_temp_humidity_btt04_battery') | float(-1)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} @@ -638,7 +647,7 @@ template: {% set temperature_missing = not has_value('sensor.downstairs_fridge_temperature_x43ts_temperature') %} {% set battery_missing = not has_value('sensor.downstairs_fridge_temperature_x43ts_battery') %} {% set illuminance_missing = not has_value('sensor.downstairs_fridge_light_sensor_x58ls_illuminance') %} - {% set power_missing = not has_value('sensor.downstairs_fridge_power_x41pp_power') %} + {% set power_missing = not has_value('sensor.downstairs_fridge_gpo_power_x68pm_power') %} {% set percentile = states('sensor.downstairs_fridge_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [10, percentile + 0.5] | min if percentile is not none else 10 %} {{ @@ -651,7 +660,6 @@ template: and not is_state('binary_sensor.downstairs_fridge_temperature_recovery_grace', 'on') and (states('sensor.downstairs_fridge_temperature_x43ts_temperature') | float(0)) > threshold ) - or states('switch.downstairs_fridge_power_x41pp') != 'on' or power_missing or is_state('binary_sensor.downstairs_fridge_power_draw_lost', 'on') }} @@ -662,7 +670,7 @@ template: {% set temperature_missing = not has_value('sensor.downstairs_fridge_temperature_x43ts_temperature') %} {% set battery_missing = not has_value('sensor.downstairs_fridge_temperature_x43ts_battery') %} {% set illuminance_missing = not has_value('sensor.downstairs_fridge_light_sensor_x58ls_illuminance') %} - {% set power_missing = not has_value('sensor.downstairs_fridge_power_x41pp_power') %} + {% set power_missing = not has_value('sensor.downstairs_fridge_gpo_power_x68pm_power') %} {% set percentile = states('sensor.downstairs_fridge_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [10, percentile + 0.5] | min if percentile is not none else 10 %} {% if temperature_missing %} @@ -674,10 +682,8 @@ template: {% if not battery_missing and (states('sensor.downstairs_fridge_temperature_x43ts_battery') | float(-1)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} {% endif %} - {% if states('switch.downstairs_fridge_power_x41pp') in ['unknown', 'unavailable'] or power_missing %} + {% if power_missing %} {% set ns.items = ns.items + ['Power monitoring unavailable'] %} - {% elif not is_state('switch.downstairs_fridge_power_x41pp', 'on') %} - {% set ns.items = ns.items + ['Power switched off'] %} {% elif is_state('binary_sensor.downstairs_fridge_power_draw_lost', 'on') %} {% set ns.items = ns.items + ['Power lost - no power draw for 4 hours'] %} {% endif %} @@ -701,7 +707,7 @@ template: {{ [10, percentile + 0.5] | min if percentile is not none else 10 }} change_rate: "{{ states('sensor.downstairs_fridge_temperature_change_rate') }}" battery: "{{ states('sensor.downstairs_fridge_temperature_x43ts_battery') }}" - power: "{{ states('sensor.downstairs_fridge_power_x41pp_power') }}" + power: "{{ states('sensor.downstairs_fridge_gpo_power_x68pm_power') }}" door_open: "{{ is_state('binary_sensor.downstairs_fridge_door_open', 'on') }}" illuminance: "{{ states('sensor.downstairs_fridge_light_sensor_x58ls_illuminance') }}" @@ -710,22 +716,22 @@ template: device_class: problem delay_on: "00:01:00" state: >- - {% set temperature_missing = not has_value('sensor.downstairs_freezer_temperature_x62ts_temperature') %} - {% set battery_missing = not has_value('sensor.downstairs_freezer_temperature_x62ts_battery') %} - {% set power_missing = not has_value('sensor.downstairs_fridge_power_x41pp_power') %} + {% set temperature_missing = not has_value('sensor.downstairs_freezer_temperature_x70ts_temperature') %} + {% set battery_missing = not has_value('sensor.downstairs_freezer_temperature_x70ts_battery') %} + {% set illuminance_missing = not has_value('sensor.downstairs_freezer_light_sensor_x61ls_illuminance') %} + {% set power_missing = not has_value('sensor.downstairs_fridge_gpo_power_x68pm_power') %} {% set percentile = states('sensor.downstairs_freezer_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [-5, percentile + 0.5] | min if percentile is not none else -5 %} {{ temperature_missing - or battery_missing - or (states('sensor.downstairs_freezer_temperature_x62ts_battery') | float(-1)) <= 20 + or illuminance_missing + or (states('sensor.downstairs_freezer_temperature_x70ts_battery') | float(-1)) <= 20 or is_state('binary_sensor.downstairs_freezer_door_open_too_long', 'on') or ( not temperature_missing and not is_state('binary_sensor.downstairs_freezer_temperature_recovery_grace', 'on') - and (states('sensor.downstairs_freezer_temperature_x62ts_temperature') | float(0)) > threshold + and (states('sensor.downstairs_freezer_temperature_x70ts_temperature') | float(0)) > threshold ) - or states('switch.downstairs_fridge_power_x41pp') != 'on' or power_missing or is_state('binary_sensor.downstairs_fridge_power_draw_lost', 'on') }} @@ -733,21 +739,23 @@ template: appliance: "Downstairs Freezer" issues: >- {% set ns = namespace(items=[]) %} - {% set temperature_missing = not has_value('sensor.downstairs_freezer_temperature_x62ts_temperature') %} - {% set battery_missing = not has_value('sensor.downstairs_freezer_temperature_x62ts_battery') %} - {% set power_missing = not has_value('sensor.downstairs_fridge_power_x41pp_power') %} + {% set temperature_missing = not has_value('sensor.downstairs_freezer_temperature_x70ts_temperature') %} + {% set battery_missing = not has_value('sensor.downstairs_freezer_temperature_x70ts_battery') %} + {% set illuminance_missing = not has_value('sensor.downstairs_freezer_light_sensor_x61ls_illuminance') %} + {% set power_missing = not has_value('sensor.downstairs_fridge_gpo_power_x68pm_power') %} {% set percentile = states('sensor.downstairs_freezer_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [-5, percentile + 0.5] | min if percentile is not none else -5 %} - {% if temperature_missing or battery_missing %} - {% set ns.items = ns.items + ['Monitor offline'] %} + {% if temperature_missing %} + {% set ns.items = ns.items + ['Temperature monitor unavailable'] %} {% endif %} - {% if not battery_missing and (states('sensor.downstairs_freezer_temperature_x62ts_battery') | float(-1)) <= 20 %} + {% if illuminance_missing %} + {% set ns.items = ns.items + ['Door monitor unavailable'] %} + {% endif %} + {% if not battery_missing and (states('sensor.downstairs_freezer_temperature_x70ts_battery') | float(-1)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} {% endif %} - {% if states('switch.downstairs_fridge_power_x41pp') in ['unknown', 'unavailable'] or power_missing %} + {% if power_missing %} {% set ns.items = ns.items + ['Shared power monitoring unavailable'] %} - {% elif not is_state('switch.downstairs_fridge_power_x41pp', 'on') %} - {% set ns.items = ns.items + ['Shared power switched off'] %} {% elif is_state('binary_sensor.downstairs_fridge_power_draw_lost', 'on') %} {% set ns.items = ns.items + ['Shared power lost - no power draw for 4 hours'] %} {% endif %} @@ -755,7 +763,7 @@ template: {% set ns.items = ns.items + ['Door open too long'] %} {% elif not temperature_missing and is_state('binary_sensor.downstairs_freezer_temperature_recovery_grace', 'on') %} {% set ns.items = ns.items + ['Temperature alert delayed - door recently open'] %} - {% elif not temperature_missing and (states('sensor.downstairs_freezer_temperature_x62ts_temperature') | float(0)) > threshold %} + {% elif not temperature_missing and (states('sensor.downstairs_freezer_temperature_x70ts_temperature') | float(0)) > threshold %} {% if (states('sensor.downstairs_freezer_temperature_change_rate') | float(0)) >= 2 %} {% set ns.items = ns.items + ['Warming rapidly - possible open door'] %} {% else %} @@ -763,15 +771,15 @@ template: {% endif %} {% endif %} {{ ns.items }} - temperature: "{{ states('sensor.downstairs_freezer_temperature_x62ts_temperature') }}" - humidity: "{{ states('sensor.downstairs_freezer_temperature_x62ts_humidity') }}" + temperature: "{{ states('sensor.downstairs_freezer_temperature_x70ts_temperature') }}" + humidity: "{{ states('sensor.downstairs_freezer_temperature_x70ts_humidity') }}" average_7_days: "{{ states('sensor.downstairs_freezer_temperature_average_7_days') }}" alert_threshold: >- {% set percentile = states('sensor.downstairs_freezer_temperature_95th_percentile_7_days') | float(none) %} {{ [-5, percentile + 0.5] | min if percentile is not none else -5 }} change_rate: "{{ states('sensor.downstairs_freezer_temperature_change_rate') }}" - battery: "{{ states('sensor.downstairs_freezer_temperature_x62ts_battery') }}" - power: "{{ states('sensor.downstairs_fridge_power_x41pp_power') }}" + battery: "{{ states('sensor.downstairs_freezer_temperature_x70ts_battery') }}" + power: "{{ states('sensor.downstairs_fridge_gpo_power_x68pm_power') }}" door_open: "{{ is_state('binary_sensor.downstairs_freezer_door_open', 'on') }}" illuminance: "{{ states('sensor.downstairs_freezer_light_sensor_x61ls_illuminance') }}" @@ -787,7 +795,6 @@ template: {% set threshold = [-5, percentile + 0.5] | min if percentile is not none else -5 %} {{ temperature_missing - or battery_missing or (states('sensor.drinks_freezer_environment_lcd_btt02_battery') | float(-1)) <= 20 or states('switch.drinks_fridge_power_x59pm') != 'on' or power_missing @@ -803,8 +810,8 @@ template: {% set power_missing = not has_value('sensor.drinks_fridge_power_x59pm_power') %} {% set percentile = states('sensor.drinks_freezer_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [-5, percentile + 0.5] | min if percentile is not none else -5 %} - {% if temperature_missing or battery_missing %} - {% set ns.items = ns.items + ['Monitor offline'] %} + {% if temperature_missing %} + {% set ns.items = ns.items + ['Temperature monitor unavailable'] %} {% endif %} {% if not battery_missing and (states('sensor.drinks_freezer_environment_lcd_btt02_battery') | float(-1)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} @@ -845,7 +852,6 @@ template: {% set threshold = [-10, percentile + 6] | min if percentile is not none else -10 %} {{ temperature_missing - or battery_missing or (states('sensor.lcd_temp_humidity_btt03_battery') | float(-1)) <= 20 or states('switch.vertical_freezer_power_x60pm') != 'on' or power_missing @@ -861,8 +867,8 @@ template: {% set power_missing = not has_value('sensor.vertical_freezer_power_x60pm_power') %} {% set percentile = states('sensor.vertical_freezer_temperature_95th_percentile_7_days') | float(none) %} {% set threshold = [-10, percentile + 6] | min if percentile is not none else -10 %} - {% if temperature_missing or battery_missing %} - {% set ns.items = ns.items + ['Monitor offline'] %} + {% if temperature_missing %} + {% set ns.items = ns.items + ['Temperature monitor unavailable'] %} {% endif %} {% if not battery_missing and (states('sensor.lcd_temp_humidity_btt03_battery') | float(-1)) <= 20 %} {% set ns.items = ns.items + ['Low monitor battery'] %} diff --git a/packages/garage_corner_light_cctv_motion.yaml b/packages/garage_corner_light_cctv_motion.yaml index 661a528..12e9ed6 100644 --- a/packages/garage_corner_light_cctv_motion.yaml +++ b/packages/garage_corner_light_cctv_motion.yaml @@ -9,9 +9,12 @@ # packages/garage_corner_light_cctv_motion.yaml # # VERSION: -# V1.0 2026-06-29 +# V1.1 2026-08-31 # # VERSION HISTORY: +# V1.1 2026-08-31 +# - Restrict CCTV motion activation to one hour before sunset through one hour after sunrise. +# # V1.0 2026-06-29 # - Initial package. # - Turns the garage external corner light on when CCTV motion MQTT payload "1" is received. @@ -20,7 +23,8 @@ # - Adds a Home Assistant enable switch for CCTV movement triggers. # # PURPOSE: -# Turns on the garage external corner light from selected CCTV motion MQTT triggers. +# Turns on the garage external corner light from selected CCTV motion MQTT triggers +# during the configured night window. # # NOTES: # - The light is: @@ -31,6 +35,7 @@ # # - Turning OFF "Garage corner light movement triggers" prevents new CCTV triggers. # - If a timer is already running, it will still finish and turn the light off. +# - CCTV triggers run from one hour before sunset until one hour after sunrise. # #:########################################################################################:# # User Configuration # @@ -91,6 +96,12 @@ automation: entity_id: input_boolean.garage_corner_light_movement_triggers state: "on" + - condition: sun + after: sunset + after_offset: "-01:00:00" + before: sunrise + before_offset: "01:00:00" + action: - service: switch.turn_on target: diff --git a/packages/jobs_tracker_appliance_completion_triggers.yaml b/packages/jobs_tracker_appliance_completion_triggers.yaml index 1b2c6f1..226475f 100644 --- a/packages/jobs_tracker_appliance_completion_triggers.yaml +++ b/packages/jobs_tracker_appliance_completion_triggers.yaml @@ -9,7 +9,7 @@ # jobs_tracker_appliance_completion_triggers.yaml # # VERSION: -# V1.0 2026-08-15 +# V1.1 2026-09-03 # # PURPOSE: # Provides time-qualified appliance door and lid triggers for Jobs Tracker completion. @@ -19,9 +19,13 @@ # # OPERATION: # Each contact must remain open for five seconds before its corresponding Jobs Tracker -# completion route is called. The job registry owns the completion entity mappings. +# completion route is called. Starting the dryer or washer clears only a previous Due +# unload job, so the next finished cycle creates its own new unload task. # # VERSION HISTORY: +# V1.1 2026-09-03 +# - Clear a pending dryer or washer unload job when its next cycle starts. +# # V1.0 2026-08-15 # - Added five-second door and lid open completion triggers for dryer and washer jobs. # @@ -63,3 +67,43 @@ automation: data: completion_entity: binary_sensor.washing_machine_lid_status_x39rs_contact completion_to_state: "on" + + - id: jobs_tracker_clear_dryer_unload_on_start + alias: "Jobs Tracker - Clear Dryer Unload on Start" + description: "Clears an outstanding Empty the Dryer job when a new dryer cycle starts." + mode: single + + triggers: + - trigger: state + entity_id: sensor.appliance_monitor_dryer_monitor + to: Operating + + conditions: + - condition: state + entity_id: sensor.jobs_tracker_empty_dryer + state: Due + + actions: + - action: script.jobs_tracker_dispatch + data: + job_id: empty_dryer + + - id: jobs_tracker_clear_washer_unload_on_start + alias: "Jobs Tracker - Clear Washer Unload on Start" + description: "Clears an outstanding Empty the Washer job when a new washer cycle starts." + mode: single + + triggers: + - trigger: state + entity_id: sensor.appliance_monitor_washing_machine_monitor + to: Operating + + conditions: + - condition: state + entity_id: sensor.jobs_tracker_empty_washing_machine + state: Due + + actions: + - action: script.jobs_tracker_dispatch + data: + job_id: empty_washing_machine diff --git a/packages/jobs_tracker_appliance_completion_triggers.yaml.bak b/packages/jobs_tracker_appliance_completion_triggers.yaml.bak new file mode 100644 index 0000000..1b2c6f1 --- /dev/null +++ b/packages/jobs_tracker_appliance_completion_triggers.yaml.bak @@ -0,0 +1,65 @@ +#:########################################################################################:# +# Jobs Tracker Appliance Completion Triggers Package # +#:########################################################################################:# +# +# TITLE: +# Jobs Tracker Appliance Completion Triggers +# +# FILE: +# jobs_tracker_appliance_completion_triggers.yaml +# +# VERSION: +# V1.0 2026-08-15 +# +# PURPOSE: +# Provides time-qualified appliance door and lid triggers for Jobs Tracker completion. +# +# DEPENDS ON: +# packages/Job_Chore_Tracking/jobs_tracker_jobs.yaml V3.5 or newer. +# +# OPERATION: +# Each contact must remain open for five seconds before its corresponding Jobs Tracker +# completion route is called. The job registry owns the completion entity mappings. +# +# VERSION HISTORY: +# V1.0 2026-08-15 +# - Added five-second door and lid open completion triggers for dryer and washer jobs. +# +#:########################################################################################:# + +automation: + - id: jobs_tracker_empty_dryer_door_open + alias: "Jobs Tracker - Empty Dryer on Door Open" + description: "Marks Empty the Dryer complete after the dryer door is open for five seconds." + mode: single + + triggers: + - trigger: state + entity_id: binary_sensor.dryer_door_status_x34rs_contact + to: "on" + for: + seconds: 5 + + actions: + - action: script.jobs_tracker_route_completion + data: + completion_entity: binary_sensor.dryer_door_status_x34rs_contact + completion_to_state: "on" + + - id: jobs_tracker_empty_washing_machine_lid_open + alias: "Jobs Tracker - Empty Washer on Lid Open" + description: "Marks Empty the Washer complete after the washer lid is open for five seconds." + mode: single + + triggers: + - trigger: state + entity_id: binary_sensor.washing_machine_lid_status_x39rs_contact + to: "on" + for: + seconds: 5 + + actions: + - action: script.jobs_tracker_route_completion + data: + completion_entity: binary_sensor.washing_machine_lid_status_x39rs_contact + completion_to_state: "on" diff --git a/packages/outdoor_lighting_control.yaml b/packages/outdoor_lighting_control.yaml index 95ec09b..f69beff 100644 --- a/packages/outdoor_lighting_control.yaml +++ b/packages/outdoor_lighting_control.yaml @@ -635,10 +635,13 @@ script: entity_id: input_datetime.outdoor_lighting_number_16_last_schedule_event data: datetime: "{{ (selected_event_ts | int(0)) | timestamp_custom('%Y-%m-%d %H:%M:%S', true) }}" - - action: script.outdoor_lighting_ramp_number_16 + - action: script.turn_on + target: + entity_id: script.outdoor_lighting_ramp_number_16 data: - target_brightness: "{{ selected_target | int(0) }}" - ramp_seconds: "{{ ramp_to_use | int(0) }}" + variables: + target_brightness: "{{ selected_target | int(0) }}" + ramp_seconds: "{{ ramp_to_use | int(0) }}" ############################################################################# # 4) Main Entrance Outside LED Lights @@ -787,10 +790,13 @@ script: entity_id: input_datetime.outdoor_lighting_main_entrance_last_schedule_event data: datetime: "{{ (selected_event_ts | int(0)) | timestamp_custom('%Y-%m-%d %H:%M:%S', true) }}" - - action: script.outdoor_lighting_ramp_main_entrance + - action: script.turn_on + target: + entity_id: script.outdoor_lighting_ramp_main_entrance data: - target_brightness: "{{ selected_target | int(0) }}" - ramp_seconds: "{{ ramp_to_use | int(0) }}" + variables: + target_brightness: "{{ selected_target | int(0) }}" + ramp_seconds: "{{ ramp_to_use | int(0) }}" ############################################################################# # Reconcile all diff --git a/packages/pet_feeding_and_jobs.yaml b/packages/pet_feeding_and_jobs.yaml index 1bf1ce2..a3047d2 100644 --- a/packages/pet_feeding_and_jobs.yaml +++ b/packages/pet_feeding_and_jobs.yaml @@ -1,8 +1,8 @@ #:########################################################################################:# # Package: Pet Feeding and Jobs Timing # File: pet_feeding_and_jobs.yaml -# Version: v1.4.0 -# Date: 2026-07-26 +# Version: v1.5.2 +# Date: 2026-09-09 # # Purpose: # Provides legacy MQTT pet activity sensors and Jobs-derived timing sensors for @@ -17,6 +17,11 @@ # instead of exposing a numeric sentinel value. # # Version History: +# - v1.5.2 (2026-09-12): Ignore stale restored dog-button event states so +# reconnects cannot create false timestamps or visual feedback. +# - v1.5.1 (2026-09-09): Extended dog-button feedback intervals to 500 ms. +# - v1.5.0 (2026-09-09): Added visual feedback flashes for physical dog +# completion buttons, using the Lounge outside light relay. # - v1.4.0 (2026-07-26): Announce four physical job completions on the Sony # lounge TV and both Pushover devices. # - v1.3.0 (2026-07-26): Restore retained dog-fed and jobs-done activity @@ -122,7 +127,12 @@ automation: conditions: - condition: template value_template: >- - {{ trigger.to_state.state not in ['unknown', 'unavailable'] }} + {% set valid_state = trigger.to_state is not none + and trigger.to_state.state not in ['unknown', 'unavailable'] %} + {% set event_ts = as_timestamp(trigger.to_state.state, 0) + if valid_state else 0 %} + {% set event_age = as_timestamp(now()) - event_ts %} + {{ valid_state and event_ts > 0 and event_age >= 0 and event_age <= 30 }} actions: - action: input_datetime.set_datetime target: @@ -145,7 +155,12 @@ automation: conditions: - condition: template value_template: >- - {{ trigger.to_state.state not in ['unknown', 'unavailable'] }} + {% set valid_state = trigger.to_state is not none + and trigger.to_state.state not in ['unknown', 'unavailable'] %} + {% set event_ts = as_timestamp(trigger.to_state.state, 0) + if valid_state else 0 %} + {% set event_age = as_timestamp(now()) - event_ts %} + {{ valid_state and event_ts > 0 and event_age >= 0 and event_age <= 30 }} actions: - action: input_datetime.set_datetime target: @@ -227,3 +242,64 @@ automation: title: "Jobs Announcement" short_announcement: "{{ completion_message }}" long_announcement: "{{ completion_message }}" + + #:######################################################################################:# + # AUTOMATION: Physical Dog-Button Visual Feedback + #:######################################################################################:# + - id: dog_button_visual_feedback + alias: "Jobs - Dog Button Visual Feedback" + description: >- + Flashes the Lounge outside light relay for one physical single-press, + preserving its original state after dog feeding or depooping is recorded. + mode: queued + max: 10 + triggers: + - trigger: state + entity_id: + - event.jobs_dog_fed_button_x14bt_action + - event.jobs_dog_depooped_button_x15bt_action + conditions: + - condition: template + value_template: >- + {% set valid_state = trigger.to_state is not none + and trigger.to_state.state not in ['unknown', 'unavailable'] %} + {% set event_ts = as_timestamp(trigger.to_state.state, 0) + if valid_state else 0 %} + {% set event_age = as_timestamp(now()) - event_ts %} + {{ + valid_state + and event_ts > 0 + and event_age >= 0 + and event_age <= 30 + and trigger.to_state.attributes.event_type == 'single' + }} + actions: + - variables: + initial_state: "{{ states('switch.esp_loungesouthleftswitch_relay_2_outside_light_1') }}" + flash_count: >- + {{ 2 if trigger.entity_id == 'event.jobs_dog_fed_button_x14bt_action' else 3 }} + - repeat: + count: "{{ flash_count | int }}" + sequence: + - choose: + - conditions: + - condition: template + value_template: "{{ initial_state == 'off' }}" + sequence: + - action: switch.turn_on + target: + entity_id: switch.esp_loungesouthleftswitch_relay_2_outside_light_1 + - delay: "00:00:00.500" + - action: switch.turn_off + target: + entity_id: switch.esp_loungesouthleftswitch_relay_2_outside_light_1 + - delay: "00:00:00.500" + default: + - action: switch.turn_off + target: + entity_id: switch.esp_loungesouthleftswitch_relay_2_outside_light_1 + - delay: "00:00:00.500" + - action: switch.turn_on + target: + entity_id: switch.esp_loungesouthleftswitch_relay_2_outside_light_1 + - delay: "00:00:00.500" diff --git a/packages/quiet_time_on_off_actions.yaml b/packages/quiet_time_on_off_actions.yaml index bc724e3..8184cd0 100644 --- a/packages/quiet_time_on_off_actions.yaml +++ b/packages/quiet_time_on_off_actions.yaml @@ -9,42 +9,24 @@ # quiet_time_on_off_actions.yaml # # VERSION: -# V1.2 2026-06-20 -# -# VERSION HISTORY: -# V1.2 2026-06-20 -# - Added Quiet Time OFF action to change OpenHASP panel openhasp_1 -# back to page 1. -# -# V1.1 2026-06-15 -# - Added separate Quiet Time ON and Quiet Time OFF action sections. -# - Added support for non-binary Quiet Time OFF actions. -# - Sets input_number.openhasp_1_backlight_level to 200 when Quiet Time ends. -# -# V1.0 2026-06-15 -# - Initial standalone package split out from the main Quiet Time package. -# - Turns selected entities on/off when input_boolean.quiet_time changes. +# V1.3 2026-09-04 # # PURPOSE: # Runs local Home Assistant actions when Quiet Time is turned ON or OFF. # -# The main Quiet Time package should continue to own: -# - input_boolean.quiet_time -# - daily reset behaviour -# - MQTT quiet_time state publishing +# The main Quiet Time package owns the helper, daily reset behaviour, and MQTT +# publishing. This package owns extra local Quiet Time actions. # -# This package only handles extra local actions that should happen when -# Quiet Time starts or ends. +# VERSION HISTORY: +# V1.3 2026-09-04 +# - Disables Flounder Motion Wake during Quiet Time and requests a one-off +# 10-second presence fade to Screen Off. +# - Restores Flounder Motion Wake when Quiet Time ends. # -# EDITING NOTES: -# - Add normal on/off entities to the relevant entity lists. -# - Empty lists are fine and will simply do nothing. -# - Use the "Other Quiet Time OFF Actions" section for things that are not -# simple on/off actions, such as setting input_numbers, selects, scenes, -# scripts, MQTT commands, or custom service calls. +# V1.2 2026-06-20 +# - Added Quiet Time OFF action to change OpenHASP panel openhasp_1 back to +# page 1. # -################################################################################ - ################################################################################ # AUTOMATIONS ################################################################################ @@ -56,56 +38,15 @@ automation: mode: single variables: - ########################################################################## - # QUIET TIME ON ACTION LISTS - ########################################################################## - # - # These actions run when input_boolean.quiet_time changes to "on". - # - quiet_time_on_turn_off_entities: - light.led_matrix_display_led_matrix_display_display - quiet_time_on_turn_on_entities: [] - - ########################################################################## - # QUIET TIME OFF ACTION LISTS - ########################################################################## - # - # These actions run when input_boolean.quiet_time changes to "off". - # - quiet_time_off_turn_off_entities: [] - quiet_time_off_turn_on_entities: - light.led_matrix_display_led_matrix_display_display - - ########################################################################## - # OTHER QUIET TIME OFF ACTION VALUES - ########################################################################## - # - # Use this list for input_number helpers that should be set when Quiet Time - # ends. - # - # Format: - # - entity_id: input_number.some_helper - # value: 123 - # - quiet_time_off_input_number_values: - entity_id: input_number.openhasp_1_backlight_level value: 200 - - ########################################################################## - # OPENHASP QUIET TIME OFF PAGE ACTION - ########################################################################## - # - # Sends the OpenHASP panel back to the main page when Quiet Time ends. - # - # Current OpenHASP MQTT command topic: - # hasp/openhasp_1/command/page - # - quiet_time_off_openhasp_page_topic: "hasp/openhasp_1/command/page" quiet_time_off_openhasp_page: 1 @@ -121,13 +62,6 @@ automation: actions: - choose: - ###################################################################### - # QUIET TIME ON ACTIONS - ###################################################################### - # - # Runs when Quiet Time starts. - # - - conditions: - condition: template value_template: "{{ trigger.to_state.state == 'on' }}" @@ -138,47 +72,44 @@ automation: - action: homeassistant.turn_off target: entity_id: "{{ repeat.item }}" - - repeat: for_each: "{{ quiet_time_on_turn_on_entities }}" sequence: - action: homeassistant.turn_on target: entity_id: "{{ repeat.item }}" - - ###################################################################### - # QUIET TIME OFF ACTIONS - ###################################################################### - # - # Runs when Quiet Time ends. - # - + # Stop camera motion from extending presence, then fade the + # current session to the existing Screen Off base state. + - action: switch.turn_off + target: + entity_id: switch.flounder_kiosk_motion_wake + - wait_template: "{{ is_state('switch.flounder_kiosk_motion_wake', 'off') }}" + timeout: "00:00:10" + continue_on_timeout: true + - action: mqtt.publish + data: + topic: "viewroad-commands/flounder/presence/end" + payload: "10" + retain: false - conditions: - condition: template value_template: "{{ trigger.to_state.state == 'off' }}" sequence: - ################################################################## - # Quiet Time OFF - binary/entity actions - ################################################################## - - repeat: for_each: "{{ quiet_time_off_turn_off_entities }}" sequence: - action: homeassistant.turn_off target: entity_id: "{{ repeat.item }}" - - repeat: for_each: "{{ quiet_time_off_turn_on_entities }}" sequence: - action: homeassistant.turn_on target: entity_id: "{{ repeat.item }}" - - ################################################################## - # Quiet Time OFF - input_number set actions - ################################################################## - + - action: switch.turn_on + target: + entity_id: switch.flounder_kiosk_motion_wake - repeat: for_each: "{{ quiet_time_off_input_number_values }}" sequence: @@ -187,34 +118,8 @@ automation: entity_id: "{{ repeat.item.entity_id }}" data: value: "{{ repeat.item.value | float }}" - - ################################################################## - # Quiet Time OFF - OpenHASP page action - ################################################################## - # - # Change OpenHASP panel back to page 1 when Quiet Time ends. - # - - action: mqtt.publish data: topic: "{{ quiet_time_off_openhasp_page_topic }}" payload: "{{ quiet_time_off_openhasp_page | int }}" retain: false - - ################################################################## - # Quiet Time OFF - other custom actions - ################################################################## - # - # Add any extra non-binary service calls here later. - # - # Examples: - # - # - action: script.some_script - # - # - action: select.select_option - # target: - # entity_id: select.some_select - # data: - # option: "Some Option" - # - ################################################################## diff --git a/packages/quiet_time_on_off_actions.yaml.bak b/packages/quiet_time_on_off_actions.yaml.bak new file mode 100644 index 0000000..b833715 --- /dev/null +++ b/packages/quiet_time_on_off_actions.yaml.bak @@ -0,0 +1,245 @@ +################################################################################ +# Quiet Time On / Off Actions Package +################################################################################ +# +# TITLE: +# Quiet Time On / Off Actions +# +# FILE: +# quiet_time_on_off_actions.yaml +# +# VERSION: +# V1.3 2026-09-04 +# - Disables Flounder Motion Wake during Quiet Time and requests a one-off +# 10-second presence fade to Screen Off. +# - Restores Flounder Motion Wake when Quiet Time ends. +# +# V1.2 2026-06-20 +# +# VERSION HISTORY: +# V1.2 2026-06-20 +# - Added Quiet Time OFF action to change OpenHASP panel openhasp_1 +# back to page 1. +# +# V1.1 2026-06-15 +# - Added separate Quiet Time ON and Quiet Time OFF action sections. +# - Added support for non-binary Quiet Time OFF actions. +# - Sets input_number.openhasp_1_backlight_level to 200 when Quiet Time ends. +# +# V1.0 2026-06-15 +# - Initial standalone package split out from the main Quiet Time package. +# - Turns selected entities on/off when input_boolean.quiet_time changes. +# +# PURPOSE: +# Runs local Home Assistant actions when Quiet Time is turned ON or OFF. +# +# The main Quiet Time package should continue to own: +# - input_boolean.quiet_time +# - daily reset behaviour +# - MQTT quiet_time state publishing +# +# This package only handles extra local actions that should happen when +# Quiet Time starts or ends. +# +# EDITING NOTES: +# - Add normal on/off entities to the relevant entity lists. +# - Empty lists are fine and will simply do nothing. +# - Use the "Other Quiet Time OFF Actions" section for things that are not +# simple on/off actions, such as setting input_numbers, selects, scenes, +# scripts, MQTT commands, or custom service calls. +# +################################################################################ + +################################################################################ +# AUTOMATIONS +################################################################################ + +automation: + - id: quiet_time_state_change_actions + alias: "Quiet Time - State Change Actions" + description: "Runs configured Home Assistant actions when Quiet Time is turned on or off." + mode: single + + variables: + ########################################################################## + # QUIET TIME ON ACTION LISTS + ########################################################################## + # + # These actions run when input_boolean.quiet_time changes to "on". + # + + quiet_time_on_turn_off_entities: + - light.led_matrix_display_led_matrix_display_display + + quiet_time_on_turn_on_entities: [] + + ########################################################################## + # QUIET TIME OFF ACTION LISTS + ########################################################################## + # + # These actions run when input_boolean.quiet_time changes to "off". + # + + quiet_time_off_turn_off_entities: [] + + quiet_time_off_turn_on_entities: + - light.led_matrix_display_led_matrix_display_display + + ########################################################################## + # OTHER QUIET TIME OFF ACTION VALUES + ########################################################################## + # + # Use this list for input_number helpers that should be set when Quiet Time + # ends. + # + # Format: + # - entity_id: input_number.some_helper + # value: 123 + # + + quiet_time_off_input_number_values: + - entity_id: input_number.openhasp_1_backlight_level + value: 200 + + ########################################################################## + # OPENHASP QUIET TIME OFF PAGE ACTION + ########################################################################## + # + # Sends the OpenHASP panel back to the main page when Quiet Time ends. + # + # Current OpenHASP MQTT command topic: + # hasp/openhasp_1/command/page + # + + quiet_time_off_openhasp_page_topic: "hasp/openhasp_1/command/page" + quiet_time_off_openhasp_page: 1 + + triggers: + - trigger: state + entity_id: input_boolean.quiet_time + from: + - "on" + - "off" + to: + - "on" + - "off" + + actions: + - choose: + ###################################################################### + # QUIET TIME ON ACTIONS + ###################################################################### + # + # Runs when Quiet Time starts. + # + + - conditions: + - condition: template + value_template: "{{ trigger.to_state.state == 'on' }}" + sequence: + - repeat: + for_each: "{{ quiet_time_on_turn_off_entities }}" + sequence: + - action: homeassistant.turn_off + target: + entity_id: "{{ repeat.item }}" + + - repeat: + for_each: "{{ quiet_time_on_turn_on_entities }}" + sequence: + - action: homeassistant.turn_on + target: + entity_id: "{{ repeat.item }}" + + # Stop camera motion from extending presence, then fade the + # current session to the existing Screen Off base state. + - action: switch.turn_off + target: + entity_id: switch.flounder_kiosk_motion_wake + + - wait_template: "{{ is_state('switch.flounder_kiosk_motion_wake', 'off') }}" + timeout: "00:00:10" + continue_on_timeout: true + + - action: mqtt.publish + data: + topic: "viewroad-commands/flounder/presence/end" + payload: "10" + retain: false + + ###################################################################### + # QUIET TIME OFF ACTIONS + ###################################################################### + # + # Runs when Quiet Time ends. + # + + - conditions: + - condition: template + value_template: "{{ trigger.to_state.state == 'off' }}" + sequence: + ################################################################## + # Quiet Time OFF - binary/entity actions + ################################################################## + + - repeat: + for_each: "{{ quiet_time_off_turn_off_entities }}" + sequence: + - action: homeassistant.turn_off + target: + entity_id: "{{ repeat.item }}" + + - repeat: + for_each: "{{ quiet_time_off_turn_on_entities }}" + sequence: + - action: homeassistant.turn_on + target: + entity_id: "{{ repeat.item }}" + + - action: switch.turn_on + target: + entity_id: switch.flounder_kiosk_motion_wake + + ################################################################## + # Quiet Time OFF - input_number set actions + ################################################################## + + - repeat: + for_each: "{{ quiet_time_off_input_number_values }}" + sequence: + - action: input_number.set_value + target: + entity_id: "{{ repeat.item.entity_id }}" + data: + value: "{{ repeat.item.value | float }}" + + ################################################################## + # Quiet Time OFF - OpenHASP page action + ################################################################## + # + # Change OpenHASP panel back to page 1 when Quiet Time ends. + # + + - action: mqtt.publish + data: + topic: "{{ quiet_time_off_openhasp_page_topic }}" + payload: "{{ quiet_time_off_openhasp_page | int }}" + retain: false + + ################################################################## + # Quiet Time OFF - other custom actions + ################################################################## + # + # Add any extra non-binary service calls here later. + # + # Examples: + # + # - action: script.some_script + # + # - action: select.select_option + # target: + # entity_id: select.some_select + # data: + # option: "Some Option" + # + ################################################################## diff --git a/packages/view_road_smoke_alarm_rf.yaml b/packages/view_road_smoke_alarm_rf.yaml new file mode 100644 index 0000000..8ad482d --- /dev/null +++ b/packages/view_road_smoke_alarm_rf.yaml @@ -0,0 +1,164 @@ +#:########################################################################################:# +# View Road Smoke Alarm RF Package - V1.2.0 # +#:########################################################################################:# +# Receives normalized AJ-765 RF state from the decoder running on beaver. # +# # +# V1.2 performs early RF fingerprint classification, normally shortly after RF activity. # +# # +# Current RF fingerprints: # +# - detector_test : TEST button transmission from a detector # +# - remote_test : TEST transmission matching the remote capture # +# - remote_hush : HUSH/LOCATE button on the Goldair remote # +# - smoke_alarm : Experimental only - not yet considered authoritative # +# # +# Individual detector identity has NOT been found in the RF protocol. # +#:########################################################################################:# + + +mqtt: + + - binary_sensor: + name: "RF Interconnect" + unique_id: view_road_smoke_alarm_rf_interconnect + default_entity_id: binary_sensor.smoke_alarm_rf_interconnect + + state_topic: "viewroad-status/smokealarms/rf/interconnect" + payload_on: "ON" + payload_off: "OFF" + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + icon: mdi:radio-tower + + device: + identifiers: + - view_road_smoke_alarm_rf + name: "Smoke Alarm RF Monitor" + manufacturer: "Zorruno" + model: "AJ-765 RF Monitor" + sw_version: "1.2.0" + + + - event: + name: "RF Event" + unique_id: view_road_smoke_alarm_rf_event + default_entity_id: event.smoke_alarm_rf_event + + state_topic: "viewroad-status/smokealarms/rf/event" + + event_types: + - interconnect_start + - detector_test + - remote_test + - remote_hush + - smoke_alarm + - unknown_aj765 + - interconnect_end + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + icon: mdi:radio-tower + + device: + identifiers: + - view_road_smoke_alarm_rf + + + - sensor: + name: "RF Current Type" + unique_id: view_road_smoke_alarm_rf_current_type + default_entity_id: sensor.smoke_alarm_rf_current_type + + state_topic: "viewroad-status/smokealarms/rf/current_type" + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + icon: mdi:waveform + + device: + identifiers: + - view_road_smoke_alarm_rf + + + - sensor: + name: "RF Last Type" + unique_id: view_road_smoke_alarm_rf_last_type + default_entity_id: sensor.smoke_alarm_rf_last_type + + state_topic: "viewroad-status/smokealarms/rf/last_type" + entity_category: diagnostic + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + icon: mdi:waveform + + device: + identifiers: + - view_road_smoke_alarm_rf + + + - sensor: + name: "RF Last Confidence" + unique_id: view_road_smoke_alarm_rf_last_confidence + default_entity_id: sensor.smoke_alarm_rf_last_confidence + + state_topic: "viewroad-status/smokealarms/rf/last_confidence" + unit_of_measurement: "%" + state_class: measurement + entity_category: diagnostic + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + icon: mdi:percent + + device: + identifiers: + - view_road_smoke_alarm_rf + + + - sensor: + name: "RF Last Seen" + unique_id: view_road_smoke_alarm_rf_last_seen + default_entity_id: sensor.smoke_alarm_rf_last_seen + + state_topic: "viewroad-status/smokealarms/rf/last_seen" + device_class: timestamp + entity_category: diagnostic + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + device: + identifiers: + - view_road_smoke_alarm_rf + + + - sensor: + name: "RF Last Duration" + unique_id: view_road_smoke_alarm_rf_last_duration + default_entity_id: sensor.smoke_alarm_rf_last_duration + + state_topic: "viewroad-status/smokealarms/rf/last_duration" + unit_of_measurement: "s" + device_class: duration + state_class: measurement + entity_category: diagnostic + + availability_topic: "viewroad-status/smokealarms/rf/availability" + payload_available: "online" + payload_not_available: "offline" + + device: + identifiers: + - view_road_smoke_alarm_rf \ No newline at end of file