# Water-heater DSI fault → Discord ping in the server-alerts channel. # # The CAN node decodes the heater's DSI lockout (node 95 page-3 b0 bit5 — # see canbus/README.md); when the burner fails to light (usually an empty # propane tank) the module latches the fault and this fires the webhook. # # Deploy to Pi: /config/packages/dsi_fault_alert.yaml # Repo copy: canbus/ha/dsi_fault_alert.yaml # # ⚠️ FIRST DEPLOY NEEDS A FULL CORE RESTART. reload_all only re-reads config # for integrations that are already set up; rest_command was a brand-new domain # on this instance, so until the restart the service didn't exist and every # automation fire died with "Action rest_command.discord_server_alerts not # found" — while check_config said valid. Verify with: # curl .../api/services | jq '[.[].domain] | index("rest_command")' # Secret: discord_server_alerts_webhook in the Pi's /config/secrets.yaml # (NOT the Gatus webhook — that one posts somewhere Wes doesn't # read; this one is confirmed delivering to the alerts channel) rest_command: discord_server_alerts: url: !secret discord_server_alerts_webhook method: POST content_type: "application/json; charset=utf-8" payload: >- {"username": "Octavia", "content": {{ message | tojson }}, "allowed_mentions": {"users": ["321798967669030912"]}} automation: # --- Octavia relay: anything on the broker can speak through the one # verified webhook path. Home HA's failsafe automations publish here # (campsite/octavia/say, payload = the message) since home has no # file/packages access for its own rest_command. --- - id: campsite_octavia_relay alias: "Octavia: MQTT relay" triggers: - trigger: mqtt topic: "campsite/octavia/say" conditions: - condition: template value_template: "{{ trigger.payload | length > 0 and trigger.payload | length < 1900 }}" actions: - action: rest_command.discord_server_alerts data: message: "{{ trigger.payload }}" mode: queued max: 5 - id: camper_dsi_fault_discord alias: "Camper: DSI fault → Discord" description: >- 10s 'for' debounces a single glitched broadcast frame; a real lockout is latched by the module so it easily survives the wait. triggers: - trigger: state entity_id: binary_sensor.onecontrol_can_water_heater_dsi_fault to: "on" for: "00:00:10" actions: - action: rest_command.discord_server_alerts data: message: >- <@321798967669030912> 🔥 **WATER HEATER DSI FAULT** — hey dumbass, you're out of propane again. (Or the igniter finally died, but let's be honest, it's the propane.) The heater is in lockout — swap the tank, then cycle the heater off/on to relight. mode: single - id: camper_dsi_fault_cleared_discord alias: "Camper: DSI fault cleared → Discord" triggers: - trigger: state entity_id: binary_sensor.onecontrol_can_water_heater_dsi_fault from: "on" to: "off" for: "00:00:10" actions: - action: rest_command.discord_server_alerts data: message: >- ✅ DSI fault cleared — the water heater is lighting again. Crisis averted. Try to remember this feeling next time you eyeball the tank gauge and say "eh, it's fine." mode: single