From 6eccaec7a8fd1b02d87254b0d2e097b23687a095 Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Thu, 27 Aug 2026 03:08:11 +0000 Subject: [PATCH] monitoring: kuma heartbeat + systemd timer for zigbee coordinator Refs #3 --- .gitignore | 3 +++ infra/systemd/zigbee-kuma-heartbeat.service | 8 ++++++ infra/systemd/zigbee-kuma-heartbeat.timer | 10 +++++++ infra/zigbee2mqtt/scripts/kuma-heartbeat.sh | 29 +++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 infra/systemd/zigbee-kuma-heartbeat.service create mode 100644 infra/systemd/zigbee-kuma-heartbeat.timer create mode 100755 infra/zigbee2mqtt/scripts/kuma-heartbeat.sh diff --git a/.gitignore b/.gitignore index 0b5c425..718c6c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ output/ secrets.h + +# zigbee coordinator -> uptime kuma push token +infra/.secrets/ diff --git a/infra/systemd/zigbee-kuma-heartbeat.service b/infra/systemd/zigbee-kuma-heartbeat.service new file mode 100644 index 0000000..dc79158 --- /dev/null +++ b/infra/systemd/zigbee-kuma-heartbeat.service @@ -0,0 +1,8 @@ +[Unit] +Description=Zigbee coordinator heartbeat to Uptime Kuma +After=docker.service +Requires=docker.service + +[Service] +Type=oneshot +ExecStart=/root/nr-flow-validator/infra/zigbee2mqtt/scripts/kuma-heartbeat.sh diff --git a/infra/systemd/zigbee-kuma-heartbeat.timer b/infra/systemd/zigbee-kuma-heartbeat.timer new file mode 100644 index 0000000..8017f4f --- /dev/null +++ b/infra/systemd/zigbee-kuma-heartbeat.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Run zigbee coordinator heartbeat every minute + +[Timer] +OnCalendar=*-*-* *:*:00 +AccuracySec=5s +Persistent=true + +[Install] +WantedBy=timers.target diff --git a/infra/zigbee2mqtt/scripts/kuma-heartbeat.sh b/infra/zigbee2mqtt/scripts/kuma-heartbeat.sh new file mode 100755 index 0000000..913f882 --- /dev/null +++ b/infra/zigbee2mqtt/scripts/kuma-heartbeat.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -u + +KUMA_BASE="https://up.notsosm.art" +TOKEN_FILE="/root/nr-flow-validator/infra/.secrets/kuma-push-token" + +[ -s "$TOKEN_FILE" ] || exit 1 +TOKEN="$(tr -d '[:space:]' < "$TOKEN_FILE")" + +reason="" + +state=$(docker exec mosquitto mosquitto_sub -h 127.0.0.1 -t "zigbee2mqtt/bridge/state" -C 1 -W 10 2>/dev/null | tr -d '[:space:]') +if [ "$state" != '{"state":"online"}' ]; then + reason="bridge_state=${state:-none}" +else + running=$(docker inspect zigbee2mqtt --format '{{.State.Running}}' 2>/dev/null) + [ "$running" = "true" ] || reason="${reason}container_running=${running:-unknown}" +fi + +if [ -n "$reason" ]; then + status="down" + msg="coordinator: ${reason}" +else + status="up" + msg="coordinator ok" +fi + +curl -fsS -m 10 -o /dev/null "$KUMA_BASE/api/push/$TOKEN?status=$status&msg=$msg" 2>/dev/null +exit 0