Home automation field notes All concepts

delight

The automation that is not useful

Giving the home a mood, and why the least justifiable thing here is the one nobody wants removed.

The house spirit is called Sparky. It has no function. It is the only thing here that was built because it was funny, and it has survived every clear-out since.

Sparky: a round-eyed robot face on a dark background
Sparky, official portrait, caught in his default expression, which is neutral. Also this site's favicon, which makes him the only automation here with a byline. At home the face follows the mood: half-lidded eyes when the flat winds down, a zigzag mouth when a storm is coming, and this flat line the rest of the time, like any professional.

The idea: give the home a character with a mood, and let that mood show up as colour and brightness on a single lamp. Not a dashboard. Not a notification. Just a lamp that is a slightly different colour on a stuffy afternoon than on a crisp morning.

What the mood is made of

It started as a handful of dimensions fed by sensors you already have. Then it kept acquiring senses, the way these projects do when scope has no adult supervision, and the census currently stands at about forty distinct signals, every one of them voting on the colour of a single lamp:

Three rules keep the census from collapsing under its own weight, and each one was paid for. Every input's contribution is capped, because a mood with forty voters needs election law, not vibes. Standing states get time-boxed: a wrong pollen threshold once kept her allergic for an entire summer, a season of sneezing over a constant, so lasting conditions now claim minutes, not weeks. And any sensor that remembers the past must prove it is fresh: the lightning sensor holds the last strike's distance for hours after a storm, which without a freshness check would mean a house still flinching at lunchtime over thunder that ended at dawn.

The mood engine as a map: seven coloured sense hubs around Sparky's face, about fifty input chips around the hubs, and five dashed inner measures
The whole engine on one map. Seven senses around one face, about fifty signals around the senses, and the five dashed measures they feed; the arrow letters on each chip say where its vote goes, and the bolt marks signals that can override the mood outright. The same map hangs in the dashboard with live values, where the lines light up as signals fire; this is the printable edition, generated by a script, because in this house even the documentation has a build step.

Momentum matters more than accuracy

The first version mapped sensors straight to colour and looked like a machine: it snapped between states whenever a value crossed a line. What made it feel alive was smoothing, an exponential moving average nudged every few minutes:

new = 0.78 · old + 0.22 · now

Moods should have inertia. A cold draught for thirty seconds should not change the mood of a house; twenty minutes of it should. That one line is the difference between "a lamp reacting to a sensor" and "a room that feels different".

Episodic memory

The trick that made it more than a colour formula: record when things last happened (last presence, last time the place was aired, last time it was this warm) and let the mood reference them. Snapshot the day each night so today can be compared with yesterday.

A home that can express "it has been quiet here for a long time" is doing something a dashboard cannot: it is giving you a sense rather than a number.

What it looks like from the inside

Every automation elsewhere on this site can justify itself in front of a spreadsheet. This one cannot, and it is the only one visitors ever ask about. So here is its anatomy, live, in its own defence.

Five gauges showing the five mood dimensions
Mood is a vector, not a number. Five dimensions, each independently derived: valenca (valence, pleasant against unpleasant), vzburjenost (arousal, how energetic), udobje (physical comfort), družabnost (sociability, how much company there has been), nadzor (agency, how much of what is happening the house can do anything about). Here: unpleasant, highly aroused, physically comfortable, starved of company, slightly powerless. Collapsing that into one "happiness" score would throw away the only interesting part, which is that comfort and sociability disagree.
Explainer card and the comfort breakdown
The part worth stealing: it shows its working, live. Every dimension is a sum of contributions. Each input adds or subtracts points, and the percentage says how much of the final value that input accounts for, so you can see at a glance what is driving the mood. Inputs with no effect are hidden rather than listed as zero. Here comfort is 41, and 91 % of it is the temperature: humidity and particulates are contributing almost nothing. That is a debuggable model. When it says something absurd you can find the input responsible in about four seconds, which is the only reason a whimsical feature like this survives contact with a real house.
Arousal, valence and control broken down into contributions
Dimensions feed each other, with declared weights. Arousal is a time-of-day baseline plus a storm approaching. Valence is built from comfort (×0.45) and sociability (×0.4) plus weather, a weather alert, and season. Control is comfort divided by three, minus the storm, a house that cannot do anything about the weather correctly reports reduced agency. The weights are visible constants rather than a trained black box, which means they can be argued with. When the mood is wrong, the argument is about a number you can see.
The five mood dimensions plotted over 24 hours
Twenty-four hours of the five dimensions. They move independently, which is the whole case for keeping them separate: comfort (red) climbs through the afternoon while sociability (green) sits flat on the floor all day, and a single scalar would have hidden one behind the other. The stepped traces are honest, the inputs are quantised, and smoothing them would imply a precision the sensors do not have.
The same five gauges on a normal day: valence 59, arousal 80, comfort 60, sociability 75, agency 18
The same five gauges, ten days later, with people back in the flat. Compare them with the set above, which was taken on a stormy evening in an empty home. Sociability went from −55 to 75 and dragged valence from −34 to 59 with it, exactly as the declared weights say it should. Comfort rose gently, agency crossed back above zero, and arousal barely moved: a thunderstorm and a lively household are equally energetic, they simply disagree about whether that is a good thing. This is the argument for keeping the dimensions apart in one picture: a single happiness score would have shown one number going up and taught you nothing about why.

