Living with Dobby
Dobby is not another dashboard. It is the person in the house who knows how the dashboard works.
Every phone and shared screen opens the same household conversation. Say what you want. Use the cards when touching is faster. Open the activity record when you need to know exactly what happened.
A morning with Dobby
6:47 AM
- Maya
It's cold downstairs.
- Dobby
Downstairs is 67°. What should I set it to?
- Maya
70.
- Dobby
Downstairs thermostat set to 70°.
7:10 AM
A parent opens the kitchen tablet. The same conversation is there. The thermostat card shows what Home Assistant currently reports. It does not pretend that the room reached 70° because Dobby accepted a new setpoint.
That evening
- Greg
Set downstairs to 70 every weekday morning at seven.
- Dobby
Done. Downstairs will be set to 70° at 7:00 AM on weekdays.
The next morning, the stored schedule fires without asking a model to read the sentence again.
What the house keeps
morning warmup · READY 0 7 * * 1-5 · America/New_York downstairs thermostat · set_temperature · 70° · Greg
The words were interpreted once. The timer, device, action, value, and author are explicit.
One house. One Dobby.
The first time a browser opens Dobby, it asks who's this? and remembers the answer. That name goes on everything the browser says and does. It is a name, not a login. Nobody gets a permission tier.
The kitchen tablet speaks as whoever set its name last. switch on the plate changes it. Every browser still enters the same persistent thread, with each person's lines interleaved in order.
Dobby would rather ask a stupid question than make a clever guess.
Say what you want. Dobby answers in a sentence or two and stops. This exchange comes from the working rig:
- Greg
Set the temp to 74 now.
- Dobby
Which thermostat—the main thermostat or the downstairs thermostat?
- Greg
Downstairs.
- Dobby
Done — downstairs thermostat set to 74.
Four rules show up in ordinary use:
- An ambiguous device becomes a question. “The thermostat” in a house with two is not permission to set both.
- An unknown managed device stays unknown. Dobby does not turn “the Roomba” into whichever vacuum looks close enough.
- A rejected operation comes back with the device's reason. Ask for 85 in a house capped at 78 and the thermostat agent names the limit.
- An accepted command reports acceptance. It does not report an imagined physical outcome. Home Assistant supplies observed state later.
- Greg
Send the Roomba to clean.
- Dobby
I don't have a Roomba here—only the thermostats, living room light, and office printer.
The model can still misunderstand a request and choose an allowed action on an allowed device. The closed roster and device rules limit that mistake. They do not make language infallible.
Sometimes talking is easier. Sometimes touching is easier.
Both paths reach the same device machinery.
/house shows every managed device as a card with its reading and its word. Under the row sits the device's other number: the water heater says the water in the tank, a humidifier says the air in the room, an oven says its target under its temperature. A type with no second number says Since 4:12 PM. The reading changes only when Home Assistant reports a new state.
A fader sets a thermostat's or water heater's setpoint, a humidifier's or dehumidifier's target, the speed of a fan, an air purifier or a range hood, and a dimmable light's brightness. It runs between the two ends the device itself reported. While your finger is on it, the proposed number rides above it in amber. Nothing is sent until the finger comes up. The step is the device's own too, so a target it would refuse cannot be reached from the card. A card cannot set the hot water to 200°F, and the device agent checks every value regardless, so anything it refuses reads HELD with the device's own reason and nothing reaches Home Assistant.
Where the value is a word rather than a number, the card draws a row of the words the device advertised. The water heater offers its mode, its away mode, and power. A humidifier offers its mode and power. The fan, the air purifier, the range hood, the light, and the switch offer power, which reads ON · off. The lock offers locked and the garage door offers closed. Unlock and open are on no surface.
The word the device holds is written in the record voice and is not a button, because the board never offers to set a thing to what it already says. The others are the quiet underlined verbs. A row with nothing left to offer is not drawn: a locked door already reads Locked.
A card tap reaches the device with no model involved. It is fast, it still runs that device's own range checks, and the thread says who did it. The card never asks “are you sure?” It offers a way back for eight seconds instead: undo · back to 70° after a fader, undo · back to eco after a word. The vacuum's start and stop and the shade's move have no card control yet. Ask for those in the thread, or put them on a schedule.
The foot of the page holds edit and remove on each card, with add a device below. See Teach Dobby your house.
The eight words
Every state on the board is a word on a flap. There are eight. WARMING and COOLING are one word with two faces.
| Word | Means |
|---|---|
| Set | Somebody asked for this value. |
| Warming Cooling | The device is doing it. Home Assistant said so. |
| Ready | A schedule waiting for its time. |
| Awake | A device that answers and only reports. Its reading is beside the word. |
| Listening | Dobby is paying attention. On the plate, beside his mark. |
| Quiet | A network device that stopped answering. |
| Held | The device declined. The reason is beside it. |
| Not known | Nobody has told us yet. It appears briefly after a restart, or when an accepted command never echoes. |
When no word is true, the row has no word. A paused schedule shows none.
The thread remembers what people asked. The activity record remembers what the house did.
When a change counts as something somebody did, a quiet system line appears in the thread: the device, the word, the value, and who did it. That includes a card tap, a schedule firing, and someone turning the dial on the wall. A Home Assistant refusal adds HELD beneath Dobby's intent line. A command that never echoes adds NOT KNOWN once.
What you should see
Then who, in faint ink: Greg for the thread, Greg, card for a tap on /house, the schedule's name when one fired, and changed at the house thermostat when somebody used the dial.
A printer going quiet at night is not a change anyone made. It appears on the card and in Activity, not in the thread.
/admin is a small link at the foot of the cards. It is a room, not a privilege. It holds:
- Topology. A live diagram of Dobby, the scheduler, every device, and the command paths between them.
- Health. Whether Home Assistant is connected and whether every runnable schedule has a timer.
- Schedules. Every standing intention. Pause, resume, delete, or add one here.
- System. The system settings and the tokens other agents hold.
- Activity. The full log, newest first. It records tool calls, device changes, schedule firings, refusals, and configuration work.
Ask about what happened
“Who changed the thermostat today?” and “Which commands did not arrive this week?” ask Dobby to read its activity record. The answer distinguishes a command from a reported state change. Counts cover the requested period even when the displayed evidence is shorter.
This is Dobby's record, not Home Assistant's complete history. No entry does not prove nothing happened. Dobby cannot measure hours of heating or cleaning from this record. Times use the house clock; a week begins on Monday, and “last night” means 6 PM yesterday through 6 AM today.
Ask Dobby to keep watch
“Tell me if the main room stays below 60°F for twenty minutes.” Dobby proposes the exact condition and waits for agreement in a later message. Once saved, code watches the condition without asking a model. The rule reports a notice; it never changes a device.
A rule can watch a lasting condition, or the absence of a matching recorded state change. It can watch all day or during a daily window, on selected weekdays. An overnight window belongs to the day it starts. Each rule watches one condition on one device; combined conditions and calendar deadlines need a different design.
There is one notice per occurrence, in the thread and above it. Acknowledge it to remove the standing notice. A known recovery lets the rule report a future occurrence. On The House, add a rule, pause or resume it, or delete it with an undo. These controls work without a model.
Unknown readings, a lost Home Assistant connection, or a restart begin a fresh observation interval. Dobby does not count time it could not observe. An acknowledgment survives a restart. A new rule starts watching now; it does not assume the condition held before it was saved.
Tell it once. The house remembers.
A schedule is a standing intention: “Set downstairs to 70 at seven every weekday.” Say it in the thread and Dobby writes a label, a time, the device, the action, the value, and who asked. It says the instruction is set for those times. It does not say the house is already that way.
“By 8 PM” and “at 8 PM” are different requests. Dobby supports the second. It asks when the wording implies the first. At the appointed time, a timer sends the stored command to the device agent. No model runs.
If the model provider is unavailable while Dobby is still running, existing schedules still fire and the cards still work. A stopped Dobby server cannot fire a Dobby-owned schedule.