Posts
Glad to be of service... 😄
did you consider metaphone matching?
I did not even know about this. Sounds super interesting. Though it seems to be very language specific?
My original intent was to not rely on language specifics. But maybe we could just define additional steps in the pipeline for specific languages. Hm. I'll have to think about this some more, but it might definitely be a great idea for a future version, so thanks for telling me about it!!
hass-closest-intent: Fuzzy intent matcher for HomeAssistant. Garbled STT output in, actual intent out.
cross-posted from: awful.systems/post/8238756
Basically, STT quality has kept me from switching to HomeAssistant’s voice assistant features. The default matcher (Hassil) is waaaaaaay to strict, and LLMs are slow, constly, and/or a privacy nightmare, plus I don’t like them.
I really thought there would be something available that just matches your STT output to the configured intents, but apparently not, so I’ve built in myself.
Finally convinced my GF to throw Alexa in the bin :)
Here’s an excerpt from the README, and feel free to AMA:
🌲 Problem statement and solutionSpeech-To-Text (STT) output, especially fast and local STT output, is often simply bad. HomeAssistant’s own Hassil is incredibly picky: your STT output must match exactly to one of the configured intents.
There’s two paths forward from this: Upgrade your hardware to support better STT, or try to figure out what the speaker probably meant to say from the garbled output.
This project does the latter.
With this custom integration, “Lights on in live in room” will actually turn on the lights in your living room. So will, for that matter, “lighrts on inn livainriomm”.
Short demo, first with
closest-intent, then with bare Hassil:
📜 Highlights
- Pattern expansion. Expanding
,(alternatives|to), and[optional|alternatives]all work, including on HASS-defined lists like your home’s areas and entities!- Slot extraction. Both for wildcard slots (like for adding something to the shopping list, where the
{item}is a wildcard), and against slots like{timer_hours:hours}with a fixed set of possibilities.- Fuzzy slot resolution. For list-like slots and expansion rules (including your areas and entities!), fuzzy match the slot values to the available options. Allows “livikroom” to be corrected to “living room”.
- Actual intent handling still done by Hassil.
closest-intentsimply corrects your STT output or typos to the closest matching intent, and then forwards a nice, canonical sentence to Hassil, who then deals with the intent just like if you had spoken/typed perfectly.- 100% LLM-free. Just uses relatively simple fuzzy matching of the input against your intents, plus some clever-ish (well… working, at least) tricks to improve the results.
- Fallback agent support. OK, I said 100% LLM-free, but if you absolutely want to, you can use one as fallback. More on this below.
- Is fast :) (as in: basically instant for a couple hundred configured custom intents).
Note:
closest-intentis completely language-agnostic. All the examples in thisREADMEare in English, but you can use it with any language you like; personally, I use it in German.📋 Examples
Here’s some examples of things I said, what my STT (
wyoming-faster-whisper-base) understood, what HomeAssistant was able to do/answer after passing the STT output throughclosest-intent, and what the same STT output would have resulted in with just bare Hassil.what was said STT output with Closest Intent bare HassilNote: These are actual results I got when speaking the “what was said” sentences in my phone. I’m a native German speaker, and so I do have an accent, but this pretty closely matches my experience when using the German-language version of whisper. The “bare Hassil” responses are what I got after 1:1 pasting the STT output into the voice assist chat window with
closest-intentdisabled.start cleaningStar cleaning.✅ Cleaning started. ❌ Sorry, I couldn’t understand thatstop cleaningStop clenching!✅ Cleaning stopped. ❌ Sorry, I am not aware of any device called clenchingvacuum the living roomVacuum Believing Room✅ Cleaning the living room. ❌ Sorry, I am unaware of any floor called Believing Roomclean the officeKing the Office✅ Cleaning the office. ❌ Sorry, there are multiple devices called Office (author’s note: no there aren’t, wtf?)vacuum the kitchenBack here in the kitchen.✅ Cleaning the kitchen. ❌ Sorry, I couldn’t understand thathow warm is it in the bedroomOur all is in the best room.✅ In the bedroom, the temperature is currently… ❌ Sorry, I am not aware of any area called best roomadd milk to the shopping listAdd milk to the chauvinist.✅ “milk” added. ❌ Sorry, I am not aware of any device called chauvinistput call dentist on my todo listput call dentist on my tudu list✅ “call dentist” added. ❌ Sorry, I am not aware of any device called tuduturn on the water pumpturn on the what her pump✅ Turned on the water pump. ❌ Sorry, I am not aware of any device called what her pumpplay some musicPlace on music✅ Playing music. ❌ Sorry, I am not aware of any area called musicresume the musicRenew Music✅ Resuming. ❌ Sorry, I couldn’t understand thatpause the musicPost music✅ Paused. ❌ Sorry, I couldn’t understand thatnext tracknext rack✅ Next track. ❌ Sorry, I am not aware of any device called rackenable shufflean able shuffling✅ Shuffle enabled. ❌ Sorry, I couldn’t understand thatdisable shuffleDisable to schaffen.✅ Shuffle disabled. ❌ Sorry, I am not aware of any device called Disablerestart the playerReset the plan.✅ Restarting the player. ❌ Sorry, I am not aware of any area called Resetplay a random albumPlayer random album✅ Playing a random album. ❌ Sorry, I couldn’t understand thatplay a random artistPlayer and Immartist.✅ Playing a random artist. ❌ Sorry, I couldn’t understand thatplay the latest tracksPlan the ladder tracks.✅ Playing recently added tracks. ❌ Sorry, I am not aware of any area called Planplay recently played songsPlayer recently played so…✅ Playing recently heard tracks. ❌ Sorry, I couldn’t understand thatplay playlist NieRPlay playlist NEAR!✅ Playing the playlist NieR. ❌ Sorry, I couldn’t understand thatplay my daily briefingand play my daily breathing✅ Here is your daily briefing: … ❌ Sorry, I am not aware of any area called and playwhat time is itWhat the hell is it?✅ It is 16:36. ✅ It is 16:36. (author’s note: okay, know what? earned. did not expect that.)what day is it todayOne day is today.✅ Today is Friday. ✅/❌ May 8th, 2026 (author’s note: that’s the output for “What date is it?”, but, eh, close enough)make the tv brighterMake that CV brighter.✅ Screen is now bright. ❌ Sorry, I couldn’t understand thatset the screen darkerThe screen doctor.✅ Screen is now dark. ❌ Sorry, I am not aware of any device called screen doctorwhat’s the weather todayWhat’s the matter with you?✅ Today, the weather is… ❌ It is 16:36. (author’s note: wait, WHAT?)how’s the weather tomorrow morningHow’s the better tomorrow?✅ Tomorrow morning, it will be… ❌ Sorry, I am not aware of any area called How’swhat’s the weather this weekWhat’s the matter this weak✅ Monday:…, Tuesday:…, ❌ It is 16:36. (author’s note: sigh…)how’s the weather at 5 o’clockcast the red there at 5 o’clock✅ At 5 o’clock, it will be… ❌ Sorry, I am not aware of any area called casthow windy is it right nowhow windy is IR low✅ The wind is currently blowing with… ❌ No timers.how windy will it be tonightHow will you be tonight?✅ Tonight, the wind speed will be around… ❌ Sorry, I couldn’t understand thathow hot will it get todayHow hard will it get today?✅ Today, temperatures will reach up to… ❌ Sorry, I couldn’t understand thatwill it rain todaywith it right today✅ No rain is expected today. ❌ Sorry, I couldn’t understand that…you get the idea.
💡 How it works
closest-intentis registered in HomeAssistant as a conversation agent. On startup, it parses (by default) all user-defined intents (or optionally, also the builtins ones). In this process, it also expands all rules, like,(alternatives|to), and[optionals], and notes where{slots}are located, and whether they are wildcards or belong to some list (like areas, entities, or the numbers 1-100).When a user request comes in (via voice command or the chat box),
closest-intentfuzzy-matches that request against those expanded rules. If the rule does not contain a slot, it is picked immediately. If it does contain a slot,closest-intentperforms a sequence of fancy magic steps to find the best-fitting slot value among a range of possible positions within the top-scoring matched sentences. In practice, this often means “smallest slot-value on a word-boundary”, but the extraction is not limited to that.With the best match found, we then reconstruct the “canonical form”, i.e. a sentence that Hassil will actually understand. If in your configured intents, “Play some music.” exists, and
closest-intentgot “Place on music” and matched that to the intent, it will simply forward “Play some music.” to Hassil. If the intent contained a slot, the extracted value will be substituted.This guarantees that the sentence passed to Hassil will actually be understood, and allows us to not have to worry at all about performing actions, running scripts,…
If no matching intent could be found, we pass the exact input we got to the configured fallback agent. By default, that is simply Hassil (which again allows us to be lazy and not worry about proper error responses), or another agent, like a LLM.
Sure thing!