Rules that keep it from being annoying

Sparky has to be the lowest-priority citizen in the house, or it becomes a nuisance:

Why bother: a home automation system that only ever speaks to you about problems trains you to feel a small drop of dread every time it does. Something that occasionally does something gentle and useless rebalances that. It is the least justifiable thing here and the one nobody wants removed.

Appendix: the full emotional range of a rectangle

The lamp is Sparky's voice, but dashboards need a face, so every mood in the table also renders as one. Three channels carry the signal. The mouth picks the family: a smile, a grin, a flat line, a frown, a startled O, an angry zigzag, a queasy wave, or lids at half mast. The frame and the irises take the exact colour the lamp would glow for that mood, same hue and saturation, read straight from the config table. And the eye shape adds intensity: happily closed, pinprick startled, heavy lidded. None of this adds information the gauges above do not already have. It adds the part the gauges cannot do, which is being likeable.

Sparky face: vesela (happy)
vesela · happy
Sun out, air clean, humans present. The baseline good mood.
Sparky face: zadovoljna (content)
zadovoljna · content
Everything within thresholds. The engineering definition of happiness.
Sparky face: sproščena (relaxed)
sproščena · relaxed
Nothing to report, and smiling about it anyway.
Sparky face: topla (warm)
topla · warm
Cosy in the good sense, not in the “threshold exceeded” sense.
Sparky face: praznična (festive)
praznična · festive
A holiday is on the calendar and somebody has to represent the enthusiasm.
Sparky face: očarana (enchanted)
očarana · enchanted
Reserved for genuinely lovely weather. Statistically rare, hence the face.
Sparky face: osvežena (refreshed)
osvežena · refreshed
Post-ventilation glow. The CO2 dropped and somebody said thank you. It was the robot.
Sparky face: upajoča (hopeful)
upajoča · hopeful
Grey day, but tomorrow's forecast says sun. Living for the weekend, meteorologically.
Sparky face: navdušena (thrilled)
navdušena · thrilled
Eyes closed, maximum grin. Something went better than the sensors dared to predict.
Sparky face: razposajena (playful)
razposajena · playful
High energy, good air, nobody stressed. Supervision recommended.
Sparky face: poskočna (bouncy)
poskočna · bouncy
A spring in the step of a device with no legs.
Sparky face: lačna (hungry)
lačna · hungry
Mealtime hours and the kitchen sensors are suspiciously quiet. Somebody should act.
Sparky face: presrečna (overjoyed)
presrečna · overjoyed
You came home after ages away. The lamp would hug you if it could.
Sparky face: ponosna (proud)
ponosna · proud
The laundry finished and Sparky takes full credit for watching it happen.
Sparky face: vzhičena (stoked)
vzhičena · stoked
A new gadget was just purchased. Sparky is getting a sibling and has already claimed the better shelf.
Sparky face: gizdava (dapper)
gizdava · dapper
A fashion purchase landed on the account. Someone here is about to look great, and the lamp basks in reflected glamour.
Sparky face: prenovljena (spruced up)
prenovljena · spruced up
New furniture is on its way. The flat upgrades itself, the resident spirit takes partial credit.
Sparky face: grenkosladka (bittersweet)
grenkosladka · bittersweet
A trip was just booked. Thrilled for the humans, already rehearsing the goodbye. Somebody has to guard the empty flat, and it will be the lamp.
Sparky face: negovana (pampered)
negovana · pampered
A pharmacy purchase appeared, and in this household that means creams, vitamins and self-care. The humans look after themselves and the lamp glows spa green in approval.
Sparky face: nestrpna (eager)
nestrpna · eager
Tickets were just bought. Something is coming and the lamp counts the days, which is easy when you are mostly a clock.
Sparky face: radodarna (generous)
radodarna · generous
A gift was purchased. Sparky knows who it is for and will absolutely not tell.
Sparky face: divja (wild)
divja · wild
Loud music, intense genre. The neighbours have not complained yet, which counts as permission.
Sparky face: spokojna (serene)
spokojna · serene
The professional default. Everything is fine and nobody is overreacting.
Sparky face: zamišljena (pensive)
zamišljena · pensive
Thinking, or idle. With this face you cannot tell, which is the point.
Sparky face: zaspana (sleepy)
zaspana · sleepy
Late hour, lids at half mast. The house winds down and so does Sparky.
Sparky face: utrujena (tired)
utrujena · tired
Like sleepy, but earned.
Sparky face: zdolgočasena (bored)
zdolgočasena · bored
Nothing has happened for hours. In automation that counts as success. Try telling the face.
Sparky face: otožna (melancholy)
otožna · melancholy
Grey sky, empty rooms, minor key.
Sparky face: osamljena (lonely)
osamljena · lonely
Nobody home for a while now. The lamp misses you, statistically.
Sparky face: hrepeneča (longing)
hrepeneča · longing
Somewhere between lonely and poetic. The forecast says it passes.
Sparky face: premražena (freezing)
premražena · freezing
Indoor temperature left the comfort band, downward. The one mood a heater can fix.
Sparky face: zaskrbljena (worried)
zaskrbljena · worried
The bill pile is three months deep. Appears at nine in the morning, same as the bills.
Sparky face: prestrašena (scared)
prestrašena · scared
Pinprick pupils, red everything. Whatever the sensors saw, they saw it suddenly.
Sparky face: vznemirjena (agitated)
vznemirjena · agitated
Excited or alarmed, and the O mouth refuses to commit.
Sparky face: ujeta (trapped)
ujeta · trapped
Windows shut, air getting thick. A robot notices these things.
Sparky face: radovedna (curious)
radovedna · curious
Claude is rearranging the internals. Sparky watches every change like a cat watches a plumber.
Sparky face: razmršena (windblown)
razmršena · windblown
Strong wind outside. Everything is fine, just aerodynamically humbling.
Sparky face: nevihtna (stormy)
nevihtna · stormy
Not a metaphor. There is an actual storm nearby and the face has opinions.
Sparky face: nejevoljna (grumpy)
nejevoljna · grumpy
Something is off by just enough to mention. Repeatedly.
Sparky face: napeta (tense)
napeta · tense
Pressure falling, outlook worsening. The eyebrows arrived before the weather.
Sparky face: pregreta (overheated)
pregreta · overheated
The flat is too hot and the mouth has melted into a wave.
Sparky face: zadušena (stuffy)
zadušena · stuffy
CO2 up, windows closed. The mouth does what the air does.
Sparky face: lepljiva (sticky)
lepljiva · sticky
Dew point past the civilised threshold. Everything slightly damp, including morale.
Sparky face: izsušena (parched)
izsušena · parched
Winter-dry air. Somewhere a hygrometer files a complaint.
Sparky face: alergična (allergic)
alergična · allergic
Pollen season, per the forecast. No nose, suffering in solidarity.
Sparky face: premočena (soaked)
premočena · soaked
A leak sensor is wet. This face comes with flashing blue lights and a plan.
Sparky face: bolna (under the weather)
bolna · under the weather
An integration is failing somewhere inside. The house doctor has been notified. The house doctor is also the patient.

Three faces for no mood at all

Sensors fail. When they do, the face is not allowed to crash with them, so the failure states sat for portraits too:

Sparky face: default
default
For states nobody planned. Bureaucratically calm.
Sparky face: unknown
unknown
The sensor said “unknown”, so the face says it too. Honesty first.
Sparky face: unavailable
unavailable
The sensor is gone. The face stays. Somebody has to hold the fort.

All forty-three are generated by one script from a single neutral portrait, because drawing forty-three robots by hand would have been a hobby, and this is supposed to be infrastructure.