<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Anton A. Jerey</title><description>Homepage</description><link>https://jerey.at/</link><language>en</language><item><title>Desk, Coffee, Sleep - Simple Automations</title><link>https://jerey.at/posts/ha-automations/</link><guid isPermaLink="true">https://jerey.at/posts/ha-automations/</guid><description>Desk lights, coffee-ready pings, and lower standby power with a few Home Assistant automations.</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I walk into my home office - &lt;strong&gt;click&lt;/strong&gt; - and the desk lights up.
Some time later - &lt;strong&gt;ping&lt;/strong&gt; - my phone tells me the coffee machine is ready.
And when the workday is done, the desk - &lt;strong&gt;click&lt;/strong&gt; - shuts down on its own.&lt;/p&gt;
&lt;p&gt;Magic? Not quite. Just Home Assistant and a few power outlets.&lt;/p&gt;
&lt;h2&gt;Home Assistant Automations&lt;/h2&gt;
&lt;p&gt;I have &lt;a href=&quot;/posts/synology-ds720/&quot;&gt;written&lt;/a&gt; about Home Assistant a few times. The part I like most is that it is a gigantic toolbox.
Similar to &lt;a href=&quot;/posts/paperless-ngx/&quot;&gt;paperless-ngx&lt;/a&gt;, it can solve all kinds of problems - no matter how tiny they might seem.&lt;/p&gt;
&lt;p&gt;As I mentioned in my &lt;a href=&quot;/posts/paperless-ngx-mail/&quot;&gt;post about mail automation&lt;/a&gt;, I really do enjoy automating things.
Most of the time the upfront work takes longer than the time an automation will ever save.
But building it is the fun part.&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- &lt;img src=&quot;./assets/personal/HA_OfficeAutomations.png&quot; alt=&quot;Office Automations&quot; /&gt; --&amp;gt;&lt;/p&gt;
&lt;p&gt;Here is a small selection of automations I built in Home Assistant and genuinely enjoy having.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
These are based on WiFi power outlets flashed with &lt;a href=&quot;https://www.tasmota.info/&quot;&gt;Tasmota&lt;/a&gt;. I specifically bought ones that also report power usage, because that enables much nicer automations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Power Outlet Automation&lt;/h3&gt;
&lt;p&gt;My desk has two WiFi power outlets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One mainly for my personal computer&lt;/li&gt;
&lt;li&gt;One for &quot;everything else&quot; (display, speakers, chargers, ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also ended up with a Philips Hue dimmer switch from a bundle. In the Hue ecosystem it is meant to control lights (in my case: Hue Play Lightbars as indirect lighting).&lt;/p&gt;
&lt;p&gt;But the nice part is that the dimmer switch can be remapped in Home Assistant. The Play Lightbars are Hue, the outlets are not - and Home Assistant happily ties those worlds together.&lt;/p&gt;
&lt;p&gt;So one of the four buttons now controls the desk power via MQTT:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Short press: turn the desk outlets on (safe default, avoids accidental shutdowns)&lt;/li&gt;
&lt;li&gt;Long press: turn the desk outlets off&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;alias: Desk &amp;amp; Computer Off
description: Switch off the Desk and Computer Switch
triggers:
  - device_id: ...
    domain: hue
    type: long_press
    subtype: 1
    unique_id: ...
    trigger: device
conditions: []
actions:
  - type: turn_off
    device_id: ...
    entity_id: ...
    domain: switch
  - type: turn_off
    device_id: ...
    entity_id: ...
    domain: switch
mode: single
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once that worked, it was hard not to add a bit more.&lt;/p&gt;
&lt;p&gt;With the Hue bundle I also got a motion sensor. Again: easy to integrate into Home Assistant. I use it for a simple &quot;morning automation&quot;: on workdays, if there is motion between 6:00 and 9:00, the desk turns on.&lt;/p&gt;
&lt;p&gt;The best part, though, is using power draw as a signal. My desk standby power is surprisingly high (around 40 W), so I prefer cutting power completely. If the desk outlet stays below a threshold (for example 45 W) for 15 minutes, Home Assistant switches it off automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/HA_DeskSwitch.png&quot; alt=&quot;Desk Switch Auto Off&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The end result is exactly what I wanted: I sit down and things wake up. When I am done, I just leave.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Out of curiosity, I calculated a simple &quot;what if&quot; case: what would it cost if this outlet stayed on for a full year without the desk being actively used?
At an average standby draw of 40 W, that comes to 0.96 kWh per day, or roughly 350 kWh per year.
Assuming an electricity price of 0.30 € per kWh, that is about &lt;strong&gt;105 € per year&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Coffee Machine State&lt;/h3&gt;
&lt;p&gt;As mentioned in my post about &lt;a href=&quot;/posts/espresso-maker/&quot;&gt;espresso makers&lt;/a&gt;, I love good coffee, but I do not love waiting for an E61 machine to warm up.&lt;/p&gt;
&lt;p&gt;The solution (again) was a WiFi power outlet. It publishes its state via MQTT and can also be controlled via MQTT. Whenever the outlet changes to &quot;ON&quot;, Home Assistant starts a timer. When it expires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I get a push notification on my phone (via the Home Assistant app)&lt;/li&gt;
&lt;li&gt;My pixel clock on the desk shows that the machine is ready&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I used to do this with iOS Shortcuts, but Home Assistant made it easier to send the same signal to multiple devices.&lt;/p&gt;
&lt;h3&gt;Nobody Home (Or Awake) Automation&lt;/h3&gt;
&lt;p&gt;Another WiFi power outlet automation.&lt;/p&gt;
&lt;p&gt;When I started with Home Assistant (in a rented apartment), I had no built-in smart home stuff. Power outlets were the easiest way to get results quickly - and they are still useful.&lt;/p&gt;
&lt;p&gt;In this case I wanted to reduce standby consumption and also deal with one very specific problem: my TV sometimes turned itself on in the middle of the night. It also benefited from a regular reboot anyway. A smart outlet solved both.&lt;/p&gt;
&lt;p&gt;The trigger is simple: when both my wife&apos;s phone and my phone leave the WiFi, I treat that as &quot;nobody is home (or awake)&quot;. In that state, the TV definitely does not need power, so Home Assistant turns the outlet off. As soon as either phone appears in the network again, the outlet is automatically switched on again.&lt;/p&gt;
&lt;p&gt;I did not apply this rule to the computer or coffee machine. The computer might be left on intentionally (updates, downloads, ...), and the coffee machine might be switched on while on the way home.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Home automation is fun when it works.&lt;/p&gt;
&lt;p&gt;I am still surprised by how much you can do with Home Assistant - mainly because you can make things fit your exact needs. You are not forced into whatever the vendor thought was a good idea.&lt;/p&gt;
&lt;p&gt;Even tiny annoyances like &quot;I have to keep holding a button to switch off power&quot; are worth solving. Not because it is hard, but because it removes friction from daily life and even saves money.&lt;/p&gt;
&lt;p&gt;One lesson that matters more than it should: keep a clean naming scheme and structure. Once you add a few devices, it gets confusing fast if names are inconsistent.&lt;/p&gt;
&lt;p&gt;That is also why I set up Home Assistant from scratch after moving. My first setup started as a test and slowly turned into &quot;production&quot; without ever getting cleaned up.&lt;/p&gt;
&lt;p&gt;For now, these automations work great. And judging by my track record, more will follow.&lt;/p&gt;
</content:encoded></item><item><title>From Inbox to Archive</title><link>https://jerey.at/posts/paperless-ngx-mail/</link><guid isPermaLink="true">https://jerey.at/posts/paperless-ngx-mail/</guid><description>Paperless-ngx incoming mail rules turned a repetitive PDF-filing task into a hands-off workflow.</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s evening after a long day of work. A new email arrives with a PDF attachment — one of those documents you want to keep: save it somewhere safe and make sure it ends up in backups.&lt;/p&gt;
&lt;p&gt;I used to do this manually: download the attachment, move it to the right folder on my NAS and then forget about it until I need it again.&lt;/p&gt;
&lt;p&gt;Now that same email gets a blue tag in my mail client and the attachment is already filed away — on my NAS and backed up. Sorcery? Not quite. Just open-source.&lt;/p&gt;
&lt;h2&gt;Automate regular tasks&lt;/h2&gt;
&lt;p&gt;I like automating repetitive tasks. For example: my desk power strip switches off automatically once the power draw stays below a threshold for a while. And the TV power is cut when two specific phones leave the Wi‑Fi — a simple &quot;nobody&apos;s home (or awake)&quot; signal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
The mentioned examples here are all done with the help of &lt;a href=&quot;https://github.com/home-assistant&quot;&gt;Home Assistant&lt;/a&gt;.
See also my &lt;a href=&quot;/posts/self-hosted-services/&quot;&gt;self hosted services&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This kind of &quot;laziness&quot; is a good excuse to learn new tools — or, in this case, to use an existing tool more effectively. When I received the same type of email again, I finally looked for a way to store those attachments automatically on my NAS (and therefore inside my normal backup routine).&lt;/p&gt;
&lt;h2&gt;Paperless-ngx once again&lt;/h2&gt;
&lt;p&gt;My first instinct was to solve this in the mail client.&lt;/p&gt;
&lt;p&gt;But I don&apos;t use the same mail client across all devices and client-side automation tends to be fragile: one device ends up being &quot;the automation machine&quot;, it needs NAS access, it has to be online at the right time and so on.&lt;/p&gt;
&lt;p&gt;I also checked what my mail provider could do. That didn&apos;t get me to a clean &quot;file attachments to the NAS&quot; workflow either — especially not one that integrates with my storage and backups.&lt;/p&gt;
&lt;p&gt;Then I remembered that &lt;a href=&quot;https://docs.paperless-ngx.com/usage/#incoming-mail&quot;&gt;Paperless-ngx&lt;/a&gt; has an &quot;incoming mail&quot; feature. Since Paperless already lives next to my storage and backups (and is part of my self-hosted stack), this was exactly the missing piece.&lt;/p&gt;
&lt;p&gt;After reading the docs and a few guides (e.g. &lt;a href=&quot;https://digital-cleaning.de/index.php/paperless-ngx-teil-11-mail-abruf-mit-vielen-extras/&quot;&gt;this one&lt;/a&gt; in German), it was clear: I&apos;m not the first person with this problem and Paperless-ngx has a solid solution.&lt;/p&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;p&gt;The setup is well documented and boils down to two concepts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Defining an e-mail account in paperless-ngx. This is necessary once per e-mail account.&lt;/li&gt;
&lt;li&gt;Defining e-mail rules for the e-mail account. This is necessary once per process you want to define.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Step 1 is basically &quot;configure IMAP&quot;: server address, port, credentials. Similar to setting up a mail client on your device.&lt;/p&gt;
&lt;p&gt;Step 2 is where the magic happens: you define rules that decide which emails should be processed. I filtered by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mailbox (inbox)&lt;/li&gt;
&lt;li&gt;sender&lt;/li&gt;
&lt;li&gt;subject&lt;/li&gt;
&lt;li&gt;age&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I configured the rule to consume only the attachment (not the email body). When Paperless-ngx imports the attachment it can automatically set metadata like tags and correspondent.&lt;/p&gt;
&lt;p&gt;Finally, I wanted a quick confirmation in my mail client that an email was handled correctly — especially while testing. Paperless-ngx can tag the processed email with a custom IMAP keyword and also ignore emails that already carry that keyword.&lt;/p&gt;
&lt;p&gt;In my case, I used the keyword &lt;code&gt;apple:blue&lt;/code&gt;, which shows up as a blue tag in Apple Mail.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/PaperlessMailSetting.png&quot; alt=&quot;Apple Mail Blue Flag&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And that&apos;s it: emails arrive, attachments get consumed and the originals are marked as processed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/PaperlessMailFlag.png&quot; alt=&quot;Apple Mail Blue Flag&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This was a good reminder to look at the tools I already use before building something new: Paperless-ngx already solved the hard parts.&lt;/p&gt;
&lt;p&gt;Manually moving a PDF to a network share isn&apos;t difficult — it&apos;s just the kind of task that&apos;s easy to postpone or forget. Automating it removes that mental overhead and makes the process consistent.&lt;/p&gt;
&lt;p&gt;Paperless-ngx keeps on impressing me. And judging from my track record, this won&apos;t be the last time I&apos;ll find another feature that quietly solves an everyday annoyance.&lt;/p&gt;
</content:encoded></item><item><title>Keyboards &amp; Words Per Minute</title><link>https://jerey.at/posts/keyboard/</link><guid isPermaLink="true">https://jerey.at/posts/keyboard/</guid><description>How a colleague&apos;s mechanical keyboard sent me down a rabbit hole of switches, layers, and typing tests</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The office was silent. I had just poured myself a fresh coffee, ready to dive into the morning&apos;s work. My trusty Logitech MK710 sat in front of me – wireless, comfortable, leagues better than those terrible standard keyboards that come with most office computers. Perfect for a productive day.&lt;/p&gt;
&lt;p&gt;Then I heard it: &lt;em&gt;clack-clack-clack-clack&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t a typewriter, though it sure sounded like one. A colleague had started using a mechanical keyboard in the office. I found myself oddly captivated by the rhythmic clicking. After our coffee break conversation about his new keyboard, I figured I&apos;d do what any reasonable person would do: take a quick look online to see what the fuss was about.&lt;/p&gt;
&lt;p&gt;What followed was anything but quick. I had stumbled into a rabbit hole I didn&apos;t know existed.&lt;/p&gt;
&lt;h2&gt;The Gateway Drug&lt;/h2&gt;
&lt;p&gt;My first purchase was a Corsair K70 RGB Mk.2 with Cherry MX Blue switches. Looking back, it was the perfect entry point – feature-rich without being overwhelming. The dedicated media controls and volume wheel quickly became indispensable. There&apos;s something satisfying about reaching up to skip a song without &lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;Tab&lt;/code&gt; out of your work. The metal top plate made it feel substantial, valuable even.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/keyboard/Corsair.jpeg&quot; alt=&quot;Corsair K70 RGB Mk.2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The only thing I disliked? That distinctly &quot;gamer&quot; aesthetic. Not everything needs RGB lighting that cycles through the entire color spectrum. But it did its job: it got me interested. More than interested, actually.&lt;/p&gt;
&lt;p&gt;I started browsing Reddit. Then forums. Then YouTube. I discovered that keyboards weren&apos;t just tools – they were a hobby. People discussed switch types the way others debate coffee beans. They talked about &quot;actuation force&quot; and &quot;travel distance&quot;. Some folks even lubed their switches by hand, disassembling each one and carefully applying lubricant with a tiny paintbrush.&lt;/p&gt;
&lt;p&gt;This was deeper than I&apos;d imagined.&lt;/p&gt;
&lt;h2&gt;Building My Own&lt;/h2&gt;
&lt;p&gt;Somewhere in my Reddit browsing, I found the &lt;a href=&quot;https://github.com/josefadamcik/SofleKeyboard&quot;&gt;SofleKeyboard&lt;/a&gt;. A split keyboard. Column-staggered layout. OLED displays. Rotary encoders. And here&apos;s the kicker: you had to build it yourself. It wasn&apos;t available for purchase.&lt;/p&gt;
&lt;p&gt;I was sold immediately.&lt;/p&gt;
&lt;p&gt;A friend shared my newfound enthusiasm, so we embarked on this together. We ordered PCBs, switches, screws, and every little electrical component from the bill of materials. It was expensive – the PCBs alone cost more than I&apos;d expected. But I was fascinated by something else: this entire keyboard design, including the build guide and parts list, was freely available online. Someone had designed this, built it, perfected it, and then just... shared it. For free. So others could recreate it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/keyboard/Sofle.JPEG&quot; alt=&quot;Sofle&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The build was incredible. The finished product looked fantastic with its split design and those little OLED screens. But using it? That was a different story.&lt;/p&gt;
&lt;p&gt;The column-staggered layout meant all the keys were arranged in neat columns rather than the traditional row-stagger we&apos;re used to. Your hands barely move once you learn it. The reduced key count (only 58 keys total) meant everything lived on layers – pressing a function key transformed the keyboard entirely. The K could be a K, or an arrow down, or an asterisk, depending on what else you pressed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/keyboard/SofleDone.JPEG&quot; alt=&quot;Sofle Done&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s brilliant in theory. With enough practice, your fingers never leave the home row. You can program custom macros. It&apos;s endlessly customizable.&lt;/p&gt;
&lt;p&gt;But then came the problem: keyboard shortcuts. Try pressing &lt;code&gt;Ctrl+Shift+Alt+↓&lt;/code&gt; in Visual Studio Code – a common shortcut for adding multiple cursors. On the Sofle, that becomes &lt;code&gt;Ctrl+Shift+Alt+↓&lt;/code&gt; + the &lt;code&gt;Upper Layer&lt;/code&gt; key. Five keys at once. Your hand contorts into positions that&apos;d make a yoga instructor wince.&lt;/p&gt;
&lt;p&gt;And there was another issue I hadn&apos;t considered: muscle memory. The Sofle requires you to use the same keyboard everywhere. Your brain adapts to those layers, to those key positions. Switch to a regular keyboard and suddenly you&apos;re fumbling like you&apos;re learning to type all over again. I discovered that I type the letter B with my right index finger – perfectly fine on a normal keyboard, but on the Sofle, B sits on the left half. My brain refused to cooperate.&lt;/p&gt;
&lt;p&gt;The Sofle taught me something important: not every keyboard is meant for every use case. Sometimes the perfect keyboard on paper isn&apos;t perfect in practice.&lt;/p&gt;
&lt;h2&gt;Finding the Sweet Spot&lt;/h2&gt;
&lt;p&gt;My next keyboard took longer to choose. I knew what I wanted now: hotswappable switches (no more desoldering), a more traditional layout, and crucially, ISO-DE support. I use German layout, and apparently, this hobby is heavily ANSI-focused. Finding ISO-DE keycaps became a recurring nightmare.&lt;/p&gt;
&lt;p&gt;I nearly built an &lt;a href=&quot;https://github.com/ebastler/isometria-75&quot;&gt;Isometria 75&lt;/a&gt; – another open-source design – but the creator mentioned ongoing issues with the board. I&apos;d learned my lesson about jumping in too quickly.&lt;/p&gt;
&lt;p&gt;Then the GMMK Pro was released. A 75% keyboard (meaning it has roughly 75% of a full keyboard&apos;s keys – goodbye numpad). ISO-DE layout. Hotswappable switches. A rotary encoder. It looked perfect.&lt;/p&gt;
&lt;p&gt;It was also expensive. Very expensive. And that was before buying switches and keycaps.&lt;/p&gt;
&lt;p&gt;I justified it the way I justify all my work equipment: compared to a carpenter or goldsmith, my initial investment is minimal. A desk, a chair, a monitor, peripherals – these are my tools. If I&apos;m going to use something every single workday, I want to enjoy using it.&lt;/p&gt;
&lt;p&gt;The GMMK Pro arrived, and it was everything I&apos;d hoped for. That full metal housing felt premium. The layout was exactly what I needed – enough keys to stay productive, few enough to keep my hands from wandering. The journey seemed complete.&lt;/p&gt;
&lt;p&gt;Then I started watching more YouTube channels about keyboards. Because of course I did.&lt;/p&gt;
&lt;h2&gt;The Current Champion&lt;/h2&gt;
&lt;p&gt;The NEO65 changed the game again. A 65% layout (even more compact than the GMMK Pro, losing the function row entirely). But here&apos;s what made it special: it supports both ISO and ANSI layouts. It works wirelessly via USB dongle, has Bluetooth, and can be wired. And unlike most prebuilt boards, you can customize the firmware.&lt;/p&gt;
&lt;p&gt;That last bit was crucial since I didn&apos;t want to have a macropad lying around on my desk.&lt;/p&gt;
&lt;p&gt;It came with an array of foam and dampening materials – sound-tuning options I hadn&apos;t used before. After hours of tinkering, I had it exactly where I wanted it.&lt;/p&gt;
&lt;p&gt;This is the keyboard I use daily now. It&apos;s genuinely the best typing experience I&apos;ve had.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/keyboard/NeoAndGmmk.JPEG&quot; alt=&quot;NeoAndGmmk&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Collection Grows&lt;/h2&gt;
&lt;p&gt;I should mention the others that found their way into my life:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Das Keyboard 4&lt;/strong&gt; with Cherry MX Brown switches was my office keyboard at my previous job. Solid, professional, utterly unremarkable. It did its job and nothing more.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Logitech MX Keys Mini&lt;/strong&gt; brought me full circle to that original MK710 feeling – great battery life, wireless, reliable. Sometimes it&apos;s nice to work on something that isn&apos;t mechanical. And the connectivity is brilliant: I can reach the TV-connected computer from across the room, or quickly respond to a longer email on my phone by connecting the keyboard to it. (Yes, I refuse to type long messages on a phone screen.)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Logitech MX Mechanical Mini&lt;/strong&gt; sits at my current workplace. It&apos;s a fun middle ground – low-profile mechanical switches that feel like something between the MX Keys and a traditional mechanical keyboard. Plus, one USB dongle can handle both the keyboard and mouse.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Numbers Game&lt;/h2&gt;
&lt;p&gt;Dive deep enough into keyboards and you&apos;ll inevitably encounter typing tests. People showcase their keyboards in action, usually on sites that measure your words per minute. It&apos;s become part of the culture.&lt;/p&gt;
&lt;p&gt;I&apos;ll admit: I enjoy these tests. Not because they matter much for programming – typing speed is rarely the bottleneck in software development. But they&apos;re useful for comparing setups. How do switches compare to each other? Is this new keycap profile better for me?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://monkeytype.com/&quot;&gt;Monkeytype&lt;/a&gt; is my favorite. It tracks three main metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WPM&lt;/strong&gt;: Words per minute (total correct characters divided by five, normalized to 60 seconds)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Acc&lt;/strong&gt;: Percentage of correctly pressed keys&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: How steady your typing speed stays&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I decided to put my keyboards to the test.&lt;/p&gt;
&lt;h3&gt;The Experiment&lt;/h3&gt;
&lt;p&gt;I tested each keyboard three times: 30 seconds, lowercase English only. Here&apos;s what I found:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyboard&lt;/th&gt;
&lt;th&gt;Avg WPM&lt;/th&gt;
&lt;th&gt;Avg Acc (%)&lt;/th&gt;
&lt;th&gt;Avg Consistency (%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Neo 65&lt;/td&gt;
&lt;td&gt;100.00&lt;/td&gt;
&lt;td&gt;99.33&lt;/td&gt;
&lt;td&gt;84.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple Macbook Air M1&lt;/td&gt;
&lt;td&gt;96.00&lt;/td&gt;
&lt;td&gt;98.33&lt;/td&gt;
&lt;td&gt;81.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logitech MX Keys Mini&lt;/td&gt;
&lt;td&gt;94.33&lt;/td&gt;
&lt;td&gt;97.67&lt;/td&gt;
&lt;td&gt;79.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GMMK Pro&lt;/td&gt;
&lt;td&gt;94.33&lt;/td&gt;
&lt;td&gt;98.33&lt;/td&gt;
&lt;td&gt;76.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sofle&lt;/td&gt;
&lt;td&gt;60.00&lt;/td&gt;
&lt;td&gt;94.00&lt;/td&gt;
&lt;td&gt;61.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone 13 mini&lt;/td&gt;
&lt;td&gt;56.67&lt;/td&gt;
&lt;td&gt;97.00&lt;/td&gt;
&lt;td&gt;70.33&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Some observations:&lt;/p&gt;
&lt;p&gt;Three runs is laughably insufficient data, but the patterns are interesting anyway. The Neo65 comes out on top – no surprise since I use it daily. That the MacBook Air takes second place is also no surprise: It is my primary personal computer.&lt;/p&gt;
&lt;p&gt;The Sofle numbers are misleading. I haven&apos;t used it in months, and you can see the practice effect: 51 WPM on the first run, 69 WPM by the third. The consistency jumped from 49 to 66. Give me a week with it and those numbers would look very different.&lt;/p&gt;
&lt;p&gt;Using the Sofle also revealed something about my typing: I hit B with my right index finger. On a traditional keyboard, this works fine. On the Sofle, where B sits on the left half, my brain staged a revolt.&lt;/p&gt;
&lt;p&gt;The phone numbers explain why I hate typing on mobile devices: I&apos;m literally half as fast. I even tried using the dictation function, but that went very poorly.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;What started with a colleague&apos;s clicking keyboard became a hobby for some time. It&apos;s fascinating how these rabbit holes appear everywhere – &lt;a href=&quot;/posts/espresso-maker/&quot;&gt;coffee&lt;/a&gt;, &lt;a href=&quot;/posts/mountain-biking/&quot;&gt;mountain bikes&lt;/a&gt;, mechanical keyboards. Each one seems simple on the surface, but dive in and you find entire communities, deep technical knowledge, and endless optimization possibilities.&lt;/p&gt;
&lt;p&gt;Someone might reasonably ask: why spend hundreds on keyboards when your typing speed barely changes?&lt;/p&gt;
&lt;p&gt;For me, it&apos;s simple. Compared to other professions, the investment is minimal. I use a keyboard every single workday. If a carpenter needs quality tools and a goldsmith needs precision instruments, why shouldn&apos;t I enjoy the tool I use most?&lt;/p&gt;
&lt;p&gt;The real limitation for me was the ISO-DE layout. I considered switching to ANSI – it would open up endless keycap options. But I&apos;d have two layouts competing in my muscle memory. I already experience this with keyboard shortcuts: my brain uses Command on thin keyboards (like the MX Keys) because it associates them with Mac layouts, and Ctrl on everything else. Adding another mental mapping seemed like asking for trouble.&lt;/p&gt;
&lt;p&gt;Lately keyboards have become a quiet topic for me. I enjoy what I have and feel no urge to change anything right now.&lt;/p&gt;
&lt;p&gt;For now, the Neo65 sits in front of me, ready for another day of work.&lt;/p&gt;
</content:encoded></item><item><title>Living With a 23-Year-Old Volvo V70</title><link>https://jerey.at/posts/volvo/</link><guid isPermaLink="true">https://jerey.at/posts/volvo/</guid><description>Crossing 300,000 km after 12 years of ownership of my 2002 Volvo V70</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s fall, the mornings are crisp, and temperatures are edging toward freezing. My garage is still unfinished, so I get into a cold car dreaming of the warm cup of coffee waiting at the office.&lt;br /&gt;
Today is the first morning this year that I use the auxiliary heater. I leave home a bit late and immediately pay for it — heavy traffic. But I don’t really mind. A good podcast is running, and even if I did mind, the traffic jam would still be there.&lt;br /&gt;
When I glance down at the dashboard to check the time, a small milestone quietly announces itself: &lt;strong&gt;300,016 km&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;My Car&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/volvo/VolvoBack.JPEG&quot; alt=&quot;Volvo Back&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I bought the car at the end of 2013, and it has been good to me ever since. It’s a 2002 Volvo V70 II D5 with a 2.5‑liter diesel engine producing (or once producing) 163 hp. In everyday driving, it consumes about 6 l/100 km in summer and 7 l/100 km in winter — though this varies quite a bit.&lt;br /&gt;
Back in my student days, when I was studying 500 km away from home, I once managed 1,400 km on a single tank, translating to an impressive 5 l/100 km. When I bought it, the odometer showed around 150,000 km. That means an average of about 12,500 km per year since.&lt;/p&gt;
&lt;h2&gt;The Good&lt;/h2&gt;
&lt;p&gt;For many reasons, the car is a keeper. Despite its size and age, it’s still remarkably economical. It swallows everything I throw at it — including my mountain bike — without having to remove a single wheel.&lt;br /&gt;
Other than the usual maintenance, it has required no major repairs. With roughly 160 hp, acceleration feels solid, and the 2.5‑liter engine makes highway driving relaxed. You can technically go from 30 km/h all the way to 210 km/h in fifth gear — given enough patience.&lt;br /&gt;
Roof rails allow for all sorts of attachments, though I haven’t experimented beyond a few ski trips. The tow hitch has proven handy more than once. The cruise control works like a charm, the AC still blasts icy air, and the auxiliary heater has saved me from many cold mornings.&lt;br /&gt;
Most of my apartments didn’t have a garage, so the Volvo often stood outside. The seats — after 23 years — remain as comfortable as ever.&lt;/p&gt;
&lt;h2&gt;The Bad&lt;/h2&gt;
&lt;p&gt;No car this old is perfect. The auxiliary heater, for example, relies on a timer. If you forget to set it or leave at unpredictable times, you either drive off in a cold car or walk out early to start it manually.&lt;br /&gt;
There’s also a safety feature that disables the heater permanently if it fails to warm up properly three times in a row. Only a Volvo workshop can reset it.&lt;/p&gt;
&lt;p&gt;Then there’s the entertainment system. Mine came with a cassette player that can even skip tracks, but not the optional CD changer. I went through the usual experiments — starting with FM transmitters — before finally installing a Bluetooth module that emulates a CD changer and integrates with the stock radio. It works fine, but it lacks conveniences like autoplay and track selection. In short, it’s good but not elegant.&lt;/p&gt;
&lt;p&gt;Rear-seat safety is another issue. Isofix wasn’t standard back then, so families had to make do without it. Retrofits are possible but hard to find and expensive.&lt;br /&gt;
And finally, perhaps the car’s biggest weakness: the headlights. Even with high beam, visibility is mediocre. More than once, the car behind me has provided better road illumination than my own lights.&lt;/p&gt;
&lt;h2&gt;The Memories&lt;/h2&gt;
&lt;p&gt;After twelve years together, the Volvo carries a lot of memories. Countless road trips through Croatia, Italy, the Czech Republic, Germany, Switzerland, Slovenia, and of course plenty of drives across Austria.&lt;br /&gt;
The best part isn’t just the destinations, but the journeys themselves — the long talks, the quiet moments, the feeling of starting your holiday as soon as you leave the driveway.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/volvo/VolvoSnow.JPEG&quot; alt=&quot;Volvo Snow&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One small story stands out: the original battery lasted 18 years. When it finally gave up, I almost felt like it deserved a proper farewell.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The Volvo V70 has been a loyal companion — practical, efficient, and surprisingly comfortable after all these years.&lt;br /&gt;
Rust is beginning to appear here and there, but nothing critical yet. I hope it stays on the road a while longer. After 300,000 km together, it feels less like an old car and more like an old friend.&lt;/p&gt;
</content:encoded></item><item><title>From the Alps to the Sea by Bike</title><link>https://jerey.at/posts/ciclovia-alpe-adria/</link><guid isPermaLink="true">https://jerey.at/posts/ciclovia-alpe-adria/</guid><description>A 468 km cycling adventure from Germany to Italy along the Ciclovia Alpe Adria — through mountains, tunnels, and the seaside finish at Grado.</description><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The cool morning air smelled faintly of pine and dew as I rolled past the quiet streets of my home town, the city slowly stirring awake beneath soft golden light. Ahead awaited over 450 kilometers of winding paths, mountain climbs, and countryside vistas — an adventure that stretched beyond a typical bike ride into a journey of endurance, friendship, and discovery. Crossing borders, tracing repurposed rail trails, and finally reaching the sun-drenched coast of Italy, this wasn’t just a cycling trip; it was a chance to reconnect with the world at a human pace after months confined by the pandemic.&lt;/p&gt;
&lt;p&gt;In 2018, I got my first proper &lt;a href=&quot;/posts/mountain-biking/&quot;&gt;mountain bike&lt;/a&gt;, but it wasn’t until 2021 — amid global travel restrictions — that the idea of a longer, multi-day bikepacking adventure really took hold. What began as two friends fueled by wanderlust grew into an epic multi-day ride along the Ciclovia Alpe Adria, testing our preparation, stamina, and love for exploration.&lt;/p&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;p&gt;The preparation consisted of multiple aspects: Training to build enough endurance to manage the distance and elevation gains. Preparing the bike and maintaining it properly before starting the journey. And perhaps most importantly: Packing as little as possible while bringing everything needed. This would prove to be crucial for enjoying the journey ahead.&lt;/p&gt;
&lt;h3&gt;Training&lt;/h3&gt;
&lt;p&gt;I didn&apos;t follow any special training plan - I simply tried to go out for a bike ride whenever possible. Even my daily commute to the office results in roughly 30 km of cycling. Since I had just gotten my new bicycle, it was naturally fun to go out for a ride whenever possible. So the training aspect of preparation happened organically as part of my new bike enthusiasm.&lt;/p&gt;
&lt;h3&gt;Bike preparation and maintenance&lt;/h3&gt;
&lt;p&gt;Owning a new bike made me anxious about potential theft during this trip. I had considered bike insurance, but a &lt;a href=&quot;https://c.onl&quot;&gt;friend&lt;/a&gt; made a compelling point against it: &quot;There are so many bikes, especially e-bikes, that are worth way more. Why would anyone steal this bike if it&apos;s secured with a proper lock?&quot;
So I invested in an Abus CityChain 1060. While being very secure, it&apos;s also quite heavy. But given its size, we could use it for both bikes and share the weight burden during the trip.&lt;/p&gt;
&lt;p&gt;For maintenance, I followed the standard procedure: clean the bike thoroughly, oil the chain, and check the tire pressure. I also refined the seating position beforehand to ensure optimal comfort, and installed a holder for a second water bottle - something that would prove invaluable on longer stretches.&lt;/p&gt;
&lt;h3&gt;Packing strategy&lt;/h3&gt;
&lt;p&gt;The key to a successful bike tour is bringing everything you need while leaving behind everything you don&apos;t. Every additional gram means more weight to carry with you over hundreds of kilometers.&lt;/p&gt;
&lt;p&gt;I met up with my cycling partner and we carefully discussed who would bring what. Despite having no previous bikepacking experience - spoiler alert - we managed to bring along just enough gear for the ride. The only items we arguably packed &quot;too much&quot; of were spare inner tubes, but as any experienced cyclist knows, those are always good to have extras of.&lt;/p&gt;
&lt;h3&gt;Route planing&lt;/h3&gt;
&lt;p&gt;We then laid out a rough route with a flexible time plan. Since neither of us was fully prepared for such a demanding tour - despite our regular rides in good weather - we planned to cycle to Golling and take the train from there to Böckstein. This would allow us to avoid the most challenging mountain section of the trip. We also deliberately scheduled plenty of extra time. After all, this was a week off work - it should be enjoyable and not stressful.&lt;/p&gt;
&lt;h2&gt;Ciclovia Alpe Adria&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.alpe-adria-radweg.com&quot;&gt;Ciclovia Alpe Adria&lt;/a&gt; is a cycle path connecting Salzburg to Grado. It has ready made stages to follow and is very popular - thus there are many accommodations along the way to host bikes along the riders. Additionally, going back from Grado is also easy - especially compared to the public transportation - as there are several companies offering van rides back reasonably priced.&lt;/p&gt;
&lt;h3&gt;Day 1 - Home to Golling / Bischofshofen&lt;/h3&gt;
&lt;p&gt;We met up near our homes - each cycling a few kilometers individually before starting the journey together.
Right away, we got stuck in a mud puddle while trying to avoid the main roads through a forest path. It felt like a warning of challenges to come, but fortunately, it wasn&apos;t representative of what followed. The weather turned out to be perfect, the bike routes were nearly empty (especially in the beginning), and we felt energized and motivated for the adventure ahead.&lt;/p&gt;
&lt;p&gt;This first day also marked our first border crossing between Germany and Austria. To maintain high energy levels, I had packed plenty of energy bars to share. This quickly became our daily ritual: regular stops to reenergize.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/00Salzburg.JPEG&quot; alt=&quot;Salzburg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We continued through Salzburg towards Hallein. Despite encountering many bike commuters, it was refreshing to experience a familiar city from the saddle of a bike. Until then, I had usually navigated Salzburg by car, bus, or on foot. But as I mentioned in a &lt;a href=&quot;/posts/mountain-biking/&quot;&gt;previous blog post&lt;/a&gt;, cycling offers its own perfect pace for experiencing places.&lt;/p&gt;
&lt;p&gt;Heading south, we were grateful for the abundant signage guiding us in the right direction. Passing through Urstein brought back memories, as I had studied there for my bachelor&apos;s degree. It&apos;s surprising how much one can forget about familiar places over time.&lt;/p&gt;
&lt;p&gt;Soon we arrived in Hallein, a beautiful historic city. We were pleasantly surprised by our progress and stamina - neither of us showing signs of fatigue yet.&lt;/p&gt;
&lt;p&gt;We continued to Golling, which was meant to be our endpoint for the day. However, we discovered that the trains between Golling and Böckstein were fully booked with cyclists. So we instead took the train to Bischofshofen to stay there overnight, and hope for available space on the train to Böckstein the next day.&lt;/p&gt;
&lt;p&gt;In Bischofshofen, we took some time for sightseeing, particularly impressed by the ski jump arena. After our long day of cycling, we enjoyed a hearty dinner and attempted to get an early night&apos;s sleep in preparation for the challenging day ahead. Not all goals were achieved that evening, however.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/01Bischofshofen.JPEG&quot; alt=&quot;Bischofshofen&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;71 km&lt;/strong&gt; covered.&lt;/p&gt;
&lt;h3&gt;Day 2 - Bischofshofen to Böckstein / Mallnitz to Untergratschach&lt;/h3&gt;
&lt;p&gt;We started the day somewhat tired after our attempts at an early night. Fortunately, as the saying goes, the best cure for tiredness is exercise - and we had plenty ahead of us.&lt;/p&gt;
&lt;p&gt;The stunning landscape definitely boosted our spirits. The scenery was consistently breathtaking, and before long we arrived at Bad Gastein. Before tackling the climb ahead, we decided to fuel up with a proper meal. This proved to be a wise decision, although the ascent through the beautiful town of Bad Gastein went more smoothly than anticipated. Had we known how manageable it would be, we might never have considered taking the train from Golling to Bischofshofen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/02Gastein.JPEG&quot; alt=&quot;Bad Gastein&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Upon reaching Böckstein, we were fortunate to secure spots on the train. Arriving in Mallnitz - now in Carinthia - we found we still had energy to spare and decided to continue. We passed through a town that seemed promising for overnight accommodation, but upon discovering a large festival in progress, we decided it would be wiser to press on a bit further.&lt;/p&gt;
&lt;p&gt;We eventually stopped in Obervellach for the night. Since our goal for the day had been to reach Mallnitz, we had already gained some bonus distance. In total, we traveled 69 km this day, but the real challenge was definitely the elevation gain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;69 km&lt;/strong&gt; covered with a personal best of &lt;strong&gt;959 m&lt;/strong&gt; elevation gain.&lt;/p&gt;
&lt;h3&gt;Day 3 - Untergratschach via Spittal an der Drau to Villach&lt;/h3&gt;
&lt;p&gt;Having successfully managed the most challenging part of the tour, we began the third day with renewed enthusiasm.&lt;/p&gt;
&lt;p&gt;The Ciclovia Alpe Adria route was excellently marked along the way, meaning we rarely needed to consult our phones for navigation. We stopped for coffee and pastries in Spittal an der Drau - which had actually been our planned destination for the day. But since we were making such good progress, we decided to continue on to Villach.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/03Spittal.JPEG&quot; alt=&quot;Spittal&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The landscape, while not quite as spectacular as the previous day, was still pleasant. The cycling infrastructure was excellent, allowing us to ride side by side for much of the way, providing ample opportunity for conversation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;75 km&lt;/strong&gt; covered with good company and conversation.&lt;/p&gt;
&lt;h3&gt;Day 4 - Villach to Gemona del Friuli&lt;/h3&gt;
&lt;p&gt;Our target for the day was Tarvisio, but we arrived there before lunch and decided to continue our journey. This day marked our second border crossing: into Italy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/04Italy.JPEG&quot; alt=&quot;Italy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The cycling route was the highlight of the day. Starting from Tarvisio, we enjoyed a gentle descent along a repurposed railway line, passing through numerous tunnels carved into the mountains.
This section was particularly enjoyable, and thanks to the slight downhill gradient, our average speed was impressively high despite covering the longest distance of our trip so far.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/06River.JPEG&quot; alt=&quot;River&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/07RRBridge.JPEG&quot; alt=&quot;River&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The turquoise waters of the Tagliamento River accompanied us for much of the way, adding to the scenic beauty of the route.&lt;/p&gt;
&lt;p&gt;We eventually arrived in Gemona del Friuli and decided to stop there for the night. The day had grown increasingly warm, and the next significant town was too distant to reach comfortably.&lt;/p&gt;
&lt;p&gt;A personal best of &lt;strong&gt;105 km&lt;/strong&gt; - our longest day of cycling.&lt;/p&gt;
&lt;h3&gt;Day 5 - Gemona del Friuli to Udine&lt;/h3&gt;
&lt;p&gt;The previous evening, we had begun planning the final days of our journey. Since we were already quite close to Grado and had been moving faster than anticipated, we decided to spend two nights in Udine.&lt;/p&gt;
&lt;p&gt;This section of the route was perhaps the least enjoyable part of the entire trip. Route markers were often difficult to spot, causing us to miss turns frequently. We also had to share public roads with vehicles more often, requiring constant vigilance.&lt;/p&gt;
&lt;p&gt;Fortunately, this was also our shortest day of cycling on the Ciclovia Alpe Adria.&lt;/p&gt;
&lt;p&gt;In Udine, we explored the city and, similar to our night in Bischofshofen, attempted to get an early night&apos;s sleep. Not all aspects of our journey went according to plan, however!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/08Udine.JPEG&quot; alt=&quot;Udine&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;55 km&lt;/strong&gt; of somewhat challenging navigation.&lt;/p&gt;
&lt;h3&gt;Day 6 - Udine&lt;/h3&gt;
&lt;p&gt;Having established a routine of hearty breakfasts followed by long days of cycling, this rest day in Udine felt almost strange. We had explored much of the city the previous day and found ourselves with time to spare. We simply walked around the charming city and, for once, actually managed an early night.&lt;/p&gt;
&lt;h3&gt;Day 7 - Udine via Palmanova to Grado&lt;/h3&gt;
&lt;p&gt;After nearly missing our daily cycling routine, we eagerly embarked on the final leg of our journey. This was the grand finale: from Udine via Palmanova to our ultimate destination, Grado.&lt;/p&gt;
&lt;p&gt;The day was warm and windy, and we were glad to leave the busy streets of Udine behind - not because we disliked the city, but because sharing roads with cars in urban areas can be stressful.&lt;/p&gt;
&lt;p&gt;En route to Grado, we passed an impressive-looking town and decided to explore its center. We were delighted by our detour into Palmanova, a unique star-shaped city built in concentric circles. It offered numerous charming restaurants and bars. Had we known about it beforehand, we would have planned an overnight stay there too. Perhaps next time!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/09Palmanova.JPEG&quot; alt=&quot;Palmanova&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The final approach to Grado was both hot and magnificent. The Matteotti Bridge stretches for about five kilometers directly above the sea, offering breathtaking views.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/10GradoBridge.JPEG&quot; alt=&quot;Matteotti Bridge&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Entering Grado felt triumphant. We immediately headed for the beach, which felt like the perfect finish line for our journey.
After checking into our hotel, we took a moment to appreciate what we had accomplished.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/11Grado.JPEG&quot; alt=&quot;Grado&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;58 km&lt;/strong&gt; for the day, bringing our total to &lt;strong&gt;433 km&lt;/strong&gt; in &lt;strong&gt;6 days&lt;/strong&gt; of active cycling.&lt;/p&gt;
&lt;h3&gt;Day 8 - Grado&lt;/h3&gt;
&lt;p&gt;Believe it or not, we decided to go for another bike ride! Just a short one this time, but if anyone had suggested this before our trip began, I would have laughed in disbelief.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;35 km&lt;/strong&gt; of leisure cycling, bringing our final total to &lt;strong&gt;468 km&lt;/strong&gt; in &lt;strong&gt;7 days&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Day 9 - Homeward Bound&lt;/h3&gt;
&lt;p&gt;One advantage of popular cycling routes like the Ciclovia Alpe Adria is the availability of transportation options for the return journey. Several services offer to bring cyclists and their bikes all the way home with vans and trailers, which we gratefully utilized.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;To summarize our journey: We cycled from home to Golling, then took the train to Bischofshofen on day one. From Bischofshofen, we continued all the way to Untergratschach on day two. Day three took us to Villach. Our fourth day marked the crossing into Italy, arriving in Gemona del Friuli. From there we reached Udine on day five and spent all of day six exploring the city. Day seven brought us to our final destination, Grado. On day eight, we explored the Grado area by bike before heading home on day nine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/ciclovia/Route.JPEG&quot; alt=&quot;Route&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This ranks among the best holidays I&apos;ve ever experienced. Cycling offers the perfect pace to appreciate your surroundings while still covering meaningful distances each day.&lt;/p&gt;
&lt;p&gt;Completing this journey in 2021, after the strict Covid lockdowns, gave us valuable time to reconnect - not just for important life updates, but for those casual, sometimes silly conversations that make friendships special. With hours of cycling each day, we had ample time to chat about everything and nothing.&lt;/p&gt;
&lt;p&gt;The structure of having a daily plan and routine was satisfying without ever feeling restrictive. And perhaps most importantly, the sense of accomplishment in completing such a journey remains one of my proudest moments and most treasured memories.&lt;/p&gt;
</content:encoded></item><item><title>Beyond Transportation - My Mountain Biking Progression</title><link>https://jerey.at/posts/mountain-biking/</link><guid isPermaLink="true">https://jerey.at/posts/mountain-biking/</guid><description>How a hand-me-down mountain bike sparked a passion for cycling, leading to bike upgrades, maintenance skills, and discovering the perfect pace for experiencing the world.</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve always liked riding bikes. For years, it was just a way to get around—nothing special, just a practical way to get from A to B. That changed in 2018, when a friend moved away and left me his mountain bike. Suddenly, I found myself looking up bike parts, learning about maintenance, and planning longer rides just for fun. What started as a simple hand-me-down turned into a hobby that stuck with me.&lt;/p&gt;
&lt;p&gt;At first, the world of mountain bikes felt a bit overwhelming. There&apos;s a lot of information out there and everyone seems to have strong opinions about what makes a “proper” bike. I took it slow, talked to friends, and did my own research. Over time, I figured out what worked for me and what didn&apos;t.&lt;/p&gt;
&lt;h2&gt;Mountain Bikes&lt;/h2&gt;
&lt;p&gt;So far, I have owned three bikes. The first one was a gift, while I bought the second and third myself.&lt;/p&gt;
&lt;h3&gt;Bergamont Revox 6.0&lt;/h3&gt;
&lt;p&gt;The Bergamont Revox 6.0 was my first real mountain bike. It was a bit too small, but it had features I&apos;d never had on a bike before—disc brakes and a lockout on the shocks. The 3x10 drivetrain was pretty standard for the bikes I was used to. The bike was a good first impression of the current state of mountain bikes. Since the frame was too small for me, I continued the legacy and gifted it to a friend—time to buy a bicycle with my own money for the first time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/mtb/BR6BC3.JPEG&quot; alt=&quot;Bulls Copperhead 3 &amp;amp; Bergamont Revox 6.0&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Bulls Copperhead 3&lt;/h3&gt;
&lt;p&gt;After a year, I upgraded to a Bulls Copperhead 3. A friend helped me pick this one at a local shop and this one fit much better, since the frame size was finally right. I started tracking my rides and exploring more of the area I live in. I even talked a few friends into joining me for a two-day tour—90 km one day, 100 km the next. It was the first time I realized how much you can see from a bike and how it&apos;s the perfect pace for travel: fast enough to cover ground, slow enough to actually notice things.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/mtb/Steiermark.JPEG&quot; alt=&quot;Styria Bike Tour&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Owning this bike also got me more interested in the world of mountain bikes. I started following new developments, reading up on gear, and watching videos about the latest tech. That&apos;s when I first came across the 1x12 drivetrain and began to figure out what features I wanted in my next bike.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/mtb/BC32.JPEG&quot; alt=&quot;Bulls Copperhead 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Looking back, it was a great choice to get started. The Magura MT4 brakes were amazing, and the Shimano Deore XT derailleur shifted very crisply.&lt;/p&gt;
&lt;h3&gt;Canyon Grand Canyon 8&lt;/h3&gt;
&lt;p&gt;In 2021, I bought a Canyon Grand Canyon 8. This was the first bike I picked out myself, after a lot of research and knowing what I wanted. A &lt;a href=&quot;https://c.onl&quot;&gt;friend&lt;/a&gt; of mine had already bought a Canyon bike and was satisfied with the entire &quot;buying a bike online&quot; process.
This bike offers a few things the Bulls Copperhead 3 didn&apos;t: It has the 1x12 Shimano Deore XT RD-M8100 drivetrain and a dropper seat post. It also has a lockable Fox 34 Rhythm shock. The brakes are Shimano RT10 discs (180 mm front, 160 mm rear) with MT400 calipers. If any part of the bike felt like a downgrade, it was definitely the brakes. The Magura MT4s simply felt much better.
The gear shifting is very smooth and crisp. Compared to the 3x10 drivetrain of the previous bike, it feels like a big step up.
Being able to adjust the seat height at the press of a button is something I really enjoy. This allows quick adjustments to the seating position, which is very helpful for longer rides. Especially if you ride in more technical terrain, it is good to get the seat out of the way.
This is also the first bike where I cared about the design—it looks very sleek and good-looking.
It has made riding even more fun and I&apos;ve started looking for new trails and longer routes. This is also the bike I used for my longest bikepacking tour so far: the Ciclovia Alpe Adria. I&apos;ll write about that trip in a future post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/mtb/Canyon.JPEG&quot; alt=&quot;Canyon Grand Canyon 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This bike has been a great buy so far. I still enjoy riding it, and there really isn&apos;t a feature missing. Of course, there are always new parts I&apos;d like to upgrade, but all the components on this bike fit my needs perfectly.&lt;/p&gt;
&lt;h2&gt;Maintenance&lt;/h2&gt;
&lt;p&gt;The more I rode, the more I realized it made sense to learn some basic maintenance. You don&apos;t need much space or fancy tools—just a simple toolkit and a repair stand are enough for most things. Adjusting gears, swapping brake pads, and cleaning the drivetrain turned out to be pretty straightforward. YouTube and a good book were all I needed to get started. Keeping the bike in good shape makes every ride better and it&apos;s also satisfying to fix things yourself.
Learning these basics also meant I could help family and friends with their bikes.&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;Mountain biking is still just a hobby for me, but one that I keep coming back to. I like the mix of being outside, getting some exercise, and tinkering with the bike.
One big advantage is that you can ride alone or with friends. Riding by myself helps me to completely disconnect from the world, whereas riding with friends gives you a lot of time to talk.
If you&apos;re thinking about mountain biking, just give it a go and don&apos;t worry too much about the details. Most things become clearer once you start riding regularly—at least, that&apos;s what worked for me.&lt;/p&gt;
</content:encoded></item><item><title>My Synology NAS - From Storage to Service Hub</title><link>https://jerey.at/posts/self-hosted-services/</link><guid isPermaLink="true">https://jerey.at/posts/self-hosted-services/</guid><description>Transforming a Synology NAS into a privacy-respecting service hub with a sustainable self-hosting workflow.</description><pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Diving into the self-hosted world can be both exciting and overwhelming. With countless services to choose from and various ways to deploy them, it&apos;s easy to get lost in the possibilities. In this post, I&apos;ll walk you through my journey of integrating services on my &lt;a href=&quot;/posts/synology-ds720/&quot;&gt;Synology DS 720+&lt;/a&gt; and share insights I&apos;ve gained along the way.&lt;/p&gt;
&lt;h2&gt;Finding Services&lt;/h2&gt;
&lt;p&gt;The initial challenge with any new tech hobby is figuring out where to start. Which services are worth your time? What problems can they actually solve for you?&lt;/p&gt;
&lt;p&gt;I was fortunate to have specific goals in mind: setting up an MQTT broker and deploying &lt;a href=&quot;/posts/paperless-ngx/&quot;&gt;Paperless-ngx&lt;/a&gt;. Having already tested Paperless locally, I was confident it would benefit from running 24/7 on my Synology NAS. The MQTT broker was familiar territory, making it an ideal first project.&lt;/p&gt;
&lt;p&gt;For discovering additional services, I relied on &lt;a href=&quot;https://www.reddit.com/r/selfhosted/&quot;&gt;Reddit&lt;/a&gt;, the excellent &lt;a href=&quot;https://github.com/awesome-selfhosted/awesome-selfhosted&quot;&gt;awesome-selfhosted&lt;/a&gt; GitHub repository, and fellow tech bloggers. My criteria were simple: does it solve a real problem, replace a proprietary service with something I control, or offer an interesting learning experience?&lt;/p&gt;
&lt;p&gt;Here are the core services that have earned permanent spots in my self-hosted ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Freika/dawarich&quot;&gt;Dawarich&lt;/a&gt;: German for &quot;I&apos;ve been there&quot; – this privacy-focused alternative to Google Maps Timeline tracks your location history on your own server. It even offers integration with Immich for displaying trip photos. &lt;img src=&quot;./assets/personal/Dawarich.png&quot; alt=&quot;Dawarich&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/immich-app/immich&quot;&gt;Immich&lt;/a&gt;: While Synology Photos served me well as a Google Photos replacement, it has limitations. Immich offers compelling features that have me seriously considering a full migration (though I&apos;m still in the evaluation phase). &lt;img src=&quot;./assets/personal/Immich.png&quot; alt=&quot;Immich&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Lissy93/dashy&quot;&gt;Dashy&lt;/a&gt;: With a growing collection of services and smart home devices, managing all those IP addresses became unwieldy. Dashy creates a sleek dashboard that not only organizes everything visually but also monitors service status at a glance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/paperless-ngx/paperless-ngx&quot;&gt;Paperless-ngx&lt;/a&gt;: I&apos;ve detailed this brilliant document management system in a &lt;a href=&quot;/posts/paperless-ngx/&quot;&gt;dedicated post&lt;/a&gt;. In short, it helps you transforms physical document chaos into digital organization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/home-assistant&quot;&gt;Home Assistant&lt;/a&gt;: Perhaps the crown jewel of self-hosting, Home Assistant unifies smart home devices while keeping data local. I&apos;ve created custom automations like automatically powering down my desk equipment when power draw drops below a threshold for a specified period, or turning off the TV when nobody&apos;s home. &lt;img src=&quot;./assets/personal/HomeAssistant.png&quot; alt=&quot;Home Assistant&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/FreshRSS/FreshRSS&quot;&gt;FreshRSS&lt;/a&gt;: I enjoy reading personal blogs. FreshRSS elegantly solves the aggregation problem, bringing my favorite blogs together in one place and making them available on my phone for convenient reading.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;My initial approach to installing services was somewhat clunky – SSHing into the NAS and managing Docker containers via terminal commands. The breakthrough came when I set up VS Code&apos;s remote development over SSH, giving me a seamless development experience.&lt;/p&gt;
&lt;p&gt;My current workflow is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, I scout for documentation and ideally a ready-made &lt;code&gt;docker-compose.yml&lt;/code&gt; file at the projects page I want to get up and running.&lt;/li&gt;
&lt;li&gt;After enabling SSH access in the Synology interface, I connect via VS Code.&lt;/li&gt;
&lt;li&gt;I create a dedicated folder for each service containing the compose file and often a README documenting my setup decisions and useful references. This folder is under git versioning so I can always track changes I make.&lt;/li&gt;
&lt;li&gt;Carefully mapping volumes in the compose file ensures data persistence. I maintain a standard structure with each service having its own subfolder within my main &lt;code&gt;docker&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;After launching the service, I follow any first-time setup procedures from the project documentation.&lt;/li&gt;
&lt;li&gt;For services I want accessible outside my home network, I configure Synology&apos;s &lt;a href=&quot;https://kb.synology.com/en-us/DSM/help/DSM/AdminCenter/system_login_portal_advanced?version=7#b_5&quot;&gt;reverse proxy&lt;/a&gt; and assign a proper domain name.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Self-hosting has been a rewarding journey that strikes a nice balance – deep enough to be interesting without becoming overwhelming. The services run reliably, maintenance overhead is manageable, and I&apos;ve discovered fascinating open-source projects along the way.&lt;/p&gt;
&lt;p&gt;The community around self-hosting is vibrant and supportive, offering endless possibilities for exploration without demanding constant attention.&lt;/p&gt;
&lt;p&gt;My Synology has proven to be an excellent platform due to its energy efficiency and always-on availability. The main limitations are Synology&apos;s DiskStation Manager (DSM) ecosystem constraints and the relatively modest computing power. As AI applications become more accessible, I occasionally wish for more processing muscle to run things like &lt;a href=&quot;/posts/paperless-ngx/#plugins&quot;&gt;Paperless plugins&lt;/a&gt; locally, preserving privacy while gaining powerful features.&lt;/p&gt;
</content:encoded></item><item><title>From C++ Talks to Mountain Peaks - My Colorado Adventure</title><link>https://jerey.at/posts/cppcon-colorado/</link><guid isPermaLink="true">https://jerey.at/posts/cppcon-colorado/</guid><description>Join me as I recount my experience at CppCon 2022 and my adventures exploring the stunning landscapes of Colorado.</description><pubDate>Mon, 05 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sharpening the tools you use daily is essential. As a programmer, this means staying up-to-date with the latest recommendations and understanding how new features in programming languages solve real-world problems. For me, conferences and training sessions have always been a great way to achieve this.&lt;/p&gt;
&lt;p&gt;In 2022, I had the opportunity to attend the &lt;a href=&quot;https://cppcon.org/&quot;&gt;CppCon&lt;/a&gt; in Aurora, Colorado. Given the long travel distance, I decided to extend my trip by a week to explore the state. Here&apos;s a glimpse into my experience.&lt;/p&gt;
&lt;h2&gt;CppCon 2022&lt;/h2&gt;
&lt;p&gt;CppCon, organized by the Standard C++ Foundation, is a premier conference for C++ enthusiasts. It features talks on upcoming features, best practices, beginner-friendly tutorials, and even general software engineering topics. Beyond the technical content, it’s a fantastic social gathering and a chance to meet like-minded people.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/CppCon.JPG&quot; alt=&quot;CppCon Bjarne Stroustrup&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I attended the conference with two colleagues, and none of us had been to Colorado before. Since Aurora doesn’t offer much in terms of attractions compared to Denver, we opted to stay in downtown Denver and commute daily to the conference venue.&lt;/p&gt;
&lt;p&gt;The conference spanned five days, where I attended five talks each day. While the content was enriching, it was also overwhelming — especially when paired with jet lag. By the end of each day, I was both inspired and exhausted.&lt;/p&gt;
&lt;h3&gt;The Good&lt;/h3&gt;
&lt;p&gt;CppCon had many highlights. The talks were well-organized, and the spacing between sessions allowed for networking and relaxation. Coffee, snacks, and drinks were plentiful, keeping everyone energized.&lt;/p&gt;
&lt;p&gt;It was inspiring to see the &quot;big names&quot; in the C++ community deliver talks in person. The atmosphere was welcoming, and attendees were eager to connect and share ideas. Some companies even had exhibits, offering insights into their workflows and tools.&lt;/p&gt;
&lt;h3&gt;The Bad&lt;/h3&gt;
&lt;p&gt;Not all talks lived up to expectations. A few felt more like product advertisements than technical discussions, which was disappointing.&lt;/p&gt;
&lt;p&gt;The location of the conference was another downside. While staying at the conference hotel might have been convenient, the area lacked activities and dining options. The hotel restaurants were expensive. Staying in downtown Denver turned out to be a great decision, as it offered more affordable accommodations and plenty of evening activities.&lt;/p&gt;
&lt;h2&gt;Exploring Colorado&lt;/h2&gt;
&lt;p&gt;As someone from Austria, I was curious to see how Colorado compared. Both regions are known for their mountains and skiing, so I expected some similarities. After the conference, I had nine days to explore the state with one of my colleagues, and we planned an itinerary packed with adventure.&lt;/p&gt;
&lt;h3&gt;Denver&lt;/h3&gt;
&lt;p&gt;We started exploring Denver right away. Despite the long conference days and jet lag, we managed to enjoy dinners and evening walks around the city. Highlights included the Colorado State Capitol, Union Station, and Coors Field.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/Denver2.JPG&quot; alt=&quot;Colorado State Capitol&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/UnionStation.JPG&quot; alt=&quot;Union Station&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As an NFL fan, attending a live game was an awesome experience. Watching the Denver Broncos play the Houston Texans was unforgettable. Overall, Denver offered a great mix of sightseeing and relaxation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/DenverNFL.JPG&quot; alt=&quot;Denver Broncos vs Houston Texans&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Manitou Springs&lt;/h3&gt;
&lt;p&gt;With a rental car, we headed to Manitou Springs. On the way, we visited the &lt;a href=&quot;https://www.worldwariiaviation.org/&quot;&gt;National Museum of World War II Aviation&lt;/a&gt;. The museum was a gem, with passionate staff and fascinating exhibits. We even saw a vintage flight simulator in action.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/AP.JPG&quot; alt=&quot;Aircraft&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/APSim.JPG&quot; alt=&quot;Vintage Flight Simulator&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Driving up Pikes Peak was another highlight. The thin air at the summit was noticeable, but the breathtaking views made it worthwhile. We also visited the Garden of the Gods and explored a charming penny arcade.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/PikesPeak.JPG&quot; alt=&quot;Pikes Peak Summit&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Rocky Mountain National Park&lt;/h3&gt;
&lt;p&gt;Our journey continued to the Rocky Mountain National Park, with a stop at the Red Rocks Amphitheatre. Having seen concerts online from this iconic venue, it was amazing to experience it in person. I hope to attend a live performance there someday.&lt;/p&gt;
&lt;p&gt;Driving through the Rockies from Grand Lake to Estes Park was a mix of awe and reflection. The aftermath of a forest fire was evident, but it was fascinating to see how the landscape was regenerating.&lt;/p&gt;
&lt;p&gt;On our way back to Denver, we stopped in Georgetown and rode the historic &lt;a href=&quot;https://www.georgetownlooprr.com/&quot;&gt;Georgetown Loop Railroad&lt;/a&gt;. We wrapped up the day with classic BBQ before flying home the next day.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/RMNP.JPG&quot; alt=&quot;Regenerating Forest in RMNP&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/colorado/RMNPFire.JPG&quot; alt=&quot;Forest Fire Aftermath in RMNP&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;CppCon was a unique experience. While the talks and networking opportunities were fantastic, some aspects fell short of my high expectations — particularly the prevalence of advertising talks. Nevertheless, I’m glad we stayed in downtown Denver, as it added a lot to the overall experience.&lt;/p&gt;
&lt;p&gt;Exploring Colorado was equally rewarding. From Denver’s vibrant city life to the natural beauty of Manitou Springs and the Rockies, the trip showcased the diversity of the U.S. It also reminded me of the challenges of balancing photography with group travel — a lesson I’ll carry forward.&lt;/p&gt;
&lt;p&gt;All in all, this trip was a perfect blend of professional growth and personal adventure.&lt;/p&gt;
</content:encoded></item><item><title>How Paperless-ngx Simplified My Workflow</title><link>https://jerey.at/posts/paperless-ngx/</link><guid isPermaLink="true">https://jerey.at/posts/paperless-ngx/</guid><description>Explore my journey from a DIY Python tool to Paperless-ngx, an open-source document management system that keeps data private.</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2019, I wrote a &lt;a href=&quot;/posts/image-2-text/&quot;&gt;Python tool&lt;/a&gt; to extract text from images. To enhance the extraction, the tool attempted to rotate the image to align as much text horizontally as possible.
The motivation behind this tool was the high price of decent duplex document scanners and my desire to avoid organizing hard copy documentation manually.
A major challenge with organization is handling documents that belong to multiple categories.&lt;/p&gt;
&lt;p&gt;My solution was to stamp each document with a numbering stamp and store all documents in the same folder. Whenever I needed something, I would search for it digitally and quickly find the document&apos;s number.&lt;/p&gt;
&lt;p&gt;Then, I began self-hosting and stumbled across &lt;a href=&quot;https://paperless-ngx.com&quot;&gt;Paperless-ngx&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://paperless-ngx.com&quot;&gt;Paperless-ngx&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Paperless is an open-source document management system. It performs text recognition and enables you to search for documents based on their content.
Additionally, you can assign titles, tags, and even an archive serial number (ASN) to documents, making it perfect for my needs.&lt;/p&gt;
&lt;p&gt;One important aspect of self-hosting Paperless-ngx is that the uploaded data remains on &lt;a href=&quot;/posts/synology-ds720/&quot;&gt;my server&lt;/a&gt;. The data is stored in both its original and enhanced versions, which is crucial in case another tool becomes available or this one becomes obsolete.&lt;/p&gt;
&lt;p&gt;For a full list of features, check out the &lt;a href=&quot;https://docs.paperless-ngx.com/#features&quot;&gt;official website&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Workflow&lt;/h3&gt;
&lt;p&gt;A typical workflow involves scanning a document, uploading it to the &lt;code&gt;consume&lt;/code&gt; folder of Paperless, waiting for it to process, and then using the web UI for document classification.
The title, ASN, tags, correspondent, etc., can be set there. Depending on the configuration, new documents receive a default tag indicating that they are still in the inbox and need to be handled. Once everything for a document is set, this tag can be removed.&lt;/p&gt;
&lt;h3&gt;Plugins&lt;/h3&gt;
&lt;p&gt;To improve the workflow of Paperless, several interesting plugins are available.
With the rise of AI, I came across two tools that utilize AI for Paperless. A key requirement for such plugins is the ability to run the LLM locally, as Paperless-ngx hosts sensitive data that I do not want to expose.&lt;/p&gt;
&lt;p&gt;For a detailed comparison of these tools, check out this &lt;a href=&quot;https://www.reddit.com/r/selfhosted/comments/1hxediz/paperlessgpt_yet_another_paperlessngx_ai/&quot;&gt;Reddit thread&lt;/a&gt;, where the creator of Paperless-GPT compares it to Paperless-AI. The creator of Paperless-AI also comments in the thread.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://github.com/icereed/paperless-gpt&quot;&gt;Paperless GPT&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Paperless GPT aims to improve OCR results using LLMs. Simple OCR mistakes like &lt;code&gt;New Yark&lt;/code&gt; can be corrected to &lt;code&gt;New York&lt;/code&gt; by the LLM.
With this improved text, the plugin can automatically set the title and tags for the document.
Another useful feature is the ability to trigger processing for new documents automatically with one tag or manually with another. In manual mode, you must approve the suggested changes.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://github.com/clusterzx/paperless-ai&quot;&gt;Paperless-AI&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This plugin also analyzes documents and uses LLMs to automatically assign tags.
Its standout feature is the ability to chat with your documents, which can be handy for quickly gathering information, such as details about your car.
Like Paperless GPT, it supports both manual and automatic modes.&lt;/p&gt;
&lt;h2&gt;QuickScan&lt;/h2&gt;
&lt;p&gt;Since I do not own a scanner and document scanners are expensive, I explored alternatives and discovered &lt;a href=&quot;https://www.quickscanapp.com/&quot;&gt;QuickScan&lt;/a&gt;. I decided to try it and was impressed.
It allows you to export documents via WebDAV directly to the server and offers many customization options.
One of its most convenient features is the export favorites, which let you define regular tasks, such as uploading documents to Paperless.
Since Paperless also stores documents for my kids, I have specific export favorites for them, which automatically store their documents in a different path within the Paperless system.
Another aspect I liked is that the app is not subscription-based. I do not mind paying for software, but I prefer a one-time purchase over increasing my monthly expenses.
QuickScan is free to use but accepts donations. Donors receive rewards like changing the app&apos;s color, but all core functionality is available to everyone.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;I am glad I found a successor to my self-written Python app. The web UI is excellent, and as a popular self-hosted service, there is plenty of help available online.
The workflow I have developed is efficient and makes the scanning process very convenient. Here are my typical steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gather a batch of documents to scan.&lt;/li&gt;
&lt;li&gt;Stamp the first document with a numbering stamp.&lt;/li&gt;
&lt;li&gt;Scan the first document and send it to the &lt;code&gt;consume&lt;/code&gt; folder using QuickScan.&lt;/li&gt;
&lt;li&gt;Add the document to a binder if it needs to be kept as a physical copy. Otherwise, discard it.&lt;/li&gt;
&lt;li&gt;Repeat these steps until all documents are in Paperless-ngx.&lt;/li&gt;
&lt;li&gt;Use the Paperless-ngx web UI to configure the documents by adding titles, ASNs, etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When I discovered the plugins, I was excited to use them to further improve the digitization process. However, since I do not have a powerful computer and my initial local testing did not meet my expectations, I decided to wait.
There is a lot of ongoing development in AI tools, and better models are becoming increasingly available.&lt;/p&gt;
</content:encoded></item><item><title>Starting My Self-hosted Journey with a NAS</title><link>https://jerey.at/posts/synology-ds720/</link><guid isPermaLink="true">https://jerey.at/posts/synology-ds720/</guid><description>Find out how I transitioned from basic storage to a versatile home server with self-hosted services on a Synology NAS.</description><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2014, I bought my first network attached storage (NAS): the Synology DS 213j. Back then, I used it for storage-related tasks only, such as photo backup and media server. In 2020, I then bought the Synology DS 720+. At that time, I started experimenting with Docker and thought it would be great to have my own server that I could use for more than just storage-related tasks. This was the start of my self-hosted journey.&lt;/p&gt;
&lt;h2&gt;Synology DS 720+&lt;/h2&gt;
&lt;p&gt;The 720+ is a two-bay NAS with a quad-core processor and 2GB of RAM, which can be upgraded. It offers low power consumption, which was important for me to avoid fearing the electrical bill and to never feel the need to switch off the server. Having gathered experience with the DS 213j, I chose to stick with Synology. The applications they offer out of the box are easy to set up and keep running. Additionally, it is possible to run Docker containers on it, making it a versatile server.&lt;/p&gt;
&lt;h2&gt;Self-hosted Services&lt;/h2&gt;
&lt;p&gt;The first self-hosted service was the weather station I created along with an MQTT broker. The current services I host vary a lot. Whenever I stumble across a new project that can be self-hosted and looks interesting to me, I tend to give it a try. Depending on my liking, they will remain around or be stopped and deleted. Self-hosted services that have been around for a long time are &lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt;, &lt;a href=&quot;https://docs.paperless-ngx.com/&quot;&gt;Paperless-ngx&lt;/a&gt;, and &lt;a href=&quot;https://freshrss.org/index.html&quot;&gt;FreshRSS&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Why Self-hosted?&lt;/h3&gt;
&lt;p&gt;When you host services yourself, you are in control of your data. This makes migrating to a different service (e.g., switching your note-taking app) easier. It&apos;s important to check how the data is stored; for note-taking, I prefer plain text, mostly Markdown.&lt;/p&gt;
&lt;p&gt;A trigger for me to think more about my data was during the Covid pandemic when I was cycling a lot. A fitness watch tracked my data, and the provider visualized it well. However, retrieving the data from the provider&apos;s server after selling the watch was difficult. Fortunately, several people on GitHub shared scripts to retrieve the data, often with the caveat, &quot;.. works until version X.Y.Z&quot;. This was a wake-up call to take better care of my data.&lt;/p&gt;
&lt;p&gt;This doesn&apos;t mean I avoid all services, but I consider the accessibility of stored data more carefully. One question I often ponder: Why would a company offer free online storage, mail hosting, and a calendar? It&apos;s not truly free.&lt;/p&gt;
&lt;p&gt;However, using online services can be convenient and perfectly fine. It&apos;s crucial to understand why something is provided to you and whether you can retrieve your data without issues later. You might be content with your current storage method, but that could change.&lt;/p&gt;
&lt;h2&gt;The Future&lt;/h2&gt;
&lt;p&gt;My own server started greatly with the Synology ecosystem. But lately, I also felt that the server could use some more computing power — especially if you want to use some LLMs. I am far from any choice, but the topic &quot;Home Lab&quot; is discussed a lot online, and there are plenty of YouTube channels giving great introductions to this rabbit hole. One thing to consider when moving away from Synology: Any service updates have to be done by me, and if something breaks, I also have to fix it.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Through my NAS, I had a great introduction to home servers and self-hosted services. It is a great starting point to consider your private data more thoroughly. With the rise of AI, it would also be great to have more computing power available. Use cases can be an automatic tag creation for documents added to &lt;a href=&quot;https://docs.paperless-ngx.com/&quot;&gt;Paperless-ngx&lt;/a&gt;. Since these documents can contain sensitive data, I would not want to use an online provided service.&lt;/p&gt;
</content:encoded></item><item><title>Exploring the World of Espresso Makers</title><link>https://jerey.at/posts/espresso-maker/</link><guid isPermaLink="true">https://jerey.at/posts/espresso-maker/</guid><description>Exploring the world of espresso making, from my first budget machine to the Lelit Mara X. A look at the machines I’ve used, lessons learned, and what I’d do differently today.</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It might be obvious from some of my projects, but I love coffee.
In 2018, I started with a cheap espresso maker. It broke rather quickly, but in doing so, it sparked my deep interest in coffee.&lt;/p&gt;
&lt;h2&gt;Getting Started with Espresso&lt;/h2&gt;
&lt;p&gt;There are countless guides on what makes a good espresso. Factors like grind coarseness, coffee dosage, bean selection, and grinder quality all play a role (always grind fresh!). Then, there are standard guidelines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Espresso should take around &lt;strong&gt;25 seconds&lt;/strong&gt; from the first drop to the last.&lt;/li&gt;
&lt;li&gt;The typical ratio is around &lt;strong&gt;1:2.5&lt;/strong&gt;—meaning if you use &lt;strong&gt;15g of coffee beans&lt;/strong&gt;, you aim for &lt;strong&gt;37.5g of espresso&lt;/strong&gt; in your cup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the most important rule? These are just starting points. The real goal is always &lt;strong&gt;taste&lt;/strong&gt; — the most important part is that the espresso tastes the way you want it and that you enjoy the process of making it.&lt;/p&gt;
&lt;h2&gt;Why an Espresso Maker?&lt;/h2&gt;
&lt;p&gt;One question I hear a lot from guests is: &lt;em&gt;“Why an espresso maker? Doesn’t the whole process feel tedious?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Well, yes and no.&lt;/p&gt;
&lt;p&gt;A fully automated machine simplifies life, but that also means you end up drinking more coffee just because it’s so convenient. There’s also the cleaning aspect — manual espresso machines with portafilters allow for thorough cleaning, whereas most automatic machines provide little access to their internal brewing components.&lt;/p&gt;
&lt;p&gt;And then, of course, there’s the &lt;strong&gt;taste&lt;/strong&gt;. I’ve yet to find an automatic espresso machine that matches the flavor of a well-dialed-in manual espresso shot. Why shouldn’t your home-brewed espresso taste just as good as the one from your favorite coffee shop?&lt;/p&gt;
&lt;h2&gt;Quickmill Cassiopea&lt;/h2&gt;
&lt;p&gt;After my first espresso maker broke, I bought the &lt;strong&gt;Quickmill Cassiopea&lt;/strong&gt;. This machine features dedicated thermoblocks for both coffee extraction and hot water/steam, allowing simultaneous espresso pulling and milk frothing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/QuickMill.JPG&quot; alt=&quot;Quickmill Cassiopea&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The good part about the coffee machine was the quick heat-up time thanks to the thermoblocks. The bad parts were the weak steam power and that the group head is Quickmill-specific, limiting the accessories available for it.&lt;/p&gt;
&lt;h2&gt;E61 Group Head&lt;/h2&gt;
&lt;p&gt;After a few years, I wanted to try an &lt;strong&gt;E61 group head&lt;/strong&gt;. I sold my Quickmill at a small loss and started looking for a new machine. After some research, it came down to two machines.&lt;/p&gt;
&lt;h3&gt;Lelit Mara X vs. Bezzera Magica S&lt;/h3&gt;
&lt;p&gt;Both machines use the &lt;strong&gt;E61 group head&lt;/strong&gt;, meaning a wide variety of accessories are available. Apart from aesthetics, the key difference was that the &lt;strong&gt;Mara X&lt;/strong&gt; offers temperature control settings and different brewing modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steam Priority Mode&lt;/strong&gt; – Functions like a traditional E61 machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coffee Priority Mode&lt;/strong&gt; – A Lelit-specific setting that optimizes for espresso extraction.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
The modes have evolved over time — if you buy a Mara X today, it may have different options.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the end, the &lt;strong&gt;Mara X simply made better-tasting espresso&lt;/strong&gt; in my testing, so I went with it. Since September 2020, I’ve been very happy with my choice.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/personal/MaraX.JPG&quot; alt=&quot;Lelit Mara-X&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;The Big Drawback: Heat-Up Time&lt;/h3&gt;
&lt;p&gt;A common downside of &lt;strong&gt;E61 machines&lt;/strong&gt; is their long &lt;strong&gt;heat-up time&lt;/strong&gt;. Lelit states &lt;strong&gt;24 minutes&lt;/strong&gt;, but real-world measurements show that stability is achieved &lt;strong&gt;after 30 minutes&lt;/strong&gt;. And temperature stability is critical for consistent shots.&lt;/p&gt;
&lt;p&gt;My solution? A &lt;strong&gt;WiFi smart plug&lt;/strong&gt; that preheats the machine automatically. While this helps, it doesn’t allow for spontaneous espresso-making. Plus, &lt;strong&gt;E61 machines consume a lot of energy&lt;/strong&gt; compared to thermoblock machines since they heat an entire boiler just to extract a few milliliters of espresso.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Like many hobbies, espresso making can become a deep rabbit hole. There’s an overwhelming amount of information online, sometimes to the point, where you optimize settings, despite liking the taste already.&lt;/p&gt;
&lt;p&gt;Would I buy my setup again? &lt;strong&gt;Probably not.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since purchasing the Mara X, new machines have emerged. While I appreciate the E61 experience, I dislike the long heat-up times and high energy consumption. Yes, the smart plug is a decent workaround, but spontaneous espresso isn’t really an option.&lt;/p&gt;
</content:encoded></item><item><title>Coffee Grinder Automation - A 2025 Update</title><link>https://jerey.at/posts/coffee-grinder-automation-2025/</link><guid isPermaLink="true">https://jerey.at/posts/coffee-grinder-automation-2025/</guid><description>An overview of how I improved my coffee grinder automation project by refactoring the code for better quality and maintainability.</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back in 2020, I automated my coffee grinder. Before that, I had to weigh the ground coffee by hand.&lt;/p&gt;
&lt;p&gt;More expensive coffee grinders offer time-based grinding and some even offer weight-based grinding.
Since mine didn&apos;t, I decided to take matters into my own hands and created a project to help me with it.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/coffee-automation&quot;}&lt;/p&gt;
&lt;p&gt;I revisited this project in 2025 and was not happy with the code.&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;The logic for starting, stopping, and managing the grinding process was scattered across multiple functions, making it difficult to understand and maintain.&lt;/p&gt;
&lt;p&gt;Looking at the main &lt;code&gt;loop()&lt;/code&gt; of the Arduino-based software showed this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void loop() {
  // ...
  if (automaticGrindingOngoing) {
    auto currentWeight = getCurrentWeightAndPublish();
    if ((currentWeight + thresholdTargetGrams) &amp;lt; desiredGrams) {
      // Start or continue the grinding
    } else {
      // The current weight with a given threshold has reached the target weight ..
      if (currentWeight &amp;lt; desiredGrams) {
        // .. now approach the desired weight slowly.
        // (the grinder retention and the distance between the grinder and the scale forced this approach)
        startGrinding(&quot;automaticGrinding&quot;, 150);
      } else {
        // .. or the desiredGrams have been reached.
      }
    }

  } else if (grindingOngoing &amp;amp;&amp;amp;
       (millis() - grindingStartedTime) &amp;gt; grindingTime) {
    // Time-based grinding was ongoing and we have reached the desired grinding time -&amp;gt; Stop the grinder.
  } else {
    // We are not grinding, so handle anything else (such as updates over the air).
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Code parts were replaced by comments to ease the reading.
&lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/ea603f113caf657fe9d7a6bd0ccbf01cdb5467bc/src/program.cpp#L217-L250&quot;&gt;Here&lt;/a&gt; is a link to the full code section.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When MQTT messages are received to start grinding, the &lt;code&gt;bool&lt;/code&gt; flags &lt;code&gt;automaticGrindingOngoing&lt;/code&gt; or &lt;code&gt;grindingOngoing&lt;/code&gt; are set.&lt;/p&gt;
&lt;p&gt;Looking at the &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/ea603f113caf657fe9d7a6bd0ccbf01cdb5467bc/src/program.cpp#L138-L169&quot;&gt;&lt;code&gt;callback&lt;/code&gt;&lt;/a&gt;, I was surprised that there wasn&apos;t a &lt;code&gt;startAutomaticGrinding&lt;/code&gt; function called or that the &lt;code&gt;startGrinding&lt;/code&gt; function starts the grinding but doesn&apos;t care about stopping it.
The stopping logic was handled separately in the &lt;code&gt;loop()&lt;/code&gt;, leading to a fragmented and hard-to-follow codebase.&lt;/p&gt;
&lt;h2&gt;Improving the Code&lt;/h2&gt;
&lt;p&gt;The first idea was to extract the entire grinder and MQTT handling logic to their own libraries.&lt;/p&gt;
&lt;p&gt;This left the &lt;code&gt;program.cpp&lt;/code&gt; with less code only handling the update over the air and the connection to the Wi-Fi.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;GrindingController&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A lot of the logic was now moved to the &lt;code&gt;GrindingController&lt;/code&gt;.
It now takes care of the MQTT &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/GrindingController.cpp#L46-L76&quot;&gt;&lt;code&gt;callback&lt;/code&gt;&lt;/a&gt; with dedicated functions for each MQTT command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;automaticGrinding(..)&lt;/code&gt; -&amp;gt; Handles weight-based grinding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeBasedGrinding(..)&lt;/code&gt; -&amp;gt; Handles time-based grinding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/GrindingController.cpp#L78-L102&quot;&gt;&lt;code&gt;automaticGrinding&lt;/code&gt;&lt;/a&gt; function takes care of everything needed for weight-based grinding.
It tares the scale, grinds beans until the target weight minus a threshold is reached, and then slowly approaches the target weight. Additionally, it also handles all the MQTT updates.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/GrindingController.cpp#L20-L25&quot;&gt;&lt;code&gt;timeBasedGrinding&lt;/code&gt;&lt;/a&gt; function sends out updates via MQTT, starts, and stops the grinder based on the desired time.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/GrindingController.cpp#L116-L119&quot;&gt;&lt;code&gt;GrindingController::loop()&lt;/code&gt;&lt;/a&gt; is called by the &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/src/program.cpp#L81-L86&quot;&gt;&lt;code&gt;program::loop()&lt;/code&gt;&lt;/a&gt;.
Its main task is checking for MQTT updates and publishing the current weight on the scale regularly.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;MqttGrinder&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;MqttGrinder&lt;/code&gt; is more or less a wrapper of the &lt;a href=&quot;https://github.com/knolleary/pubsubclient&quot;&gt;&lt;code&gt;PubSubClient&lt;/code&gt;&lt;/a&gt;, a library used for MQTT communication.
It takes care of any grinder-specific MQTT communication, such as &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/MqttGrinder.cpp#L25-L41&quot;&gt;publishing&lt;/a&gt; new values, &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/MqttGrinder.cpp#L6-L11&quot;&gt;subscribing&lt;/a&gt; to MQTT topics relevant to the grinder, and setting up the &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/MqttGrinder.cpp#L58C26-L58C34&quot;&gt;callback&lt;/a&gt; which is called when one of the subscribed topics is received.&lt;/p&gt;
&lt;h3&gt;Blocking vs. Non-Blocking&lt;/h3&gt;
&lt;p&gt;The old implementation within the &lt;code&gt;program::loop()&lt;/code&gt; was (almost) non-blocking, which actually is a good practice. A few delays were part of it, but in theory, the &lt;code&gt;program::loop()&lt;/code&gt; would be pretty much executed periodically.&lt;/p&gt;
&lt;p&gt;The new implementation is blocking since the new grinding functions remain in a &lt;code&gt;while&lt;/code&gt;-loop until the targets are reached - theoretically, they can also never be reached.&lt;/p&gt;
&lt;p&gt;But since the grinder controller always has exactly one task to do (either time-based or automatic grinding) and a firmware update should only occur when the grinder is not grinding, this solution felt right.
Additionally, the two main functions of the &lt;code&gt;GrindingController&lt;/code&gt; (&lt;code&gt;automaticGrinding&lt;/code&gt; and &lt;code&gt;timeBasedGrinding&lt;/code&gt;) now are responsible for their own actions all the time, making the code easier to understand.&lt;/p&gt;
&lt;p&gt;And despite the two functions being blocking, the &lt;code&gt;MqttGrinder&lt;/code&gt; will still handle the MQTT messages regularly since the current weight is published periodically.
This is probably the part that should be refactored next, as there is a lot of hidden logic there. That &lt;code&gt;GrindingController::getCurrentWeightAndPublish()&lt;/code&gt; publishes the weight after a defined time has passed (&lt;code&gt;scaleUpdateTime&lt;/code&gt;) and therefore triggers an MQTT update is pretty hidden.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;It was fun to refactor this old project. Often my ESP-based projects start off as a quick proof of concept through which the code quality often suffers.&lt;/p&gt;
&lt;p&gt;Additionally, I no longer own that grinder and therefore no longer use this project.
My current grinder is a so-called &quot;single dose coffee grinder&quot; - you weigh the beans before pouring them into the grinder and the output of the grinder is exactly the same weight.&lt;/p&gt;
&lt;p&gt;But still having the load cell available enabled me to &quot;experience&quot; my own documentation for the setup - where the schematic allowed me to quickly have something up and running.
For testing, I chose to skip the relay and instead use the built-in LED of the D1 mini to indicate the current state of the grinder.&lt;/p&gt;
&lt;p&gt;There are still several code parts that would benefit from a refactoring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The new &lt;a href=&quot;https://github.com/Jerey/coffee-automation/blob/f62142d689d115cbf7541daf6f7284798d2f38ee/lib/CoffeeAutomation/GrindingController.cpp#L46-L76&quot;&gt;&lt;code&gt;callback&lt;/code&gt;&lt;/a&gt; function is rather long for being a mapping of topic to function.&lt;/li&gt;
&lt;li&gt;A lot of logic is still hidden. That removing &lt;code&gt;GrindingController::getCurrentWeightAndPublish()&lt;/code&gt; results in no MQTT messages being updated is not something I would expect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, further functions could be added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fallback to ensure that the relay is switched off if anything bad happens (firmware crashes, etc.).&lt;/li&gt;
&lt;li&gt;Hardware buttons to control the grinder: MQTT enables many ways to control the grinder. But in real life, one would always control the grinder while standing there. It would be great to adjust settings and start the grinding without the need for any MQTT-compatible device.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those code updates will come is unclear since I am no longer a user of the project.
But I also did not expect to refactor this project and yet here we are.&lt;/p&gt;
&lt;p&gt;For a detailed view of the changes, you can check out the &lt;a href=&quot;https://github.com/Jerey/coffee-automation/pull/2&quot;&gt;GitHub pull request&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Stockholm, Kiruna and Oslo</title><link>https://jerey.at/posts/kiruna-stockholm-oslo/</link><guid isPermaLink="true">https://jerey.at/posts/kiruna-stockholm-oslo/</guid><description>A journey through the breathtaking beauty of Scandinavia´s cities and landscapes. From the Northern Lights in Kiruna to the stunning architecture of Stockholm and Oslo.</description><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Stockholm, Kiruna and Oslo&lt;/h1&gt;
&lt;p&gt;As I embarked on this journey through Scandinavia, my passion for photography grew alongside my excitement to capture the breathtaking beauty of these cities and landscapes. From the Northern Lights in Kiruna to the stunning architecture of Stockholm and Oslo, each destination offered a unique experience that pushed my skills to new heights.&lt;/p&gt;
&lt;h2&gt;Stockholm&lt;/h2&gt;
&lt;p&gt;Our journey began in Stockholm, a great city to get started with photography. The city&apos;s rich culture, delicious food, and shorter winter days made it an ideal spot to test my camera. We spent three nights exploring the city&apos;s many museums, including the Vasa Museum on the island of Djurgården.&lt;/p&gt;
&lt;h3&gt;Vasa Museum&lt;/h3&gt;
&lt;p&gt;The Vasa Museum is home to a Swedish warship that sank on its maiden voyage in the 17th century. The ship was discovered in the 1950s and has undergone extensive preservation efforts. I had previously visited this museum several times, but it never failed to amaze me.
Having bought the Canon EOS M50 Mark II and the Sigma EF-M 16mm f/1.4 prior to this trip, I had to bring it to the museum. That allowed me to further figure out photography in dark conditions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmVasaFromTop.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmVasaFromBack.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Julbord&lt;/h3&gt;
&lt;p&gt;Despite growing up in Austria, my family always celebrated Christmas in a Swedish fashion - so with a traditional Swedish Christmas feast, known as Julbord.
During December, several restaurants offer a Julbord.
So additionally to Christmas, I got to enjoy this buffet an additional time that year.&lt;/p&gt;
&lt;h3&gt;Walking&lt;/h3&gt;
&lt;p&gt;The best way to explore a city is typically by walking. This allowed us to take photos whenever we stumbled across nice places. My friend taught me a few tricks on photography. For example in the following photo if you look to the left of the light pole, you can see a large tower far away in the background.
This tower drew attention to it, which was not the intention for this photo. So by strategically placing the light pole in front of it, the photo became visually more appealing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmPark.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In addition to exploring the city, we also tried some delicious Swedish street food, like Tunnbrödsrulle, a flatbread wrapped around a sausage, mashed potatoes, and other tasty fillings.&lt;/p&gt;
&lt;p&gt;Here are a few impressions of Stockholm and some of my first photos with my camera.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmNationalmuseum.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmStora.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/StockholmAtNight.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Kiruna&lt;/h2&gt;
&lt;p&gt;After three days in Stockholm, we flew to Kiruna. I definitely recommend a seat at the window, as the landscape is spectacular.
We had a rental car in Kiruna, which introduced a first time: Driving a car with spikes.
Similar to Stockholm, we immediately started walking around the city, grabbed a Souvas Rulle (similar to the Tunnbrödsrulle, but with reindeer meat instead of the sausage) and spent some time in the apartment waiting for the Northern Lights.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaAtDay.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaChurchOther.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As I wrote in the last post, we checked out the local church, walked around the town in the dark and drove to a less light polluted area to raise the chances of seeing the Northern Lights - which we kind of did, but only through the lens of the camera.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaFirstAurora.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We also took part in an Aurora expedition with dinner - a snowmobile, Northern Lights and dinner tour. Sadly we did not see the Northern Lights that day, but the landscape and food were great.
Another day, we drove to the Esrange Space Center. It was a long car drive, but it was worth it. We stopped on several occasions for photography and even saw a Moose and a Reindeer in the wild. The space station visitor center was interesting, but the best part about going there was definitely the landscape and the almost untouched nature.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaSpaceStation1.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaSpaceStation2.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaSpaceStation3.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After that, we went on to our next hotel, which was situated at the Torne river. There we were able to see the Northern Lights with our eyes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/KirunaAuroraCamp.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Oslo&lt;/h2&gt;
&lt;p&gt;To finish our Scandinavian trip - sorry Finland - we went to Oslo in Norway. We walked through the city, took several photos at the Oslo Opera House and the pier. We saw the Royal Palace and took it rather slow and easy that day, after having spent much time sightseeing and taking photos.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/OsloOpera.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/kiruna-stockholm-oslo/OsloHarbor.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The entire trip was a great experience. The Northern Lights were definitely the highlight of this journey. Kiruna is an awesome city and I definitely want to go there again. I have been to Stockholm often, so it is kind of &quot;known&quot; but as always a great experience. And Oslo has been awesom. It was nice to see the city for a second time, but due to the Corona pandemic rising again, many activities were not possible and we were also already exhausted from the past days walking and taking pictures.&lt;/p&gt;
</content:encoded></item><item><title>Kiruna and the Northern Lights</title><link>https://jerey.at/posts/photography/</link><guid isPermaLink="true">https://jerey.at/posts/photography/</guid><description>A trip to Sweden’s Kiruna offered me an unforgettable opportunity to capture the stunning Northern Lights and explore new depths in my photography through the use of professional gear.</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Having Swedish roots, a friend of mine asked me in 2021, if I wanted to join him on a trip to Sweden to capture the Northern Lights.&lt;/p&gt;
&lt;h2&gt;Camera Setup&lt;/h2&gt;
&lt;p&gt;Up until then, I had primarily taken photos with my phone. In 2015, I started creating yearly photo albums after realizing that I rarely revisited my pictures. This practice motivated me to take more photos, knowing they would be part of my next album. As a result, I had already been considering purchasing an entry-level mirrorless camera. The chance to photograph the Northern Lights became the final push I needed. I bought an used Canon EOS M50 Mark II, which came with a Canon EF-M 15-45mm f/3.5-6.3 IS STM lens.&lt;/p&gt;
&lt;h2&gt;Lenses and a Tripod&lt;/h2&gt;
&lt;p&gt;My friend, an experienced photographer, quickly introduced me to essential photography techniques and settings. He recommended purchasing an additional lens for capturing the Aurora Borealis: the SIGMA EF-M 16mm f/1.4. Its wide aperture would allow more light to enter, making it ideal for low-light photography.&lt;/p&gt;
&lt;p&gt;Another lens he suggested was the budget friendly Canon EF 50mm f/1.8, perfect for portrait photography. Since my M50 has an EF-M mount, I needed an adapter to use this lens. The adapter applies a 1.6x crop factor, effectively converting the 50mm lens into an 80mm equivalent. This exposed one of the first drawbacks of my camera: the limited availability and high cost of compatible lenses.&lt;/p&gt;
&lt;p&gt;Another crucial investment was a sturdy tripod. I chose the Rollei Compact Traveller No. 1, ensuring stability for long-exposure shots.&lt;/p&gt;
&lt;h2&gt;Kiruna&lt;/h2&gt;
&lt;p&gt;With my camera gear ready, I began testing my lenses and exploring the camera’s settings. Initially, it was overwhelming, but much of my learning came from hands-on experimentation during the trip.&lt;/p&gt;
&lt;p&gt;December in Kiruna is incredibly cold, so we often found ourselves indoors, waiting for the Northern Lights or preparing food. During these breaks, we experimented with different camera settings, even attempting to take photos through the windows. One amusing moment occurred when I excitedly captured a green light on my camera, only to realize upon closer inspection that it was the reflection of the microwave clock. The long exposure time had allowed the camera to pick up details that were invisible to the naked eye.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/Microwave.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We ventured into the city and its surroundings. After capturing several shots of the local church, we drove to a remote area with minimal light pollution. At first, we saw what appeared to be an unusual cloud, but upon pointing the camera at it, we discovered that it was actually the Aurora Borealis. While it wasn’t yet visible to the naked eye, seeing it through the camera was thrilling.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/Church.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/FirstNorthernLights.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our next hotel was situated near the river Torne surrounded by a forest — an ideal location for photography but also a gamble, as the northern lights are not guaranteed and there was not much else to do there. Fortunately, luck was on our side. This time, we could see the lights with our bare eyes — not as vividly as through the camera, but still an unforgettable sight.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/SecondNorthernLights1.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/SecondNorthernLights2.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here a photo for comparison taken with my phone:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/travel/photography/SecondNorthernLightsPhone.JPEG&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;All in all, the trip to Sweden was an incredible experience. I captured my first stunning photos with a proper camera and compared them to those taken with my phone. However, I also encountered another challenge: post-processing. Editing the images required time and effort — yet another skill to master.&lt;/p&gt;
&lt;p&gt;Despite this, the journey reinforced my passion for photography, and I left Sweden with unforgettable memories and a deeper appreciation for the art of capturing light.&lt;/p&gt;
</content:encoded></item><item><title>Mara X Meter</title><link>https://jerey.at/posts/mara-x-meter/</link><guid isPermaLink="true">https://jerey.at/posts/mara-x-meter/</guid><description>An e-paper display which visualizes the heat-up process and key metrics of the Lelit Mara-X espresso machine.</description><pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My espresso machine is a Lelit Mara-X. Among several adaptations to the classic E-61 brewing unit, the Mara-X features a serial input and output interface. This interface provides information such as the current software version, target boiler temperature, current boiler temperature, current heat exchanger temperature, and the heating status (on or off).&lt;/p&gt;
&lt;p&gt;I have come across several projects that visualize this data in various ways.&lt;/p&gt;
&lt;p&gt;To ensure that the aesthetics of the coffee machine remain largely unaffected by modern displays, I decided to use an e-paper display. This display visualizes the data relevant to me and also draws a heat-up graph.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/mara-x-meter&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Coffee Grinder Automation</title><link>https://jerey.at/posts/coffee-grinder-automation/</link><guid isPermaLink="true">https://jerey.at/posts/coffee-grinder-automation/</guid><description>An automated coffee grinder using a D1-mini and load cell to achieve precise weight-based grinding for consistent coffee quality.</description><pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I enjoy a good cup of coffee. To achieve that at home, I bought a coffee grinder along with a nice espresso machine. Several factors are important for a great-tasting coffee: coarseness, dosage, quality of the beans, extraction time, and more. To find the best-tasting coffee, it is crucial to minimize the changing factors, one of which is the amount of beans. Previously, I had to stand by the coffee grinder with a scale and manually measure the amount of ground beans. After working from home for a while, I got annoyed with this process, so I decided to automate the grinding of the beans.&lt;/p&gt;
&lt;p&gt;Having gained some experience in the &lt;code&gt;ESP8266&lt;/code&gt; world, I decided to use a &lt;code&gt;D1-mini&lt;/code&gt; for the task. After some research, I chose to use a load cell along with the load cell amplifier HX711. The grinder itself is switched on and off by a relay controlled by the &lt;code&gt;D1-mini&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;node-red&lt;/code&gt; flow along with the &lt;code&gt;node-red&lt;/code&gt;-dashboard is used to control the &lt;code&gt;D1-mini&lt;/code&gt;. The commands are sent through &lt;code&gt;mqtt&lt;/code&gt; topics.&lt;/p&gt;
&lt;p&gt;On the dashboard, there are several functions: weight-based and time-based grinding, a brew timer, and the taring of the scale. The main challenge with this project was that it takes some time for the ground coffee to reach the scale while grinding. Therefore, stopping the grinder when the weight is reached might already be too late. It was necessary to stop the grinding process a bit earlier and then grind some more until the target weight is reached.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/project/CoffeeGrinderDashboard.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/coffee-automation&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Image to Text</title><link>https://jerey.at/posts/image-2-text/</link><guid isPermaLink="true">https://jerey.at/posts/image-2-text/</guid><description>A Python tool that extracts text from scanned documents, stores it digitally, and organizes them using a numbering system for easy retrieval.</description><pubDate>Fri, 01 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I enjoy the transition to a paperless world, as I find it much easier to organize documents digitally. However, since many documents are still required as hard copies, one is forced to archive them. A tough question then is: How many and which categories of organizers will one need for all documents?&lt;/p&gt;
&lt;p&gt;For me, I decided that I do not want any categories and each organizer should be used until it is full.&lt;/p&gt;
&lt;p&gt;To be able to find documents, I wrote a Python program that extracts text from scanned documents and stores it in a computer-processable way.&lt;/p&gt;
&lt;p&gt;Additionally, each document is stamped with a numbering stamp (which automatically increases its number with each stamping) and the computer-processable data is stored in folders named by the number of the document. So whenever I am looking for a certain document, I type in keywords from the document and the computer provides me with the number of the document and a preview of it. Then I can grab the organizer, which has the number range written on it, and take the document from it.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/image-to-pdf-and-txt&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Weatherstation</title><link>https://jerey.at/posts/weatherstation/</link><guid isPermaLink="true">https://jerey.at/posts/weatherstation/</guid><description>Hard- and software project to track, store and visualize the current temperature and humidity.</description><pubDate>Fri, 01 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Looking for a project to work on in my spare time that touches on several technologies, I came across the &lt;code&gt;ESP8266&lt;/code&gt; and had the idea to create a &quot;weather station.&quot; It should be able to track the room climate by storing the current temperature and humidity. Additionally, this collected data should be presented in a nice way.&lt;/p&gt;
&lt;p&gt;The project consists of two major parts: &lt;a href=&quot;https://github.com/jerey/weatherstation-client&quot;&gt;The client&lt;/a&gt;, which measures the current temperature and humidity and publishes the data via &lt;code&gt;MQTT&lt;/code&gt;. It is based on an &lt;code&gt;ESP&lt;/code&gt;, and a custom PCB was created for the &lt;code&gt;D1 mini&lt;/code&gt; to facilitate the connections. The second part is the server, which stores the received values and presents them in a nice way. There are multiple ways to start a server to handle the data: either with a &lt;a href=&quot;https://github.com/jerey/weatherstation-server&quot;&gt;Node.js-based server&lt;/a&gt;, which was specifically created for this project utilizing a SQL database to store the values and starting a web server to present the data in the form of graphs, or with the help of &lt;code&gt;node-red&lt;/code&gt;, &lt;code&gt;influxdb&lt;/code&gt;, and &lt;code&gt;grafana&lt;/code&gt;. Here, a &lt;code&gt;node-red&lt;/code&gt; flow is started, which automatically stores the published data to an &lt;code&gt;InfluxDB&lt;/code&gt;, and &lt;code&gt;Grafana&lt;/code&gt; is used to visualize it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/project/WeatherstationNodeJSServer1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./assets/project/WeatherstationGrafana.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/weatherstation-client&quot;}&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Jerey/weatherstation-server&quot;}&lt;/p&gt;
</content:encoded></item></channel></rss>