For the barrels, they were simply sold with the bases. Didn't see a reason not to use them, and also allowed me to drill the hole for the hose connector as close to the bottom as possible (used both for filling water in and for leveling between the two barrels, since the pump is only in one of the barrels, see last picture). I don't remember what the barrels cost exactly, but it wasn't too much and I'm happy with the sturdiness.
For the compost bin, we could have gone a bit more expensive tbh. This one was <25€, and as you can see, it's not exactly shaping up to be a paragon of longevity. It sits on some slabs that were already in that corner, and I though it might help drain excess water...? Not sure though, I don't think it does anything. The compost bin is also too small (and unsturdy) to go in with a shovel from the top and dig the compost over, which would really be beneficial. But still worth it. We put all our kitchen scraps in, almost completely eliminating residual waste bad usage for us, and I pull about 70l of compost out of it each spring.
If you have a place where you can place the bin in the garden rather than on the deck, dot it, I'd say. Take a look around youtube or something, there's some really cool composting systems.
Good luck! Hope the pictures help. Sorry for being so slow to respond.
Thanks :) Ah, you mean this one?

I built that last year specifically for our paprika (capsicum? never sure what the English word is. Web search says "pointed peppers"? Not hot though).
The previous years, every time around August the twigs would be full of large, heavy, but unripe fruit. Inevitably, we'd get windy weather and a third of the twigs would break off. The soil in those pots is not very deep (15cm, ca), so the trellis needed to be able to stand on its own. I really like the outcome, no breakage last year :)
The original idea came from here: https://www.youtube.com/watch?v=wFWNV1V0x3o adapted for our situation. The twigs end up kind of laying atop the supports.
Oh, and throwing a plastic foil over it in February/March also worked quite nicely to create a make-shift coldframe!
Forecast says no more frost this year, so I took a gamble and already planted and sowed everything out last weekend. [more pictures + drip irrigation details in the post]
cross-posted from: awful.systems/post/8068330
This is a 50sqm balcony/terrace on the 2nd (3rd American) floor of a rental apartment building. I immediately knew we had to take the apartment, because having a balcony garden was my number 1 wish. In that sense, we definitely got super lucky.
This is year 4 of the garden, and it feels like we’ve reached “routine” with it. In the first year, we lugged about 2.5 cubic meters of soil up there to fill all the pots. From June-October, this space is enough to fill 100% of our (two people) vegetable needs.
![]()
![]()
![]()
![]()
![]()
Unsurprisingly, this is way too much to water by hand every day, not to mention when we’re not home for some days/weeks. The balcony is also south-facing, and it gets hot in the summer (seriously, I have burnt my feet on the stones before).
Unfortunately, there’s also no water outlet on the terrace itself, and the landlord said “no” to putting one there (which was expected, the way the house/apartment is built is not really suitable for that).
Our solution has been to put two 300l rain tanks on the balcony (atop of load bearing walls). They get filled by a hose from the kitchen tap whenever required. The barrels are connected by a second hose. In the one in the greenhouse, a rain barrel pump sucks water out, into a watering computer and optionally to a hose for manual watering.
From the watering computer, two watering circuits start; originally the plan was to distinguish between plants that constantly needed a bit of water, and ones that preferred a lot of water occasionally (e.g. the citrus plants); in practice, it turned out to be easier to just always water everything a bit. Oh well.
The watering computer itself it pretty dumb / not connected to an app or the like; it just opens the valves every 8 hours for (in the summer) 3 minutes each time. That’s mostly OK. On super hot days, I sometimes start a fourth round of watering in the early afternoon.
The pump is however plugged into a Zigbee-enabled smart socket, which is controlled by an automation via HomeAssistant (so, all-locally, thankfully). The main purpose of this is an automation that disables the pump when there has been a lot of rain in the past 24hrs, or a moderate amount of rain in the past 8 hours. Not that important when we are home, but usually extends the number of days we can be away from home by 2-3 days for a full filling of the tanks.
![]()
![]()
Finally, here’s some pictures and a video from the past couple of years. I think this year is the first year where no new pots were added, and we needed to buy hardly any new soil (the compost bin has really been worth it in that regard, as well!)
![]()
![]()
Happy to answer any questions!!
I bought a Brother HL-L2375DW a couple of years back specifically for Linux compatibility, and it did NOT disappoint.
- haven't had a single error
- has not refused to print a single time
- super quick, good quality, duplex
- using cheap 3rd party toner without complaint
- works perfectly from Linux
I don't usually like to recommend brands/products, but this is the exception. If you need a printer, and black and white is all you need, go for this one.
Just gonna leave this here


