Seed the TinyHouse: nineteen flows in place of eight hundred nodes
The Node-RED installation this replaces is 865 nodes across three tabs, and roughly a fifth of it is unreachable — the pellet stove's controller, the scene engine and the awning's logic were all disconnected from the heartbeat they ran on. What is here is the intent rather than the wiring: nineteen named flows, 109 nodes, and no heartbeat at all. A sensor value is the event. The device layer moves with it. `actor/*` and `light/*` were never a device interface — Node-RED subscribed to its own topics, stamped a DMX channel on each and encoded one Art-Net universe — so those topics retire with it and the encoders are five nodes in the `dmx` flow. Two shared library nodes carry what every actuator needs. `arbiter` answers the thing this design was missing: a value someone sets on a screen is not undone by the next evaluation. A manual value wins for a hold, the house takes over when it expires, and a schedule can force past both — so "off at two in the morning" still means off. The control binds to the message the arbiter writes back, so one tile shows what reached the fixture and setting it is the override. `motor` is why a stop is now commanded once. A rollershutter has no position sensor, so time is the only feedback: it says how long to run and a trigger sends the single STOP that ends it. The reference sent STOP forever. Everything is seeded stopped, the Art-Net node does not transmit and the heat pump does not accept commands until house.json says so. `--dry` checks the whole set without an installation: names nothing provides, loops, type disagreements, widgets bound to nothing, and every Python node run once on values of the shape it declared — including whether what it returns goes anywhere. That last one has already caught a typo that would have published into silence. house.json holds this installation's addresses, MAC addresses and DMX map and is git-ignored, as the Node-RED inventory is. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
# The workspace root delegates to these (see ../Makefile).
|
# The workspace root delegates to these (see ../Makefile).
|
||||||
|
|
||||||
.PHONY: dev-utils dev dev-local dev-lan up down update install dev-backend dev-frontend \
|
.PHONY: dev-utils dev dev-local dev-lan up down update install dev-backend dev-frontend \
|
||||||
generate-client seed-example seed-demo seed-house seed-aircon seed-hosted-demo test test-backend test-frontend soak bench-startup lint lint-backend \
|
generate-client seed-example seed-demo seed-house seed-aircon seed-tinyhouse seed-hosted-demo test test-backend test-frontend soak bench-startup lint lint-backend \
|
||||||
lint-frontend format-frontend umami build docs docs-serve clean help
|
lint-frontend format-frontend umami build docs docs-serve clean help
|
||||||
|
|
||||||
COMPOSE_ROOT := $(CURDIR)
|
COMPOSE_ROOT := $(CURDIR)
|
||||||
@@ -112,6 +112,17 @@ seed-house: ## Seed the house write-path rig (needs the real broker reachable)
|
|||||||
seed-aircon: ## Seed the aircon write-path rig (needs the unit reachable)
|
seed-aircon: ## Seed the aircon write-path rig (needs the unit reachable)
|
||||||
cd backend && uv run python ../scripts/seed_aircon_control.py
|
cd backend && uv run python ../scripts/seed_aircon_control.py
|
||||||
|
|
||||||
|
# The house itself. Reads ../house.json for this installation's addresses and
|
||||||
|
# DMX wiring; everything it creates is published and stopped. ARGS=--dry checks
|
||||||
|
# the whole set without an installation and pushes nothing.
|
||||||
|
seed-tinyhouse: ## Seed the TinyHouse flows (ARGS=--dry to check only)
|
||||||
|
@user=$$(grep -E '^FIRST_SUPERUSER=' $(COMPOSE_ROOT)/.env 2>/dev/null | head -1 | cut -d= -f2-); \
|
||||||
|
pass=$$(grep -E '^FIRST_SUPERUSER_PASSWORD=' $(COMPOSE_ROOT)/.env 2>/dev/null | head -1 | cut -d= -f2-); \
|
||||||
|
cd backend && \
|
||||||
|
FIRST_SUPERUSER="$${FIRST_SUPERUSER:-$$user}" \
|
||||||
|
FIRST_SUPERUSER_PASSWORD="$${FIRST_SUPERUSER_PASSWORD:-$$pass}" \
|
||||||
|
uv run python ../scripts/seed_tinyhouse.py $(ARGS)
|
||||||
|
|
||||||
# Operators of the hosted demo only — NOT part of any deployment, and nothing a
|
# Operators of the hosted demo only — NOT part of any deployment, and nothing a
|
||||||
# self-hosted instance needs. It wipes and recreates its three flows and its
|
# self-hosted instance needs. It wipes and recreates its three flows and its
|
||||||
# dashboard, so re-running it is how the public demo is reset.
|
# dashboard, so re-running it is how the public demo is reset.
|
||||||
|
|||||||
Reference in New Issue
Block a user