-
Notifications
You must be signed in to change notification settings - Fork 4
Release 26.3.2.1 - CPAP/Tank Refill Mode, new sensors, and ESPHome modernization #35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
d6db296
d50e4b9
d000ca3
8c2a09e
02ff25c
d547a43
64c94a4
6d2d9a6
80c1945
d73a082
4783838
2b6250e
0519e65
f7af815
e637d23
1d3fc49
817818c
09d3d60
abfb0e8
f0f2a12
bb2c678
23a8b4c
bd58d14
ab51496
dd9cb47
9a9644a
0cabc9c
0ec11e9
712e264
894a316
623f8cb
bb25a90
d51b0d9
f07d04b
640f627
1cf2bfa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| name: Label Check | ||
|
|
||
| # pull_request_target (not pull_request) so the job gets a write token on | ||
| # fork-submitted PRs too; plain pull_request runs from forks are read-only | ||
| # and cannot add labels. Safe because the called workflow only reads the PR | ||
| # body and never checks out or executes PR code. The "edited" type re-runs | ||
| # the check when the template checkboxes are changed. | ||
| on: | ||
| pull_request_target: | ||
| types: [opened, edited, reopened, synchronize] | ||
|
|
||
| permissions: | ||
| pull-requests: write | ||
| issues: write | ||
| contents: read | ||
|
|
||
| jobs: | ||
| label-check: | ||
| name: Label Check | ||
| uses: ApolloAutomation/Workflows/.github/workflows/label-check.yml@main |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,10 +1,9 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| substitutions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: apollo-pump-1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: "25.12.18.1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: "26.3.2.1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| device_description: ${name} made by Apollo Automation - version ${version}. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| esp32: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| board: esp32-c6-devkitm-1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| variant: esp32c6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| flash_size: 8MB | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| framework: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -18,9 +17,22 @@ esphome: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(pump_start_time) = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(safety_alert_active) = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - script.execute: pump_safety_check | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - priority: -20 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch.is_on: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: stop_pump_when_full | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: stop_pump_when_full | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - priority: -100 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - delay: 1000ms | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - delay: 1000ms | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - script.execute: statusCheck | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - priority: -10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -69,6 +81,7 @@ captive_portal: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| web_server: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| port: 80 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| version: 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Buzzer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -127,6 +140,30 @@ switch: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| restore_mode: RESTORE_DEFAULT_OFF | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| icon: mdi:water-sync | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: template | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "Tank Refill Mode" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| optimistic: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| restore_mode: RESTORE_DEFAULT_OFF | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| icon: mdi:water-sync | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on_turn_on: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: stop_pump_when_full | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on_turn_off: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: stop_pump_when_full | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_on: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: template | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "Auto Refill" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| optimistic: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| restore_mode: RESTORE_DEFAULT_OFF | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| icon: mdi:autorenew | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: config | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: template | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "Pump Safety Override" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: pump_safety_override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -147,10 +184,21 @@ switch: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| or: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - binary_sensor.is_on: fluid_input_sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Normal mode: input has water | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - and: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_off: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - binary_sensor.is_on: fluid_input_sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Inverted mode: input is dry (destination is low, needs filling) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - and: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_on: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - binary_sensor.is_off: fluid_input_sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Bypass: dry protection not enabled | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_off: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
186
to
197
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE="Integrations/ESPHome/Core.yaml"
echo "== Target file existence =="
ls -la "$FILE" || true
echo
echo "== Lines 150-230 =="
nl -ba "$FILE" | sed -n '140,240p'
echo
echo "== Find tank_refill_mode usages/definitions =="
rg -n "tank_refill_mode" "$FILE" || true
echo
echo "== Find stop_pump_when_dry usages/definitions =="
rg -n "stop_pump_when_dry" "$FILE" || true
echo
echo "== Show relevant start gating context (look for 'start'/'pump' 'dry' logic blocks) =="
rg -n -C 2 "(start|pump).*dry|dry.*(start|pump)|(tank_refill_mode|stop_pump_when_dry).*then:|on_press|on_boot|lambda|id:|condition:|or:|switch\.is_off|switch\.is_on" "$FILE" || trueRepository: ApolloAutomation/PUMP-1 Length of output: 259 🏁 Script executed: #!/bin/bash
set -euo pipefail
FILE="Integrations/ESPHome/Core.yaml"
echo "== Lines 150-230 =="
awk 'NR>=150 && NR<=230 {printf "%d\t%s\n", NR, $0}' "$FILE"
echo
echo "== Find tank_refill_mode usages/definitions =="
rg -n "tank_refill_mode" "$FILE" || true
echo
echo "== Find stop_pump_when_dry usages/definitions =="
rg -n "stop_pump_when_dry" "$FILE" || true
echo
echo "== Context around OR branch near lines ~180-200 =="
awk 'NR>=170 && NR<=210 {printf "%d\t%s\n", NR, $0}' "$FILE"
echo
echo "== Find the 'pump start' gating logic block (best-effort search) =="
rg -n -C 3 "(pump|start).*condition:|condition:|or:|binary_sensor\.is_(on|off)|switch\.is_(on|off)" "$FILE" | head -n 200Repository: ApolloAutomation/PUMP-1 Length of output: 10325 Tank Refill Mode should not satisfy the “dry protection bypass” branch for pump start In Suggested fix- # Bypass: dry protection not enabled
- - switch.is_off: stop_pump_when_dry
+ # Bypass only in normal mode when dry protection is intentionally disabled
+ - and:
+ - switch.is_off: tank_refill_mode
+ - switch.is_off: stop_pump_when_dry📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump turning on - conditions met" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - text_sensor.template.publish: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: last_pump_action | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| state: "Pump Started" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - lambda: |- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(pump_start_time) = millis(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(safety_alert_active) = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -160,10 +208,17 @@ switch: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: pump_control | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on_turn_off: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lambda: 'return id(pump_start_time) != 0;' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump turned off" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - text_sensor.template.publish: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: last_pump_action | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| state: "Pump Stopped" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - lambda: |- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(pump_start_time) = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id(safety_alert_active) = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump turned off" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| binary_sensor: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -213,6 +268,20 @@ binary_sensor: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| input: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| pullup: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inverted: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| on_release: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| and: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_on: auto_refill | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_on: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_off: pump_control | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Auto refill triggered - tank level low" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - text_sensor.template.publish: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: last_pump_action | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| state: "Auto Refill Triggered" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - script.execute: pumpUntilFull | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: gpio | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: Fluid Output | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -295,6 +364,26 @@ light: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| min_brightness: 50% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| max_brightness: 100% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text_sensor: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: template | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "Last Pump Action" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: last_pump_action | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| icon: mdi:pump | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: wifi_info | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ip_address: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "IP Address" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: wifi_ip | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: "diagnostic" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "ESPHome Version" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hide_timestamp: true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: "diagnostic" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - platform: template | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name: "Apollo Firmware Version" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| id: apollo_firmware_version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| update_interval: never | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| entity_category: "diagnostic" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| script: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - id: pumpUntilFull | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -366,10 +455,20 @@ script: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump stopping - safety" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: pump_control | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - and: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_on: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_off: stop_pump_when_full | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - binary_sensor.is_on: fluid_input_sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump stopping - destination full (inverted mode)" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.turn_off: pump_control | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - if: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| condition: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - and: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_on: stop_pump_when_dry | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - switch.is_off: tank_refill_mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - binary_sensor.is_off: fluid_input_sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - logger.log: "Pump stopping - input dry" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: ApolloAutomation/PUMP-1
Length of output: 178
🏁 Script executed:
Repository: ApolloAutomation/PUMP-1
Length of output: 9824
🏁 Script executed:
Repository: ApolloAutomation/PUMP-1
Length of output: 17605
🏁 Script executed:
Repository: ApolloAutomation/PUMP-1
Length of output: 5355
Inverted-mode “destination full” stop is gated on
stop_pump_when_full: off, but refill mode turnsstop_pump_when_fullon by default—making that stop path unreachable unless the switch is manually disabled.tank_refill_modeenablesstop_pump_when_full(on_boot: lines 26-31;on_turn_on: lines 150-154;pumpUntilFull: lines 388-393).pump_safety_check, the inverted-mode “destination full” block requirestank_refill_modeandswitch.is_off: stop_pump_when_full(lines 458-466), so it won’t run in default refill mode; only the separate “tank full” check (output sensor, gated onstop_pump_when_full: on) can stop the pump.One possible alignment