<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>OffSetLab</title><link href="http://www.offsetlab.net/" rel="alternate"/><link href="http://www.offsetlab.net/atom.xml" rel="self"/><id>http://www.offsetlab.net/</id><updated>2026-02-28T20:03:35+00:00</updated><subtitle>Latest articles from OffSetLab</subtitle><entry><title>Cloud Coffee Casualties</title><link href="http://www.offsetlab.net/cloud-coffee-casualties/" rel="alternate"/><updated>2026-02-28T20:03:35+00:00</updated><id>http://www.offsetlab.net/cloud-coffee-casualties/</id><summary type="html">&lt;p&gt;In no way do I consider myself a coffee snob. I'm pragmatic if nothing else. I like good coffee, but I'm not hell-bent on going out of my way for something exquisite. However, with the home automation projects ongoing, and living in Ireland, a smart kettle was a no-brainer. It boiled the water every morning, and we used it to make cheap instant coffee just to get ourselves into working gear.&lt;/p&gt;
&lt;p&gt;Last year, that ritual broke, along with the kettle company's servers. They stopped controlling the device remotely back in September last year. The kettle isn't bricked, but it turned dumb. It now runs manually with the push of a button, and all our automations are dead.&lt;/p&gt;
&lt;p&gt;It's a cautionary tale that you can't have your products rely on the 3rd party cloud. I wish we could, but it's the nature of things. We need to be in control and I don't trust that company anymore. While this one was working, everything was peachy, but once it's gone, it's gone. I'm shopping for a new kettle so it will take some time to figure out what can fit our criteria.&lt;/p&gt;
&lt;p&gt;The point of the matter is simple: don't get something that you can't trust, or even that you need to pay subscription to use, especially something so simple as boiling water.&lt;/p&gt;
&lt;p&gt;With the new job, the routine has changed again. I have coffee in the office, still at the three time cadence, but since I'm not there five days a week, the home setup still matters. Vesna and I are back to the manual drudgery to get that caffeine hit.&lt;/p&gt;
&lt;p&gt;If it's weekend, and I remember to make the &lt;a class="reference external" href="/using-french-press-for-coffee-cold-brewing/"&gt;cold brew&lt;/a&gt;, then it's waiting for us in the fridge. If not, I utilize the trusty moka pot and make espresso. Finding one that is induction compatible was a chore, though. Not impossible, but something we had to think about.&lt;/p&gt;
&lt;p&gt;The price of coffee spiked recently and I'm not happy about it. I'm also not going out of my way to get the beans and grind them myself, although there was once a situation where we ran out of pre-ground coffee. In a pinch, the Vitamix can do the job, but we don't have the specialized dry-container attachment, so we used the regular one. It works, but it's not a habit I want to keep.&lt;/p&gt;
&lt;p&gt;Going beyond coffee, we tried Yerba Mate, but that thing can be incredibly bitter. We're still trying to figure out what to do with it because we have a whole kilogram of it to get through. We also tried the black tea, but it's just not our cup of tea, though it does work well in cocktails.&lt;/p&gt;
&lt;p&gt;Speaking of cocktails, it comes naturally to me to experiment. Whether it's Espresso Martini variants, hot cocktails, or something featuring coffee liqueur. We even have some pumpkin spice syrup that we've been using in both our morning stimulants and our evening opiates.&lt;/p&gt;
&lt;p&gt;In the end, we take whatever coffee we can get, then add the awesome Oatly Barista to it, no sugar, and move on. It gets the job done.&lt;/p&gt;
</summary></entry><entry><title>2025 Recap</title><link href="http://www.offsetlab.net/2025-recap/" rel="alternate"/><updated>2026-01-14T22:06:07+00:00</updated><id>http://www.offsetlab.net/2025-recap/</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://2025.djangocon.eu/"&gt;DjangoCon EU&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Funny enough, when &lt;a class="reference external" href="/pillars-of-kings-in-antarctica/"&gt;we were in Antarctica&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Trips:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Netherlands, Utrecht, Nijmegen, The Hague, to explore, to see a friend&lt;/li&gt;
&lt;li&gt;Croatia, Vesna had a family emergency&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;Croatia, another family emergency with me as the delegate&lt;/li&gt;
&lt;li&gt;Croatia, to see families because we were about to make a bucket-list trip&lt;/li&gt;
&lt;li&gt;Argentina, Buenos Aires, a jumping off point to Ushuaia&lt;/li&gt;
&lt;li&gt;Uruguay, Colonia del Sacramento, a day trip from Buenos Aires&lt;/li&gt;
&lt;li&gt;Argentina, Ushuaia, the end of the world and back, Tierra del Fuego national park&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Domestic travel:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Northern Ireland, friends got a cat from the same breeder&lt;/li&gt;
&lt;li&gt;Wexford, for soap making workshop&lt;/li&gt;
&lt;li&gt;Killary Harbour, the mud race happened&lt;/li&gt;
&lt;li&gt;Dún a Rí Forest Park to get a log for mushrooms and see a bit of wild&lt;/li&gt;
&lt;li&gt;Northern Ireland, Belfast, for the winter market&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Twice to Theatre Sports, improv teathre to see a friend perform. It's silly and funny.&lt;/li&gt;
&lt;li&gt;Gloryhammer, in spite of their major misogynistic fuckup, we went with a friend for science (also, the support, Dominum, was great)&lt;/li&gt;
&lt;li&gt;Miracle of Sound, debut concert. They are actually good&lt;/li&gt;
&lt;li&gt;The Dead South, Vesna wanted to see them&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Heilung"&gt;Heilung&lt;/a&gt; + Eivor, with friends and it's a ritual, not a concert&lt;/li&gt;
&lt;li&gt;DjangoCon EU, an ex colleague was visiting so this was a nice opportunity for him to see things and for me to network&lt;/li&gt;
&lt;li&gt;Irish Python Meetup, mostly because I wanted to see what they have to say&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/The_Rocky_Horror_Show"&gt;The Rocky Horror Show&lt;/a&gt;, a cult musical&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Books:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/dp/B07HL82JMH"&gt;Propaganda Blitz: How the Corporate Media Distort Reality&lt;/a&gt; - David Edwards, David Cromwell&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/dp/1785044486"&gt;How to Argue With a Meat Eater (And Win Every Time)&lt;/a&gt; - Ed Winters&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/dp/B007EDYJDA"&gt;The Limits to Growth: The 30-Year Update&lt;/a&gt; - Donella H. Meadows&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/dp/B073ZPMZ95"&gt;Creating Russophobia: From the Great Religious Schism to Anti-Putin Hysteria&lt;/a&gt; - Guy Mettan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Video games finished:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Behind_the_Frame:_The_Finest_Scenery"&gt;Behind the Frame&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Video games played:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Dead_Space_(2023_video_game)"&gt;Dead Space Remake&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things we bought:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;cat stuff, spool of sisal rope, harness, toothbrushes, toys, furniture, catio stuff, scratchers&lt;/li&gt;
&lt;li&gt;Garrus (Mass Effect) ducky for Vesna's birthday, good for debugging, playing in the tub and having a novelty conversation starter&lt;/li&gt;
&lt;li&gt;laser spirit level to arrange shelves&lt;/li&gt;
&lt;li&gt;pots and clothes and bedding and kitchen stuff&lt;/li&gt;
&lt;li&gt;bunch of equipment for the Antarctica trip&lt;/li&gt;
&lt;li&gt;vacuum pump for wine, it works, but we drink the wine before we get to store it&lt;/li&gt;
&lt;li&gt;door draft stopper&lt;/li&gt;
&lt;li&gt;extension cords and connecting cables&lt;/li&gt;
&lt;li&gt;monitor raiser&lt;/li&gt;
&lt;li&gt;SAD lamp for all the needs Vesna has over the winter&lt;/li&gt;
&lt;li&gt;copper mugs for mule cocktails, hex pattern, had to have them&lt;/li&gt;
&lt;li&gt;grill toaster&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.razer.com/"&gt;Razer&lt;/a&gt; Basilisk v3 mouse&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.com/"&gt;Raspberry PI&lt;/a&gt; M.2 HAT, along with a drive&lt;/li&gt;
&lt;li&gt;tea strainer kit&lt;/li&gt;
&lt;li&gt;household supplies, consumables&lt;/li&gt;
&lt;li&gt;motion activated bin&lt;/li&gt;
&lt;li&gt;hexagonal ottomans from IKEA&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://eu-shop.nanoleaf.me/"&gt;Nanoleaf&lt;/a&gt; Essentials bulbs for the spotlights in the bedroom&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://boardgamegeek.com/boardgame/360692/septima"&gt;Septima&lt;/a&gt; board game&lt;/li&gt;
&lt;li&gt;stuff for the apartment downstairs, a couch, a rug, a table, new dispenser for the bathroom to fix the broken one&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.tapo.com/en/"&gt;Tapo&lt;/a&gt; smart energy monitoring plug&lt;/li&gt;
&lt;li&gt;shelves for the bathroom that we turned into a storage room&lt;/li&gt;
&lt;li&gt;cordless vacuum again because the last one broke&lt;/li&gt;
&lt;li&gt;scissors and magnetic holder&lt;/li&gt;
&lt;li&gt;battery organizer&lt;/li&gt;
&lt;li&gt;kitchen tap plate that we used to fix the kitchen tap&lt;/li&gt;
&lt;li&gt;PS4 controller charger&lt;/li&gt;
&lt;li&gt;packs of lazy Susans (Vesna loves to organize)&lt;/li&gt;
&lt;li&gt;sink strainers&lt;/li&gt;
&lt;li&gt;tools, like cutters&lt;/li&gt;
&lt;li&gt;some &lt;a class="reference external" href="https://en.wikipedia.org/wiki/ESP32"&gt;ESP32&lt;/a&gt; devices to get Bluetooth trilateration working (room presence), I need to revisit this in a future article&lt;/li&gt;
&lt;li&gt;two more Nanoleaf bulbs&lt;/li&gt;
&lt;li&gt;STP cable for network (got the IKEA Idasen standing desk working again, this time with native Bluetooth integration)&lt;/li&gt;
&lt;li&gt;mixer for the Old Fashioned cocktail&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Amazon_Kindle"&gt;Kindle&lt;/a&gt; Paperwhite, Vesna got me one because we were going on a long trip&lt;/li&gt;
&lt;li&gt;Symfonisk picture frame speaker (we had a discount from the kitchen purchase in IKEA), it is &lt;a class="reference external" href="https://www.sonos.com/en-ie/home"&gt;Sonos&lt;/a&gt; based, we need to customize it&lt;/li&gt;
&lt;li&gt;light-tailing kit for LEGO &lt;a class="reference external" href="https://www.lego.com/en-ie/product/horizon-forbidden-west-tallneck-76989"&gt;Tallneck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;light switch cover for the IKEA 5-button controller&lt;/li&gt;
&lt;li&gt;cosplay accessories for our Halloween tradition, don't ask&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.gsmarena.com/xiaomi_redmi_note_14_pro_5g_(global)-13613.php"&gt;Redmi Note 14 Pro 5G&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.aqara.com/eu/"&gt;Aqara&lt;/a&gt; vibration sensor, I have some ideas&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/dp/B0DQ18CMLJ"&gt;Redmi Buds 6&lt;/a&gt;, ANC, and I like it&lt;/li&gt;
&lt;li&gt;massage gun that only sees use when something hurts&lt;/li&gt;
&lt;li&gt;hiking boots that I thought I'd use on the Antarctica trip, but didn't have a chance, they will be used later&lt;/li&gt;
&lt;li&gt;bunch of small things like wired gloves for mandolin kitchen work&lt;/li&gt;
&lt;li&gt;wax, mushroom kit so I did the log build on the balcony and I'll report in a yar if it grew&lt;/li&gt;
&lt;li&gt;squatty potty!&lt;/li&gt;
&lt;li&gt;rechargeable batteries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other important events:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;became a board member for the complex we live in, eventually we switched the management company because we want this place to become better&lt;/li&gt;
&lt;li&gt;rug tufting workshop with our D&amp;amp;D coterie, and the rugs look great&lt;/li&gt;
&lt;li&gt;whiskey cocktail workshop, but I know how to do cocktails&lt;/li&gt;
&lt;li&gt;assembled more furniture from IKEA for the small apartment and refurbished it&lt;/li&gt;
&lt;li&gt;soap making workshop with beer in Wexford, basically you make a solution and Irish stout is the soap base&lt;/li&gt;
&lt;li&gt;fixed the cat scratcher with a new sisal rope, twice&lt;/li&gt;
&lt;li&gt;fixed the tub with a new panel where the tiles were broken by the plumber&lt;/li&gt;
&lt;li&gt;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)&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;finally consolidated the Raspberry stack with some additional services like &lt;a class="reference external" href="https://immich.app/"&gt;Immich&lt;/a&gt; and media handling&lt;/li&gt;
&lt;li&gt;made a catio for Kida &amp;amp; Tenzin, parents wanted to help, but that's not why we got them to visit&lt;/li&gt;
&lt;li&gt;fixed the kitchen tap with paddings, the wooden base is horrible for taps without paddings&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://gaelforceevents.com/en/turf-warrior"&gt;Turf Warrior&lt;/a&gt;, 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&lt;/li&gt;
&lt;li&gt;pottery painting workshop so now there's a mug on my desk&lt;/li&gt;
&lt;li&gt;rented out the small apartment so we'll see how that goes&lt;/li&gt;
&lt;li&gt;inoculated two logs with mushroom spawn (Oyster and Lion's Mane)&lt;/li&gt;
&lt;li&gt;made another big trip to visit the last two continents we didn't step foot on so now the list is complete&lt;/li&gt;
&lt;li&gt;got two cheap phones to get us through the trip with eSIM support and a better camera, I'm sorry &lt;a class="reference external" href="https://shop.fairphone.com/nl/home"&gt;Fairphone&lt;/a&gt;, but money is tight at the moment&lt;/li&gt;
&lt;li&gt;got a job offer&lt;/li&gt;
&lt;li&gt;kettle stopped working, a cautionary tale that things must be local, and not depend on the 3rd party cloud&lt;/li&gt;
&lt;/ul&gt;
</summary></entry><entry><title>Pillars of Kings in Antarctica</title><link href="http://www.offsetlab.net/pillars-of-kings-in-antarctica/" rel="alternate"/><updated>2025-12-30T10:27:59+00:00</updated><id>http://www.offsetlab.net/pillars-of-kings-in-antarctica/</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Mexico happened eventually with Panama in the same package while I was working for Gencove and this is &lt;a class="reference external" href="/way-away/"&gt;the furthest south we got on that side of the world&lt;/a&gt;. We did our first round of travel vaccinations for the tropics and boosted what we could several weeks ago.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Pan-American_Highway"&gt;Pan American Highway&lt;/a&gt; is a dream never realized. The road is supposed to connect North and South Americas, but there's the issue of the &lt;a class="reference external" href="https://www.youtube.com/watch?v=WEzrHOt1jjw"&gt;Darien Gap&lt;/a&gt;. The continents look connected, but they really are not. This is where our path ended the last time.&lt;/p&gt;
&lt;p&gt;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?&lt;/p&gt;
&lt;p&gt;We paid a substantial amount of money for a &lt;a class="reference external" href="https://www.travelhx.com/en-au/destinations/antarctica-cruises/"&gt;sustainable expedition to Antarctica&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The flight from Dublin to &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Buenos Aires&lt;/span&gt;&lt;data class="p-latitude" value="-34.603889"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-58.381389"&gt;&lt;/data&gt;&lt;/span&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Colonia del Sacramento&lt;/span&gt;&lt;data class="p-latitude" value="-34.471389"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-57.844167"&gt;&lt;/data&gt;&lt;/span&gt; from Buenos Aires via the regular ferry. Enough to get our passports stamped and get away from the bustling of the city.&lt;/p&gt;
&lt;p&gt;After a few days checking out the most important bits of Buenos Aires, we had a flight to &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Ushuaia&lt;/span&gt;&lt;data class="p-latitude" value="-54.801944"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-68.303056"&gt;&lt;/data&gt;&lt;/span&gt;, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;It took us two days to get across to the peninsula and after the first landing on the &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Wiencke island&lt;/span&gt;&lt;data class="p-latitude" value="-64.833333"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-63.383333"&gt;&lt;/data&gt;&lt;/span&gt;, 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.&lt;/p&gt;
&lt;p&gt;In the coming days we also landed next to the &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Brown station&lt;/span&gt;&lt;data class="p-latitude" value="-64.895476"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-62.870905"&gt;&lt;/data&gt;&lt;/span&gt; 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 &lt;a class="reference external" href="https://lotr.fandom.com/wiki/Argonath"&gt;Argonath&lt;/a&gt; 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.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/brown-station.jpg" class="img-responsive center-block" src="/media/images/brown-station.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;We had a kayaking session in Charlotte Bay which we didn't do much of because we were greeted by a family of &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Minke_whale"&gt;Minke whales&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;On the way back, we stopped in Ushuaia for a day, just in time to check out the city and the neighboring &lt;span class="p-location h-geo"&gt;&lt;span class="p-name"&gt;Tierra del Fuego national park&lt;/span&gt;&lt;data class="p-latitude" value="-54.833333"&gt;&lt;/data&gt;&lt;data class="p-longitude" value="-68.5"&gt;&lt;/data&gt;&lt;/span&gt;. 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?&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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...&lt;/p&gt;
</summary></entry><entry><title>Display Home Assistant Values on Kraken AIO</title><link href="http://www.offsetlab.net/display-home-assistant-values-on-kraken-aio/" rel="alternate"/><updated>2025-04-29T18:43:19+00:00</updated><id>http://www.offsetlab.net/display-home-assistant-values-on-kraken-aio/</id><summary type="html">&lt;p&gt;While our PC is still not OK with the CPU being the way it is, the &lt;a class="reference external" href="https://nzxt.com/product/kraken-360-elite-rgb-2023"&gt;NZXT Kraken AIO&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://developer.nzxt.com/docs/development/"&gt;NZXT developer documentation&lt;/a&gt; details the available variables.&lt;/p&gt;
&lt;p&gt;Since it's a web page in itself, there have already been some &lt;a class="reference external" href="https://github.com/NZXTCorp/web-integrations-examples"&gt;interesting solutions made by the community&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kraken display&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The dimensions of it are 640 pixels in width and height. NZXT shows the width and height dynamically, but only in JavaScript (&lt;cite&gt;window.nzxt.v1.width&lt;/cite&gt; and &lt;cite&gt;window.nzxt.v1.height&lt;/cite&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web page configuration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The displayed page is shown all the time. If the query string parameter &lt;cite&gt;?kraken=1&lt;/cite&gt; 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 &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams"&gt;URLSearchParams&lt;/a&gt; capability of the browser.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage"&gt;localStorage&lt;/a&gt; instead. The fields are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;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 &lt;strong&gt;ever&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;The information for the three gauges which are showing the temperatures from -20 to 35 in form of three fields per entity&lt;ol class="loweralpha"&gt;
&lt;li&gt;Label (what to display)&lt;/li&gt;
&lt;li&gt;Home Assistant Entity (where to query the data)&lt;/li&gt;
&lt;li&gt;Home Assistant Entity Attribute (not really mandatory if the number is exposed on the entity, but it can be drilled into)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;The forecast Home Assistant Entity and Attribute&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/kraken-configuration.png" class="img-responsive center-block" src="/media/images/kraken-configuration.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;strong&gt;Web page display&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://developers.home-assistant.io/docs/api/rest"&gt;Home Assistant REST API&lt;/a&gt; is queried for the initial data via regular endpoints, then a reconnecting websocket is established on the &lt;a class="reference external" href="https://developers.home-assistant.io/docs/api/websocket"&gt;Home Assistant Websocket API&lt;/a&gt; and it listens to the data changes and updates them if necessary. Home Assistant uses that way to interact with its dashboard. I used &lt;a class="reference external" href="https://echarts.apache.org/en/index.html"&gt;Apache eCharts&lt;/a&gt; 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.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/kraken-display.png" class="img-responsive center-block" src="/media/images/kraken-display.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;&lt;strong&gt;GitHub IO page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Basically, the repo is configured to build a page on the GitHub so it needs to contain the &lt;cite&gt;index.html&lt;/cite&gt; 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 &lt;cite&gt;configuration.yaml&lt;/cite&gt; of the Home Assistant. This ensures the app is pretty much static and no back-end is needed.&lt;/p&gt;
&lt;p&gt;The result is actually pretty neat and I'm happy with it.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/kraken-aio.jpeg" class="img-responsive center-block" src="/media/images/kraken-aio.jpeg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://github.com/zmasek/kraken-home-assistant/"&gt;Kraken Home Assistant&lt;/a&gt; and you can use it directly via &lt;a class="reference external" href="https://zmasek.github.io/kraken-home-assistant/"&gt;Kraken Home Assistant Github IO page&lt;/a&gt;. 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.&lt;/p&gt;
</summary></entry><entry><title>Dishwasher Uplift</title><link href="http://www.offsetlab.net/dishwasher-uplift/" rel="alternate"/><updated>2025-03-27T20:25:03+00:00</updated><id>http://www.offsetlab.net/dishwasher-uplift/</id><summary type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/tiles.jpg" class="img-responsive center-block" src="/media/images/tiles.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;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?)).&lt;/p&gt;
&lt;p&gt;We have an LED strip installed below the top elements to illuminate the worktop. It's a sound reactive &lt;a class="reference external" href="https://kno.wled.ge/"&gt;WLED&lt;/a&gt; capable contraption powered by a &lt;a class="reference external" href="https://quinled.info/pre-assembled-quinled-dig-uno/"&gt;QuinLED board&lt;/a&gt; that I installed myself. I resorted to &lt;a class="reference external" href="https://www.wago.com/global/"&gt;WAGO connectors&lt;/a&gt; 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.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/wled.jpg" class="img-responsive center-block" src="/media/images/wled.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The smart appliances are powered by &lt;a class="reference external" href="https://www.home-connect.com/global"&gt;Home Connect&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Unfortunately, it doesn't even beep when it's done.&lt;/p&gt;
&lt;p&gt;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 &lt;cite&gt;running&lt;/cite&gt; in the Home Assistant. Countdown for a certain amount of time switch it to &lt;cite&gt;idle&lt;/cite&gt;. This would mostly work for the fixed times of the programs if nothing goes wrong and I'd be happy with it. We had &lt;a class="reference external" href="/nfc-tags-in-home-automation/"&gt;the NFC powered solution for the dumb washing machine&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Fortunately, it opens the door when it's done.&lt;/p&gt;
&lt;p&gt;This gives me an additional parameter I can work with. The dishwasher door has a gap deep enough to fit a narrow &lt;a class="reference external" href="https://www.ikea.com/ie/en/p/parasoll-door-window-sensor-smart-white-80504308/"&gt;open/close PARASOLL Ikea sensor&lt;/a&gt; and it's not visible. Connecting it to the door was the first step, but I had to know if it's consuming power.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/parasoll-device.jpg" class="img-responsive center-block" src="/media/images/parasoll-device.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Some time ago, we ordered the &lt;a class="reference external" href="https://www.amazon.co.uk/dp/B097YBXHTW"&gt;Tapo P110 smart plug&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://www.home-assistant.io/integrations/tplink/"&gt;TP-Link&lt;/a&gt; devices. I named the plug appropriately, added it to the adequate room and then I had to do some thinking.&lt;/p&gt;
&lt;p&gt;The plug is shown as a device with several entities. The one that interests me is the &lt;cite&gt;current_consumption&lt;/cite&gt; sensor. Regarding the open/close sensor, it is the second part of the puzzle.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/tapo.png" class="img-responsive center-block" src="/media/images/tapo.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;On the automatic program that it says up to 2:50, it finished within 2:30 in that run.&lt;/li&gt;
&lt;li&gt;When it idles, then the consumption shows between 0 and 0.4W.&lt;/li&gt;
&lt;li&gt;When the display is active, but the door still opened, it fluctuates between 2.6W and 2.9W,&lt;/li&gt;
&lt;li&gt;When it's running there are several states&lt;ol class="loweralpha"&gt;
&lt;li&gt;it can climb to an around 2000W if the heater is on,&lt;/li&gt;
&lt;li&gt;or lower in 7W to 70W ballpark if the pump is on or possibly the spinners,&lt;/li&gt;
&lt;li&gt;or even lower to 2W to 3W if it's just steaming the plates.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;cite&gt;running&lt;/cite&gt;, and the door is still closed, it remains as &lt;cite&gt;running&lt;/cite&gt;, despite the usage dip.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;After the countdown finishes, everything turns off and the consumption goes to 0W to 0.4W again.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Ultimately, I ended up with a template sensor defined in the &lt;cite&gt;configuration.yaml&lt;/cite&gt; because it can define the icons dynamically:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
template:
  - sensor:
    - name: &amp;quot;Dishwasher&amp;quot;
      unique_id: dishwasher
      state: &amp;gt;
        {% 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 &amp;gt;= 3 and door == 'off' %}
          Running
        {% elif is_state('sensor.dishwasher', 'Running') and door == 'off' %}
          Running
        {% elif power &amp;lt; 3 %}
          Idle (standby)
        {% else %}
          Unknown
        {% endif %}
      icon: &amp;gt;
        {% if is_state('sensor.dishwasher', 'Running') %}
          mdi:dishwasher
        {% else %}
          mdi:dishwasher-off
        {% endif %}
&lt;/pre&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
alias: Dishwasher Finished
description: &amp;quot;&amp;quot;
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
&lt;/pre&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</summary></entry><entry><title>LEGO Remote Controlled Ambient Lighting</title><link href="http://www.offsetlab.net/lego-remote-controlled-ambient-lighting/" rel="alternate"/><updated>2025-03-18T16:15:12+00:00</updated><id>http://www.offsetlab.net/lego-remote-controlled-ambient-lighting/</id><summary type="html">&lt;p&gt;While working for the &lt;a class="reference external" href="https://www.gencove.com/"&gt;genetic sequencing company&lt;/a&gt; across the Atlantic, I got nudged into the world of &lt;a class="reference external" href="https://www.lego.com/"&gt;LEGO&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;Some time ago, one friend gifted us &lt;a class="reference external" href="https://www.lego.com/en-ie/product/bonsai-tree-10281"&gt;LEGO Bonsai&lt;/a&gt; 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 &lt;a class="reference external" href="https://steponabrick.com/bonsai"&gt;Bonsai tree by Marius Herrmann&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://www.lightailing.com/blogs/news/lightailing-vs-briksmax-light-different"&gt;LED powered bricks&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B09NVY13XW/"&gt;RF remote switch that starts at 3.6V from QIACHIP&lt;/a&gt;. 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 &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07SGQ44F5/"&gt;USB Type A sockets&lt;/a&gt; to make life easier for me. No soldering. Just wiring up and using a small screwdriver to secure the wires in place.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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: &lt;em&gt;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.&lt;/em&gt; I had one lying around and sure enough, when I attached it, it had no problems powering the kit.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lego-remote-controlled-lighting.jpg" class="img-responsive center-block" src="/media/images/lego-remote-controlled-lighting.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;The story doesn't end here. The universal remote we have is a &lt;a class="reference external" href="https://www.ibroadlink.com/productinfo/762672.html"&gt;Broadlink RM4 Pro&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;I have the &lt;a class="reference external" href="https://www.home-assistant.io/integrations/broadlink"&gt;remote integration&lt;/a&gt; enabled in our Home Assistant instance. So to continue the process, I used the developer tools to learn the command with &lt;cite&gt;learn_command&lt;/cite&gt;:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
action: remote.learn_command
target:
  entity_id:
    - remote.broadlink_rm4_pro
data:
  command_type: rf
  command: power
  device: bonsai
&lt;/pre&gt;
&lt;p&gt;And with it, I have the &lt;cite&gt;send_command&lt;/cite&gt; ready. I exposed it in the script called &lt;cite&gt;Toggle Bonsai&lt;/cite&gt;.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
action: remote.send_command
data:
  command: power
  device: bonsai
target:
  entity_id: remote.broadlink_rm4_pro
&lt;/pre&gt;
&lt;p&gt;If the kit is on, it will turn it off and if it's off, it'll turn it on. Nothing special.&lt;/p&gt;
&lt;p&gt;Then I made a helper Template of a type Switch.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-template-switch-lego.png" class="img-responsive center-block" src="/media/images/ha-template-switch-lego.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;But it wouldn't display nicely in the interface. So I made it a type of Light and it worked beautifully.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-helpers-lego.png" class="img-responsive center-block" src="/media/images/ha-helpers-lego.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Because it can be exposed to a voice assistant, I did exactly that.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;video controls style="width: 100%; height: auto; display: block;" src="/media/videos/remote-controlled-lighttail.mp4" type="video/mp4"&gt;&lt;/video&gt;&lt;hr class="docutils" /&gt;
&lt;p&gt;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.&lt;/p&gt;
</summary></entry><entry><title>2024 Recap</title><link href="http://www.offsetlab.net/2024-recap/" rel="alternate"/><updated>2025-01-13T21:37:39+00:00</updated><id>http://www.offsetlab.net/2024-recap/</id><summary type="html">&lt;p&gt;Last year was... peculiar. I only had two posts in 2024, but I can explain. Some big things happened.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;I got a job,&lt;/li&gt;
&lt;li&gt;we upsized and had to invest time, money and energy into renovating the new place,&lt;/li&gt;
&lt;li&gt;I quit that job from the first point.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The year started with lazying about on the New Year's. I got the passport that I applied for in December and it arrived in January. I guess I'm a Paddy now.&lt;/p&gt;
&lt;p&gt;Vesna had a surprise party for her birthday and all of our friends gathered to celebrate it. It was a blast, but we hope it is out of the way now. One thing off of the checklist. Sneaking around is not fun.&lt;/p&gt;
&lt;p&gt;Ever since October 2023, we were engaged into bidding for a bigger place. Cats really showed us that the apartment we were in was too small. It was a long procedure to secure the mortgage since I was unemployed, the cash flow was weaker and the various explanations of funds were required. Being formal here, I don't understand their money laundering department. If they ask for previous six months of statements, OK, but they are really pushing it when they go back several years wanting to know where the money came from. We never cheated or hacked the system. Not funding any terrorist organizations, but oftentimes I felt like we were being treated like one. The money history is the salary from working an honest job. Sure, they will add up all the balances and reach the same conclusion, but the time they take to resolve the thing is frustrating to say the least. We were giving our data within the same day, and their response would be two weeks later. Crazy stuff. Either ask for everything in the beginning and be done with it, or don't make up rules as you go.&lt;/p&gt;
&lt;p&gt;We were deciding what to get for the new apartment, but it was all in the air since we didn't get the keys until 29th of February. Then it was proper planning and measuring.&lt;/p&gt;
&lt;p&gt;The new apartment is in the same building, but it's over 50% bigger. It was seemingly very well maintained because it was an owner occupied property, but we hit severe roadblocks in refurbishing it.&lt;/p&gt;
&lt;p&gt;Snow fell the beginning of March and we took the cats outside to see the snow for the first time. They were confused, but curious which is fine. It was lovely to see them going around the environment they are equipped to be in, considering their long fur.&lt;/p&gt;
&lt;p&gt;As for the job hunt, I got either rejections or folks ignoring the application. I had a couple of interviews, but we didn't click. Looking for a job is bad. &lt;a class="reference external" href="https://www.cnbc.com/2024/01/12/amazon-citigroup-google-layoffs-money-and-job-search-moves.html"&gt;Due&lt;/a&gt; &lt;a class="reference external" href="https://www.pcgamer.com/the-impact-of-16000-games-industry-layoffs-in-one-chart/"&gt;to&lt;/a&gt; &lt;a class="reference external" href="https://www.neowin.net/news/blizzard-has-canceled-its-unnamed-survival-game-as-part-of-microsofts-gaming-layoffs/"&gt;the&lt;/a&gt; &lt;a class="reference external" href="https://www.ign.com/articles/sony-announces-significant-playstation-layoffs-affecting-900-staff-london-studio-to-close"&gt;massive&lt;/a&gt; &lt;a class="reference external" href="https://www.omgubuntu.co.uk/2024/02/mozilla-announces-layoffs-firefox-ai-plans"&gt;layoffs&lt;/a&gt; &lt;a class="reference external" href="https://www.independent.ie/business/technology/irish-jobs-at-risk-in-second-round-of-citrix-layoffs/a1455234914.html"&gt;in&lt;/a&gt; &lt;a class="reference external" href="https://techcrunch.com/2024/02/21/tech-layoffs-2023-list/"&gt;the IT&lt;/a&gt; &lt;a class="reference external" href="https://www.irishtimes.com/tags/tech-lay-offs/"&gt;industry&lt;/a&gt;, I was often competing with around three hundred candidates. With the generative AI thrown in the mix, the productivity increases, which means less people are needed to work. The society didn't really keep up with the reduced need for the workforce, generative AI displacing jobs. I can tell for sure that you can throw things at the generative AI prompt, but you need to know if the answers are OK. I'm trying Prompt Driven Development and I have to correct it almost every time. It is an intense autocomplete, after all, but a very, very good one. I can program quicker.&lt;/p&gt;
&lt;p&gt;I landed a job within spacetech industry before we got the keys, in February as well, and it seemed like a great thing.&lt;/p&gt;
&lt;p&gt;It really helped that I was interested in the area. The projects I did before like &lt;a class="reference external" href="/solar-projector-2/"&gt;Solar Projector&lt;/a&gt; (which was parsing &lt;a class="reference external" href="https://izw1.caltech.edu/ACE/"&gt;AES&lt;/a&gt; and &lt;a class="reference external" href="https://www.nesdis.noaa.gov/current-satellite-missions/currently-flying/dscovr-deep-space-climate-observatory"&gt;DSCOVR&lt;/a&gt; data, and I retired it when I moved away from Digital Ocean to the self-hosted solution) or unreleased GIS projects (one for a map of the local graveyard in Croatia, which was a vanilla PostGIS experiment, and the other for the map of agricultural fields made with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sentinel-2"&gt;Sentinel-2&lt;/a&gt;) helped here. I knew what I was talking about and had a pretty good hunch of what they would work on.&lt;/p&gt;
&lt;p&gt;I would be doing what I liked and in an area that was great. It was going great for a while, not as streamlined as the bioinformatics job before it, but interesting nevertheless and ripe with opportunities to explore that specific area of industry. I was even writing a post detailing how great this development is, but, alas, it didn't last because by late September, it started to go sour and my best intentions of publishing something good got thrown out of the window.&lt;/p&gt;
&lt;p&gt;On the first company get-together, it was announced to start the RTO process the following week which made no sense since everyone was remote from a different country. I was a bit sad because except me, nobody pushed back. It started to smell back then and there. Within a few weeks, micromanagement kicked in. Time was wasted several hours a week on unnecessary meetings. The estimates were reasonable, but the expectations were not. We're all seniors and know what we're talking about and how some tasks take time to complete and how some problems are not as easy, or impossible to solve. Something that would take months was expected in days.&lt;/p&gt;
&lt;p&gt;It culminated in a communication ban between team members and we were expected to answer directly to the upper management. I said I couldn't work like that. I think others did, too. The communication ban was imposed on planning, checking up, brainstorming, code reviews... You name it. It was particularly hard in a system where each layer depends on another. How is the front-end supposed to implement design that it can't talk about or get the data from the back-end if they don't know how it will look like? I was talked over during that meeting and I tried to convince myself it would blow over the following weekend. Come Monday, I learnt that people started quitting and in the same day, the whole team, then me, too, quit our positions.&lt;/p&gt;
&lt;p&gt;Like I said, it could not have been handled better since we tried to clear up the understanding for weeks, but it fell on deaf ears. I wish it didn't end up like that, but there I was. Unemployed again, thinking that this time it would be better. What I talked about earlier still stands. The job market is not yet healthy and while I had some promising interviews, I think the hiring process is utterly broken. After over a decade in the industry, I'd expect I wouldn't need to solve brain teasers like I'm in the university again, where I aced, BTW, but I'm getting tired.&lt;/p&gt;
&lt;p&gt;Agency work, telco networks, healthtech, genetic sequencing, spacetech... but the industry is jumping on trends. It was blockchain for a while, but right now it's the generative AI which still creates the technological unemployment, but I should have the upper hand since my university was exactly about that. We'll see if I can catch up. I am already dabbling in the current state of affairs, fancy new libraries and ways of working.&lt;/p&gt;
&lt;p&gt;So back to the apartment. We paid a hefty sum and, while the place looked like it was immediately available for moving in, things we couldn't have foreseen started to creep in and we had to renovate. Regarding the whole picture, we decided to remove the wardrobes and install a single built in one. The floors below the removed wardrobes were non-existent. The kitchen was also made up of various units and old appliances that were very worn out. It had to go. We refreshed the balconies, painstakingly removed the remaining old floors and had the resin floor installed in all the rooms. In the kitchen we fought a battle with the tile installer who did such a poor job (no dividers, no levelers) that we wasted time, money and energy. We had to do the tiling ourselves in the end, ripping out the badly installed new tiles in the process. We would not have done it if we hadn't gone online, to Reddit, and asked around if we were the only ones who thought the job was poorly done. I felt so bad about the whole thing, but it was supposed to be a place where we would live in for a while and we wanted it to look decent, if not great.&lt;/p&gt;
&lt;p&gt;So the floors were done, the wardrobe got installed and then the walls and woodwork. We got all the walls repainted, fixed up since they're plasterboard and had some acoustic panels installed. In the process we realized how some walls were not perfectly aligned and were off the angles. This is something we can't get to grips with - how a relatively new build can be broken because of poor workmanship. One of the radiators was drooping and we had to have it reinstalled on new hinges where the plumbers broke the water pipe in the process and we ended up airing the place for days over the summer.&lt;/p&gt;
&lt;p&gt;We opted for a kitchen (plus installation) from IKEA and I installed the lighting (&lt;a class="reference external" href="https://kno.wled.ge/"&gt;WLED&lt;/a&gt; capable) under elements myself. I'll have to revisit this and write about the building blocks. It's reactive to the other parts of the smart home, mainly in the notification area. The plumbing in the kitchen was also a job that was so badly done that I don't know how qualified people can do such a terrible job. I keep repeating myself, but, sadly, it's how it is. The electricity was not ideal either. We even managed to get our mail stolen, the parcel contained the oven switch for the kitchen. It's no wonder I didn't write anything since this thing consumed so much energy and left us in such a sorry mental state (not to mention the physical exhaustion with cuts and bruises from hammering and hurt spine), but we pushed on.&lt;/p&gt;
&lt;p&gt;Eventually we got the place from the keys on 29th of February to the condition where we could move in on October 16th which we did and left the small apartment in a state ready to be fixed up and rented out. Our troubles didn't end since our bathtub broke and we had to have the drain replaced and now there's a gaping hole on the side of it that I need to close up with a panel. We didn't have the will to continue more in 2024, especially with the prospect of having to do the other apartment as well. We went to Croatia to visit families and remind ourselves that Ireland was still a good choice.&lt;/p&gt;
&lt;p&gt;What I learned in the process is that it's not a bad thing to do all of those things myself. It's not  rocket science, but for someone who didn't know anything, it took time and money to figure things out. I can tile now if nothing. We can tile now. Vesna and I are doing all of these things ourselves and are not shying away from the physical labor even though we're both dealing with software. It's great to have a partner who you can rely on completely, both for physical labor and emotional support. I can't stress this enough and hope she is aware of my thoughts about this.&lt;/p&gt;
&lt;p&gt;We live in the new place now with our two cat friends and, while we still have no curtains which is a crazy story with the badly done walls, the bathtub hole is there, the heating acting up somewhat, the shelving not done, the small bathroom is a warehouse, the place looks and feels like home and it can only get better. We plan to install a catio eventually, but that will be a project for another time.&lt;/p&gt;
&lt;p&gt;Trips:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Croatia, to visit families&lt;/li&gt;
&lt;li&gt;France (Tillé), for a small layover&lt;/li&gt;
&lt;li&gt;Hungary (Budapest, Pilisszántó), to visit a friend's birthplace and have some fun in the local waterpark&lt;/li&gt;
&lt;li&gt;Spain (Alicante, El Castell de Guadalest, Benidorm), for a much needed vacation&lt;/li&gt;
&lt;li&gt;UK, Scotland (Glasgow), for a &lt;a class="reference external" href="https://www.worldcon.org/"&gt;WorldCon&lt;/a&gt;, an SF convention&lt;/li&gt;
&lt;li&gt;Croatia again, on my own since I had a dental emergency&lt;/li&gt;
&lt;li&gt;Poland (Poznan), my work trip, Vesna didn't join and I'm sad about it&lt;/li&gt;
&lt;li&gt;France (Tillé), for a long layover and coming back to Ireland to make it to a concert&lt;/li&gt;
&lt;li&gt;Croatia, to visit families&lt;/li&gt;
&lt;li&gt;Latvia (Riga), flight from Dublin for an exploratory visit&lt;/li&gt;
&lt;li&gt;Estonia (Tallinn), for some reason they are very discriminatory, but high tech in the capital&lt;/li&gt;
&lt;li&gt;Finland (Helsinki), meeting up with a friend who is a curator and her partner who were visiting from Croatia&lt;/li&gt;
&lt;li&gt;Croatia, again, winter holidays, had to leave Tenzin and Kida with friends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Domestic travel:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Donadea forest park with friends&lt;/li&gt;
&lt;li&gt;Co. Galway, for a series of stag events like puzzle solving, obstacle course, whiskey tasting tour&lt;/li&gt;
&lt;li&gt;Greystones, beach visit&lt;/li&gt;
&lt;li&gt;Kilkenny, attending a wedding where I sewed the buttons for suspenders on my trousers and Vesna was a bridesmaid&lt;/li&gt;
&lt;li&gt;Limerick, for a concert&lt;/li&gt;
&lt;li&gt;Donadea forest park with the same pair of friends, redux&lt;/li&gt;
&lt;li&gt;Galway, to visit the cat that the same pair of friends were getting and to see the neighboring castle&lt;/li&gt;
&lt;li&gt;Sigginstown Castle in Co. Wexford, for playing D&amp;amp;D in a castle and make some fond memories of this&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Star Wars orchestral concert&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Snow_Patrol"&gt;Snow Patrol&lt;/a&gt; with support from &lt;a class="reference external" href="https://www.kingfishr.ie/"&gt;Kingfishr&lt;/a&gt; and &lt;a class="reference external" href="https://www.pillowqueens.com/"&gt;Pillow Queens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Blink-182"&gt;Blink 182&lt;/a&gt; (finally happened and was deadly)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Books:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/Permanent-Record/dp/B07VWRS1XT"&gt;Permanent Record: A Memoir of a Reluctant Whistleblower&lt;/a&gt;, by Edward Snowden&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Video games finished:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Prince_of_Persia:_The_Lost_Crown"&gt;Prince of Persia: The Lost Crown&lt;/a&gt; (churning through the DLC, though)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Video games played:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://overwatch.blizzard.com/en-us/"&gt;Overwatch 2&lt;/a&gt; (still)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Dragon_Age:_The_Veilguard"&gt;Dragon Age 4: Veilguard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Life_Is_Strange:_True_Colors"&gt;Life is Strange: True Colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Hollow_Knight"&gt;Hollow Knight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Subnautica"&gt;Subnautica&lt;/a&gt; (yes, again, and can't wait for the sequel)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things we bought:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;a lot of things we needed when renovating&lt;/li&gt;
&lt;li&gt;kitchen appliances (washing machine, induction stove and oven by &lt;a class="reference external" href="https://www.home-connect.com/"&gt;Bosch for smart home&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;two more cameras for covering our apartment blindspots by &lt;a class="reference external" href="https://reolink.com/"&gt;Reolink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;a crowbar for ripping out the old floor and wardrobes&lt;/li&gt;
&lt;li&gt;electric sander (before we got into the Einhell ecosystem)&lt;/li&gt;
&lt;li&gt;door stoppers&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.netatmo.com/"&gt;Netatmo&lt;/a&gt; smart valves for the radiators&lt;/li&gt;
&lt;li&gt;shelves&lt;/li&gt;
&lt;li&gt;multi-tool for ripping out the floors (got into &lt;a class="reference external" href="https://www.einhell.com/"&gt;Einhell&lt;/a&gt; ecosystem with their battery)&lt;/li&gt;
&lt;li&gt;small foldable trolley that did wonders when moving&lt;/li&gt;
&lt;li&gt;some clothes for the wedding&lt;/li&gt;
&lt;li&gt;kettle, carpet, glasses&lt;/li&gt;
&lt;li&gt;window vacuum cleaner from Einhell&lt;/li&gt;
&lt;li&gt;cat grooming equipment&lt;/li&gt;
&lt;li&gt;tiling equipment including the electric tile cutter that we should really sell&lt;/li&gt;
&lt;li&gt;flooring and &lt;a class="reference external" href="https://nanoleaf.me"&gt;Nanoleaf&lt;/a&gt; hexagonal lights&lt;/li&gt;
&lt;li&gt;cabinets and wardrobes&lt;/li&gt;
&lt;li&gt;kitchen electricity elements (and the whole kitchen from IKEA)&lt;/li&gt;
&lt;li&gt;loads of cat toys and scratchers&lt;/li&gt;
&lt;li&gt;induction coffee pot&lt;/li&gt;
&lt;li&gt;endoscopic camera (for checking out behind the drywall)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B082314NFL/"&gt;frother wand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;equipment for &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B01N0MA729/"&gt;LED&lt;/a&gt; under the kitchen elements, pliers, wago...&lt;/li&gt;
&lt;li&gt;loads of tools for fixing things up ourselves like drill, jigsaw, vice&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.samsung.com/ie/tablets/galaxy-tab-a/galaxy-tab-a9-plus-wifi-graphite-128gb-sm-x210nzaeeub/"&gt;Samsung Galaxy Tab A9+&lt;/a&gt; for Vesna's D&amp;amp;D IRL games&lt;/li&gt;
&lt;li&gt;medicine cabinet for the bathroom&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://hexclad.com/"&gt;HexClad&lt;/a&gt; induction wok and pan protectors&lt;/li&gt;
&lt;li&gt;handheld vacuum cleaner&lt;/li&gt;
&lt;li&gt;PC parts (&lt;a class="reference external" href="https://nzxt.com/"&gt;NZXT&lt;/a&gt; case and AIO, &lt;a class="reference external" href="https://www.asus.com/"&gt;Asus&lt;/a&gt; Thor PSU)&lt;/li&gt;
&lt;li&gt;hangers, labels, kitchen shelves&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B08VGK1V82/"&gt;starlight projector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;glass hangers and platters for the drinks cabinet&lt;/li&gt;
&lt;li&gt;mushroom kit (Lion's mane that turned out working well)&lt;/li&gt;
&lt;li&gt;strainers&lt;/li&gt;
&lt;li&gt;some &lt;a class="reference external" href="https://www.sonos.com/"&gt;Sonos&lt;/a&gt; speakers&lt;/li&gt;
&lt;li&gt;kitchen utensils&lt;/li&gt;
&lt;li&gt;metal stickers and spice holders&lt;/li&gt;
&lt;li&gt;plates, containers, dispensers&lt;/li&gt;
&lt;li&gt;more chargers and cables&lt;/li&gt;
&lt;li&gt;mud race equipment&lt;/li&gt;
&lt;li&gt;some electronics for a small project I'll write about&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.hyggegames.com/en-us/product/the-hygge-game"&gt;Hygge&lt;/a&gt; board game&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things we sold:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;a lot of things we didn't need when renovating&lt;/li&gt;
&lt;li&gt;small fridge&lt;/li&gt;
&lt;li&gt;washing machine, pretty much leftovers from the old occupier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other important events:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;went axe throwing for Vesna's birthday, prepped her a nice surprise party&lt;/li&gt;
&lt;li&gt;ghost bus tour in Dublin (there are still places to see in our city)&lt;/li&gt;
&lt;li&gt;silversmithing course where our friends' group hammered into existence silver fidget rings&lt;/li&gt;
&lt;li&gt;Aurora Borealis crept up all the way from the cold north to us and we took some wonderful photos&lt;/li&gt;
&lt;li&gt;Stella cinemas luxury experience&lt;/li&gt;
&lt;li&gt;friends from Croatia visited and we're sorry it happened while the new place was not done yet, raw concrete floors and all&lt;/li&gt;
&lt;li&gt;another friend visit for a concert&lt;/li&gt;
&lt;li&gt;fixing the PC where it finally turned out that the CPU broke the PSU so it had to be replaced, but the Intel CPU is &lt;a class="reference external" href="https://warcraft.blizzplanet.com/blog/comments/how-to-fix-i9-13900k-ks-kf-and-i9-14900k-firefox-chrome-video-game-crashes"&gt;Intel's 13th gen that has a manufacturing defect&lt;/a&gt; and I've lost my faith in them. It works underclocked, but I'll switch to AMD when able&lt;/li&gt;
&lt;li&gt;went to a cocktail-making workshop for my birthday party, also got some ideas, cocktail making is slowly becoming a thing in my life, I like to make some for our friends&lt;/li&gt;
&lt;li&gt;didn't go to &lt;a class="reference external" href="https://gaelforceevents.com/en/turf-warrior"&gt;Turf warrior mud race&lt;/a&gt; but bought wetsuits for it, hopefully they will be used for other activities&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.lego.com/"&gt;LEGO&lt;/a&gt; play, I'll write about it&lt;/li&gt;
&lt;li&gt;generative AI project on cocktail making that is slowly becoming a thing I'll open source&lt;/li&gt;
&lt;li&gt;blog update with some &lt;a class="reference external" href="https://indieweb.org/Webmention"&gt;Webmention&lt;/a&gt; things, but need to improve a bit. So far nothing visible&lt;/li&gt;
&lt;li&gt;got into our building management board&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that's pretty much it. Eventful year, but let's not repeat it :D&lt;/p&gt;
</summary></entry><entry><title>NFC Tags in Home Automation</title><link href="http://www.offsetlab.net/nfc-tags-in-home-automation/" rel="alternate"/><updated>2024-02-26T16:46:39+00:00</updated><id>http://www.offsetlab.net/nfc-tags-in-home-automation/</id><summary type="html">&lt;p&gt;The current &lt;a class="reference external" href="https://www.amazon.co.uk/zemismart-Rechargable-Tubular-Control-Required/dp/B093PSZ44B/"&gt;Zemismart curtain roller&lt;/a&gt; started to act up and I was to do the whole reset with a pin and a button, but my manual was in a box in our storage so I had to retrieve it like &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Conan_the_Barbarian"&gt;Conan the Barbarian&lt;/a&gt;. I had to shuffle other boxes and stuff to get to the one I needed. This just made me realize that our physical storage space could use some more love. I thought it would be a great idea to put an &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Near-field_communication"&gt;NFC&lt;/a&gt; tag near the curtain to have a link to the scanned manual instead. Get rid of all the paper forms and have a digital storage of things would free up the space. I already use &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Syncthing"&gt;Syncthing&lt;/a&gt; for the photos for the &lt;a class="reference external" href="https://www.photoprism.app/"&gt;PhotoPrism&lt;/a&gt; so I might as well do a self-hosted document storage system to manage general files, too. For that, I opted to use &lt;a class="reference external" href="https://github.com/sigoden/dufs/"&gt;dufs&lt;/a&gt;. It's simple and it works. I mounted a folder from my external drive into the configuration of &lt;em&gt;dufs&lt;/em&gt;, added the credentials and left it in the local network. After all, I don't need this service exposed to the whole world to see. I added the whole thing into my existing compose file on the Raspberry Pi. It is something like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
dufs:
  image: sigoden/dufs
  ports:
    - 5000:5000
  volumes:
    - /path/to/host/folder:/data
  command: [&amp;quot;/data&amp;quot;, &amp;quot;-A&amp;quot;, &amp;quot;-a&amp;quot;, &amp;quot;user:pass&amp;#64;/:rw&amp;quot;]
&lt;/pre&gt;
&lt;p&gt;Of course, you'd need to adjust where necessary for your system. With static file serving in place, I scanned the manual and uploaded the resulting file to the &lt;em&gt;dufs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I did the same for the washer/dryer, but it was easier for it. I found three manuals online and uploaded them in a single folder. I could eventually write the folder URL to the tag instead. One piece of the puzzle was in place. Moving on to the &lt;em&gt;NFC&lt;/em&gt; one.&lt;/p&gt;
&lt;p&gt;When discussing my solution with friends, they asked a few questions about the &lt;em&gt;NFC&lt;/em&gt; itself. I answered them as best as I could:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Do the &lt;em&gt;NFC&lt;/em&gt; tags require batteries?&lt;/p&gt;
&lt;p&gt;No, they're just a chip and an antenna in a small form. When exposed to the RF field, they emit the data. They do not require batteries which is cool. The reading happens when the reader and the tag are in a close proximity of each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Could you do the same with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/QR_code"&gt;QR code&lt;/a&gt; if you're scanning with your phone?&lt;/p&gt;
&lt;p&gt;Yes, you could embed the data and this is wonderful. &lt;a class="reference external" href="https://en.wikipedia.org/wiki/WeChat_Pay"&gt;WeChat&lt;/a&gt; and &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Revolut"&gt;Revolut&lt;/a&gt; even function with payments reading the &lt;em&gt;QR codes&lt;/em&gt; since you only need a camera. Almost all smartphones have a camera, and while majority of phones do have &lt;em&gt;NFC&lt;/em&gt;, it's not as ubiquitous as the camera. When you create a tag in &lt;a class="reference external" href="https://www.home-assistant.io/"&gt;Home Assistant&lt;/a&gt;, you get a &lt;em&gt;QR code&lt;/em&gt;, but can also write it to an &lt;em&gt;NFC&lt;/em&gt; chip. I had the &lt;em&gt;QR code&lt;/em&gt; for one automation already and I also use one currently for WiFi credential listing in the apartment as well, but in my experience, scanning &lt;em&gt;QR codes&lt;/em&gt; requires more work from the user and more time is spent, whereas &lt;em&gt;NFC&lt;/em&gt; scanning happens almost instantly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;You could call automations by just clicking a shortcut on your phone.&lt;/p&gt;
&lt;p&gt;Yes, I could, and I do for some of the things. Curtain control mostly. But then you have to set up phone shortcuts as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;You can tell your smart speaker to execute an automation, right?&lt;/p&gt;
&lt;p&gt;I can, and I do. A smart speaker leaves a lot to be desired, though, at least the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Google_Nest_(smart_speakers)"&gt;Nest Mini&lt;/a&gt; I have. It mishears the command or ignores it for some reason or says it did things, but it didn't... It even asked me to clean my room myself once instead of sending the vacuum cleaner there. Can you imagine?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;What do your cats have to do with that technology?&lt;/p&gt;
&lt;p&gt;Nothing except having the same acronym. NFC = Near Field Communication, NFC = &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Norwegian_Forest_cat"&gt;Norwegian Forest Cat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Last year I bought a box of &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B0BX382KZZ"&gt;NFC NTAG 215 tags&lt;/a&gt; and started using them in various circumstances. I gave some to friends as well so they can experiment if they wanted to. While reworking the dashboard for the &lt;em&gt;Home Assistant&lt;/em&gt; instance, I made the tabs for each room of the apartment and in each room I opened a &lt;a class="reference external" href="https://www.home-assistant.io/dashboards/markdown/"&gt;markdown card&lt;/a&gt; describing what &lt;em&gt;NFC&lt;/em&gt; tags I had in each room (or in general) and what they were used for.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;on the keychain:&lt;/p&gt;
&lt;p&gt;holds the URL of the OffSetLab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the cork board:&lt;/p&gt;
&lt;p&gt;has 7 tags and acts as a dashboard for controlling the lights and sounds for the D&amp;amp;D session&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the projector:&lt;/p&gt;
&lt;p&gt;toggles projector, speakers, PS4 on/off state and lowers the motorized projector screen (for some reason, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Consumer_Electronics_Control"&gt;HDMI CEC&lt;/a&gt; is not powering on all the devices so I have to trigger them each separately)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the washing machine (two tags):&lt;/p&gt;
&lt;p&gt;triggers a notification in 8:05 hours from the moment of scanning. This is the exact time the washing machine cotton 40 °C and cupboard dry takes to finish. I might have a smart washing machine one day so I would not be limited to the manual notification of that single program&lt;/p&gt;
&lt;p&gt;contains the link to the folder with manuals for the washer/dryer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;below the kitchen hanging cupboard:&lt;/p&gt;
&lt;p&gt;calls &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Roborock#Robot_vacuum_cleaners"&gt;Roborock&lt;/a&gt; to clean up the kitchen. This is useful when the surfaces are cleaned up and crumbs thrown on the floor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the apartment door:&lt;/p&gt;
&lt;p&gt;WiFi connection information for the apartment. There's a &lt;em&gt;QR code&lt;/em&gt; next to it as well. When guests arrive and ask for a WiFi access, this is how they get it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the hooded litterbox:&lt;/p&gt;
&lt;p&gt;turns off the notification annoyer to clean the litterboxes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the side of the mirror next to the bathtub:&lt;/p&gt;
&lt;p&gt;toggles a scene which dims the lightbulb, changes its colour to warm and turns on the fan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the blue box in the storage:&lt;/p&gt;
&lt;p&gt;sends a notification to the phone that scanned it with a list of items in the box (I should change this to a proper link to a list)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;on the window&lt;/p&gt;
&lt;p&gt;contains the link to the manual for the roller curtain motor&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vesna particularly loves the physical dashboard with &lt;em&gt;NFC&lt;/em&gt; tags I made for our &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Dungeons_%26_Dragons"&gt;D&amp;amp;D&lt;/a&gt; sessions. They start playing ambiental music from &lt;a class="reference external" href="https://spotify.com/"&gt;Spotify&lt;/a&gt; playlists on the speakers and manipulate the lights as well as one that turns off everything that was running for the session. I started up the &lt;a class="reference external" href="https://inkscape.org/"&gt;Inkscape&lt;/a&gt;, added one inch diameter circle, only border, no fill and placed the icon from &lt;a class="reference external" href="https://pictogrammers.com/library/mdi/"&gt;Material Design Icons&lt;/a&gt; inside it. I printed it on the sticky paper and cut it out to be on the &lt;em&gt;NFC&lt;/em&gt; tag. Then I put the tags onto the hexagonal cork board and gave it to Vesna to play with the dashboard since she's our resident dungeon mistress (not that kind, you perverts).&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-dnd-dashboard.jpg" class="img-responsive center-block" src="/media/images/ha-dnd-dashboard.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Setting up the &lt;em&gt;NFC&lt;/em&gt; tags is quite easy:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Take an &lt;em&gt;NFC&lt;/em&gt; tag and have it ready&lt;/li&gt;
&lt;li&gt;Open &lt;a class="reference external" href="https://play.google.com/store/apps/details?id=io.homeassistant.companion.android&amp;amp;hl=en_US"&gt;Home Assistant app&lt;/a&gt; on your &lt;em&gt;NFC&lt;/em&gt; enabled phone&lt;/li&gt;
&lt;li&gt;In &lt;em&gt;Home Assistant&lt;/em&gt;, open the hamburger menu, pick &lt;em&gt;Tags&lt;/em&gt;, click &lt;em&gt;Add Tag&lt;/em&gt;, name it and press &lt;em&gt;create and write&lt;/em&gt; (you don't have to enter tag ID)&lt;/li&gt;
&lt;li&gt;Press the robot head icon for the created tag, this creates the automation that triggers &lt;em&gt;When a tag is scanned&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Create the automation according to your needs&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-app-tags.png" class="img-responsive center-block" src="/media/images/ha-app-tags.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Alternatively to the Home Assistant app, you can use &lt;a class="reference external" href="https://play.google.com/store/apps/details?id=com.wakdev.wdnfc&amp;amp;hl=en_US"&gt;NFC Tools&lt;/a&gt; app, go to &lt;em&gt;Write&lt;/em&gt; -&amp;gt; &lt;em&gt;Add a record&lt;/em&gt;, pick a type of the record and follow the instructions. This is useful for having the tag with other data like links, WiFi credentials, automating phone behaviour with &lt;a class="reference external" href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&amp;amp;hl=en_US"&gt;Tasker&lt;/a&gt;... in essence, things that are not exclusive to &lt;em&gt;Home Assistant&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Automations in the house are either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;togglers whose action is &lt;em&gt;Conditionally execute an action and default to another action&lt;/em&gt; which is using a simple IF-THEN-ELSE construct to check for a certain device state (off or on) and execute a script. This enables me to activate things or deactivate them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;use the same thing as above, but check which device triggered it. IF part is: &lt;em&gt;Test if template renders a value equal to true&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
{{ trigger.event.data.device_id == &amp;quot;my device app id taken from device's URL&amp;quot; }}
&lt;/pre&gt;
&lt;p&gt;THEN is &lt;em&gt;Call a service: 'Notifications: Send a notification via mobile_app'&lt;/em&gt; (depending on the device, I have two actions for two devices here so it's going to two different mobile_app instances). No ELSE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;directly &lt;em&gt;Call a service&lt;/em&gt; (usually execute a script or send a command to a device) or &lt;em&gt;Delay for&lt;/em&gt;, then &lt;em&gt;Call a service&lt;/em&gt; (in the case of the washing machine tag)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Annoyer silencing is a bit complex, so I'll explain it as best as I can with an example for my litter box cleaning routine. It comprises of one helper and three automations to accomplish the entire workflow:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-helpers.png" class="img-responsive center-block" src="/media/images/ha-helpers.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Under &lt;em&gt;Settings&lt;/em&gt;, &lt;em&gt;Devices and services&lt;/em&gt;, there is a &lt;em&gt;Helpers&lt;/em&gt; tab. I use the &lt;em&gt;toggle&lt;/em&gt; type which is esentially an &lt;em&gt;input boolean&lt;/em&gt;. It can be either true or false. I called it &amp;quot;Litterbox Cleaned&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;I have an automation that triggers every half an hour, three times. It's active in the morning, in the afternoon and in the evening. Annoying, right? I call it &amp;quot;Litter Boxes Notification&amp;quot;. It checks if the &amp;quot;Litterbox Cleaned&amp;quot; is &lt;em&gt;Off&lt;/em&gt;, and only then does actions that are:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;Call a service 'Notifications: Send a notification via mobile_app'&lt;/em&gt; with the &lt;tt class="docutils literal"&gt;message&lt;/tt&gt;: &amp;quot;Clean the litter boxes.&amp;quot; and &lt;tt class="docutils literal"&gt;data&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
actions:
  - action: SILENCE
    title: Silence
&lt;/pre&gt;
&lt;p&gt;This means that the notification on the phone will have a button that can be pressed and the specified action triggers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;Text-to-speech (TTS) 'Say a TTS message with cloud'&lt;/em&gt; (I edit this one in YAML because I use a template to give some personality to the responses):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
service: tts.cloud_say
metadata: {}
data:
  cache: false
  entity_id: media_player.my_nest_speaker
  message: &amp;gt;-
    {{ [&amp;quot;Clean the litter boxes.&amp;quot;, &amp;quot;Please clean the litter boxes.&amp;quot;, &amp;quot;Clean the fucking litter boxes.&amp;quot;, &amp;quot;Roses are red, violets are blue, clean the damn litter boxes, so I don't bother you.&amp;quot;, &amp;quot;Did you clean the litter boxes?&amp;quot;] | random }}
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Manual interventions are then another automation that I call &amp;quot;Tag Litterbox 1 is scanned&amp;quot; and it has two triggers:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;When a tag is scanned&lt;/em&gt; (the one I physically put on the litter box)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;When mobile_app_notification_action event is fired&lt;/em&gt;. Event data is &lt;tt class="docutils literal"&gt;action: SILENCE&lt;/tt&gt; which means I pressed the silence button on the notification from the step 2.1.&lt;/p&gt;
&lt;p&gt;And two actions:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;Call a service 'Input boolean: Turn on' on Litterbox Cleaned&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;&lt;em&gt;Call a service 'Notifications: Send a notification via mobile_app'&lt;/em&gt; (I edit this one in YAML because I use a template to timestamp the silencing):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
service: notify.mobile_app_fp3
data:
  message: Litterboxes cleaned at {{ now().strftime(&amp;quot;%-I:%M %p (%d-%m-%y)&amp;quot;) }}.
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;The last automation I call &amp;quot;Turn Off Litterbox Input&amp;quot; and it triggers on the time as well, five minutes after the last notification in the series. The automation from step 2 triggers on 10:00, 10:30, 11:00, and this one triggers on 11:05. It has the action &lt;em&gt;Call a service 'Input boolean: Turn off' on Litterbox Cleaned&lt;/em&gt;. This makes the helper have a value of false and it's idempotent so there's no worry if it's already off. This action primes the annoyer for the next series of annoying that will start in the afternoon (again, automation from step 2).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-automation-lbn.png" class="img-responsive center-block" src="/media/images/ha-automation-lbn.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-automation-lb1is.png" class="img-responsive center-block" src="/media/images/ha-automation-lb1is.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/ha-automation-tolbi.png" class="img-responsive center-block" src="/media/images/ha-automation-tolbi.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;I use &lt;a class="reference external" href="https://www.nabucasa.com/"&gt;Nabu Casa&lt;/a&gt; cloud connection for the convenience of accessing the instance outside my network, to integrate with voice assistants easily and to financially support &lt;em&gt;Home Assistant&lt;/em&gt; development. I think this is a good thing. With it, I'm able to have &lt;tt class="docutils literal"&gt;tts.cloud_say&lt;/tt&gt;, but you could also use &lt;tt class="docutils literal"&gt;tts.google_translate_say&lt;/tt&gt; if you have a different setup.&lt;/p&gt;
&lt;p&gt;This was a long overdue article (and it's long, too) so I hope it's useful for whomever is reading this, but it will be useful to me so I remember how I did stuff. Poking around the &lt;em&gt;Home Assistant&lt;/em&gt; is not a scary experience and it can be very fun.&lt;/p&gt;
</summary></entry><entry><title>2023 Recap</title><link href="http://www.offsetlab.net/2023-recap/" rel="alternate"/><updated>2024-01-09T11:56:37+00:00</updated><id>http://www.offsetlab.net/2023-recap/</id><summary type="html">&lt;p&gt;The year started like usual. Recap writing and checking out the New Year's resolutions. We quickly tried to get back into the routine that we sorely missed for a month, but as it turned out, 2023 was great in the first half, however, very bad in the second one.
My writing halved due to the general lethargy since I got laid off and some other things got to occupy our life at the same time. Considering those, this year should see us wrap up some things we set in motion and propel us into new directions.
Aside from being laid off, getting the cats and the citizenship are the most important events. Here's the recap:&lt;/p&gt;
&lt;p&gt;Trips:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Luxembourg (Luxembourg proper, a weekend getaway to see the city, we were pleasantly surprised because it was really beautiful)&lt;/li&gt;
&lt;li&gt;Croatia (Zagreb and Slavonija as usual, to see our families)&lt;/li&gt;
&lt;li&gt;Spain (Madrid layover and sleepover)&lt;/li&gt;
&lt;li&gt;Panama (Panama City and the Canal itself, monkey islands in the Canal)&lt;/li&gt;
&lt;li&gt;Mexico (Cancún, Tulum, Yucatán riviera, Chichén Itzá)&lt;/li&gt;
&lt;li&gt;USA (Florida, Orlando, Universal Studios amusement park - a jumping off point to the next set of countries below)&lt;/li&gt;
&lt;li&gt;US Virgin Islands (St. Thomas, basically this is a USA territory, not a standalone country)&lt;/li&gt;
&lt;li&gt;Antigua and Barbuda (St. John's)&lt;/li&gt;
&lt;li&gt;Sint Maarten (Philipsburg, this is a part of the Netherlands)&lt;/li&gt;
&lt;li&gt;Collectivity of Saint Martin (Marigot, this is a part of France, the previous one and this one are both on the same island: Saint Martin)&lt;/li&gt;
&lt;li&gt;Commonwealth of Puerto Rico (San Juan, another USA overseas territory and they're not sure how to resolve the political situation, I think there was a referendum on them wishing to become a new state)&lt;/li&gt;
&lt;li&gt;Dominican Republic (San Felipe de Puerto Plata)&lt;/li&gt;
&lt;li&gt;USA (Orlando, Florida, again, since it was a round trip across the Caribbean, but this time we saw the Kennedy Space Center)&lt;/li&gt;
&lt;li&gt;USA (New York for work)&lt;/li&gt;
&lt;li&gt;UK (London for a day trip)&lt;/li&gt;
&lt;li&gt;Spain (Málaga, a day long layover, Spain is really wonderful)&lt;/li&gt;
&lt;li&gt;Croatia (Slavonija and Zagreb to see families and friends)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/atlantis.jpg" class="img-responsive center-block" src="/media/images/atlantis.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Domestic travel:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Great Sugar Loaf (again, climbing this 501m mountain)&lt;/li&gt;
&lt;li&gt;Portadown (pizza and pottery course)&lt;/li&gt;
&lt;li&gt;Killarney (citizenship ceremony)&lt;/li&gt;
&lt;li&gt;Leixlip (kayak course)&lt;/li&gt;
&lt;li&gt;Belfast (for a trip with friends)&lt;/li&gt;
&lt;li&gt;Kircubbin (family expansion)&lt;/li&gt;
&lt;li&gt;Celbridge (friends got a place there so we visit frequently)&lt;/li&gt;
&lt;li&gt;Enniskerry (a friend has a place there so we visited)&lt;/li&gt;
&lt;li&gt;Glendalough (again, with another set of family members)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No concerts, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Blink-182"&gt;Blink 182&lt;/a&gt; got postponed, but they released a new album&lt;/li&gt;
&lt;li&gt;Stand up comedy show with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Reginald_D._Hunter"&gt;Reginald D. Hunter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Books:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Walkaway_(Doctorow_novel)"&gt;Walkaway - Cory Doctorow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Thinking_In_Systems:_A_Primer"&gt;Thinking in Systems - Donella Meadows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/After-Meat-Amazing-Meat-Free-World-ebook/dp/B09DTF36K2/"&gt;After Meat - Karthik Sekar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/Obligate-Carnivore-Really-Means-Vegan-ebook/dp/B005JTNMWA/"&gt;Obligate Carnivore - Jed Gillen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Manufacturing_Consent"&gt;Manufacturing Consent - Edward S. Herman and Noam Chomsky&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things we bought:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;LEGO sets (we were gifted &lt;a class="reference external" href="https://www.lego.com/en-ie/product/bonsai-tree-10281"&gt;Bonsai Tree&lt;/a&gt; and quickly complemented it with &lt;a class="reference external" href="https://www.lego.com/en-ie/product/flower-bouquet-10280"&gt;Flower Bouquet&lt;/a&gt; and &lt;a class="reference external" href="https://www.lego.com/en-ie/product/horizon-forbidden-west-tallneck-76989"&gt;Horizon Forbidden West: Tallneck&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A charging gadget for USB devices (we're getting low on sockets in the apartment so having a charging hub was a life saver)&lt;/li&gt;
&lt;li&gt;More climbing equipment (shoes and harnesses)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Steam_Deck"&gt;SteamDeck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SteamDeck dock&lt;/li&gt;
&lt;li&gt;Insect net for the balcony&lt;/li&gt;
&lt;li&gt;Some fitness equipment for training the fingers for climbing&lt;/li&gt;
&lt;li&gt;Some cable organizing solutions and boxes&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.fireangel.co.uk/home/product/st-230/"&gt;FireAngel smoke alarm&lt;/a&gt; to replace the old broken one (also thinking about the automation of it)&lt;/li&gt;
&lt;li&gt;NFC tags for improving the automation at home (annoying notifications and NFC scans to silence them, calling vacuum to the kitchen, WiFi credentials, activating scenes, delaying notification for stupid devices like washing machine)&lt;/li&gt;
&lt;li&gt;Paper shredder (because we got sick and tired of figuring out how to anonymize the incoming mail for recycling)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.netatmo.com/en-eu/smart-weather-station"&gt;Netatmo weather station&lt;/a&gt; (that has since shown us that the air quality can get bad in the apartment)&lt;/li&gt;
&lt;li&gt;Bathroom cupboard&lt;/li&gt;
&lt;li&gt;Tons of pet related equipment including &lt;a class="reference external" href="https://petkit.com/"&gt;smart fountain and feeders by Petkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A set of Ikea KALLAX frames (to replace what we sold)&lt;/li&gt;
&lt;li&gt;Additional KALLAX inserts&lt;/li&gt;
&lt;li&gt;A small handheld vacuum cleaner&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.aqara.com/eu/product/presence-sensor-fp2/"&gt;Aqara FP2 presence sensor&lt;/a&gt; (for zone automation, but it's currently underutilized)&lt;/li&gt;
&lt;li&gt;Another dehumidifier model to complement the existing one in another room (they run for a couple of hours each day with smart outlets controlling them)&lt;/li&gt;
&lt;li&gt;Graphics card (the old one is giving up on us, and it was the last component to buy since the whole PC died last winter. That said, not sure the new one works as expected)&lt;/li&gt;
&lt;li&gt;Picture frames (we attended a fluorescent painting course)&lt;/li&gt;
&lt;li&gt;More cocktail equipment&lt;/li&gt;
&lt;li&gt;Fake elven ears for a Halloween costume :)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.raspberrypi.com/products/raspberry-pi-5/"&gt;Raspberry PI 5&lt;/a&gt; (but it is not established yet)&lt;/li&gt;
&lt;li&gt;A bluetooth mouse for the SteamDeck&lt;/li&gt;
&lt;li&gt;A set of wireless headphones (because Kida keeps eating the wired ones)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Things we sold:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Ikea MALM small chest&lt;/li&gt;
&lt;li&gt;Ikea MALM big chest&lt;/li&gt;
&lt;li&gt;Fit Bounce trampoline (we're sad this is gone, but we needed some space, considering)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other important events:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/genealogy-and-dna-analysis/"&gt;Sequenced our DNA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Got laid off&lt;/li&gt;
&lt;li&gt;Became an Irish citizen, did the ceremony, got the cert, got the passport&lt;/li&gt;
&lt;li&gt;Had a massive amount of vaccines due to travel, then Covid vaccine again&lt;/li&gt;
&lt;li&gt;Saw a lot of places and touched a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Kennedy_Space_Center_Visitor_Complex#Apollo/Saturn_V_Center"&gt;Moon rock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Finished a kayaking course so we can kayak with confidence&lt;/li&gt;
&lt;li&gt;Threw away all the boxes of the devices whose warranty expired&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/family-dlc/"&gt;Expanded our small family&lt;/a&gt; to include Tenzin and Kida and bought a whole lot of cat stuff&lt;/li&gt;
&lt;li&gt;Did all the necessary things at the vet for Tenzin and Kida but we kinda need to get checked ourselves this year&lt;/li&gt;
&lt;li&gt;Automated cat drinking and feeding solutions&lt;/li&gt;
&lt;li&gt;Overhauled Home Assistant instance&lt;/li&gt;
&lt;li&gt;Went to a drink&amp;amp;paint course&lt;/li&gt;
&lt;li&gt;Finished &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Subnautica"&gt;Subnautica&lt;/a&gt; again&lt;/li&gt;
&lt;li&gt;Sold things we were not using&lt;/li&gt;
&lt;li&gt;Taught cats some tricks&lt;/li&gt;
&lt;li&gt;Assembled cat trees&lt;/li&gt;
&lt;li&gt;Sister and her family finally visited&lt;/li&gt;
&lt;li&gt;Changed wheels on my office chair&lt;/li&gt;
&lt;li&gt;Upped my cocktail game with a book on &lt;a class="reference external" href="https://www.amazon.co.uk/D%C3%BCngeonmeister-Cocktail-Recipes-Campaign-Ultimate/dp/1507214650"&gt;D&amp;amp;D cocktails&lt;/a&gt; gifted by a friend&lt;/li&gt;
&lt;li&gt;Joined &lt;a class="reference external" href="https://indieweb.org/"&gt;IndieWeb&lt;/a&gt; community and slowly reworking the web with &lt;a class="reference external" href="https://htmx.org/"&gt;HTMX&lt;/a&gt; and &lt;a class="reference external" href="https://indieweb.org/Webmention"&gt;webmentions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cats had to be spayed and neutered so it was a number of sleepless nights&lt;/li&gt;
&lt;li&gt;Halloween costume party&lt;/li&gt;
&lt;li&gt;Little birthday party in an old arcade machines pub&lt;/li&gt;
&lt;li&gt;Added &lt;a class="reference external" href="https://github.com/bastienwirtz/homer"&gt;Homer&lt;/a&gt; into the Raspberry to have a visible list of all our Docker containers&lt;/li&gt;
&lt;li&gt;Planted flowers around the neighborhood, waiting for Spring to see the results&lt;/li&gt;
&lt;/ul&gt;
</summary></entry><entry><title>Family DLC</title><link href="http://www.offsetlab.net/family-dlc/" rel="alternate"/><updated>2023-12-17T14:52:40+00:00</updated><id>http://www.offsetlab.net/family-dlc/</id><summary type="html">&lt;p&gt;Every time I try writing something I end up in a state resembling a writer's block. Days pass and when I sit down to write an article, I quickly realize I don't have anything to report. In actuality I have loads of things to report, but no point in writing about them since they're not complete yet. I'm either busy wrapping things up for weeks or resigned to waiting for things beyond my control to resolve. Another cold period approaches and it is not helping either.&lt;/p&gt;
&lt;p&gt;Still, I need to write about something, else I'll slow down so much I am afraid I'll be going in reverse. While I won't write about the things that are not yet completed, I'll write about one thing that definitely is. Our small family is not two, but four now. Twins Kida and Tenzin have joined our little club and are taking away our sleep, our time, our sanity, but bringing in some joy, calm and are keeping us from obsessing over meaningless things.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/tenzin-kida.jpeg" class="img-responsive center-block" src="/media/images/tenzin-kida.jpeg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Getting a household ready for cats is not a trivial task. To fit our overall smart-home project, we opted to immediately introduce some smart gadgets - the ones we could afford and fit into our small apartment. We now have two automated food dispensers (dry only), a smart water fountain (they're interested in drinking the running water) and a single cat flap door.&lt;/p&gt;
&lt;p&gt;The flap door we needed for Kida as she's a fussy eater - slower than her brother, who started to steal her food, and she also prefers to have audience and encouragement while she does it (we've since learnt that she's what's referred to as &amp;quot;affection eater&amp;quot;).&lt;/p&gt;
&lt;p&gt;He has no such trouble. He's growing way faster than her and is over five kg now. A true gentle giant. At the time of this writing, they're currently just over seven months old. Time is flying, though.&lt;/p&gt;
&lt;p&gt;Aside from providing food and water logistics, we've set up two litter boxes in the hallway, which we'd love to replace with an automatic one, but that's both expensive and impractically large at this point.&lt;/p&gt;
&lt;p&gt;Vesna bought every toy from every top list of cat toys and then some, we've set up a number of nooks where they can curl into for a nap, as well as two cat trees that they can climb, perch from and observe us from a height. Most of the time they sleep on the windowsill or above and below our bed.&lt;/p&gt;
&lt;p&gt;They also have very distinct personalities. Tenzin is quick to sneak a cuddle or two, or three, and is friendly with everyone (which terrifies Vesna as if he ever escaped, nobody would ever return the glorious affectionate furball that he is). Kida is very skittish, but loves to explore and play, and vocalizes it frequently. She's not super into being cuddled, but will follow us from one room to another. We're working on it.&lt;/p&gt;
&lt;p&gt;We also took the time to teach them some tricks. Their repertoire consists of responding to their name, sitting, giving high five, fist bump and low five, giving handshake, a hug, jumping over a leg or an arm, nose bumping and the list continues to grow. Right now we're teaching them to react to &amp;quot;no&amp;quot; - basically turning their attention from the illicit activity to us and using positive reinforcement when it works.&lt;/p&gt;
&lt;p&gt;When weather permits, we try to take them for a walk on a leash, although that can prove to be challenging with them either trying to dash after something (Tenzin) or getting scared of strangers and freezing in place (Kida). It sure makes our lives less boring, and hopefully theirs more interesting.&lt;/p&gt;
&lt;p&gt;The challenge ahead of us will also be switching them to a vegan diet. Their digestion can react temporarily, but we've done our research and it shouldn't cause long term issues. There are several brands that offer balanced food options for cats in the vegan department, but none of them are going into specialized territory like &amp;quot;kitten only&amp;quot;, or &amp;quot;sterilized kitten&amp;quot; foods. Top that with what they had in the previous household, we are taking it slow.&lt;/p&gt;
&lt;p&gt;They were also fixed relatively recently and they recovered nicely. Her procedure did involve some sleepless nights on our part, spent streaming relaxing cat music, but it mostly worked on Vesna. Luckily, that milestone is behind us now.&lt;/p&gt;
&lt;p&gt;They've changed our lives profoundly in a very short time and we love them unconditionally, but I do sometimes wish they could learn how to work so Vesna and I are not the sole breadwinners in the family, or at least to cast some useful spells in the spellcaster's familiar vein.&lt;/p&gt;
</summary></entry><entry><title>Genealogy and DNA Analysis</title><link href="http://www.offsetlab.net/genealogy-and-dna-analysis/" rel="alternate"/><updated>2023-06-25T18:29:20+00:00</updated><id>http://www.offsetlab.net/genealogy-and-dna-analysis/</id><summary type="html">&lt;p&gt;In short, &lt;strong&gt;genealogy&lt;/strong&gt; is the study of family history. Aside from studying birth records, historical lists and articles and other available sources, relatively recently popular method of studying family history is &lt;strong&gt;DNA analysis&lt;/strong&gt;, to see how related people within a DNA database are. There are two biggest consumer focused companies out there for humans: &lt;a class="reference external" href="https://www.ancestry.co.uk/"&gt;Ancestry&lt;/a&gt;, which is mostly focused on North America and  &lt;a class="reference external" href="https://www.myheritage.com/"&gt;MyHeritage&lt;/a&gt;, which is mostly &lt;a class="reference external" href="https://blog.genomelink.io/posts/ancestrydna-vs-myheritage-a-simple-comparison-for-the-dna-newbie"&gt;focused on Europe&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/dna.jpeg" class="img-responsive center-block" src="/media/images/dna.jpeg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;My uncle started doing genealogy on MyHeritage and I was kinda fed up myself with not knowing all the cousins, their spouses, children. I also wanted to have my DNA sequenced. After all, I used to work in such a &lt;a class="reference external" href="https://gencove.com/"&gt;company&lt;/a&gt;, but eventually I opted to first enter the data in Ancestry because their DNA database of humans is &lt;a class="reference external" href="https://www.bestonlinereviews.com/dna-testing/ancestry-dna-test-vs-23andme-vs-myheritage/"&gt;the biggest&lt;/a&gt; there is at the moment, they offer &lt;strong&gt;traits&lt;/strong&gt; display, as well as &lt;strong&gt;ancestry&lt;/strong&gt;, and there's an option to export the data from them and import it into MyHeritage. It took some manual work to export the data from Ancestry, with usual disclaimers, of course, then import it to MyHeritage and wait for them to analyze it.&lt;/p&gt;
&lt;p&gt;DNA is assembled by combining some parts in the DNA strain of the individual with the reference genome. Humans are mostly the same so there are no big differences between us regarding genetics.&lt;/p&gt;
&lt;p&gt;All of the calculations are done by finding similarities of the submitted DNA with the rest of the DNA samples in the database.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;ancestry&lt;/strong&gt; analysis is done by comparing the number of DNA subsequences of the individual with the sampled population grouped by their place of living. It is a static picture of things. People migrated and there's considerable room for getting it wrong, but there is truth to it, especially because ancestry can be distinguished way back throughout generations.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;traits&lt;/strong&gt; display is there to see things like free vs attached earlobes, alcohol flush, sprinter gene and so on. Ancestry got almost all of my traits correct. Traits are usually determined by finding genetic similarities of a user within the DNA database that is marked up by user submitted answers.&lt;/p&gt;
&lt;p&gt;More interesting is the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Polygenic_score"&gt;PRS&lt;/a&gt; (&lt;strong&gt;Polygenic Risk Score&lt;/strong&gt;) that can determine predisposition to various traits. Diseases being a very interesting part of it. Cancers and such. Of course, we're talking about statistical probability, which is definitely not the singular cause, but a possible contributing factor. For instance, just because one might be an alcoholic, genetically speaking, if they're not drinking, it can hardly be the case. PRS are also most viable in the populations with European ancestry, since they're the most researched group, but can fail in other groups. Take it with a grain of salt if you're checking things out for health. Ancestry does not give out PRS related to health. If one wants that, they should sequence their genome with &lt;a class="reference external" href="https://www.23andme.com/"&gt;23andMe&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;DNA analysis, as expected, depends largely on the sample size, as well as other factors, like epigenetics, additive genetic effects, etc. It is an interesting area of study.&lt;/p&gt;
&lt;p&gt;It took about a month to get the results. The kit gets ordered, sent, then it's activated, sample is collected via saliva, stabilizing fluid is added to it and it's mailed back. It's a long wait then. They need to receive the sample, extract the DNA and run analysis on it. It depends on the lab and the amount of work they have. Import/export to another service (from Ancestry to MyHeritage in our case) was a matter of days and a bit of manual work.&lt;/p&gt;
&lt;p&gt;As for my ancestry, I didn't get swapped at birth. The DNA matches it produced are correct, from both sides of the family (calculated by chromosomes because this is how inheritance works), but the ancestry is different from what I was expecting. My family is Slavic, to be precise: West and South Slavs. In Ancestry.com instead of Czechia, it got a lot of Southern Poland. It also threw out some similarities in their model with Germanic Europe, Baltic, Sweden and Denmark, then a bit of Norway. MyHeritage used a different model because it has different groups and has different samples. They placed my ancestry correctly in Czechia, but also found some similarities with Greek and Italian groups, Scandinavian, Iberian and Finnish. Apparently the families migrated from the north towards the south of Europe. Can't really blame them. My path was going back and a bit west. I'm in Ireland now and I love the climate here. I even got the citizenship just a few days ago ☘ Something to mess up the static image of ancestry once again :)&lt;/p&gt;
</summary></entry><entry><title>Way Away</title><link href="http://www.offsetlab.net/way-away/" rel="alternate"/><updated>2023-06-05T14:31:26+00:00</updated><id>http://www.offsetlab.net/way-away/</id><summary type="html">&lt;p&gt;We picked up wanderlust some six years ago when we were traveling to Australia. There's no way we'll see all the countries in the world during our lifetime, but there's a strong chance we'll succeed in seeing all of Europe's. Humans often focus on wrong things. Our apartment could burn down, but we would move on. Material things are not that important. It's important that we have each other. But we are lucky enough that our fundamental needs have been met at this point in time so we have some space to pursue our desires.&lt;/p&gt;
&lt;p&gt;I wasn't writing for a while since we were away from home for a month and a half. I was called to an off-site in Panama and an on-site in New York was planned to be soon after. We chose to take our holidays in between so we didn't have to do two transatlantic flights. Planes are leaving a substantial carbon footprint as is. We saw a fair chunk of Mexico and Caribbean as well. The trip was long and enjoyable, but I can say Aegean islands do beat the Caribbean in terms of what you can see. It's hard to pack a lot in limited time, and the cultural sites, which we prefer to visit, are more tightly packed in the former.&lt;/p&gt;
&lt;p&gt;As for the nature, Yucatan peninsula is full of &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Cenote"&gt;cenotes&lt;/a&gt; that are a sight to be seen. The time we spent in Mexico was the top experience of our journey. It had some nice natural and historical sites. From ancient Mayan ruins, to reefs and groundwater pools.&lt;/p&gt;
&lt;p&gt;Our first flight was from Dublin to Madrid, for a long layover towards Panama City. We saw the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Panama_Canal"&gt;Panama canal&lt;/a&gt; and the city itself. The work was exhausting, trying to get a new feature off the ground within a very tight deadline is always hard, but I got to see people I hadn't seen in a while. For Panama we also opted to get vaccinated. Our bodies are not really used to the conditions there. The vaccination went well and some protections we took (DTP, Hep A and Typhoid) will last a long time. This will be useful for us in the future.&lt;/p&gt;
&lt;p&gt;After Panama, we went to Cancún. It was a mixture of nature and history. We saw the city itself because we had accommodation near the center. It's not a very walkable city, and we're not car people, but it does have good public transport. We jumped off to some guided tours towards Chichén Itzá and Tulum. We admired the Mayan architecture and took a dip in the sea and some sinkholes, which made me want to start a scuba course one day.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/tulum.jpg" class="img-responsive center-block" src="/media/images/tulum.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;After Cancún, we went to Orlando as our jumping off point to the islands. We had some mean tostadas over there that we immediately tried to replicate back home. Those tostadas and the Colombian empanadas we had in Panama were two food items that we enjoyed the most. The rest of our culinary experience ranged from average to sadly subpar, and left us with the impression that vegan scene in North America is just not that developed yet. The highlight in Orlando was the Universal Studios amusement park. We managed to go to all the adrenaline rides that we wanted.&lt;/p&gt;
&lt;p&gt;The Caribbean islands/territories/countries we visited from Orlando were the US Virgin Islands, Saint Martin (both French and Dutch parts), Antigua and Barbuda, Dominican Republic and Puerto Rico. The culture over there is diverse and influenced by the previous colonialism era and dramatic historical overturns. We enjoyed some historical sites and the cities themselves. It was a long round trip that took us back to Orlando again.&lt;/p&gt;
&lt;p&gt;Back in Orlando, we decided to stay for a few days before traveling for the New York on-site. The US is still expensive as is, but Orlando is cheaper than New York. We went to see the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Kennedy_Space_Center"&gt;Kennedy Space Center&lt;/a&gt; and all the US space program exhibitions. We got to fondle a moon rock sample. We did miss an actual rocket launch, because it got postponed so many times. Eventually we packed our bags (that were not many because we always travel light) and flew to New York.&lt;/p&gt;
&lt;p&gt;In New York it was the usual on-site work, the combination of rooftop bars that the company usually goes for and an evening of personal time that we used to see the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/30_Hudson_Yards"&gt;Edge skydeck&lt;/a&gt; and Manhattan from a higher vantage point. By then we were getting homesick and were looking forward to going back to Dublin.&lt;/p&gt;
&lt;p&gt;Those first days at home were us just trying to catch up, wash all our clothes, get things in order. I had my hair cut a bit, installed a bug net on the balcony. We were getting ready to spend a summer at home. As luck would have it, less than two weeks after we came back, I got laid off together with around a third of the company. I really strive not to obsess over things I can't control. After all, the job market situation is very bad recently, especially in IT. Layoffs are happening all over the world.&lt;/p&gt;
&lt;p&gt;Right now I'm out there on the job market, as well as doing some personal stuff. Losing a job really messes with one's head. Looking for a job is not helping it. Constant impostor syndrome, questioning self-worth, being worried all the time. I feel like this is not talked about enough. Life goes on, really. Time stops for nobody.&lt;/p&gt;
&lt;p&gt;P.S. While I was writing this, my citizenship application got approved so I guess there's some more bureaucracy in that department. Time indeed does not stop for anybody and tends to be very turbulent. :)&lt;/p&gt;
</summary></entry><entry><title>Convert KML Placemarks to Zones for Home Assistant with Python</title><link href="http://www.offsetlab.net/convert-kml-placemarks-to-zones-for-home-assistant-with-python/" rel="alternate"/><updated>2023-03-05T12:53:19+00:00</updated><id>http://www.offsetlab.net/convert-kml-placemarks-to-zones-for-home-assistant-with-python/</id><summary type="html">&lt;p&gt;I have a habit of tracking the places we've been to in &lt;a class="reference external" href="https://www.google.com/earth/about/versions/#earth-pro"&gt;Google Earth Pro&lt;/a&gt;. I have a list of folders that are named after countries and, inside them, a list of places that we've been to. Sure, I can export to a KML/KMZ format but Google Maps refuses to load the file because of the size. I would also like to display the places in the &lt;a class="reference external" href="https://www.home-assistant.io/"&gt;Home Assistant&lt;/a&gt;, but there's no easy way and I really don't want to over-engineer this.&lt;/p&gt;
&lt;p&gt;Home Assistant is self-hosted and I can control it, so I decided to whip up a quick script in Python to help me accomplish seeing the places in Home Assistant.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;I opened Google Earth and selected all the places, then exported them to a KML file that I called &lt;cite&gt;places.kml&lt;/cite&gt;. I saved it to a location where I put the Python script.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/google-earth-places.png" class="img-responsive center-block" src="/media/images/google-earth-places.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;The script is in a file called &lt;cite&gt;kml2zones.py&lt;/cite&gt; and safely nested in a virtual environment on Python 3.10.x. I installed the requirements with &lt;cite&gt;pip&lt;/cite&gt; (&lt;a class="reference external" href="https://pythonhosted.org/pykml/"&gt;pykml&lt;/a&gt; and &lt;a class="reference external" href="https://pyyaml.org/"&gt;PyYAML&lt;/a&gt;) and ran the script &lt;cite&gt;python kml2zones.py&lt;/cite&gt; which in turn output the &lt;cite&gt;zones.yaml&lt;/cite&gt; file in the same folder. Here are the contents:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code literal-block"&gt;
from pykml import parser
from yaml import dump

# load kml into object
with open(&amp;quot;places.kml&amp;quot;) as f:
    root = parser.parse(f).getroot()

# iterate through the kml,
# extract what is needed in to a dict,
# then append that dict to to the list
data = []
for country in root.Folder.Folder:
    for placemark in getattr(country, &amp;quot;Placemark&amp;quot;, []):
        try:
            coordinates = str(placemark.Point.coordinates).split(&amp;quot;,&amp;quot;)
        except Exception:
            coordinates = str(placemark.MultiGeometry.Point.coordinates).split(&amp;quot;,&amp;quot;)
        data.append({
            &amp;quot;name&amp;quot;: str(placemark.name),
            &amp;quot;latitude&amp;quot;: float(coordinates[1]),
            &amp;quot;longitude&amp;quot;: float(coordinates[0]),
        })

# dump the list to a yaml format file
with open(&amp;quot;zones.yaml&amp;quot;, &amp;quot;w&amp;quot;) as f:
    dump(data, f)
&lt;/pre&gt;
&lt;ol class="arabic simple" start="3"&gt;
&lt;li&gt;I copied over the &lt;cite&gt;zones.yaml&lt;/cite&gt; to the Home Assistant configuration folder and edited the &lt;cite&gt;configuration.yaml&lt;/cite&gt; in it to have: &lt;cite&gt;zone: !include zones.yaml&lt;/cite&gt; at the end, then I restarted the Home Assistant.&lt;/li&gt;
&lt;li&gt;I planned to load them in the &lt;a class="reference external" href="https://www.home-assistant.io/dashboards/map/"&gt;Map card&lt;/a&gt;, but that card accepts only a list of entities which are generated from zones when the Home Assistant loads. I got the list of entities with &lt;cite&gt;Developer Tools&lt;/cite&gt; in Home Assistant. Under &lt;cite&gt;Template&lt;/cite&gt;, I put the following:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code literal-block"&gt;
{% for item in states | map(attribute='entity_id') | list %}{% if item.startswith(&amp;quot;zone&amp;quot;) %}
  - entity: {{ item }}{% endif %}{% endfor %}
&lt;/pre&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/home-assistant-template-zones.png" class="img-responsive center-block" src="/media/images/home-assistant-template-zones.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Good enough of that black magic, except the first result in the list which I had to indent manually. I copied the entities.&lt;/p&gt;
&lt;ol class="arabic simple" start="5"&gt;
&lt;li&gt;I created a new tab on the dashboard with only one card so it expands, the type was Map, I added two zones in visual editor, as well as set the zoom to 3, then switched over to the code editor. This showed me how I wanted it to look like.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/home-assistant-map-card.png" class="img-responsive center-block" src="/media/images/home-assistant-map-card.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;ol class="arabic simple" start="6"&gt;
&lt;li&gt;I removed those two zones under entities and in their place put the clipboard content obtained from step 4. Then I searched for the ones that I had from before in that list that are not from the &lt;cite&gt;zones.yaml&lt;/cite&gt; (like &lt;cite&gt;zone.home&lt;/cite&gt; or the local stores that I previously had saved in the Home Assistant database) and removed them. I finished editing the card.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/home-assistant-map.png" class="img-responsive center-block" src="/media/images/home-assistant-map.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;That's pretty much it. It really shows how it's easy to do things with Python.&lt;/p&gt;
&lt;p&gt;As of this moment, I did a number of small stupid scripts for doing various things. Some of them grew into a full fledged service like &lt;a class="reference external" href="https://mellow.offsetlab.net/"&gt;Mellow&lt;/a&gt;. Mellow was more an opportunity to play with what &lt;a class="reference external" href="https://aws.amazon.com/"&gt;AWS&lt;/a&gt; has to offer than anything else. The &lt;cite&gt;kml2zones.py&lt;/cite&gt; could maybe be converted into a service as well but I cannot be bothered and, what's more likely, people would not really use it, but it is there if someone wants to nibble on it and help themselves. Even executing it without a file, through REPL itself.&lt;/p&gt;
&lt;p&gt;Some of the scripts I did end up as a snippet, some of them as a repository. Of the top of my head I made:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/mellow-trello-to-coggle-converter/"&gt;Mellow&lt;/a&gt; - the conversion from Trello board to Coggle mind map&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/convert-kml-placemarks-to-zones-for-home-assistant-with-python/"&gt;kml2zones.py&lt;/a&gt; - the conversion from KML file to zones.yaml for Home Assistant&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/displaying-geotagged-photos-on-google-earth-with-python/"&gt;geotag-gallery&lt;/a&gt; - making a KML file with placemarks from photos and tagging them with convolution AI results&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://bitbucket.org/zmasek/led-morse/"&gt;led-morse&lt;/a&gt; - blinking LED light on Arduino in a Morse code&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/shamrock-a-trefle-api-library-for-plant-data/"&gt;Shamrock&lt;/a&gt; - getting plant data from a 3rd party service.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Probably more. Writing those things is easy and the possibilities are endless.&lt;/p&gt;
&lt;p&gt;The script in this article is an example of how things can be done quick and dirty if one only wants to invest a bit of time. I remember seeing some videos of people &lt;a class="reference external" href="https://www.youtube.com/watch?v=7Y8Ppin12r4"&gt;using Python as a scripting language&lt;/a&gt; much like a macro in an operating system. It would open browser, start some pages, click through some of the options and so on. Generally automating a plethora of mundane tasks. I'm sure people could utilize it in their own life, too.&lt;/p&gt;
</summary></entry><entry><title>Room-Level Presence Tracking</title><link href="http://www.offsetlab.net/room-level-presence-tracking/" rel="alternate"/><updated>2023-02-27T19:25:19+00:00</updated><id>http://www.offsetlab.net/room-level-presence-tracking/</id><summary type="html">&lt;p&gt;While ordering PC components, I also ordered &lt;a class="reference external" href="https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/"&gt;Raspberry PI Zero 2 W&lt;/a&gt;. Ideally I'd have one more so I can have three and a proper &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Paxos_(computer_science)"&gt;Paxos&lt;/a&gt; distribution, but they are notoriously difficult to obtain these days. In the end I used my original PI 4 and Zero 2 W to create a two-node system for room level presence detection. The third one will have to wait so I might go for it this year if it turns available.&lt;/p&gt;
&lt;p&gt;I installed Raspbian on the PI Zero 2 W and connected it to the network. Then I made the IP static on the router so it's not changing anymore. The same is done for the Raspberry PI 4, but in reality, all the devices that are our own have a static IP in the network. It's easier to address them and the configuration is not always catering to the dynamic ones.&lt;/p&gt;
&lt;p&gt;The project I used was &lt;a class="reference external" href="https://www.room-assistant.io/"&gt;room-assistant&lt;/a&gt; and I installed it to both devices via &lt;a class="reference external" href="https://www.docker.com/"&gt;Docker&lt;/a&gt;. PI Zero 2 W only has room-assistant, and the PI 4 has &lt;a class="reference external" href="https://mosquitto.org/"&gt;Mosquitto&lt;/a&gt;, Home Assistant and Room Assistant. The Room Assistant describes that you should have &lt;cite&gt;local.yml&lt;/cite&gt; configuration and mine is as follows on PI 4:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
global:
  instanceName: &amp;quot;Living Room&amp;quot;
  integrations:
    - homeAssistant
    - bluetoothLowEnergy
cluster:
  autoDiscovery: false
  weight: 2
  port: 6425
  peerAddresses:
    - &amp;lt;IP_v4 of the Raspberry PI Zero 2 W&amp;gt;:6425
homeAssistant:
  mqttUrl: &amp;quot;mqtt://&amp;lt;IP_v4 of the Raspberry PI 4&amp;gt;:1883&amp;quot;
  mqttOptions:
    username: &amp;lt;mqtt username&amp;gt;
    password: &amp;lt;mqtt password&amp;gt;
bluetoothLowEnergy:
  maxDistance: 20
  allowedlist:
    # bluetooth mac of the device you want to track,
    # for example, phone. There's a chance LE physical address
    # is rotated, if that's the case, you can go into
    # Home Assistant Android app, go under:
    # Settings -&amp;gt; Companion App -&amp;gt; Manage Sensors -&amp;gt; BLE Transmitter
    # and enable it, the format will be
    # UUID_WITHOUT_DASHES-major-minor
    - 112233445566
&lt;/pre&gt;
&lt;p&gt;PI Zero 2 W has the &lt;strong&gt;same&lt;/strong&gt; configuration file, but with a different &lt;cite&gt;instanceName&lt;/cite&gt; (being in bedroom), &lt;cite&gt;weight&lt;/cite&gt; of 1 so it's not picked as the leader if possible (the higher the number, the bigger the chance it will be the leader, and also that's why I'd like to have three devices at least - Paxos, remember), &lt;cite&gt;peerAddresses&lt;/cite&gt; has the IP of the Raspberry PI 4, but the rest are the same as the configuration above. Be sure to change the values where they are required.&lt;/p&gt;
&lt;p&gt;As for the Mosquitto, it's an MQTT broker that is coming recommended for Home Assistant use. Room Assistant detects a Bluetooth device, then sends a message to the queue. After that, the Home Assistant picks it up.&lt;/p&gt;
&lt;p&gt;I am not very happy with the devices reporting their location. It would depend on the load of the device and the quality as well. I tried using &lt;cite&gt;bluetoothClassic&lt;/cite&gt; integration at first, but switched to &lt;cite&gt;bluetoothLowEnergy&lt;/cite&gt; because it was more accurate. Still, I think I might have to change the devices themselves since the signal drops, or investigate more into it to tweak the configuration. The walls will also affect this.&lt;/p&gt;
&lt;p&gt;On the other side, once the Home Assistant picks up the integration, all that is left is to detect the presence. The integration makes sensors out of your devices, for example: &lt;cite&gt;sensor.fairphone_3_ble_room_presence&lt;/cite&gt;. To get it into automations, it's the easiest to create the template automation trigger somewhat like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
{{ is_state(&amp;quot;sensor.fairphone_3_ble_room_presence&amp;quot;, &amp;quot;Living Room&amp;quot;) }}
&lt;/pre&gt;
&lt;p&gt;When the above triggers the automation, the action can follow. For instance, turn off the lights in the other parts of the apartment, start home theater if it's evening, things like that... That said, I'll keep using it and see if I can improve on it.&lt;/p&gt;
</summary></entry><entry><title>2022 Recap</title><link href="http://www.offsetlab.net/2022-recap/" rel="alternate"/><updated>2023-01-16T19:12:40+00:00</updated><id>http://www.offsetlab.net/2022-recap/</id><summary type="html">&lt;p&gt;The year was filled with good things and the bad. Mostly good. It's hard to complain looking back. After all, we did more than expected.&lt;/p&gt;
&lt;p&gt;I am keeping my publishing frequency of once a month, but like I said before, I lost some of the data when the SSD failed along with a plethora of components so the two consecutive articles were done late December. The restrictions were loosened up so we got to travel, but I miss just staying at home in a way. I also published &lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Cuply&lt;/a&gt; in the Summer but need to come back to it to see it in action this year and iron out any kinks.&lt;/p&gt;
&lt;p&gt;Moving on to the recap. A friend said that revenge traveling was trending. Being holed up during the pandemic meant that we saved enough money. Coupled with some additional planning meant that we didn't waste our days off. Usually our trips are self-organized and follow a bit of a template, we prefer to take accommodation near the city centre, and then rely on hop-on-hop-off buses and free walking tours to get a better sense of the space and history.&lt;/p&gt;
&lt;p&gt;Trips:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Poland (Krakow, Auschwitz, Wieliczka salt mine, a lot of it was focused on what happened during the WW2, but we definitely found time for vodka tasting)&lt;/li&gt;
&lt;li&gt;Croatia (back home, Zagreb and Papuk nature park)&lt;/li&gt;
&lt;li&gt;Hungary (Budapest, saw some friends from Ireland that were visiting their family)&lt;/li&gt;
&lt;li&gt;Austria (Vienna, the capital of the old Austro-Hungarian empire that Croatia was a part of)&lt;/li&gt;
&lt;li&gt;Slovakia (Bratislava, the last destination of our trifecta trip; in retrospect it would've been great if we had the time to visit the cities traveling via Danube, as all three are on it, but it was still great. The architecture is very familiar in the remnants of the empire)&lt;/li&gt;
&lt;li&gt;Spain (Valencia, a futuristic looking city that reminds us of the Star Trek's San Francisco version, with a lot of green surfaces converted from the old dried up river bed)&lt;/li&gt;
&lt;li&gt;Spain (Barcelona, visiting a work colleague)&lt;/li&gt;
&lt;li&gt;Andorra (Andorra la Vella, while visiting Barcelona, it was an opportunity to visit this snowbound microstate)&lt;/li&gt;
&lt;li&gt;France (Ax-les-Thermes, all part of the same day trip from Barcelona)&lt;/li&gt;
&lt;li&gt;USA (Boston, Somerville, New York, visiting for work and an opportunity to see another continent. Saw four out of five boroughs in NYC, a neighborhood music festival in Somerville and took some lovely tours in Boston)&lt;/li&gt;
&lt;li&gt;Switzerland (Zürich, long layover towards Greece, we plan to come back)&lt;/li&gt;
&lt;li&gt;Greece (Athens, Volos, Rhodes, Santorini, Mykonos, Delos, visiting the islands)&lt;/li&gt;
&lt;li&gt;Turkey (Istanbul, Kusadasi, and a bit of Turkey which is very European, well, at least the parts we were at, and Istanbul is magnificent)&lt;/li&gt;
&lt;li&gt;France (Paris, Versailles, a trip with Vesna's parents)&lt;/li&gt;
&lt;li&gt;Spain (Tarragona, to see this old Roman Empire city with all the accompanying ruins, then Barcelona, visiting for work, this time saw the inside of Sagrada Familia)&lt;/li&gt;
&lt;li&gt;USA (New York, and work again, and some other vistas, the Wicked musical in Gershwin theater on Broadway and the last borough which was Bronx, where we visited the botanical gardens)&lt;/li&gt;
&lt;li&gt;Romania (Brasov, Bucharest, Sibiu, Sinaia, visiting castles, all the gothic and vampire things. Carpathian mountains are beautiful, and Peles Castle is an amazing modern castle)&lt;/li&gt;
&lt;li&gt;Croatia (back home and Zagreb again)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for domestic travel, a couple of friends came over so we revisited the usual spots in Dublin and around our place, as well as finally went on a tour of the cemetery. My parents visited at one point so that was a blast, too. However, we did some domestic travel outside of Dublin, too, taking a road trip with friends:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Derry in Northern Ireland (a quick visit on a rainy day)&lt;/li&gt;
&lt;li&gt;Malin Head (the northernmost point of the island)&lt;/li&gt;
&lt;li&gt;Glenveagh (the national park)&lt;/li&gt;
&lt;li&gt;Slieve League (beyond amazing vistas, we took a boat ride as well)&lt;/li&gt;
&lt;li&gt;Ballyshannon (a small trip around the city)&lt;/li&gt;
&lt;li&gt;Marble Arch Caves in Northern Ireland (going underground with all the stalactites and stalagmites)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/slieve-league.jpg" class="img-responsive center-block" src="/media/images/slieve-league.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Concerts and events:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Oh_Wonder"&gt;Oh, Wonder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of things we bought:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B08Q3QM3SY/"&gt;Grow light&lt;/a&gt; for the plants which worked with a pump for the plants to survive in the tub while we were away on one occasion&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B0743FNXK5/"&gt;ESP32 feather board&lt;/a&gt; for the automation of the standing desk&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07D37VDM3/"&gt;Aqara door and window sensors&lt;/a&gt; for turning of the heating if the room is ventilating&lt;/li&gt;
&lt;li&gt;D&amp;amp;D things, books, papers, inks...&lt;/li&gt;
&lt;li&gt;3D printing safety equipment and miniature painting equipment&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07RCXXWYB/"&gt;Cocktail making set&lt;/a&gt; and then some metal straws and picks&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07FDQB5P5/"&gt;Bluetooth speaker&lt;/a&gt; for the bathroom. Unfortunately it's not that smart to be always on, but works&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B08KVYD7DK/"&gt;Soldering iron kit&lt;/a&gt; for working on the &lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Cuply&lt;/a&gt; project&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Life_Is_Strange#Comics"&gt;Life is Strange&lt;/a&gt; comic set, so I've read a bit this year&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07W7LDV7K/"&gt;Logitech Z407 PC speakers&lt;/a&gt; because the old ones died and I couldn't repair them. I'm not on that level yet&lt;/li&gt;
&lt;li&gt;New backpacks for Vesna and I, a picnic blanket and travel pillows&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B0B2QS77D2/"&gt;Zemismarat curtain motor&lt;/a&gt; because I got tired of waiting for the IKEA to release a fitting item... that and the old curtain nearly fell on my head because the old axis got worn down&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B087DFFJRD/"&gt;External Samsung SSD&lt;/a&gt; for backing up things locally&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B077Y84X67/"&gt;Tefal deep fat fryer&lt;/a&gt; because our local fast food joint closed down and we were panicking&lt;/li&gt;
&lt;li&gt;Kitchen utensils and replacing/repairing things in the apartment&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/1785043765/"&gt;This is Vegan Propaganda&lt;/a&gt; book I got from Vesna and I highly recommend it&lt;/li&gt;
&lt;li&gt;New poster covers&lt;/li&gt;
&lt;li&gt;Bathroom curtain&lt;/li&gt;
&lt;li&gt;Raspberry PI Zero 2 W&lt;/li&gt;
&lt;li&gt;Desktop PC components that died (CPU, PSU, Cooler, MoBo, RAM)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other important events:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Got a confirmation that my citizenship application was being processed, but it will probably take another year and a half from the time of this writing&lt;/li&gt;
&lt;li&gt;PC died, but managed to repair it&lt;/li&gt;
&lt;li&gt;Contracted COVID-19 most likely while traveling from France&lt;/li&gt;
&lt;li&gt;Started wall climbing, seems it will stick and we need to get fit&lt;/li&gt;
&lt;li&gt;Finished hydroponics, i.e. the Cuply project&lt;/li&gt;
&lt;li&gt;Didn't draw, but must do something this year&lt;/li&gt;
&lt;li&gt;Played some games, but only finished &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ori_and_the_Will_of_the_Wisps"&gt;Ori and the Will of the Wisps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read some comic books and books: Life is Strange, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Persepolis_(comics)"&gt;Persepolis&lt;/a&gt;, This is Vegan Propaganda&lt;/li&gt;
&lt;li&gt;Got into cocktail mixing&lt;/li&gt;
&lt;li&gt;Reminded myself we're getting older&lt;/li&gt;
&lt;li&gt;Got back to planning trips&lt;/li&gt;
&lt;li&gt;Didn't ride the scooters, but need to do something about it this year&lt;/li&gt;
&lt;li&gt;Started 3D printing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right now it's back to planning out this year and making some resolutions yet again.&lt;/p&gt;
</summary></entry><entry><title>Last of the Season</title><link href="http://www.offsetlab.net/last-of-the-season/" rel="alternate"/><updated>2022-12-31T21:33:13+00:00</updated><id>http://www.offsetlab.net/last-of-the-season/</id><summary type="html">&lt;p&gt;The temperature finally stabilized in the apartment. We got some things cleaned up and met up with some friends for a pint or three. Right now we're waiting to play another N7 session, but no go so far. The fireworks outside make our friends' dog scared so I'm writing a bit.&lt;/p&gt;
&lt;p&gt;We made a cocktail for tonight, another vegnog variant.&lt;/p&gt;
&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3" style="color: black;"&gt;Vegnog&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/vegnog.jpg" alt="Vegnog"/&gt;
    &lt;p class="summary"&gt;It comes in two parts. The ingredients are as follows with the first component being infused then added to the rest and blended away.&lt;/p&gt;
    &lt;h5 style="color: black;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;3&lt;/span&gt;
            &lt;span class="type"&gt;cups&lt;/span&gt; oat milk
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;6&lt;/span&gt;
            &lt;span class="type"&gt;tbsp&lt;/span&gt; brown sugar
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;4&lt;/span&gt;
            &lt;span class="type"&gt;pods&lt;/span&gt; cardamom
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;pinch&lt;/span&gt; saffron
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;pieces&lt;/span&gt; clove
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;piece&lt;/span&gt; star anise
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1 1/2&lt;/span&gt;
            &lt;span class="type"&gt;cups&lt;/span&gt; spiced rum
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; plant based whipped cream
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1/4&lt;/span&gt;
            &lt;span class="type"&gt;tsp&lt;/span&gt; ground cinnamon
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1/2&lt;/span&gt;
            &lt;span class="type"&gt;tsp&lt;/span&gt; vanilla extract
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;pinch&lt;/span&gt; ground nutmeg
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: black;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Put 1 cup of oat milk, brown sugar, cardamom pods, saffron, cloves and star anise in a saucepan and heat up for it to infuse. After it's done, let it cool and remove the solids. Then add the infused milk with the rest of the ingredients in a blender and blend for a minute until it becomes frothy. Let it cool in a refrigerator for later. Drink responsibly.
    &lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Happy New Year!&lt;/p&gt;
</summary></entry><entry><title>The News of Our Death Have Been Greatly Exaggerated</title><link href="http://www.offsetlab.net/the-news-of-our-death-have-been-greatly-exaggerated/" rel="alternate"/><updated>2022-12-30T16:26:19+00:00</updated><id>http://www.offsetlab.net/the-news-of-our-death-have-been-greatly-exaggerated/</id><summary type="html">&lt;p&gt;But our PC died and some drafts with it, so I didn't publish anything last month.&lt;/p&gt;
&lt;p&gt;It was a painful experience trying to get the new components and checking out the extent of damage. Suffice to say, I managed to cannibalize the old PC and augment what I could with a solid hit on our wallet. The delivery was a nightmare and it took weeks to sort it out. Some issues are still ongoing.&lt;/p&gt;
&lt;p&gt;The new rig was assembled just a few hours before our flight to Croatia. I couldn't do anything but wait until we came back.&lt;/p&gt;
&lt;p&gt;We spent approximately a month in Croatia, working, visiting friends and spending time with family, but it was enough to start missing Ireland quite a lot. After all, our lives and routine are centered around that small piece of the planet.&lt;/p&gt;
&lt;p&gt;Going forward, I need to set up better accessibility to the server, a better backup and a contingency plan... For watering the plants. Luckily there was no damage as the biological processes in plants slowed down so they didn't require water as much. We were also worried about the freezing weather breaking the water containers on the balcony left over from 3D printing, but it was all fine.&lt;/p&gt;
&lt;p&gt;We came to an empty apartment. Everything was seemingly in order. We hit the store to get some food. We didn't even manage to unpack. That will happen today. I turned on the heating remotely before arrival but one of the radiators needed to be bled so it took longer than expected for room temperature to climb. It's finally OK at the time of this writing.&lt;/p&gt;
&lt;p&gt;I'll publish something tomorrow as well just to keep my publishing frequency at least 12 times a year. For what is worth, we're alive, well and back.&lt;/p&gt;
</summary></entry><entry><title>Drawing Setup</title><link href="http://www.offsetlab.net/drawing-setup/" rel="alternate"/><updated>2022-10-28T21:26:25+00:00</updated><id>http://www.offsetlab.net/drawing-setup/</id><summary type="html">&lt;p&gt;Temperature is dropping in the northern hemisphere again. With the looming energy crisis, some people worry about heating. It's not that dire, though. Ireland is not reliant on the rest of the EU's infrastructure and the temperature oscillations are mild, too. There are no reductions, but the costs are rising. The situation is such that people keep warning the politicians against allowing so many datacenters in Ireland because the infrastructure can't support it. There's a concern this might lead to potential black-outs.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Cuply&lt;/a&gt; project was written about so it's time for me to take a short break from it. Even though it's hard for me not to come back. I believe it not to be finished so I will keep revisiting it to make sure it works properly. The bad weather keeps me at bay. Winter is approaching and we aren't on the balcony anymore so no hardware bits are done at the moment, only what's on the desk in front of me. I'm thinking about having a PCB for it, but need to figure out how to approach it. With the winter, again, we're slowly going into hibernation as well, so most of the things we do will happen indoors.&lt;/p&gt;
&lt;p&gt;It is high time for me to kick myself into drawing and painting again. I guess it was a hectic beginning of the year and I cannot catch a break. We traveled (and still travel) a lot which I'll mention in the recap. I can tell that with all the travel, it was difficult to carry out things I had planned out, like Cuply. We did minor fixes in the apartment and rearranged priorities. So many things to do, so little time.&lt;/p&gt;
&lt;p&gt;To kick off the painting, I decided to write this article. I got to have enough time this year to do things in spite of the distractions. The following paragraphs will describe my drawing setup.&lt;/p&gt;
&lt;p&gt;I do things at the &lt;a class="reference external" href="https://www.ikea.com/ie/en/p/idasen-desk-sit-stand-brown-beige-s79280917/"&gt;standing desk&lt;/a&gt; that goes up twice a day for an hour and a half. I automated that with &lt;a class="reference external" href="https://www.amazon.co.uk/Adafruit-HUZZAH32-ESP32-Feather-Board/dp/B0743FNXK5"&gt;ESP32 board&lt;/a&gt;. I can say that more focus comes from sitting, but I can't afford sitting all the time. I am not getting any younger and seldom do exercise (aside from the wall climbing which seems to be getting more frequent). This is at least countering the sedentary way of living. On the desk there's one 24&amp;quot; DELL U2413 monitor on the &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B00AUTTBPQ/"&gt;monitor arm&lt;/a&gt; so I can move it around should I have to. There's the standard keybord-mouse combination and a set of speakers on the desk, but they are not that important for drawing. The monitor arm is important since I have more space to work with.&lt;/p&gt;
&lt;p&gt;The traditional drawing happens with a set of pencils (usually on the dark side with B2 being the most common), blending stumps, regular and kneaded erasers, some technical pens for inking and a small sketchbook. Sometimes I go for a specialty charcoal pens, but they're not used often in my repertoire. I can always display references on the big screen and, when done, scan things in with the scanner system behind me (HP 4130 doing a vendor lock-in) which is enough for home use.&lt;/p&gt;
&lt;p&gt;I also hope to start with traditional painting of minis and I'll have more to say on that topic once I actually get to it. I'd need to use a spray paint primer, which is impossible to do indoors, but for the brushwork, I'll pretty much spend most of the time at the same desk. The only difference being one silicone mat so the paint doesn't spill on the desk surface.&lt;/p&gt;
&lt;p&gt;When doing things digitally, which is my preferred method, I use a small &lt;a class="reference external" href="https://www.wacom.com/en-cn/products/pen-displays/cintiq-13-hd"&gt;Wacom Cintiq&lt;/a&gt; graphics tablet. It has all the usual pen gestures, from tilt (which is invaluable to have) to pressure. I also have a &lt;a class="reference external" href="https://www.amazon.co.uk/Logitech-Bluetooth-Illuminated-Keyboard-K810/dp/B00969DKNU"&gt;bluetooth keyboard&lt;/a&gt; for hitting all the keyboard shortcuts from wherever it's comfortable. I use a combination of &lt;a class="reference external" href="https://www.painterartist.com/en/"&gt;Corel Painter&lt;/a&gt; and &lt;a class="reference external" href="https://krita.org/en/"&gt;Krita&lt;/a&gt; applications of which I had a &lt;a class="reference external" href="https://krita.org/en/item/creating-a-python-plugin-for-krita-guest-article-by-zlatko-masek/"&gt;guest article on a slicing Python plug-in on Krita's blog&lt;/a&gt;. There are also &lt;a class="reference external" href="https://lazynezumi.com/"&gt;Lazy Nezumi Pro&lt;/a&gt; and &lt;a class="reference external" href="https://pureref.com/"&gt;PureRef&lt;/a&gt; to help me out with the workflow.&lt;/p&gt;
&lt;p&gt;There's one more thing and that's the ImgRef browser extension that I had Vesna do. It helps immensely with finding reference images for the finished work. A multi-page search. I'll have to poke her to publish the code.&lt;/p&gt;
</summary></entry><entry><title>Cuply - Hydroponics Greenhouse Cabinet Powered by Django Channels and Arduino - Conclusion</title><link href="http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-conclusion/" rel="alternate"/><updated>2022-09-30T22:10:59+00:00</updated><id>http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-conclusion/</id><summary type="html">&lt;p&gt;I'm in the process of making a greenhouse out of a glass cabinet that sits on our balcony. Inside it, there's to be a plethora of sensors and actuators hooked up to &lt;a class="reference external" href="https://store.arduino.cc/products/arduino-due"&gt;Arduino Due&lt;/a&gt; microcontroller, which is in turn connected to an old &lt;a class="reference external" href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;. The software stack is &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; with &lt;a class="reference external" href="https://channels.readthedocs.io/en/latest/"&gt;Channels&lt;/a&gt; in the back-end, and &lt;a class="reference external" href="https://reactjs.org/"&gt;React&lt;/a&gt; with some &lt;a class="reference external" href="https://d3js.org/"&gt;D3&lt;/a&gt; in the front-end. It was a project long time in development, and this series of articles will explore it from the inception to the latest product.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/"&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-back-end/"&gt;Back-end&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-front-end/"&gt;Front-end&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-conclusion/"&gt;Conclusion&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The devil is in the details. Right now the system works, but as with all long-running projects, this one will need some time to see if it's viable. As of time of this writing, there are contacts loose and the relays are breaking down sometimes. I need to tighten up the contacts and stop using the breadboard which was a proof of concept anyway. Moving on from prototyping into a real product will mean that I need to sit down and start soldering on the connections. With all the #revengetravel happening, I was putting it off for quite some time.&lt;/p&gt;
&lt;p&gt;Making Cuply pretty will mean that the mechanism will get enclosed in a proper box where I can only have the necessary connections sticking out. For power, communication and sensors. I will utilize &lt;a class="reference external" href="/3d-printer-shenanigans/"&gt;3D printer mentioned before&lt;/a&gt; for some of the stuff.&lt;/p&gt;
&lt;p&gt;At the moment, &lt;a class="reference external" href="https://github.com/zmasek/cuply"&gt;Cuply code lives in the repository online&lt;/a&gt;, but I need to clean it up and write up some documentation. With all that has been happening this summer, it was hard to keep up. Things are flowing if nothing. Not overflowing :)&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-water-flow.png" class="img-responsive center-block" src="/media/images/cuply-water-flow.png" /&gt;
</summary></entry><entry><title>Cuply - Hydroponics Greenhouse Cabinet Powered by Django Channels and Arduino - Front-end</title><link href="http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-front-end/" rel="alternate"/><updated>2022-08-18T20:11:13+00:00</updated><id>http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-front-end/</id><summary type="html">&lt;p&gt;I'm in the process of making a greenhouse out of a glass cabinet that sits on our balcony. Inside it, there's to be a plethora of sensors and actuators hooked up to &lt;a class="reference external" href="https://store.arduino.cc/products/arduino-due"&gt;Arduino Due&lt;/a&gt; microcontroller, which is in turn connected to an old &lt;a class="reference external" href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;. The software stack is &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; with &lt;a class="reference external" href="https://channels.readthedocs.io/en/latest/"&gt;Channels&lt;/a&gt; in the back-end, and &lt;a class="reference external" href="https://reactjs.org/"&gt;React&lt;/a&gt; with some &lt;a class="reference external" href="https://d3js.org/"&gt;D3&lt;/a&gt; in the front-end. It was a project long time in development, and this series of articles will explore it from the inception to the latest product.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/"&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-back-end/"&gt;Back-end&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-front-end/"&gt;Front-end&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This summer I set out to work on Cuply so I containerized the thing and set up the Raspberry Pi to house the project. I destroyed one SD card in the process but it's still working with the old one. Just a bit too cramped for my liking. When setting up the hardware I did some soldering (for which I bought the soldering iron) for the relay contraption. I tested out the pumps, checked for  leaks and sealed them with silicone glue. For the back-end part I wrote majority of tests and implemented the coverage for it. I still need to push the repo to the cloud. Stay put for that one.&lt;/p&gt;
&lt;p&gt;It was time for me to move to the front-end, which this article is about. The progress has been slow, but the Cuply project is moving forward despite outside distractions. The front-end architecture is driven by React. The dashboard is using the &lt;a class="reference external" href="https://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt; CSS framework and there are some D3 graphs that display the state of sensors. D3 bits are heavily modified examples taken from &lt;a class="reference external" href="https://observablehq.com/"&gt;Observable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don't have a user registration system in place at the moment so when setting the project up, a user needs to be created in the back-end with &lt;cite&gt;createsuperuser&lt;/cite&gt; Django management command. It's not an issue to have a superuser here because the project is isolated in the local network and the user is the only one existing in the project. Parameters can also be changed with the enabled Django admin.&lt;/p&gt;
&lt;p&gt;A microcontroller is also needed to be set up in the Django admin, but at this point I'm thinking about hardcoding it in the settings and getting rid of the database interaction since there's only one microcontroller present. To ease my trouble, I exported the fixtures of the user, profile, microcontroller and devices so I can recreate them at will with &lt;cite&gt;loaddata&lt;/cite&gt; management command.&lt;/p&gt;
&lt;p&gt;Containerizing it spins up two containers. One for queue for the websockets and the other one for the app itself. The latter exposes the Arduino from the host so the order of things when spinning it up matters. Plug in the Arduino in the electrical outlet, then plug it in the Raspberry. This is important because the Arduino requires its own power supply, otherwise it makes Raspberry unstable.&lt;/p&gt;
&lt;p&gt;Front-end bit is completely isolated and communicates with the back-end via REST API, websockets and authorizes itself through JWT. It is built with &lt;cite&gt;create-react-app&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;When turning on the interface in the browser for the first time, a modal with logging in is presented to the user and one user/password combination later, the rest of the interface is unlocked. The navigation consists of the standard buttons for the main page and for signing out, then the items that are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Sensors&lt;/li&gt;
&lt;li&gt;Actuators&lt;/li&gt;
&lt;li&gt;Plants&lt;/li&gt;
&lt;li&gt;Trends&lt;/li&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first three display and edit the state of the items in the cupboard. &lt;cite&gt;Trends&lt;/cite&gt; deals with displaying the graph of the historical data of the sensors and &lt;cite&gt;Settings&lt;/cite&gt; changes the user's API key for &lt;a class="reference external" href="https://floracodex.com/"&gt;FloraCodex&lt;/a&gt;. Editing the specific item opens a modal with a form to be changed and submitted back on the server via REST API. The real time data is fed to the dashboard through the websocket.&lt;/p&gt;
&lt;p&gt;Here are some screenshots:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-sensors.png" class="img-responsive center-block" src="/media/images/cuply-sensors.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-actuators.png" class="img-responsive center-block" src="/media/images/cuply-actuators.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-plants.png" class="img-responsive center-block" src="/media/images/cuply-plants.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-trends.png" class="img-responsive center-block" src="/media/images/cuply-trends.png" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-settings.png" class="img-responsive center-block" src="/media/images/cuply-settings.png" /&gt;
</summary></entry><entry><title>Cuply - Hydroponics Greenhouse Cabinet Powered by Django Channels and Arduino - Back-end</title><link href="http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-back-end/" rel="alternate"/><updated>2022-07-31T22:39:50+00:00</updated><id>http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-back-end/</id><summary type="html">&lt;p&gt;I'm in the process of making a greenhouse out of a glass cabinet that sits on our balcony. Inside it, there's to be a plethora of sensors and actuators hooked up to &lt;a class="reference external" href="https://store.arduino.cc/products/arduino-due"&gt;Arduino Due&lt;/a&gt; microcontroller, which is in turn connected to an old &lt;a class="reference external" href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;. The software stack is &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; with &lt;a class="reference external" href="https://channels.readthedocs.io/en/latest/"&gt;Channels&lt;/a&gt; in the back-end, and &lt;a class="reference external" href="https://reactjs.org/"&gt;React&lt;/a&gt; with some &lt;a class="reference external" href="https://d3js.org/"&gt;D3&lt;/a&gt; in the front-end. It was a project long time in development, and this series of articles will explore it from the inception to the latest product.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/"&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-back-end/"&gt;Back-end&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;Front-end&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Back-end architecture is driven by Python and Django. I am skilled with that stack so I wanted to make something with things I know how to work with. Because of the smaller footprint that the Raspberry Pi has, I had to reduce the number of active processes that would potentially consume the memory. What I ended up with is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Redis server that serves as the support for the websockets&lt;/li&gt;
&lt;li&gt;Django ASGI process that would deal with both, sockets and web traffic, but another thread is spawned to take care of the sensors and actuators, as explained further down&lt;/li&gt;
&lt;li&gt;Docker daemon composing the application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The database is SQLite since it's only one user per cabinet. No need to have Postgres there. Originally I was thinking to go raw with &lt;a class="reference external" href="https://circus.readthedocs.io/en/latest/"&gt;Circus&lt;/a&gt; managing the processes (I wouldn't go with &lt;a class="reference external" href="http://supervisord.org/"&gt;Supervisor&lt;/a&gt; because Circus is simpler and handles sockets as well), but this proved to be better encapsulated with Docker so I wrapped things in it instead.&lt;/p&gt;
&lt;p&gt;When an ASGI process is created (because it has to handle websockets), an app gets initialized and there's a piece of code in &lt;cite&gt;apps.py&lt;/cite&gt; that spawns another thread. I had to do it this way since that other thread houses an infinite loop that would block the execution of the normal server code. In that new thread, a loop manager is created and executed, which in turn has several functions called in an infinite loop. They are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;updating the devices needed to be parsed if the device list is changed in any way&lt;/li&gt;
&lt;li&gt;updating the readings from the sensors&lt;/li&gt;
&lt;li&gt;running actuators depending on the readings from the sensors&lt;/li&gt;
&lt;li&gt;communicating the current state to the websocket&lt;/li&gt;
&lt;li&gt;saving the snapshot of the state for trend graphs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I had to have the Arduino blueprint sketch written in a C variant, but since I don't know C that well, what it does is sends the state to the USB and reacts to the input coming from the USB. This is done for the analog and digital sensors and actuators, for I2C and for communicating with the servo if attached. The idea is that devices in the cabinet are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;analog temperature sensor&lt;/li&gt;
&lt;li&gt;analog light sensor&lt;/li&gt;
&lt;li&gt;analog ambient humidity sensor&lt;/li&gt;
&lt;li&gt;I2C water level sensor (a capacitive one to prevent the corrosion)&lt;/li&gt;
&lt;li&gt;servo motor for pushing and pulling the door of the cabinet through the rack and pinion mechanism&lt;/li&gt;
&lt;li&gt;three digital actuator relays for controlling the submerged pump, the air pump and the LED strip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The meat of the code is in Python that wraps the &lt;a class="reference external" href="https://pyserial.readthedocs.io/en/latest/index.html"&gt;pySerial&lt;/a&gt; library around Arduino microcontroller itself. The wrapper methods are in turn called from two places. Django models and the finite state machine library called &lt;a class="reference external" href="https://automat.readthedocs.io/en/latest/"&gt;automat&lt;/a&gt; from Glyph. Communicating the state is sending the JSON message to the channel layer for the front-end to parse.&lt;/p&gt;
&lt;p&gt;The other bits of the back-end application is a common auth system used by Django together with REST framework to serialize the messages for interfacing with &lt;a class="reference external" href="https://floracodex.com/"&gt;FloraCodex&lt;/a&gt; via my &lt;a class="reference external" href="https://shamrock.readthedocs.io/en/latest/"&gt;Shamrock&lt;/a&gt; library. Originally Shamrock was interfacing with Trefle, but Trefle is now discontinued and FloraCodex is picking up the pieces. It works OK for my use-case. At least in the initial test. This might warrant another article, but I'll probably mention it in the future eventually.&lt;/p&gt;
</summary></entry><entry><title>Cuply - Hydroponics Greenhouse Cabinet Powered by Django Channels and Arduino - Hardware</title><link href="http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/" rel="alternate"/><updated>2022-06-29T19:24:11+00:00</updated><id>http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/</id><summary type="html">&lt;p&gt;I'm in the process of making a greenhouse out of a glass cabinet that sits on our balcony. Inside it, there's to be a plethora of sensors and actuators hooked up to &lt;a class="reference external" href="https://store.arduino.cc/products/arduino-due"&gt;Arduino Due&lt;/a&gt; microcontroller, which is in turn connected to an old &lt;a class="reference external" href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;. The software stack is &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; with &lt;a class="reference external" href="https://channels.readthedocs.io/en/latest/"&gt;Channels&lt;/a&gt; in the back-end, and &lt;a class="reference external" href="https://reactjs.org/"&gt;React&lt;/a&gt; with some &lt;a class="reference external" href="https://d3js.org/"&gt;D3&lt;/a&gt; in the front-end. It was a project long time in development, and this series of articles will explore it from the inception to the latest product.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-hardware/"&gt;Hardware&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;Back-end&lt;/li&gt;
&lt;li&gt;Front-end&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The hardware side came to be an IKEA glass cabinet. We opted to buy one and be done with it. I assembled it indoors and we took it out to the balcony. It fit the space we had in mind for the project and we felt it was good enough. The glass walls made it a greenhouse and, because it resembled a cupboard, the name was born: &lt;strong&gt;Cuply&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We replaced the original shelving with a suspension contraption to hold the plants. Some parts were bought in the nearby hardware store, some in IKEA, some online, some in the nearby general store, but let's list them all:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;Glass Cabinet&lt;/dt&gt;
&lt;dd&gt;Ikea, a small version of MILSBO line, to hold everything. It's transparent on all the sides except the bottom, which is to achieve the greenhouse effect and keep things cozy.&lt;/dd&gt;
&lt;dt&gt;Suspension rod&lt;/dt&gt;
&lt;dd&gt;Ikea, FINTORP line rod, attached with screws from the local hardware store. We drilled into the inside of the cabinet, on the top side, to attach it. It's meant to hold the suspended plant pillars from the accompanying hooks. I also had to shorten it with a hacksaw.&lt;/dd&gt;
&lt;dt&gt;Two chains per pillar&lt;/dt&gt;
&lt;dd&gt;From the local hardware store, four chains in total. They measure ~50cm in length. The links have to fit the hooks on the suspension rod and the turnbuckles.&lt;/dd&gt;
&lt;dt&gt;Three turnbuckles per pillar&lt;/dt&gt;
&lt;dd&gt;From the local hardware store, six in total. Each turnbuckle goes through a bottle so it holds it in place.&lt;/dd&gt;
&lt;dt&gt;Six plastic bottles&lt;/dt&gt;
&lt;dd&gt;They're rather small, 1L actually, but one has to start somewhere and we drank a lot of juice to get them. Bottom half is sprayed white to reflect the sunlight and shield the sensitive roots. Black electric wire isolating tape is added in the middle just for the looks, to hide the transition from white to transparent. The front of each bottle is cut out to allow the plant to stick out. Bottle sides are drilled on the left and right for the turnbuckle to go through. A plant pillar consists of three bottles, turned upside-down and connected by plugging the bottle cap of the previous bottle into the bottom of the next one, which requires drilling a 2.5cm hole in each bottom to push the cap through. Each bottle cap and the bottom of the first bottle have a 5mm holes drilled into them, to connect to the water system loop and circulate water through the pillars. Each bottle houses a hydroponic pot (it's like a regular pot, but like a net) with clay pellets. There are two pillars, three bottles per pillar - six bottles in total.&lt;/dd&gt;
&lt;dt&gt;Upper tank made from a soil drain pipe&lt;/dt&gt;
&lt;dd&gt;10cm diameter, 75cm in length. Both ends are covered with a rubber cap bought online. There is a hole at the top, 2.5cm in diameter, for the water inlet, and two small holes at the bottom of the tank with aquarium drip valves to control the flow. A small piece of aquarium tubing leads from each bottom hole into the top hole of its respective plant pillar. The drip valves are sealed with silicone (which is safe for aquatic life) so they don't leak at the sides. The upper tank is suspended above the pillars and held in place by two pipe clamps and some screws from the local hardware store.&lt;/dd&gt;
&lt;dt&gt;Lower tank also made from a soil drain pipe&lt;/dt&gt;
&lt;dd&gt;10cm diameter, 75cm in length. Both ends are covered with a rubber cap bought online. There is a hole at the top, 2.5cm in diameter, for the water outlet. A small water pump is submerged in the lower tank with a power cable going out the cable hole on the side. The outlet of the lower tank is connected to the inlet hole in the upper tank via the provided water pump tube (via nozzle), approximately 13mm in diameter and of ~150cm length. The pump outputs 1500L of liquid per hour so it's fast and strong enough. Another hole on the top, also 2.5cm in diameter, is drilled on the other side to replenish the water and to provide the access to the air stone from the air pump to keep the algae from forming in the tank. The cap of the bottom bottle of each pillar has a small hole drilled into it, 5mm in diameter, from which an aquarium tube feeds back into the lower thank, allowing it to be filled up again. There's also another ~2mm * ~20mm slit on the top side for the I2C capacitive water level sensor to go into the bottom tank. Could be that more sensors can be added, but this is my experimental limit for now. It is also held in place by two pipe clamps and some screws from the local hardware store.&lt;/dd&gt;
&lt;dt&gt;Light, temperature, ambiental humidity sensors&lt;/dt&gt;
&lt;dd&gt;All analogue placed inside the cabinet.&lt;/dd&gt;
&lt;dt&gt;Relays&lt;/dt&gt;
&lt;dd&gt;For controlling both of the pumps and the light. Three in total.&lt;/dd&gt;
&lt;dt&gt;Arduino Due&lt;/dt&gt;
&lt;dd&gt;All the sensors are attached to it and it has its own power source since all of it cannot be powered through the USB. Arduino Due is used because it supports a wider plethora of sensors than GPIO of Raspberry PI.&lt;/dd&gt;
&lt;dt&gt;Raspberry Pi&lt;/dt&gt;
&lt;dd&gt;A first generation model B+ is put to use here. It has a WiFi antenna in one USB slot (because it didn't come with an integrated WiFi interface) and Arduino Due is plugged in the other USB slot to report the state of the sensors (and act on the actuators).&lt;/dd&gt;
&lt;dt&gt;LED strip in the cabinet&lt;/dt&gt;
&lt;dd&gt;Held in place above the pillars to provide additional lighting and connected via relay to the Arduino Due.&lt;/dd&gt;
&lt;dt&gt;Power source&lt;/dt&gt;
&lt;dd&gt;Everything is neatly connected in one plastic box and fed power coming into the cabinet from the nearby outlet.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;The idea came from the &lt;a class="reference external" href="https://www.kickstarter.com/projects/windowfarms/learn-to-grow-and-share-with-new-windowfarms"&gt;Window Farms kickstarter&lt;/a&gt; so kudos to those folks. Even though the project is discontinued, it gave me inspiration for the hydroponic loop. The plants are nested in each bottle and are of a herb type, compatible both with the ambiental conditions as well as with each other. There are various attempts online at controlling similar systems via computers. Mine is no different. The systems are known as &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Grow_box"&gt;Grow Boxes&lt;/a&gt; and there are most likely communities around them.&lt;/p&gt;
&lt;p&gt;The lower tank has an inlet for the solution that is made from water and a fertilizer concentrate bought in store. It needs to be changed weekly or when it evaporates. Once things are set up, the system runs the loop by pumping the solution from the lower tank controlled by the relay and turned on by the sensor, then letting the gravity take care of the rest by dripping the solution from the upper tank all the way through the pillars to the lower tank. The whole cycle is repeated ad nauseam. The lights turn on in the low light conditions.&lt;/p&gt;
&lt;p&gt;Here are some photos from hammering on the hardware:&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cabinet.jpg" class="img-responsive center-block" src="/media/images/cabinet.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/suspension-rod.jpg" class="img-responsive center-block" src="/media/images/suspension-rod.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/turnbuckle-1.jpg" class="img-responsive center-block" src="/media/images/turnbuckle-1.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/turnbuckle-2.jpg" class="img-responsive center-block" src="/media/images/turnbuckle-2.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/pillar-1.jpg" class="img-responsive center-block" src="/media/images/pillar-1.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/pillar-2.jpg" class="img-responsive center-block" src="/media/images/pillar-2.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/light.jpg" class="img-responsive center-block" src="/media/images/light.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-1.jpg" class="img-responsive center-block" src="/media/images/lower-tank-1.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-2.jpg" class="img-responsive center-block" src="/media/images/lower-tank-2.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-3.jpg" class="img-responsive center-block" src="/media/images/lower-tank-3.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-4.jpg" class="img-responsive center-block" src="/media/images/lower-tank-4.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-5.jpg" class="img-responsive center-block" src="/media/images/lower-tank-5.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/lower-tank-6.jpg" class="img-responsive center-block" src="/media/images/lower-tank-6.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/arduino-box.jpg" class="img-responsive center-block" src="/media/images/arduino-box.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/air-pump.jpg" class="img-responsive center-block" src="/media/images/air-pump.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/raspberry-pi.jpg" class="img-responsive center-block" src="/media/images/raspberry-pi.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-first-look.jpg" class="img-responsive center-block" src="/media/images/cuply-first-look.jpg" /&gt;
</summary></entry><entry><title>Cuply - Hydroponics Greenhouse Cabinet Powered by Django Channels and Arduino - Overview</title><link href="http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/" rel="alternate"/><updated>2022-05-31T17:37:36+00:00</updated><id>http://www.offsetlab.net/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/</id><summary type="html">&lt;p&gt;I'm in the process of making a greenhouse out of a glass cabinet that sits on our balcony. Inside it, there's to be a plethora of sensors and actuators hooked up to &lt;a class="reference external" href="https://store.arduino.cc/products/arduino-due"&gt;Arduino Due&lt;/a&gt; microcontroller, which is in turn connected to an old &lt;a class="reference external" href="https://www.raspberrypi.org/"&gt;Raspberry Pi&lt;/a&gt;. The software stack is &lt;a class="reference external" href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; with &lt;a class="reference external" href="https://channels.readthedocs.io/en/latest/"&gt;Channels&lt;/a&gt; in the back-end, and &lt;a class="reference external" href="https://reactjs.org/"&gt;React&lt;/a&gt; with some &lt;a class="reference external" href="https://d3js.org/"&gt;D3&lt;/a&gt; in the front-end. It was a project long time in development, and this series of articles will explore it from the inception to the latest product.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/cuply-hydroponics-greenhouse-cabinet-powered-by-django-channels-and-arduino-overview/"&gt;Overview&lt;/a&gt; ← You are here&lt;/li&gt;
&lt;li&gt;Hardware&lt;/li&gt;
&lt;li&gt;Back-end&lt;/li&gt;
&lt;li&gt;Front-end&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since we started looking to &lt;a class="reference external" href="https://www.offsetlab.net/buying-an-apartment-in-dublin/"&gt;buy an apartment&lt;/a&gt; back in 2018, we had in mind a south-facing balcony. In the end, we were lucky enough to buy just such an apartment and, even though the balcony is small, we got it to become a special corner of our living space. It doesn't have much, but you can sit there and enjoy the view of the treeline across, day and evening, have a drink or even a meal on the foldable table we installed. The previous owners had a water butt set up to pick up the drain water and a set of flowering plants that thrived on it. We wanted herbs we could use in the kitchen so we had to control the water quality. Because the balcony is small, we opted to try a vertical set-up instead of a horizontal one, and having a hydroponic loop made sense. Fast forward to 2022. We have an automated system, although that's still just the beginning.&lt;/p&gt;
&lt;p&gt;Even though sunlight is abundant on south-facing balconies in the northern hemisphere, if there are no outside obstructions, Ireland is not ideal. To control the temperature better, we opted for a glass greenhouse to look nice and make use of the greenhouse effect. For that, we had to buy a glass cabinet because building one was hardly an option. No space for us to do it at home, and the hackerspace we know is not really near enough to reach conveniently without our own transport.&lt;/p&gt;
&lt;p&gt;Whoever opts to build such a thing by themselves, by all means, go for it. Custom builds will always utilize the available space better.&lt;/p&gt;
&lt;p&gt;We could've become members of a nearby community garden. It's looking lovely this year. But we'd definitely be too lazy to devote ourselves to maintaining it so the balcony greenhouse will have to do. And, to be fair, setting up hydroponics is more fun.&lt;/p&gt;
&lt;p&gt;Of course, there are some drawbacks. The space is limited in general and we'll see how viable the plants will be (the pots are rather small), but it's an experiment driven project that is inconspicuous enough, but also decorative and useful; it enriches our balcony's environment, creates a separation from the neighbours and might yield fragrant herbs. Not to mention that it's a great opportunity to have a hobby.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/cuply-first-look.jpg" class="img-responsive center-block" src="/media/images/cuply-first-look.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;In the future articles, I'll go into more detail on how the thing was made. For now, it's a hydroponic loop that functions between two tanks. The lower one pumps the water into the upper one, and the gravity takes care of the rest. Because of the size, only six plants are able to be inside the cabinet. The other things are nifty add-ons that just make the whole thing a bit high-tech and agro-informatics driven. Whatever the case, I'll open-source it after I finish the articles and have a working cabinet, so whoever wants to explore a bit and implement a similar solution in their place, they're more than welcome to use it.&lt;/p&gt;
</summary></entry><entry><title>3D Printer Shenanigans</title><link href="http://www.offsetlab.net/3d-printer-shenanigans/" rel="alternate"/><updated>2022-04-27T20:30:08+00:00</updated><id>http://www.offsetlab.net/3d-printer-shenanigans/</id><summary type="html">&lt;img alt="/media/images/3d-printing-setup.jpeg" class="img-responsive center-block" src="/media/images/3d-printing-setup.jpeg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Buying a 3D printer was a decision we postponed for a very long time. With Vesna delving deeper into DM-ing D&amp;amp;D, we were thinking that we could host some games IRL for friends. Heck, I could even make some cocktails because we got a cheap cocktail making kit. Having miniatures would be nice, printing them would save money. Having a 3D printer would be useful for other models like small hardware parts, gifts, fixing broken things, etc. In the end we decided to bite the bullet and opted for a high resolution resin printer because they have gotten affordable enough and the level of detail is amazing. Right now we have &lt;a class="reference external" href="https://phrozen3d.com/products/phrozen-sonic-mini-8k-resin-3d-printer"&gt;Phrozen Sonic Mini 8K resin 3D printer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What surprised me the most was that people who tinker on their computers usually have a notion that 3D printing is still filament only. Having a spool of plastic thread melted and drawn with, layer by layer, is not the only way. The other type is resin based, where the build plate is submerged in a vat of photopolymer liquid resin. The resin gets exposed to UV light from the screen below the vat and hardens on the build plate, layer by layer. The model is pulled out of the vat upside-down. These printers are faster by design because they harden the entire layer at once instead of a single dot drawing. They also have a higher resolution and less visible ridges between layers, but are messier and one needs to deal with toxic chemicals. To understand resin a bit more, Brent, from Goobertown Hobbies, &lt;a class="reference external" href="https://www.youtube.com/watch?v=ht4tbCiFxeM"&gt;explains the resin from the chemist perspective&lt;/a&gt; better than I would ever do.&lt;/p&gt;
&lt;p&gt;There's also a concern where &lt;a class="reference external" href="https://blogs.cdc.gov/niosh-science-blog/2018/08/16/3d-printing/"&gt;the fumes from melted plastic are a health hazard&lt;/a&gt; that needs to be addressed, but also the evaporation from resin, which needs more study. That's why 3D printers should be kept in a well ventilated room and PPE should be used. The toxicity for the environment and recycling the waste are also a concern. We don't plan to print a ton of miniatures, but we still need to address the waste properly. Like any other dangerous chemical, resin needs to be treated with respect. UV curing the liquid form renders it inert because monomers eventually form polymer chains that are not as harmful to the environment. The outcome is the same, the waste needs to be properly disposed of.&lt;/p&gt;
&lt;p&gt;We bought &lt;a class="reference external" href="https://www.patreon.com/ArtisanGuild"&gt;Artisan Guild&lt;/a&gt; Patreon subscription to get some really nice miniatures for D&amp;amp;D. Surrounding a campfire with some heroes is a good start. We aligned all the models we wanted that could fit the printer margins. This was done in &lt;a class="reference external" href="https://www.chitubox.com/"&gt;Chitubox slicer tool&lt;/a&gt; and the presupported files had most of the planes under 45 degrees vertically to counter the effects of gravity. The presupported files are great, but Chitubox can do it automatically if your models don't come presupported. One needs to know why printing is done at an angle and align their models properly so the need for the supports is reduced and it's easier to print without ending up with bent model planes.&lt;/p&gt;
&lt;p&gt;Chitubox also needs a profile for the machine so it knows the parameters like screen resolution for the printing and what kind of resin is used. Regarding the printer itself, the profile file can be picked up from the manufacturer's pages and loaded into Chitubox.&lt;/p&gt;
&lt;p&gt;As for the resin parameters, we needed to consult resin documentation. The problem was that the parameters were provided on the assumption that we would be using the same manufacturer's printer as well. We had to dig a bit to find the correct parameters for our use case. Exposure times and lifting speed are paramount for a successful print. After they were set, we sliced the file and had it ready for printing.&lt;/p&gt;
&lt;p&gt;The resulting sliced file was under 250 MiB with over 1000 layers and around 50 grams of resin would be used. The bottle is 1 KG so it wasn't a lot. With the correct settings (don't ask, we had to print twice and we found out about the &lt;a class="reference external" href="https://ameralabs.com/blog/the-complete-resin-3d-printing-settings-guide-for-beginners/"&gt;proper instructions&lt;/a&gt; afterwards), the printing process would take around seven hours.&lt;/p&gt;
&lt;p&gt;There are a few steps we also had to do:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Upgrade the firmware. Phrozen has instructions for their printers so the resulting files from recent Chitubox versions can be compatible;&lt;/li&gt;
&lt;li&gt;Test the LCD. There's a button for it in the printer. Inspect the screen for any deformities;&lt;/li&gt;
&lt;li&gt;Calibrate the build plate. Also a button that gives out instructions. Align the build plate accordingly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the above done, and setting up the workstation and cleaning equipment (we used pet food trays to work on), it was time to print. PPE was used all the time: safety glasses, breathing masks, nitrile gloves. We also bought &lt;a class="reference external" href="https://www.elegoo.com/products/elegoo-mini-air-purifier"&gt;Elegoo carbon filters&lt;/a&gt; and put them in the printer chamber and turned them on. I know the melted plastic smell because I visited the plastic factory way too often when I was a kid. This one is not that bad, but still we'd like to play it safe. We then shook the bottle of resin for a minute and then opened it and poured the contents out in the resin vat. We covered the printer, inserted the USB memory stick with the file from Chitubox and kicked off the printing. Our window was also open so fresh air could circulate in the room with the printer.&lt;/p&gt;
&lt;p&gt;When the printing finished, the resulting models were still dripping a bit, so we left them for a couple of minutes for the majority of liquid to drip away. It was time to wash and clean. With PPE back on (safety first), we removed the printer cover and transferred the build plate, with the printed models still attached to it, into the washing tub of our &lt;a class="reference external" href="https://www.anycubic.com/products/anycubic-wash-cure-plus-machine"&gt;washing and curing station from Anycubic&lt;/a&gt;. We then filled the tub with tap water and covered it. We used the &lt;a class="reference external" href="https://www.elegoo.com/products/elegoo-water-washable-resin"&gt;resin from Elegoo that is water washable&lt;/a&gt; because IPA (isopropyl alcohol) is tricky to handle and expensive to buy. That said, please have some. We bought a bottle in the local pharmacy because it is invaluable when cleaning the equipment after printing.&lt;/p&gt;
&lt;p&gt;We covered the printer again with the lid to prevent the smell and the stray UV rays from reaching the resin in the vat and started a ten minute washing cycle in our washing/curing station. It has a lab type mixer so it was creating a vortex in the tub. After it was done, we removed the tub and pulled out the build plate from it.&lt;/p&gt;
&lt;p&gt;It was time to remove the models with a spatula. They were really stuck. Safety equipment is especially necessary here because the crumbling resin supports start flying everywhere. After the models were dislodged, we immediately removed the rest of the supports by (gloved) hand and put the models on a paper towel.&lt;/p&gt;
&lt;p&gt;We transferred the water from the tub into a separate container and left it to be cured by the sun. It must not just be poured down the drain because in uncured state it's still toxic to aquatic life. We used IPA to clean the tub, the grate, the build plate and left it all to dry. We then put the washing/curing station in the curing mode and put the models in it to cure for another two minutes. This is the general time for curing and it should dry them out. They were done, but we weren't.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/3d-printing-results.jpg" class="img-responsive center-block" src="/media/images/3d-printing-results.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;We uncovered the printer once more, turned off the carbon filters and took out the resin vat. We sieved the resin back through a funnel into the original resin bottle. Some people leave it in the vat, but we cannot afford that luxury because we don't have a dedicated workshop. We cleaned the vat with IPA soaked tissues since they're softer than paper towels and have a reduced risk of damaging the FEP film on the bottom of the vat. The vat needs to be cleaned after a failed print as well. FEP film on the bottom of the vat will wear out over time so it needs to be replaced eventually.&lt;/p&gt;
&lt;p&gt;In the end, we left the used tissues and paper towels from cleaning the equipment (like spatula), the nitrile gloves from handling it all, etc., in a transparent bin bag in the sun. The dirty waste has to be left out a few days so the UV rays from the sun cure whatever is left of the resin particles.&lt;/p&gt;
&lt;p&gt;The washing water could be reused for the next printing sessions until there's sludge in it collecting on the bottom. At that point, the sludge can be poured onto a plate so the sun evaporates the water and cures the rest of the resin so it hardens. The hardened resin is ready for waste disposal at that time.&lt;/p&gt;
&lt;p&gt;As for the models... they had some post-processing left like filing and polishing where needed. I have to say that we're pretty satisfied with the overall outcome. What can be done with them later is painting them, but I'll leave it for another article. Of course, if something else needs printing, other than the miniatures, I'll be sure to mention it.&lt;/p&gt;
</summary></entry><entry><title>Open Science</title><link href="http://www.offsetlab.net/open-science/" rel="alternate"/><updated>2022-03-31T16:40:31+00:00</updated><id>http://www.offsetlab.net/open-science/</id><summary type="html">&lt;p&gt;We still have cases of infections and deaths, but people seem like they decided that the pandemic is over. The COVID-19 pandemic is &lt;strong&gt;not&lt;/strong&gt; over. 2020 wasn't that long ago, when we didn't have any protection in terms of vaccines and the world was panic buying. One only needs to look at &lt;a class="reference external" href="https://ourworldindata.org/covid-cases"&gt;our world in data&lt;/a&gt; to see that the hospitalizations and spikes are still happening.&lt;/p&gt;
&lt;p&gt;Today, most of the discourse revolves around Russia-Ukraine conflict instead of the danger in everyone's house. It's difficult for me to see how the world can be united. It's always &lt;a class="reference external" href="https://en.wikipedia.org/wiki/In-group_and_out-group"&gt;in-group, out-group&lt;/a&gt; thinking that permeates the society.&lt;/p&gt;
&lt;p&gt;Climate change and biodiversity loss haven't gone away either. &lt;a class="reference external" href="https://www.theguardian.com/environment/2022/mar/25/we-need-action-immediately-great-barrier-reef-authority-confirms-sixth-mass-coral-bleaching-event"&gt;The great bleaching of the coral&lt;/a&gt; keeps happening. The world is not in a good place. It's in a bad one.&lt;/p&gt;
&lt;p&gt;Most of my last year was focused on automating things. It continues into this year as well. Just recently I got the &lt;a class="reference external" href="https://github.com/j5lien/esphome-idasen-desk-controller"&gt;standing desk (Ikea Idasen) automated (with ESP32)&lt;/a&gt; so it forces me to stand up because I made it switch the sitting/standing modes at certain times of the day. It turns out that before that I was really lazy to push a button, either the one on the controller or in the smartphone app and stand up. This way it just happens and I must adjust. Does wonders for my posture :)&lt;/p&gt;
&lt;p&gt;I also installed &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B07D37VDM3/ref=ppx_yo_dt_b_asin_title_o01_s01"&gt;sensors for windows&lt;/a&gt; and the entrance so I can turn off my heating usage if I'm airing the place. Other things, too, like security.&lt;/p&gt;
&lt;p&gt;Days are getting longer. DST still wasn't abandoned though. We finally got to walk outside and have a coffee in the nearby park. The sun really ups our mood and the weight of the winter clothes are once again disappearing.&lt;/p&gt;
&lt;p&gt;We got triple vaxxed and would go for the next one if needed in the future. There is an effort to find ways to expand vaccine usage quickly enough where normal distribution chains may prove lacking. This was argued with &lt;a class="reference external" href="https://radvac.org/about/"&gt;RaDVaC vaccine&lt;/a&gt; and it shows an interesting application of it; nasal instead of the regular injection. Also, the push towards opening the research is active with &lt;a class="reference external" href="https://opencovidpledge.org/about/"&gt;Open COVID Pledge&lt;/a&gt; spearheading some of the efforts. &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Body_hacking"&gt;Body hacking&lt;/a&gt; can be cool.&lt;/p&gt;
&lt;p&gt;Opening the science got some traction years ago with now defunct &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Science_Commons"&gt;Science Commons&lt;/a&gt;. However, people still use Creative Commons licenses to get the research out to the interested parties. It's a noble goal and the civilization can only move forward with it. Scientists take to Twitter and other social media to get enough people to do peer review for them in unpublished pieces before they submit the work to a scientific journal. They need to get their work reviewed sooner rather than later. We really need a new form of peer review process.&lt;/p&gt;
&lt;p&gt;There's a whole topic on &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Open_science"&gt;Open Science&lt;/a&gt; about how we don't really have the access to the whole body of knowledge the civilization possesses. More often than not it's hidden behind paywall webs of scientific journals that, while doing a good job in peer review and quality control of the submissions, also get in the way of science proliferation itself.&lt;/p&gt;
&lt;p&gt;According to the Universal Declaration of Human Rights, Article 27, &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Alexandra_Elbakyan"&gt;Alexandra Elbakyan&lt;/a&gt; argues that&lt;/p&gt;
&lt;blockquote&gt;
Everyone has the right freely ... to share in scientific advancement and its benefits&lt;/blockquote&gt;
&lt;p&gt;which is the reason she founded the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sci-Hub"&gt;Sci-Hub&lt;/a&gt;.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/Alexandra_Elbakyan_at_Sochi_in_2021_(cropped).jpg" class="img-responsive center-block" src="/media/images/Alexandra_Elbakyan_at_Sochi_in_2021_(cropped).jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;It is a place where people can pirate scientific articles and see what's inside. When I was doing papers back in the university, I myself could've definitely used the opportunity to easily check something online without potentially paying for content that might turn out not relevant for what I was doing. I can deeply relate to the annoyance of the situation when resources are not readily available, and understand the reasoning to go about it the Sci-Hub way. In my time, there was no other option but to do some legwork and hit the libraries in hope that they had things one needed.&lt;/p&gt;
&lt;p&gt;The problem from years ago, and I don't think it has changed, was that the majority of courses were based around the resources known to be previously available to students, rather than being on the bleeding edge of science. It's not that hard to imagine that we should be moving faster than we are.&lt;/p&gt;
</summary></entry><entry><title>Prepare In Advance</title><link href="http://www.offsetlab.net/prepare-in-advance/" rel="alternate"/><updated>2022-02-09T21:54:10+00:00</updated><id>http://www.offsetlab.net/prepare-in-advance/</id><summary type="html">&lt;p&gt;We've had a lot of time on our hands to get better at planing meals. Food rarely gets boring and humans usually eat several times every day so there's intrinsic motivation to become better at it. It's handy to have some pre-made ingredients at the ready when you're out of ideas or short on time. At some point we were buying, I think, some ready-made dough that came with a small jar of tomato sauce. We kept the jars so now we use them to store things like seeds and nuts, almond flakes, pine nuts. Roasted or raw, they are a great addition to all kinds of meal bowls. For some reason, Vesna gets really excited about storage containers, but if you have a variety of them, you can store all kinds of goodies beforehand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;icecubes with botanicals (for gin or some such)&lt;/li&gt;
&lt;li&gt;the same tray can be used to freeze fresh herbs in olive oil to have a quick ready boost for meals that require those two. For instance, fresh basil in olive oil for tomato based sauces&lt;/li&gt;
&lt;li&gt;bigger silicone trays or pots can house ready made frozen soups that you can thaw out&lt;/li&gt;
&lt;li&gt;small jars look cute and can store flavoring oils like chili oil and black garlic oil&lt;/li&gt;
&lt;li&gt;we've also made nut butters; Vitamix has a program to make those. Aside from pure butters (that we did), you can also make mixed (which we didn't try yet), as well as home made chocolate spread&lt;/li&gt;
&lt;li&gt;jams, but you should do the ones that you usually cannot buy otherwise. For instance, we made &lt;a class="reference external" href="https://www.onehundreddollarsamonth.com/carrot-cake-jam-recipe/"&gt;carrot cake jam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pickling is also an option, we have a steady supply of ginger (gari), but we also pickled purple onion which looks quite decorative as well&lt;/li&gt;
&lt;li&gt;jackfruit cashu picked up from Wil Yeung. It's very textured and involves draining the canned pieces, marinating them in a spicy mix and baking in the oven&lt;/li&gt;
&lt;li&gt;vegan cheeses. Vesna usually makes them and I tag along. She uses cashews as a base with lactic acid and kappa carrageenan, which are easily available to order online&lt;/li&gt;
&lt;li&gt;herbal teas. Of course, if you have a garden with things like mint, chamomile, rose hip, even better&lt;/li&gt;
&lt;li&gt;mayonnaise with &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Aquafaba"&gt;aquafaba&lt;/a&gt;. Don't throw away the water from the chickpea can. It can be used for various things like mayonnaise or vegan cheese&lt;/li&gt;
&lt;li&gt;cold brew tea. Easily made by soaking green tea teabag per cup of cold water overnight and using it in quick drinks or as is&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/using-french-press-for-coffee-cold-brewing/"&gt;cold brew coffee&lt;/a&gt;, not much to say, I wrote about the ease of making it before&lt;/li&gt;
&lt;li&gt;chili and curry pastes. These can store for some time and can be used when making, well, chili or curry&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are two quick Vitamix recipes you can try:&lt;/p&gt;
&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3 text-danger" style="color: initial;"&gt;Vegan white chocolate spread&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/vegan-white-chocolate-hazelnut.jpg" alt="Vegan white chocolate spread"/&gt;
    &lt;p class="summary"&gt;Essentially this is a nut butter with white chocolate added in.&lt;/p&gt;
    &lt;h5 style="color: initial;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;250&lt;/span&gt;
            &lt;span class="type"&gt;grams&lt;/span&gt; vegan white chocolate
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;400&lt;/span&gt;
            &lt;span class="type"&gt;grams&lt;/span&gt; Roasted hazelnuts
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;pinch&lt;/span&gt; salt
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;splash&lt;/span&gt; vanilla extract
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: initial;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Melt the chocolate in a microwave. Put hazelnuts, a splash of vanilla and a pinch of salt in a blender. Put it to a nut butter program and blend. When it's done, add melted chocolate and pulse a few times. Store in a jar.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3" style="color: initial;"&gt;Grated vegan parmesan-like cheese&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/vegan-parmesan.jpg" alt="Vegan parmesan"/&gt;
    &lt;p class="summary"&gt;You can put it on pasta or wherever the real parmesan would go.&lt;/p&gt;
    &lt;h5 style="color: initial;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;0.5&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; cashews
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;tbsp&lt;/span&gt; nutritional yeast
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;0.5&lt;/span&gt;
            &lt;span class="type"&gt;tsp&lt;/span&gt; salt
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;0.25&lt;/span&gt;
            &lt;span class="type"&gt;tsp&lt;/span&gt; garlic powder
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: initial;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Put all of it in a blender. Pulse on high a couple of times until it's powdery. Use the smallest Vitamix attachment since it's useful to make small amounts quickly.
    &lt;/p&gt;
&lt;/div&gt;
</summary></entry><entry><title>2021 Recap</title><link href="http://www.offsetlab.net/2021-recap/" rel="alternate"/><updated>2022-01-15T20:31:11+00:00</updated><id>http://www.offsetlab.net/2021-recap/</id><summary type="html">&lt;p&gt;2021 came and went. I was thinking that it was going to hinder our plans, but it didn't. We managed to see our folks. Life was good in 2021. I got all twelve articles out which was a modest success for me. There's still a ton of stuff that will get carried over to 2022, but that's OK.&lt;/p&gt;
&lt;p&gt;The new year started OK as well. It's January, but we already got the third shot of the vaccine (with the accompanying fever as expected). I even applied for the citizenship just recently. The process will take some time.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/citizenship-paperwork.jpg" class="img-responsive center-block" src="/media/images/citizenship-paperwork.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;Considering there's an ongoing pandemic, travel was limited, but in the small window of opportunity in the summer we &lt;a class="reference external" href="/long-overdue-vacation-and-then-some/"&gt;visited our folks back in Croatia&lt;/a&gt;. Going there we also visited:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Italy, Venice, Dolomites, a slight detour via our old acquaintance, Trieste. All great looking and not as touristy at this time&lt;/li&gt;
&lt;li&gt;Croatia, Pula, Brijuni National Park, Rijeka, Krk (actual place on the island of the same name), Zagreb and our respective homeplaces in Slavonia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have to mention that we had six long six weeks to do this trip because we were able to work remotely, as well as take a lot of unspent days off. Venice is beautiful, so is Pula and Brijuni (that need much love).&lt;/p&gt;
&lt;p&gt;Domestic travel suffered so we didn't travel much within Ireland, but we went to Dalkey again, this time with friends.&lt;/p&gt;
&lt;p&gt;No events except one that we booked back in early 2020 before the pandemic hit so it was postponed several times:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ricky_Gervais"&gt;Ricky Gervais&lt;/a&gt; standup act, for a bit of black comedy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I worked a lot on automating the household and bought some stuff to help me. Here's the big list:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;ZigBee motor for the curtains&lt;/dt&gt;
&lt;dd&gt;I decided to install another one for the angle change of the stripe curtains and it doesn't look too bad hidden in a corner&lt;/dd&gt;
&lt;dt&gt;ZigBee inline switches&lt;/dt&gt;
&lt;dd&gt;right now on the bathroom fan, but more to be installed for the lights. The problem is that the drywall is thin so there's difficulty installing it within the existing switch&lt;/dd&gt;
&lt;dt&gt;Reolink cameras&lt;/dt&gt;
&lt;dd&gt;monitoring the entryways for the peace of mind&lt;/dd&gt;
&lt;dt&gt;ZigBee signal repeater&lt;/dt&gt;
&lt;dd&gt;for the future projects with the extended ZigBee mesh&lt;/dd&gt;
&lt;dt&gt;Chromecast&lt;/dt&gt;
&lt;dd&gt;Disney+ is horribly buggy on PS4 so we are using this as a workaround, as well as to cast things from the local storage&lt;/dd&gt;
&lt;dt&gt;Google Nest speaker&lt;/dt&gt;
&lt;dd&gt;can't figure out my accent. It confuses &amp;quot;on&amp;quot; and &amp;quot;off&amp;quot; and thinks &amp;quot;close&amp;quot; is to query online for something close instead of closing the curtains, &amp;quot;screaming&amp;quot; instead of &amp;quot;streaming&amp;quot; and not to mention that once I tried to clean the bedroom with the RoboVac and it snarkily told me to do it myself :D&lt;/dd&gt;
&lt;dt&gt;Lights under the bed&lt;/dt&gt;
&lt;dd&gt;work with the morning alarm at the moment, but will attach the motion sensor so we can find our way to the bathroom at night&lt;/dd&gt;
&lt;dt&gt;Universal Remote from Broadlink&lt;/dt&gt;
&lt;dd&gt;to replace the remotes in the house and automate their functions at the same time, works with three devices at the moment&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;We also fell into the trap of pandemic shopping and bought a bunch of stuff unrelated to the automation. Some more necessary than others:&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;Showerhead&lt;/dt&gt;
&lt;dd&gt;with a dynamo powered LED for checking when the water is warm enough (Vesna loves this one, she no longer dips a toe unless she sees the red light)&lt;/dd&gt;
&lt;dt&gt;Desks&lt;/dt&gt;
&lt;dd&gt;motorized standing one for me and a regular for Vesna (she prefers to do her exercise away from the desk). I'll automate mine eventually to rise every day instead of doing it manually&lt;/dd&gt;
&lt;dt&gt;Chairs&lt;/dt&gt;
&lt;dd&gt;gave mine to Vesna because it's the same model as the one from her job and she likes it, and I bought another one that I loved sitting on back in Croatia&lt;/dd&gt;
&lt;dt&gt;Trolley for wine&lt;/dt&gt;
&lt;dd&gt;well, wine mostly, for now. We had to shuffle our furniture a bit for this one to fit in&lt;/dd&gt;
&lt;dt&gt;Water pump for the plants&lt;/dt&gt;
&lt;dd&gt;we don't want to bother our friends to water our plants every time we're away so this should cover for us instead&lt;/dd&gt;
&lt;dt&gt;Laminator&lt;/dt&gt;
&lt;dd&gt;laminate everything! Well, some of the things in the apartment. So far underutilized&lt;/dd&gt;
&lt;dt&gt;Mechanical keyboard&lt;/dt&gt;
&lt;dd&gt;so I can get NKRO finally because the existing one was giving me a headache. This one glows as well&lt;/dd&gt;
&lt;dt&gt;Book reader&lt;/dt&gt;
&lt;dd&gt;eInk and all so Vesna can read more comfortably, also no dead trees&lt;/dd&gt;
&lt;dt&gt;Smartphone for Vesna&lt;/dt&gt;
&lt;dd&gt;so it's fast and takes cool photos&lt;/dd&gt;
&lt;dt&gt;Bluetooth headphones for Vesna&lt;/dt&gt;
&lt;dd&gt;mostly for audiobooks on her book reader, but she uses it for other things, too&lt;/dd&gt;
&lt;dt&gt;Portable drone&lt;/dt&gt;
&lt;dd&gt;for traveling and taking aerial photos&lt;/dd&gt;
&lt;dt&gt;Electric scooters&lt;/dt&gt;
&lt;dd&gt;right now we're buzzing around the park because we're too scared to go anywhere else&lt;/dd&gt;
&lt;dt&gt;GoPro telescopic grip&lt;/dt&gt;
&lt;dd&gt;the 360 camera was bought the year before, but the old grip broke ages ago so I had to take another one&lt;/dd&gt;
&lt;dt&gt;Webcamera arm&lt;/dt&gt;
&lt;dd&gt;for increased mobility during video calls&lt;/dd&gt;
&lt;dt&gt;Caster wheels&lt;/dt&gt;
&lt;dd&gt;hacking the IKEA coffee table so we can move it around&lt;/dd&gt;
&lt;dt&gt;Magnetic photo frames&lt;/dt&gt;
&lt;dd&gt;fridge is a shrine to our travels&lt;/dd&gt;
&lt;dt&gt;Fingered shoes&lt;/dt&gt;
&lt;dd&gt;to simulate barefoot walking&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;In 2021 we also:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;changed the ISP and switched to fiber. A better deal than the previous coaxial one&lt;/li&gt;
&lt;li&gt;more or less I was working on the automation scripts and visuals for the dashboard in the Home Assistant&lt;/li&gt;
&lt;li&gt;I also started to host some services on the local Raspberry PI for the quick access&lt;/li&gt;
&lt;li&gt;when visiting Croatia, I had to get a new ID card with biometric functionality so I had to go through the hoops of making it work with the chip reader on the PC&lt;/li&gt;
&lt;li&gt;Vesna DMs D&amp;amp;D like a pro&lt;/li&gt;
&lt;li&gt;our jobs didn't change&lt;/li&gt;
&lt;li&gt;we &lt;a class="reference external" href="/mortgage-redemption/"&gt;paid off the apartment&lt;/a&gt; (and obviously started to finally implement the decor)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/treflehq/documentation"&gt;Trefle died&lt;/a&gt; so I had to unlock the API and am currently working with a drop-in replacement on &lt;a class="reference external" href="https://shamrock.readthedocs.io/en/latest/index.html"&gt;Shamrock&lt;/a&gt;, but more on that later this year&lt;/li&gt;
&lt;li&gt;we got vaccinated twice (and third time this year)&lt;/li&gt;
&lt;li&gt;no courses and no conventions happened&lt;/li&gt;
&lt;li&gt;still didn't draw and I am rectifying that this year, no excuses anymore. &lt;a class="reference external" href="https://krita.org/en/item/krita-5-0-released/"&gt;Krita 5 was released&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;no projects were finished, but were started so I expect to test and publish a big one this year. I also had to buy several items for it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All in all, not a bad year and I can only expect that this one turns out better. I am feeling pretty optimistic.&lt;/p&gt;
</summary></entry><entry><title>Cocktails For The New Year</title><link href="http://www.offsetlab.net/cocktails-for-the-new-year/" rel="alternate"/><updated>2021-12-31T11:41:02+00:00</updated><id>http://www.offsetlab.net/cocktails-for-the-new-year/</id><summary type="html">&lt;p&gt;I had a gap in publishing this year, but with this month, I'm catching up. Winter holidays are like a small hibernation. The temperature drops and we crank up the heating every now and then, when we feel cold. I like it because things slow down and get quiet. This is exacerbated with the ongoing pandemic. Still, we go outside to take a walk even though the weather is not as nice and plan out new trips that might happen. Nobody knows.&lt;/p&gt;
&lt;p&gt;After the mandatory Covid-19 scare (because the nearby store was packed before holidays) and a home test after a few days, we came up negative so it's OK. The plans for the New Year's eve are ongoing. We'll be playing pen and paper RPG with friends on a video call. In the meantime, we decided to prepare by having some snacks around and home made cocktails. Mind you, we have no fancy glasses so they're not really super-presentable. Here's the list:&lt;/p&gt;
&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3" style="color: black;"&gt;Cranberry Mimosa&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/cranberry-mimosa.jpg" alt="Cranberry Mimosa"/&gt;
    &lt;p class="summary"&gt;This one is quick to assemble and I've been assured is a holiday cocktail. For it, you need to prepare a simple syrup beforehand and you augment it with sparkling wine. Here's the version we tried. Nothing fancy.&lt;/p&gt;
    &lt;h5 style="color: black;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; cane sugar
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; cranberries (halved)
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; water
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;bottle&lt;/span&gt; prosecco wine
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;several&lt;/span&gt;
            &lt;span class="type"&gt;sprigs&lt;/span&gt; rosemary (optional)
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;several&lt;/span&gt;
            &lt;span class="type"&gt;pieces&lt;/span&gt; fresh cranberries (optional)
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: black;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Combine water, sugar and cranberries in a saucepan and bring to a boil constantly stirring. Remove from heat and cover. Refrigerate. If you make it in the morning, you can make cocktails in the evening. To assemble, strain the syrup and put 1 shot in a glass. Add 2 shots of sparkling wine (we used prosecco). Garnish with rosemary sprig and some fresh cranberries on a stick. You can also go wild and put the sugar on the glass rim.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3" style="color: black;"&gt;Spicy Hot Toddy&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/spicy-hot-toddy.jpg" alt="Spicy Hot Toddy"/&gt;
    &lt;p class="summary"&gt;This reminds me of mulled wine. Essentially it's a hot whiskey that can warm you up. It's commonly served in pubs around here. Here's a version with a spiced tea that serves two.&lt;/p&gt;
    &lt;h5 style="color: black;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;cups&lt;/span&gt; water
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;tbsp&lt;/span&gt; maple syrup
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;piece&lt;/span&gt; star anise
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;3&lt;/span&gt;
            &lt;span class="type"&gt;pieces&lt;/span&gt; allspice
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;piece&lt;/span&gt; clove
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;4&lt;/span&gt;
            &lt;span class="type"&gt;pods&lt;/span&gt; cardamom
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;thumbsize piece&lt;/span&gt; cinnamon stick
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;bags&lt;/span&gt; black tea
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;2&lt;/span&gt;
            &lt;span class="type"&gt;shots&lt;/span&gt; whiskey
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1/2&lt;/span&gt;
            &lt;span class="type"&gt;piece&lt;/span&gt; orange (juiced, optional)
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: black;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Put water and spices and sugar in a sauce pan. Have it boil for five minutes, then remove from the heat. Add in the black tea bags and simmer for another four minutes. Remove and discard the spices and the teabags with a slotted spoon and add two shots of whiskey, maple syrup and a juice of half an orange. Whisk and put in mugs. Serve hot.
    &lt;/p&gt;
&lt;/div&gt;

&lt;div class="hrecipe"&gt;
    &lt;h4 class="fn h3" style="color: black;"&gt;Homemade Cream Liquor&lt;/h4&gt;
    &lt;img class="img-responsive center-block photo" src="/media/images/homemade-cream-liquor.jpg" alt="Homemade Cream Liquor"/&gt;
    &lt;p class="summary"&gt;Of course, a vegan version. For this one you'll need a blender. We have a Vitamix, which is high powered and can make quick work of cashews and can turn the whole thing very smooth. This should give you about half a liter.&lt;/p&gt;
    &lt;h5 style="color: black;"&gt;Ingredients:&lt;/h5&gt;
    &lt;ul&gt;
        &lt;li class="ingredient"&gt;
            &lt;span class="value"&gt;1/2&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; whiskey
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;carton&lt;/span&gt; plant based cooking cream (250ml)
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1/3&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; cashews (soaked overnight, or raw if using Vitamix)
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;3&lt;/span&gt;
            &lt;span class="type"&gt;Tbsp&lt;/span&gt; maple syrup
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;tsp&lt;/span&gt; vanilla extract
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1/2&lt;/span&gt;
            &lt;span class="type"&gt;cup&lt;/span&gt; oat milk
        &lt;/li&gt;
        &lt;li&gt;
            &lt;span class="value"&gt;1&lt;/span&gt;
            &lt;span class="type"&gt;pinch&lt;/span&gt; nutmeg
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;h5 style="color: black;"&gt;Instructions:&lt;/h5&gt;
    &lt;p class="instructions"&gt;
        Put all the ingredients in a blender and blend away for a minute. Probably longer in a weaker blender. Serve chilled.
    &lt;/p&gt;
&lt;/div&gt;&lt;p&gt;As this year wraps up, this is the first time we've had so many days off in a row and not used them to travel somewhere. It takes a bit of effort to fight the restlessness and take it easy. Planning out things for the next twelve months helps with that. Into the new year we go.&lt;/p&gt;
</summary></entry><entry><title>Some More Home Automation</title><link href="http://www.offsetlab.net/some-more-home-automation/" rel="alternate"/><updated>2021-12-16T17:42:36+00:00</updated><id>http://www.offsetlab.net/some-more-home-automation/</id><summary type="html">&lt;p&gt;Our place just got smarter ;) First thing to sort was a fiber optic connection. Getting the router to behave was a pain. One ISP had an abysmally bad router and I am very tired of dealing with the technical support that knows less than me and should know more. I could avoid this, scratch that, I &lt;em&gt;should&lt;/em&gt; avoid this by always going with a provider that would either allow a personal router or have theirs act as a bridge so I don't have to destroy my local network every time. We canceled the existing contract with the ISP providing coax network and switched to fiber optics with another ISP. This second ISP was, as said, bad, so we had to cancel them as well within two weeks and switch to the third one using the same infrastructure. The speeds are still not as promised, but are at least a bit more stable, with a router that has miles more options than than I expected. I hooked up one external drive so it behaves like a simple NAS now, as well as streamlining the devices connected to the internal network. For the ones who want to know more, it's a &lt;a class="reference external" href="https://en.avm.de/"&gt;Fritz!Box&lt;/a&gt; model.&lt;/p&gt;
&lt;p&gt;Moving on from there, I've set up CCTV with &lt;a class="reference external" href="https://reolink.com/"&gt;Reolink&lt;/a&gt; cameras using &lt;a class="reference external" href="https://www.home-assistant.io/integrations/onvif/"&gt;ONVIF Home Assistant integration&lt;/a&gt;. I was able to hook into streams on that side with &lt;a class="reference external" href="https://www.home-assistant.io/lovelace/picture-glance/"&gt;Picture Glance card&lt;/a&gt; showing it. The motion sensor had to be interfaced through the local REST endpoint because it wasn't available out of the box with the integration. Fortunately, configuring it was not complicated. It looks something like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;
binary_sensor:
  - platform: rest
  resource: http://camera.local.ip.address/api.cgi?cmd=GetMdState&amp;amp;user=username&amp;amp;password=password
  name: My Camera Motion
  scan_interval: 2
  value_template: &amp;quot;{{ value_json[0].value.state }}&amp;quot;
  device_class: motion
&lt;/pre&gt;
&lt;p&gt;It can later be added in the Home Assistant for display and automations. I'd need to tweak movement detection so I can record and send notifications properly when away from home.&lt;/p&gt;
&lt;p&gt;In other news, we also got some additional &lt;a class="reference external" href="https://www.ikea.com/ie/en/p/myrvarv-led-lighting-strip-flexible-dimmable-30304967/"&gt;Tradfri lighting&lt;/a&gt; under the bed (but alas no sensor yet), a &lt;a class="reference external" href="https://www.ikea.com/ie/en/p/tradfri-shortcut-button-white-40467765/"&gt;shortcut button&lt;/a&gt; to switch scenes (even though the same can be achieved with a phone and &lt;a class="reference external" href="https://companion.home-assistant.io/docs/integrations/android-quick-settings/"&gt;Home Assistant scripts&lt;/a&gt;, which we did, but we don't always have our phones on us), a &lt;a class="reference external" href="https://www.ikea.com/ie/en/p/tradfri-signal-repeater-80424255/"&gt;signal repeater&lt;/a&gt; for ZigBee so I can extend the range of our mesh (for future projects), and this cool &lt;a class="reference external" href="https://www.amazon.co.uk/gp/product/B0915WZJSD"&gt;showerhead that is powered by dynamo&lt;/a&gt; so it shows the temperature of water both numerically and in LED color (I know, we've got nothing better to do).&lt;/p&gt;
&lt;p&gt;We also got a &lt;a class="reference external" href="https://store.google.com/product/chromecast"&gt;Chromecast&lt;/a&gt; to skip overloading our Raspberry with things. It proved to be OK and it works. Disney's application on PS4 constantly crashes on us after 10 minutes and this is a workaround so we can watch the shows over there. It also works with the NAS because we can stream videos on it through &lt;a class="reference external" href="https://play.google.com/store/apps/details?id=com.bubblesoft.android.bubbleupnp"&gt;BubbleCast&lt;/a&gt; app on Android.&lt;/p&gt;
&lt;p&gt;There are things in the pipeline that I'm to do in the coming months regarding home automation. I am aware that I need to wait to get all the equipment that comes to mind, but it only means that I'll have more things to write about. With &lt;a class="reference external" href="https://en.wikipedia.org/wiki/SARS-CoV-2_Omicron_variant"&gt;another COVID-19 variant&lt;/a&gt; out there and the increasing number of people we know getting sick, we're staying put this year. Who knows. We might end up watching &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Home_Alone"&gt;Home Alone&lt;/a&gt;. Not just live it :D&lt;/p&gt;
</summary></entry><entry><title>Topsoil Loss Problems</title><link href="http://www.offsetlab.net/topsoil-loss-problems/" rel="alternate"/><updated>2021-11-28T12:05:41+00:00</updated><id>http://www.offsetlab.net/topsoil-loss-problems/</id><summary type="html">&lt;p&gt;So COP26, right? &lt;a class="reference external" href="https://jacobinmag.com/2021/11/cop26-deal-betrayal-climate-justice-crisis-western-governments/"&gt;More greenwashing&lt;/a&gt;, more broken promises. &lt;a class="reference external" href="https://www.youtube.com/watch?v=t0DE1M5wpgY"&gt;Abby Martin of the Empire Files asked Nancy Pelosi about military being exempt from the climate change talks&lt;/a&gt; and got a ridiculously evasive answer. Even more ominously, the answer implied that the primary way military was going to be involved in fighting climate change was to enforce security when inevitable unrest due to migrations and conflicts over reducing resources erupts. So, of course it needs to be extra funded. Nobody batted an eyelash.&lt;/p&gt;
&lt;p&gt;At this point it's really hard to stay composed looking at the world go to waste. Aside from putting the pressure, people should also offer solutions. All of the activist efforts start to look like an exhaust valve, a catharsis. The pressure is not doing much. I was optimistic about the &lt;a class="reference external" href="/climate-failure/"&gt;Paris agreement, but was ultimately disappointed&lt;/a&gt;, as noted previously.&lt;/p&gt;
&lt;p&gt;Aside from &lt;a class="reference external" href="https://news.un.org/en/story/2021/08/1097362"&gt;the world being agonizingly slow to reduce greenhouse gas emissions&lt;/a&gt; and the &lt;a class="reference external" href="https://www.scientificamerican.com/article/global-biodiversity-is-in-free-fall/"&gt;biodiversity loss promises also not being kept&lt;/a&gt; (seems like we're constantly going down because they &lt;a class="reference external" href="/carbon-footprint-transport/"&gt;weren't kept under control a decade ago either&lt;/a&gt;), there's another pressing issue that does not get enough attention - the ongoing soil erosion. For instance, where it's easiest to observe - the struggle to contain expanding deserts - there are concrete efforts undertaken, like the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Great_Green_Wall_(China)"&gt;Great Green Wall&lt;/a&gt;, with varying levels of success. These efforts do, however, demonstrate that once we set our minds to things, we can do them. But there's a less obvious aspect of it, where we're going about our business as usual, which is overfarming and the related topsoil loss.&lt;/p&gt;
&lt;p&gt;Topsoil is the upper layer of soil with the biggest amount of the organic matter where most of biological soil activity occurs. To put it simply: no topsoil, no food.&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;img alt="/media/images/topsoil.jpg" class="img-responsive center-block" src="/media/images/topsoil.jpg" /&gt;
&lt;hr class="docutils" /&gt;
&lt;p&gt;We're originally from a place that is a part of the Pannonian Plain. It's not a mountainous area and is fit for growing crops; especially the staple foods, which are the basis of agriculture.
They like to say it's the granary of the country, although with all the import/export activities, it's just one piece of the larger puzzle of food security in the world. However, I've heard it said from the people working the land that there's only around a hundred years of crop harvesting left in the region and that's it. They're being optimistic. Back in 2014, that is seven years ago, &lt;a class="reference external" href="http://www.reuters.com/article/us-food-soil-farming-idUSKCN0JJ1R920141205"&gt;FAO notified that we have around 60 years of topsoil left&lt;/a&gt;. Right now it's closer to 50.&lt;/p&gt;
&lt;p&gt;One of the largest influencers on the modern world is &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Norman_Borlaug"&gt;dr. Norman Borlaug&lt;/a&gt;. He's not studied in history, but he should be. A Nobel laureate holding a peace prize received in 1970, also called &amp;quot;the father of green revolution&amp;quot;, he is credited with saving over a billion people from starvation. Quite amazing. He was an agronomist that developed a strain of high-yield wheat that greatly improved food security. Especially in developing nations. Talk about singular achievement in saving the world. However, I am afraid that our farming practices are failing the civilization and high-yield crops won't be enough anymore if they have nowhere to grow.&lt;/p&gt;
&lt;p&gt;So, erosion of topsoil obviously leads to worse crop yield and food scarcity, but that's only part of the problem. The soil loses its filtration properties and allows pollutants into groundwater, damaging water quality. Erosion increases sedimentation in waterways. Water and land wildlife habitats are destroyed, biodiversity takes a hard hit and the cascading system failure gains momentum bringing about undesirable changes in things we think are not affected, yet they are. Once these changes affect human communities and their ability to survive where they've lived for centuries, these populations will be forced to move, igniting new societal and economic pressures. Topsoil loss affects systems across the board. It's all interconnected.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://www.un.org/en/observances/world-soil-day"&gt;World Soil Day&lt;/a&gt; was conceived for raising awareness of such catastrophes. Greta Thunberg's campaign is raising climate change awareness, the &lt;a class="reference external" href="https://www.theguardian.com/environment/2020/sep/30/world-plant-species-risk-extinction-fungi-earth"&gt;biodiversity loss is not being stopped in the second decade in a row&lt;/a&gt;, but I am pretty sure that topsoil loss gets relegated to less pressing issues as humans suffer from present bias. There's food now, but one cannot see past 30 days, let alone 50 years. This is not talked about enough. As is our custom, we'll start wondering and hand wringing when the food shortage becomes a very real situation, but I'm very afraid it will be too late. Our approach to food growing and consumption practices have been slow to change and very reluctant to accommodate environment conservation and restoration efforts. The time to act should have been yesterday, but better late than never.&lt;/p&gt;
</summary></entry></feed>