offset \ˈȯf-ˌset\ noun

a force or influence that makes an opposing force ineffective or less effective

2025 Recap

2025 started with us trying to get rested from visiting families. Those things are never great for me. Vesna has it different. Be it emotional blackmail or nostalgia, one thing's for sure. It's exhausting.

What I really don't like is that I get a feeling like they consider our life stopped when we moved. Like we're just waiting to come back. Or maybe it's them waiting for us to come back and projecting.

It's been over a decade and we have a thriving social life in Ireland. We built our social circle, nested, have these great little beasts following us. This is not going away.

In the current world, going back to Croatia doesn't sound like a good move, although I often feel like Marjane Satrapi. Like I don't belong there anymore, but I also don't belong here. The anti-immigrant sentiment is worrying. Not just in Ireland, but in EU in general. This touches upon a grim topic that is best left for a dedicated article.

We didn't go down the route of doing new year's resolutions. It was just a hard push to finish what we already started. We drilled and sawed and continued shaping up our apartment. From the small things, to the kinda bigger ones. We even got water damage from the neighbor upstairs just two days before the year ended. I think we covered the most of it. The curtains are still not done because we were not really financially solvent.

The job hunt was slow. My unemployment benefit dried up and I reapplied and got rejected, as expected. The finances were dropping, but we stayed afloat by the sheer fact Vesna was the primary breadwinner and has a job. We're both scared, however. The job displacement due to the generative AI is worrying. I even inquired about a PhD because I had time on my hands and need some connections. It is still an option if I ever get to a state where it makes sense. Visiting a friend in Netherlands in a university campus, then talking to all the scientists on the expedition, just made me remember how fun it is to discover things and see how they work.

To offset the finances in decline, we fixed up the small apartment and rented it out at the end of the year. We learned to paint and scrubbed everything we could get our hands on. The income from it would equate to the unemployment benefit, but it's still better than nothing. We did think about selling it, but decided against it, if we can manage.

DjangoCon EU was also a good event, but it struck me that there were more people trying to get a job than companies offering jobs. The food situation was not ideal there either. The hotel staff had no idea how to handle vegans, let alone lactose intolerant people. I met some interesting folks, though.

I also went to one Python Ireland event, GIS related, and found out some new stuff. Most importantly that I'm still competitive in this job market, but interesting and good job offers seldom appear.

We were making do so at least we were not in a danger of going under. We even got to travel and see some events.

Funny enough, when we were in Antarctica I got a call from a job I applied to. I told them outright that I'm on a bucket-list trip and if it was not meant to be, I was okay with it. They, however, said they'd wait for me to come back and engage in the interviewing process.

Five rounds. It hurts to think back about it. However, I passed all of them and got the offer that I accepted. I didn't start in 2025. This was left for after the year ended.

Trips:

  • Netherlands, Utrecht, Nijmegen, The Hague, to explore, to see a friend
  • Croatia, Vesna had a family emergency
  • Spain, Tenerife, back to the island, but this time with friends for a water park and to see the stars in one of the darkest nights
  • Croatia, another family emergency with me as the delegate
  • Croatia, to see families because we were about to make a bucket-list trip
  • Argentina, Buenos Aires, a jumping off point to Ushuaia
  • Uruguay, Colonia del Sacramento, a day trip from Buenos Aires
  • Argentina, Ushuaia, the end of the world and back, Tierra del Fuego national park
  • Antarctica, Wiencke island, Antarctic peninsula, Petermann island, Pleneau island, an expedition to see the last continent and make a landfall several times, funny enough, South America was also a continent we didn't step foot on before so it was two in one

Domestic travel:

  • Northern Ireland, friends got a cat from the same breeder
  • Wexford, for soap making workshop
  • Killary Harbour, the mud race happened
  • Dún a Rí Forest Park to get a log for mushrooms and see a bit of wild
  • Northern Ireland, Belfast, for the winter market

Shows:

  • Twice to Theatre Sports, improv teathre to see a friend perform. It's silly and funny.
  • Gloryhammer, in spite of their major misogynistic fuckup, we went with a friend for science (also, the support, Dominum, was great)
  • Miracle of Sound, debut concert. They are actually good
  • The Dead South, Vesna wanted to see them
  • Heilung + Eivor, with friends and it's a ritual, not a concert
  • DjangoCon EU, an ex colleague was visiting so this was a nice opportunity for him to see things and for me to network
  • Irish Python Meetup, mostly because I wanted to see what they have to say
  • The Rocky Horror Show, a cult musical

