Decode node 89 (furnace) read-only: Furnace Running (page-3 b0 bit0) and Furnace DSI Fault (b0 bit5), same type-0x1E DSI encoding as the water heater. The furnace is thermostat-controlled, not a Lippert load — it sits on the bus only to report ignition state. Captures only ever showed 0x80 (off), so the 0x81 running / 0xA0 fault bytes are inferred by parallel to node 95; confirm on the first real burn. Add Water Heater Heating (node 95 page-3 x[3] bit7 = burner actively firing) — distinct from the on/off switch, which only reflects "enabled". Carry all three through the MQTT bridge to home HA, add the furnace DSI-fault Octavia alert mirroring the water heater, and update the README node map (89 was "unknown switched load"). Campsite + home Camper dashboards updated live. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
127 lines
5.0 KiB
YAML
127 lines
5.0 KiB
YAML
# 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
|
|
|
|
# --- Furnace DSI fault (node 89). Same lockout scheme as the water heater
|
|
# (page-3 b0 bit5); see canbus/README.md. A furnace lockout means no forced-air
|
|
# heat — more urgent than the water heater on a cold night. ---
|
|
- id: camper_furnace_dsi_fault_discord
|
|
alias: "Camper: Furnace 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_furnace_dsi_fault
|
|
to: "on"
|
|
for: "00:00:10"
|
|
actions:
|
|
- action: rest_command.discord_server_alerts
|
|
data:
|
|
message: >-
|
|
<@321798967669030912> 🥶 **FURNACE DSI FAULT** — the furnace tried to
|
|
light and gave up. That means no heat. Same usual suspect: you're out
|
|
of propane (or the igniter died, but c'mon). It's in lockout — swap the
|
|
tank, then cycle the thermostat to relight before everything inside
|
|
hits ambient.
|
|
mode: single
|
|
|
|
- id: camper_furnace_dsi_fault_cleared_discord
|
|
alias: "Camper: Furnace DSI fault cleared → Discord"
|
|
triggers:
|
|
- trigger: state
|
|
entity_id: binary_sensor.onecontrol_can_furnace_dsi_fault
|
|
from: "on"
|
|
to: "off"
|
|
for: "00:00:10"
|
|
actions:
|
|
- action: rest_command.discord_server_alerts
|
|
data:
|
|
message: >-
|
|
✅ Furnace fault cleared — it's lighting again and making heat. Enjoy
|
|
the warmth, and maybe glance at the propane gauge once in a while like
|
|
a functioning adult.
|
|
mode: single
|