Books:

Video games finished:

Video games played:

Things we bought:

  • cat stuff, spool of sisal rope, harness, toothbrushes, toys, furniture, catio stuff, scratchers
  • Garrus (Mass Effect) ducky for Vesna's birthday, good for debugging, playing in the tub and having a novelty conversation starter
  • laser spirit level to arrange shelves
  • pots and clothes and bedding and kitchen stuff
  • bunch of equipment for the Antarctica trip
  • vacuum pump for wine, it works, but we drink the wine before we get to store it
  • door draft stopper
  • extension cords and connecting cables
  • monitor raiser
  • SAD lamp for all the needs Vesna has over the winter
  • copper mugs for mule cocktails, hex pattern, had to have them
  • grill toaster
  • Razer Basilisk v3 mouse
  • Raspberry PI M.2 HAT, along with a drive
  • tea strainer kit
  • household supplies, consumables
  • motion activated bin
  • hexagonal ottomans from IKEA
  • Nanoleaf Essentials bulbs for the spotlights in the bedroom
  • Septima board game
  • stuff for the apartment downstairs, a couch, a rug, a table, new dispenser for the bathroom to fix the broken one
  • Tapo smart energy monitoring plug
  • shelves for the bathroom that we turned into a storage room
  • cordless vacuum again because the last one broke
  • scissors and magnetic holder
  • battery organizer
  • kitchen tap plate that we used to fix the kitchen tap
  • PS4 controller charger
  • packs of lazy Susans (Vesna loves to organize)
  • sink strainers
  • tools, like cutters
  • some ESP32 devices to get Bluetooth trilateration working (room presence), I need to revisit this in a future article
  • two more Nanoleaf bulbs
  • STP cable for network (got the IKEA Idasen standing desk working again, this time with native Bluetooth integration)
  • mixer for the Old Fashioned cocktail
  • Kindle Paperwhite, Vesna got me one because we were going on a long trip
  • Symfonisk picture frame speaker (we had a discount from the kitchen purchase in IKEA), it is Sonos based, we need to customize it
  • light-tailing kit for LEGO Tallneck
  • light switch cover for the IKEA 5-button controller
  • cosplay accessories for our Halloween tradition, don't ask
  • Redmi Note 14 Pro 5G
  • Aqara vibration sensor, I have some ideas
  • Redmi Buds 6, ANC, and I like it
  • massage gun that only sees use when something hurts
  • hiking boots that I thought I'd use on the Antarctica trip, but didn't have a chance, they will be used later
  • bunch of small things like wired gloves for mandolin kitchen work
  • wax, mushroom kit so I did the log build on the balcony and I'll report in a yar if it grew
  • squatty potty!
  • rechargeable batteries

Other important events:

  • became a board member for the complex we live in, eventually we switched the management company because we want this place to become better
  • rug tufting workshop with our D&D coterie, and the rugs look great
  • whiskey cocktail workshop, but I know how to do cocktails
  • assembled more furniture from IKEA for the small apartment and refurbished it
  • soap making workshop with beer in Wexford, basically you make a solution and Irish stout is the soap base
  • fixed the cat scratcher with a new sisal rope, twice
  • fixed the tub with a new panel where the tiles were broken by the plumber
  • a bunch of people visited (both sets of parents, my relatives that live in Ireland, Vesna's sister, her partner and a cousin with his family, a friend that was going for DjangoCon EU)
  • updated Raspberry PI with M.2 and an active cooler and I can say it's faster to deliver the pages and can act properly as a media device
  • finally consolidated the Raspberry stack with some additional services like Immich and media handling
  • made a catio for Kida & Tenzin, parents wanted to help, but that's not why we got them to visit
  • fixed the kitchen tap with paddings, the wooden base is horrible for taps without paddings
  • Turf Warrior, a race in the mud, the wet suit is great to have, yes we can do it, and are apparently adventurous enough considering we did the polar plunge as well
  • pottery painting workshop so now there's a mug on my desk
  • rented out the small apartment so we'll see how that goes
  • inoculated two logs with mushroom spawn (Oyster and Lion's Mane)
  • made another big trip to visit the last two continents we didn't step foot on so now the list is complete
  • got two cheap phones to get us through the trip with eSIM support and a better camera, I'm sorry Fairphone, but money is tight at the moment
  • got a job offer
  • kettle stopped working, a cautionary tale that things must be local, and not depend on the 3rd party cloud

Pillars of Kings in Antarctica

We like traveling. I mentioned it before. We set foot on all of the permanently inhabited continents except South America. Our grand plan was to go and see Russia, but war in Ukraine happened, from there we wanted to go to Cuba, but I had a job for a US company which made the whole Visa Waiver invalid, then from Cuba to Mexico and Peru, but COVID-19 happened as well. A series of events in the world that threw the proverbial wrench in the machinery so the whole trip was difficult to organize and pull off.

Mexico happened eventually with Panama in the same package while I was working for Gencove and this is the furthest south we got on that side of the world. We did our first round of travel vaccinations for the tropics and boosted what we could several weeks ago.

The Pan American Highway is a dream never realized. The road is supposed to connect North and South Americas, but there's the issue of the Darien Gap. The continents look connected, but they really are not. This is where our path ended the last time.

Fast forward, our plans were altered. Tenzin and Kida became a part of our family, I got laid off and got another job later. We upsized because the apartment got cramped. We were stable financially when we decided to revisit the idea of South America and that is when the question put itself forward. Why not to go further?

We paid a substantial amount of money for a sustainable expedition to Antarctica going from Argentina. I know the whole expeditions are geared to tourists and it's an oxymoron to call it sustainable. We wanted to see all of the continents and this was the least painful option.

The whole trip was months in preparation, almost a year since we paid the deposit, and our most ambitious trip so far. We usually don't pack big suitcases, but since the trip was going to encompass both warm and cold weather, and the flights included checked luggage, we decided it wouldn't be the worst thing to have one big suitcase, except we didn't have it so we borrowed it from friends. No luggage was lost.

Our phones were also not up to the challenge. Both had very diminished battery lives and Vesna also cracked her screen (and blamed Tenzin). We chose cheaper upgrades (sorry Fairphone, I'll get back to you once I get financially stable again) and planned to take the old GoPro to take pictures. A friend who's into photography convinced us to take his old pro camera with us, which turned out great.

With heavy hearts, we left Kida and Tenzin behind and vowed we'd come back - to cats who didn't understand what was happening, to friends who were minding them, to families who were scared. But it's not like we were heading for some unexplored frontier. We chose a destination that we found interesting and that was open and fit for tourists, so there was no room for fear.

The flight from Dublin to Buenos Aires was a connecting one. On the way there via Paris, and on the way back via Amsterdam. A long journey is not something we hadn't experienced before, but it was some years ago from Amsterdam to Beijing and from Shanghai to Paris. It's not impossible, but it is very cramped and it's a bit of a gamble if the preordered vegan option will be available. Sometimes you have to argue to receive things that should be provided as agreed.

Transoceanic flights take time. I cannot sleep in the seat and it's a pain, but we brought enough entertainment. From the downloaded Spotify playlist, to Kindle books and even Steam Deck games. Vesna also had some videos to watch despite the in-flight entertainment system. We used the opportunity to see some things together.

When we landed in Buenos Aires, we got reminded why we hated checked-in luggage. It's another time waster, another cost, another effort to transport. Either way, we didn't have the issues with the immigration and got to the city center without trouble.

Buenos Aires is lovely. In spite of the streets being in the grid system, which leaves little room for discerning landmarks and a lot to urban sprawl, it didn't make us feel anxious, unlike London. It is probably the green spaces everywhere and the architecture is familiar, although the buildings are a bit taller since Buenos Aires is newer than the European cities. It's clean and green and the economy tries to stay afloat in spite of the free fall it's currently in.

We didn't do the usual walking tour, but only the hop-on hop-off bus this time. What little time we had there we used for going around on our own and one day we also visited Uruguay. It's very easy to jump over to Colonia del Sacramento from Buenos Aires via the regular ferry. Enough to get our passports stamped and get away from the bustling of the city.

After a few days checking out the most important bits of Buenos Aires, we had a flight to Ushuaia, what they like to say - the end of the world - kinda. Because I was a birthday boy, we got transferred to the fancier Arakur hotel with a lookout, but we managed to see the city on the way back. From there, we got transferred to a ship and off we were across the Drake Passage.

It was turbulent and wavy. We were told that it was actually okay and it could've been worse, in spite of the sea rocking the boat and the anti-nausea pills knocking us out. The ship had 312 passengers and the crew and is equipped with a lecture hall so it was interesting to hear about all the scientific stuff from phytoplankton, over macro-fauna to the geology of the continent.

It took us two days to get across to the peninsula and after the first landing on the Wiencke island, next to the Damoy point, with a number of Gentoo penguins all around. We spent the night over there camping. It was windy and cold and some condensation in the tent turned to frost. In the morning we had to be evacuated. One person didn't wake up and passed away. I know the gossip, but I don't like guessing.

In the coming days we also landed next to the Brown station on the peninsula itself and saw some penguins again. What impressed me the most was the Paradise Bay because the weather was spectacular with the mountains descending deep into the ocean below with the clear skies and rich reflections among the icebergs. Like an ice version of the Argonath from the Lord of the Rings. The other stops were Petermann island and Pleaneau island and more penguins alongside some boat trips among the icebergs checking out the seals and remote roosteries.


/media/images/brown-station.jpg

We had a kayaking session in Charlotte Bay which we didn't do much of because we were greeted by a family of Minke whales going all around us and below us playing and showing their bellies. It is truly a sight to see floating on the water in the kayak and ignoring the paddles. Just recording with a phone.

The weather was great throughout the journey. It was warm because the sun is hitting harder and the sunglasses are invaluable. We had to ditch most of the layers to avoid the heat. So yes, the weather was kind to us except the last day when we had to skip the Deception Island and attempt a landfall in a bay close-by, but the wind was too strong even for that so we huddled inside and were looking out through the windows.

We had to go back a day earlier because of the tragedy that happened during camping. The Drake Passage was wavy again, but we took the time to listen to the lectures. Even though the ship is equipped with a hot tub and a sauna, we didn't avail of those and instead opted to just listen to the scientists telling us about things. I was very interested in the remote sensing area, be it monitoring the ice or the wildlife migration.

On the way back, we stopped in Ushuaia for a day, just in time to check out the city and the neighboring Tierra del Fuego national park. We did it ourselves with the local bus. The weather was once again great so it was dry and we could just walk around and snap some photos as well as get our passports stamped. In the city there's the Republic of Croatia square. Who knew?

Vegan food is still difficult despite the expedition advertising itself as a sustainable one. It's pretty much the same as with every cruise. You have to ask, but they will paint by numbers and make mistakes. Like getting a non-vegan cake for my birthday delivered to our cabin and me having to go through the trouble of returning it. Or the first night before leaving for the southern tip of the continent, when were placed in a 'luxury' five star hotel which didn't even have plant milk for our coffees in the morning.

The expedition itself had weird demographics. I felt out of place because we're not rich folks and we're not old. Strong vibes of Gattaca and Snowpiercer. Those who know, know. Like playing outside of our league and feeling like an impostor. The expedition wants adventuring young folks, but it gets decrepit old ones that can barely scale the stairs after leaving the boat when landing, and need three people around to help them walk. The adventuring young folks have no money to afford a journey like that. They are also not pushing for the changes in the environmental department so go figure. It makes me sad, but here we are.

The way back took us to Buenos Aires again where I asked around at the nearby cemetery for one of my relatives, but didn't have any luck. We explored the places to eat because, even though the ship should cater to the vegans, and we didn't go hungry, it left a lot to be desired. We missed tofu. Such a simple thing.

The journey to the airport was eventful with Uber barely making it and the way back took us to Amsterdam with the plane conditions being all cramped again. We didn't want to visit the city. We were in Amsterdam before and the weather was miserable. Traveling from the late Spring to the late Autumn and crashing badly at the same time, left us with a long layover in the Schiphol where we only wanted to sit properly and walk around, have a normal coffee.

Would we do it again? If time and money were not an issue, yes. I think we got to experience all the highlights that we could so we're not regretting anything. There are other places to see, but the continents are all marked as done. Oceans, on the other hand...

Display Home Assistant Values on Kraken AIO

While our PC is still not OK with the CPU being the way it is, the NZXT Kraken AIO solution is cooling the CPU well. It managed to knock down the temperatures by almost a half. I am very satisfied. I guess we had to switch to the water cooling eventually. The modern components require robust solutions. They get very hot.

For a long time I was a fan of silent monolithic closed cases that I never have to see, but having one with transparent sides looks cool. The only issue I have with it is that it's bulky. And heavy. No matter how many components I remove, the ones that remain get heavier.

The AIO features a 640x640 px circular display and the good folks at the NZXT allowed users to display a web page on it. They also added the NZXT API access so we can query the CPU, GPU, fluid temperatures etc. The NZXT developer documentation details the available variables.

Since it's a web page in itself, there have already been some interesting solutions made by the community such as Google Photos slideshow, YouTube video display or Spotify album art. While I had the Spotify integration active for a couple of days, I wanted to have something more useful because I am not listening to Spotify all the time.

Our apartment is full of smart devices, although still not up to the level of the old apartment, but getting there. I decided to roll up my sleeves and make an integration that would display the local Home Assistant instance data on the Kraken AIO LCD. I had to keep stopping myself from overthinking and overengineering the thing. The integration was supposed to be a short showcase project. I had to consider several things:

Kraken display

The dimensions of it are 640 pixels in width and height. NZXT shows the width and height dynamically, but only in JavaScript (window.nzxt.v1.width and window.nzxt.v1.height respectively) and I still needed to account for it being circular. Pretty much, the browser window is in kiosk mode so a 100% should be okay, however, making sure that the interface fits in a circle was something that constantly had to be on my mind.

Web page configuration

The displayed page is shown all the time. If the query string parameter ?kraken=1 is present, the configuration is not shown. Without the parameter, it is shown next to the interface. I already mentioned the backendless part so it's parsing the parameter by using the URLSearchParams capability of the browser.

The configuration is a simple form that shows several text fields. The styling is done with DaisyUI and Tailwind. Upon the form save, the information is not POSTed, but saved to localStorage instead. The fields are:

  1. The long lived access token for the Home Assistant. You make it once in the Home Assistant UI from the Security section of your profile. Once created, the token is shown once and the security is on the user not to share that token further. It is like a quick password so you need to make sure that it's not exposed publicly anywhere ever.
  2. The Home Assistant instance URL, where to ask for the data, in our case, it is the Nabu Casa provided URL since I'm not exposing the service manually to the world, but if you do, make sure the necessary security is in place and the page must be served over HTTPS.
  3. The information for the three gauges which are showing the temperatures from -20 to 35 in form of three fields per entity
    1. Label (what to display)
    2. Home Assistant Entity (where to query the data)
    3. Home Assistant Entity Attribute (not really mandatory if the number is exposed on the entity, but it can be drilled into)
  4. The forecast Home Assistant Entity and Attribute

I didn't go for the dynamic picker because that would make the project blow out of the scope. I also didn't put in any validation because that would quickly lead to the overengineering.


/media/images/kraken-configuration.png

Web page display

Once the parameters are saved on the configuration page to the local storage, they persist and are available in the second window that is not for the configuration, but for display only. It is the same browser, after all. The Home Assistant REST API is queried for the initial data via regular endpoints, then a reconnecting websocket is established on the Home Assistant Websocket API and it listens to the data changes and updates them if necessary. Home Assistant uses that way to interact with its dashboard. I used Apache eCharts gauge because it let me build something good quickly enough. I was toying with the raw SVG, but opted for a library in the end. No need to reinvent the wheel. I can live with the performance hit because the service is not meant to be super fast. To describe it a bit, it's three gauges like a concentric circle cut out on the bottom quarter. The temperatures are from -20 to 35 which is common for the area I'm in. The textual display is in the middle. Below, in that cut-out, there's the forecast icon.


/media/images/kraken-display.png

GitHub IO page

Basically, the repo is configured to build a page on the GitHub so it needs to contain the index.html file for it to work without some extra long URL. Enabling the pages is done via repo settings. The GitHub pages are accessed via HTTPS, as it should be, so you have to make sure that Home Assistant instance is also accessed via HTTPS. The mixed communication is not working because they both need to be on the same protocol. That's why Nabu Casa can solve the certificate if you don't have it exposed yourself. You also can't POST due to the CORS, so you need to enable CORS for the page explicitly in the configuration.yaml of the Home Assistant. This ensures the app is pretty much static and no back-end is needed.

The result is actually pretty neat and I'm happy with it.


/media/images/kraken-aio.jpeg

I am not sure if I will play more with it. Possibly yes if I wanted to expand on it, but for now, the repo is public under Kraken Home Assistant and you can use it directly via Kraken Home Assistant Github IO page. You can also drop me ideas or make improvents yourself. The application is a bit niche since not everyone uses Home Assistant and not everyone has Kraken AIO, but there it is.

Dishwasher Uplift

We opted for a kitchen from IKEA because it's easily designed (their online tool is a serious advantage in the kitchen design space) and readily available. Considering the amount of money that we'd have to cash out for the whole kitchen (appliances and units) and the aesthetic choices (which of them are integrated and which of them are not), the available space (it's not a big kitchen) and immovable items (combi boiler, plumbing), the tradeoffs had to be made.

We'll have a dream kitchen one day, but right now we're doing the best we can with what we have. And we're doing it great! For instance, I mentioned the trouble of getting the tiles done and how we opted to do them ourselves in the end. We arranged the warm and cool tile patterns for where the fridge or an oven are. What I'd really like is a fiber optic cable running below the tiles or the tile pattern spilling into the living room floor instead of a sharp delineation, but it will have to wait for another place.


/media/images/tiles.jpg

Some of the big appliances are freestanding (the fridge and the washing machine) and most of them are integrated (oven, induction stove top, dishwasher, extractor fan) or hidden in a cupboard (combi boiler).

Some of them are smart (washing machine, oven, induction stovetop, combi boiler via thermostat), and some are dumb (fridge, dishwasher, extractor fan, faucet (can you imagine it's possible to have that one smart as well?)).

We have an LED strip installed below the top elements to illuminate the worktop. It's a sound reactive WLED capable contraption powered by a QuinLED board that I installed myself. I resorted to WAGO connectors so I don't have to solder and it works great. As in the previous apartment, I put the motion sensor under the top elements so the lights turn on when there's motion in the kitchen. I also use them for visual notifications. When doors open, when some of the appliances finish their program, etc. I'll have to explain the visual notification interface one day.


/media/images/wled.jpg

My OCD tendencies kick in more often than not and I'd really like to have all of the appliances smart, but I can't complain about the first world problems. It is what it is.

The smart appliances are powered by Home Connect. We wanted the connected extractor fan, but it wouldn't look nice if it's not built in and I don't see the option right now. We also wanted a Bosch dishwasher, an integrated unit, but IKEA doesn't have the standard doors or slot for it. Even if you get an adapter for your unit, which you can, anecdotal evidence says that the IKEA cabinet doors for the integrated unit are too heavy and wreck the dishwasher eventually. This is one of the tradeoffs we had to go with. We wanted an integrated dishwasher so a unit from IKEA is what we have right now. It is as dumb as they come, but it works.

Until we dare to get an integrated smart one (or give up for the freestanding one), I was thinking about how to get the basic information of the dishwasher status.

Looking at the smart washing machine that even shows the impeller state for the water pump and has an auto dosing mechanism for the detergents (my parents would say it's science fiction), the dishwasher pales in comparison. I would be happy to have the dishwasher at least show the state when it's running. I don't need to remotely start it, but when I'm away in a different room and waiting for the dishes to be ready so I can start preparing lunch, it would be great if we could be notified.

Unfortunately, it doesn't even beep when it's done.

I was initially thinking to have an NFC tag. With the companion app, scan it with your phone and it will set the state as running in the Home Assistant. Countdown for a certain amount of time switch it to idle. This would mostly work for the fixed times of the programs if nothing goes wrong and I'd be happy with it. We had the NFC powered solution for the dumb washing machine in the old apartment after all. The dishwasher has an automatic program and can stop when it thinks it's done so the time is variable. I wanted to avail of that capability and had to continue workshopping the solution.

Fortunately, it opens the door when it's done.

This gives me an additional parameter I can work with. The dishwasher door has a gap deep enough to fit a narrow open/close PARASOLL Ikea sensor and it's not visible. Connecting it to the door was the first step, but I had to know if it's consuming power.


/media/images/parasoll-device.jpg

As a side-note, there are solutions that use the vibration sensor to see when it's running, but I am not optimistic about that one. The dishwasher would have to be vibrating reliably for that.

A little too late I saw that IKEA has INSPELNING line of energy monitoring plugs that is frequently out of stock due to a high demand. It's Zigbee, the same as the PARASOLL and it needs the Zigbee hub. We have the official Home Assistant dongle for this so it's not a problem. The solution is almost identical to the one I set up so whichever hardware someone wants to go with, it's a possibility.

Some time ago, we ordered the Tapo P110 smart plug and it arrived, but it was stuck in the drawer until I got around to figure this out. It's WiFi and doesn't need a hub, but the sensors it exposes are pretty much the same ones as the INSPELNING. The only difference is that it initially has to get paired through the app with a phone.

While the plug can be used to remotely enable the power flow, the dishwasher can't be started that way. I didn't need that capability. I still need to load it up and I can set the delay, but the nature of the energy monitoring plug is such that it would give me the status on the energy usage of the appliance in real-time. This is good.

On a side-note, I'm running low on space on the phone so I had to clean up some old photos and consolidate them. I have to work on backing it up properly, too. The phone is due an upgrade as well, but it works so far. I had to free up the storage first because the app that can pair the plug is heavy and takes up valuable space.

Anyway, after the plug got paired and subsequently added to the local WiFi network using the app, I made the IP of the plug static, as usual, and then added the Home Assistant integration for TP-Link devices. I named the plug appropriately, added it to the adequate room and then I had to do some thinking.

The plug is shown as a device with several entities. The one that interests me is the current_consumption sensor. Regarding the open/close sensor, it is the second part of the puzzle.


/media/images/tapo.png

I had the dishwasher run normally with the plug monitoring the energy usage so I can inspect the historical data. The insights I got were this:

  1. On the automatic program that it says up to 2:50, it finished within 2:30 in that run.
  2. When it idles, then the consumption shows between 0 and 0.4W.
  3. When the display is active, but the door still opened, it fluctuates between 2.6W and 2.9W,
  4. When it's running there are several states
    1. it can climb to an around 2000W if the heater is on,
    2. or lower in 7W to 70W ballpark if the pump is on or possibly the spinners,
    3. or even lower to 2W to 3W if it's just steaming the plates.

If the dishwasher doors are closed and it has the power consumption of over 3W for at least a minute, then I consider it running. This happens immediately after the program starts running.

It's not ideal and I can expect false positives. At one point, the usage drops below 3W. By that logic, it would mean that the dishwasher stopped, but it didn't really. To compensate, if the status has been set to running, and the door is still closed, it remains as running, despite the usage dip.

That's why that open/close sensor is important in this case. While I can figure out the high consumption state, it's not important to me. I need to know if it's running or not. I differentiate two idle states. One is when the doors are open, the other when they're not. This is important for the automation later on.

When the program is done, the dishwasher will open automatically, but it will still consume approximately 2.7W because the display is still on counting down for approximately fifteen minutes until the plates cool off. The light below the dishwasher door is also on.

After the countdown finishes, everything turns off and the consumption goes to 0W to 0.4W again.

It can be interacted with immediately when the doors open so it's good enough for me to get a peeler out or something simple.

Ultimately, I ended up with a template sensor defined in the configuration.yaml because it can define the icons dynamically:

template:
  - sensor:
    - name: "Dishwasher"
      unique_id: dishwasher
      state: >
        {% set power = states('sensor.dishwasher_current_consumption') | float(0) %}
        {% set door = states('binary_sensor.ikea_of_sweden_parasoll_door_window_sensor_opening_2') %}
        {% set duration = 60 %}
        {% if door == 'on' %}
          Idle (door open)
        {% elif power >= 3 and door == 'off' %}
          Running
        {% elif is_state('sensor.dishwasher', 'Running') and door == 'off' %}
          Running
        {% elif power < 3 %}
          Idle (standby)
        {% else %}
          Unknown
        {% endif %}
      icon: >
        {% if is_state('sensor.dishwasher', 'Running') %}
          mdi:dishwasher
        {% else %}
          mdi:dishwasher-off
        {% endif %}

Now I needed to get the sensor connected to an automation. This was simple enough through the visual interface, but yaml config looks similar to this:

alias: Dishwasher Finished
description: ""
triggers:
  - entity_id:
      - sensor.dishwasher
    trigger: state
    from: Running
    to: Idle (door open)
conditions: []
actions:
  - action: notify.mobile_app_fp3
    data:
      message: Dishwasher finished! Time to unload it.
      title: Dishwasher Finished
mode: single

After the appliance finishes, I send a notification. What I didn't show is a whole set of different notifications to simplify things, but there's the visual one that will blink those WLED lights.

I can also add the plug to the energy monitoring dashboard, but since I didn't wire up the whole apartment to it, there is not a lot of use for that. Maybe if the power starts acting up, I can make a notification that something's wrong with the machine, but that is a potential problem for a future me, if at all.

LEGO Remote Controlled Ambient Lighting

While working for the genetic sequencing company across the Atlantic, I got nudged into the world of LEGO, so now I know some of the lingo like alt-bricks, MOCs and whatnots. We had a workshop once for a team building and it was great. It got me to rethink all the bricks and what one can do with them.

Some time ago, one friend gifted us LEGO Bonsai model. I liked how it came with two style choices. You could do the standard green leaf tree and you could have it blossom in pinkish colors for the spring. They reused frogs as a flower bud element in pink color. It is a great hack. They also provided some inspiration in the manual should one wish to go into the MOC territory. There are some amazing trees out there. I especially love the Bonsai tree by Marius Herrmann since the bark is wonderfully executed. Maybe one day I dare to do something like that if we ever get to have more bricks in our apartment.

Soon afterwards, I had the standard Bonsai on our shelf. One of our cats, Tenzin, managed to climb the shelf and knock it over. It warned us that no models should be in the reach of them, but that said, they won't do things deliberately or clumsily. They are always curious and will accidentally knock over things trying to squeeze into small spaces, which was the case here. One of the bricks got severely dented when the structure underwent rapid unscheduled disassembly on the resin floor below. We were unlucky. I had to replace it with the same one and LEGO can provide replacement bricks for that purpose. Not so cheap, but possible.

When moving into another apartment we took our models with us, but this time we'd be smarter. We bought some Billy units from IKEA and put glass doors onto them. One of the bookcases is now serving as a bar shelf because I like making cocktails. There are various kits, bottles, glasses, utensils... might even put in a book or two on cocktail making. It's a display case after all and having that Bonsai in was perfect. No cats to mess it up and it looks cute. Most of our apartment is green, so the green leafy style was assembled for it.

Some time before we got our LEGO models placed in their designated nooks, Vesna told me that there's this thing in the LEGO world where people augment their sets with LED powered bricks to get some fancy lighting on them. It looked awesome based on the pictures we saw, so we put a kit for the Bonsai in the wishlist and some weeks later, bought the kit for the leafy green style. It stayed in the box waiting for us to move and for me to find time to wire it up, but I managed to do it. Not perfectly. There are wires, but it adds to the charm. It can definitely be more tightly wrapped if one wants to hide the wires completely.

The set is powered by 3 AA batteries and it has a manual switch. The kit is connected to the power unit by USB A. I had it wired up like that for some time. It looks amazing for the nightly ambient lighting, but I was lazy to get up each time and turn it on. Since I have a universal remote that can power the devices on and off, I was thinking there had to be a way to have it work remotely as well. Sure enough, a bit of looking up online revealed that there's an RF remote switch that starts at 3.6V from QIACHIP. Which is roughly 3 AA batteries that are rechargable (1.2 are those, but the standard ones are 1.5, times three, of course). It would be enough. I got the RF kit off of Amazon and also opted for USB Type A sockets to make life easier for me. No soldering. Just wiring up and using a small screwdriver to secure the wires in place.

The components arrived and I managed to wire them up according to the layout diagrams. I powered the system up, it lit up. I used the provided RF remote to make the buttons work the way I wanted and it was also working as expected. I didn't have issues with the instructions or the components themselves. The whole process was a breeze.

Soon afterwards I learned that the 3 AA batteries won't really pay off in the long run because I'd have to charge them more often than I'd like. My thought process went something like this: 4.5V... The smartphones are usually powered by 5V which is close enough. Would a powerbank work? It's able to connect to the USB after all. I had one lying around and sure enough, when I attached it, it had no problems powering the kit.


/media/images/lego-remote-controlled-lighting.jpg

The story doesn't end here. The universal remote we have is a Broadlink RM4 Pro unit which means it connects to the WiFi. Sure enough, you can use the remote standalone and learn the command that way, which I did, but I seldom use it directly from the Broadlink app in my smartphone.

I have the remote integration enabled in our Home Assistant instance. So to continue the process, I used the developer tools to learn the command with learn_command:

action: remote.learn_command
target:
  entity_id:
    - remote.broadlink_rm4_pro
data:
  command_type: rf
  command: power
  device: bonsai

And with it, I have the send_command ready. I exposed it in the script called Toggle Bonsai.

action: remote.send_command
data:
  command: power
  device: bonsai
target:
  entity_id: remote.broadlink_rm4_pro

If the kit is on, it will turn it off and if it's off, it'll turn it on. Nothing special.

Then I made a helper Template of a type Switch.


/media/images/ha-template-switch-lego.png

But it wouldn't display nicely in the interface. So I made it a type of Light and it worked beautifully.


/media/images/ha-helpers-lego.png

Because it can be exposed to a voice assistant, I did exactly that.



Now that all the great things are showcased, I can say what doesn't work. I can't know the state of the device unless I have some other external sensor. I have to manually sync the state if it ever gets out of sync, but I don't see that happening that often. I also don't need to preserve the state between restarts so it's also OK. As long as the instance is alive. I'm golden. More than often it's on powerbank dying but it's not a big annoyance as getting up and flipping the switch manually.