<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>goncalomb.com (blog)</title><description>A blog about technology, programming and other random things. By Gonçalo MB.</description><link>http://localhost:4321/blog</link><item><title>My stance on AI writing and coding</title><link>http://localhost:4321/blog/2025/12/12/d090bc20-my-stance-on-ai-writing-and-coding</link><guid isPermaLink="true">http://localhost:4321/blog/2025/12/12/d090bc20-my-stance-on-ai-writing-and-coding</guid><pubDate>Fri, 12 Dec 2025 20:45:47 GMT</pubDate><content:encoded>&lt;p&gt;The previous iteration of this site, before the &lt;a href=&quot;/blog/2025/07/27/a6cbdb77&quot;&gt;Astro rebuild&lt;/a&gt;, had a notice on the footer that read:&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;All content (including code) on this site, attributed to me (Gonçalo MB), was created without the deliberate use of AI tools. I’m making a commitment to keep it that way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is still true today.&lt;/p&gt;
&lt;p&gt;I’ve used AI tools before, but mostly as a way to search for information, both ChatGPT and Google AI Mode (Gemini). But I’m not an AI/ML developer. I don’t keep up with the latest AI news, models, tools, APIs, etc. And if you ask me about some AI thing, I probably won’t know what you are talking about.&lt;/p&gt;
&lt;p&gt;I concede that AI is a very powerful and influential technology, but in addition to all the good that it might bring, there are also many well-documented problems, both technological and cultural.&lt;/p&gt;
&lt;p&gt;I don’t want AI to permeate my life, and especially I don’t want it to control my ideas, creations, and memories.&lt;/p&gt;
&lt;h2 id=&quot;writing&quot;&gt;Writing&lt;/h2&gt;
&lt;p&gt;I’ve never used any AI tools to write or rewrite text, blog posts, comments, emails, notes, etc. I find that idea repulsive at best. If I’m publishing some text with my name attached, I want it to be my words, not those of some machine. My writing might not be the best, but it’s still mine.&lt;/p&gt;
&lt;p&gt;I do use normal spell checking to catch any typographical errors, but that has been the standard for decades.&lt;/p&gt;
&lt;p&gt;If for some fringe reason I have to post any AI-generated text anywhere, it will be clearly marked as such.&lt;/p&gt;
&lt;h2 id=&quot;coding&quot;&gt;Coding&lt;/h2&gt;
&lt;p&gt;I’ve always considered coding a creative thing, by this I mean that, for me, code has expression and meaning. It carries the ideas and feelings of its creator, like writing. I can go back to some code that I’ve written and see the intent and ideas behind it. That’s not to say that I consider all code meaningful, I’ve written a lot of purely mechanical code, just to “get it done”. And I know that other people just see code as “a means to an end” and that’s fine.&lt;/p&gt;
&lt;p&gt;Also, every programmer knows that, in addition to creating new code, programming requires a lot of searching, studying, reading documentation, tutorials, etc. And sometimes we even directly reuse code and algorithms created by others. For me, up until now, this was the only way I ever programmed anything. But clearly with these “new” AI tools, that is no longer the &lt;em&gt;only&lt;/em&gt; way.&lt;/p&gt;
&lt;p&gt;I’ve tested AI coding tools before, and I’ve asked ChatGPT for some throwaway snippets of code. But, as of today (2025-12-12), I have never published or committed any AI-generated code to any repositories (public or private) that I have contributed to. This might be about to change.&lt;/p&gt;
&lt;p&gt;After much reflection, I have enabled GitHub Copilot on VS Code. These are my commitments now:&lt;/p&gt;
&lt;p&gt;Any of my commits with AI-generated code/assets (on any project) will have the author/committer email &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;me+ai@g...mb.com&lt;/code&gt; (my normal git email with a &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;+ai&lt;/code&gt; sub-address) and additional information in the commit message or comments if necessary. Any of my own projects that include AI-generated code/assets will have a notice (e.g., in the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;README.md&lt;/code&gt; or website).&lt;/p&gt;
&lt;p&gt;I will consider code/assets to be “AI-generated” if they were created using AI prompts, AI rewrites/refactoring, “vibe coding”, etc. As for AI “inline suggestions”, I will consider these “AI-generated” (and mark the commit) if they don’t match what I was already going to type (in content, format, style, etc.). Basically, if I don’t feel like I personally created some piece of code, I’ll mark it.&lt;/p&gt;
&lt;p&gt;I will also never publish any code that I didn’t read and understand completely.&lt;/p&gt;
&lt;p&gt;With these clear commitments, I hope to be able to use these tools and continue to enjoy programming while maintaining control and authorship of my code. I’ll probably continue programming the classic way (i.e., avoiding AI prompts and “vibe coding”) but use AI as an enhancement/alternative to search and for boilerplate code while using AI “inline suggestions” as a way to be faster and more productive.&lt;/p&gt;
&lt;h2 id=&quot;tldr&quot;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Writing:&lt;/strong&gt; no AI-generated text under my name anywhere, any AI-generated text will be clearly marked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coding:&lt;/strong&gt; limited AI use, any of my commits with AI-generated code will have the author/committer email &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;me+ai@g...mb.com&lt;/code&gt;, and any of my own projects that include AI-generated code will have a notice.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If my stance on these issues ever changes, I’ll update this post (keeping any previous text).&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;Thanks for reading and using RSS. Full blog at &lt;a href=&quot;/blog&quot;&gt;goncalomb.com&lt;/a&gt; (&lt;a href=&quot;/blog/2025/12/12/d090bc20-my-stance-on-ai-writing-and-coding&quot;&gt;this post&lt;/a&gt;).&lt;/p&gt;
&lt;ul style=&quot;list-style: none; padding-left: 1.5rem;&quot;&gt;
	&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:github&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:github&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59c.4.07.55-.17.55-.38c0-.19-.01-.82-.01-1.49c-2.01.37-2.53-.49-2.69-.94c-.09-.23-.48-.94-.82-1.13c-.28-.15-.68-.52-.01-.53c.63-.01 1.08.58 1.23.82c.72 1.21 1.87.87 2.33.66c.07-.52.28-.87.51-1.07c-1.78-.2-3.64-.89-3.64-3.95c0-.87.31-1.59.82-2.15c-.08-.2-.36-1.02.08-2.12c0 0 .67-.21 2.2.82c.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82c.44 1.1.16 1.92.08 2.12c.51.56.82 1.27.82 2.15c0 3.07-1.87 3.75-3.65 3.95c.29.25.54.73.54 1.48c0 1.07-.01 1.93-.01 2.2c0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:github&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://github.com/goncalomb&quot; rel=&quot;me noopener&quot;&gt;GitHub @goncalomb&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:mastodon&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:mastodon&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603c.348-1.778.32-4.339.32-4.339c0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091c.083 3.394.626 6.74 3.78 7.57c1.454.383 2.703.463 3.709.408c1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295c-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541c-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764c.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983c.74 0 1.336.259 1.791.764q.662.757.661 2.046z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:mastodon&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://fosstodon.org/@goncalomb&quot; rel=&quot;me noopener&quot;&gt;Mastodon @goncalomb@fosstodon.org&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:person-lines-fill&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:person-lines-fill&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6m-5 6s-1 0-1-1s1-4 6-4s6 3 6 4s-1 1-1 1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:person-lines-fill&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;/#contacts&quot; rel=&quot;me noopener&quot;&gt;(more contacts)&lt;/a&gt;

			&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;</content:encoded><category>ai</category><author>goncalomb</author></item><item><title>Now using Astro</title><link>http://localhost:4321/blog/2025/07/27/a6cbdb77-now-using-astro</link><guid isPermaLink="true">http://localhost:4321/blog/2025/07/27/a6cbdb77-now-using-astro</guid><pubDate>Sun, 27 Jul 2025 20:54:25 GMT</pubDate><content:encoded>&lt;p&gt;Earlier this year I decided to rebuild this website using a modern framework… It’s now powered by &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;the-background&quot;&gt;The background&lt;/h2&gt;
&lt;p&gt;Ever since I started this website back in 2013, it has always been running on some custom PHP backend. In 2018 I even rebuilt and published the “CMS” on GitHub (&lt;a href=&quot;https://github.com/goncalomb/asbestos&quot;&gt;asbestos&lt;/a&gt;). This CMS only had very basic routing and some HTML utility classes, but it was always good enough to serve a couple of pages.&lt;/p&gt;
&lt;p&gt;Then I started the blog. That required implementing proper content management with Markdown files, images, etc. this was never part of the original system. And after my last post gained considerable views from Hacker News, some people started asking for an RSS feed. I knew it was time for a rebuild. I didn’t really want to implement anything else on this old system.&lt;/p&gt;
&lt;h2 id=&quot;the-framework&quot;&gt;The framework&lt;/h2&gt;
&lt;p&gt;My basic requirements were TypeScript, React, and static site generation.&lt;/p&gt;
&lt;p&gt;At first I considered Next.js, but my (limited) experience with it was not very good. I never liked the way it mixes server and client code, and it always felt too dependent on Vercel. I also tried Gatsby, but it looked too fragmented with too many plugins and configurations.&lt;/p&gt;
&lt;p&gt;Ultimately, I couldn’t be happier to have chosen Astro. With Astro basically everything that can, will be &lt;a href=&quot;https://docs.astro.build/en/concepts/islands/&quot;&gt;rendered as static HTML&lt;/a&gt; for improved performance. It also has built-in content management using &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot;&gt;content collections&lt;/a&gt; with TypeScript type-safety, &lt;a href=&quot;https://docs.astro.build/en/guides/server-islands/&quot;&gt;server islands&lt;/a&gt; if you want server rendered content, &lt;a href=&quot;https://docs.astro.build/en/guides/framework-components/&quot;&gt;integration with several UI frameworks&lt;/a&gt; (e.g. React) and much more.&lt;/p&gt;
&lt;h2 id=&quot;the-rebuild&quot;&gt;The rebuild&lt;/h2&gt;
&lt;p&gt;As for the website itself, the new design very much mirrors the old one, still using &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt; and a custom theme, with some minor changes. I had to create a couple of remark/rehype plugins (that’s what Astro uses for Markdown and MDX, &lt;a href=&quot;https://unifiedjs.com/&quot;&gt;unifiedjs&lt;/a&gt;), to properly render my old blog posts files, but other than that, it was just a matter of recreating the design using Astro components and moving the files.&lt;/p&gt;
&lt;p&gt;Now the blog has a proper &lt;a href=&quot;http://localhost:4321/blog/rss.xml&quot;&gt;RSS feed&lt;/a&gt;, year and tag pages, header links and a dash of &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@view-transition&quot;&gt;view transitions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also have another site running Astro, the documentation for my Jira Cloud App, WDIScan (&lt;a href=&quot;https://wdiscan.com/&quot;&gt;wdiscan.com&lt;/a&gt;), is built using &lt;a href=&quot;https://starlight.astro.build/&quot;&gt;Starlight&lt;/a&gt;, a documentation theme for Astro. Gone are my unmaintainable HTML pages with &lt;a href=&quot;https://httpd.apache.org/docs/current/mod/mod_include.html&quot;&gt;httpd mod_include&lt;/a&gt; (lol).&lt;/p&gt;&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;Thanks for reading and using RSS. Full blog at &lt;a href=&quot;/blog&quot;&gt;goncalomb.com&lt;/a&gt; (&lt;a href=&quot;/blog/2025/07/27/a6cbdb77-now-using-astro&quot;&gt;this post&lt;/a&gt;).&lt;/p&gt;
&lt;ul style=&quot;list-style: none; padding-left: 1.5rem;&quot;&gt;
	&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:github&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:github&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59c.4.07.55-.17.55-.38c0-.19-.01-.82-.01-1.49c-2.01.37-2.53-.49-2.69-.94c-.09-.23-.48-.94-.82-1.13c-.28-.15-.68-.52-.01-.53c.63-.01 1.08.58 1.23.82c.72 1.21 1.87.87 2.33.66c.07-.52.28-.87.51-1.07c-1.78-.2-3.64-.89-3.64-3.95c0-.87.31-1.59.82-2.15c-.08-.2-.36-1.02.08-2.12c0 0 .67-.21 2.2.82c.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82c.44 1.1.16 1.92.08 2.12c.51.56.82 1.27.82 2.15c0 3.07-1.87 3.75-3.65 3.95c.29.25.54.73.54 1.48c0 1.07-.01 1.93-.01 2.2c0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:github&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://github.com/goncalomb&quot; rel=&quot;me noopener&quot;&gt;GitHub @goncalomb&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:mastodon&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:mastodon&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603c.348-1.778.32-4.339.32-4.339c0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091c.083 3.394.626 6.74 3.78 7.57c1.454.383 2.703.463 3.709.408c1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295c-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541c-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764c.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983c.74 0 1.336.259 1.791.764q.662.757.661 2.046z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:mastodon&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://fosstodon.org/@goncalomb&quot; rel=&quot;me noopener&quot;&gt;Mastodon @goncalomb@fosstodon.org&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:person-lines-fill&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:person-lines-fill&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6m-5 6s-1 0-1-1s1-4 6-4s6 3 6 4s-1 1-1 1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:person-lines-fill&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;/#contacts&quot; rel=&quot;me noopener&quot;&gt;(more contacts)&lt;/a&gt;

			&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;</content:encoded><category>meta</category><category>astro</category><author>goncalomb</author></item><item><title>How I Also Hacked my Car</title><link>http://localhost:4321/blog/2024/01/30/f57cf19b-how-i-also-hacked-my-car</link><guid isPermaLink="true">http://localhost:4321/blog/2024/01/30/f57cf19b-how-i-also-hacked-my-car</guid><pubDate>Tue, 30 Jan 2024 22:14:07 GMT</pubDate><content:encoded>&lt;p&gt;This blog post is kind of inspired by another that I saw &lt;a href=&quot;https://news.ycombinator.com/item?id=32447650&quot;&gt;on HN some time ago&lt;/a&gt;, &lt;a href=&quot;https://programmingwithstyle.com/posts/howihackedmycar/&quot;&gt;“How I Hacked my Car”&lt;/a&gt;. After praising the infotainment system of the car, a Hyundai IONIQ, the author ends up hacking it and running custom software on the head unit.&lt;/p&gt;
&lt;p&gt;Well, my much cheaper 2023 Dacia Sandero also has a decent infotainment system with navigation and wireless Android Auto.&lt;/p&gt;
&lt;p&gt;Even before I got the car, I searched around to see if the system was hackable. I was not surprised to find that a simple USB drive with an &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun.sh&lt;/code&gt; script gets run as root. A classic. Various forums around the web use this method to change skins and side-load navigation maps. I was not interested in that, my goal was also to run some custom software.&lt;/p&gt;
&lt;p&gt;Well, there is more to the story, otherwise, I would just that &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun.sh&lt;/code&gt; “feature”.&lt;/p&gt;
&lt;h2 id=&quot;the-infotainment-system&quot;&gt;The Infotainment System&lt;/h2&gt;
&lt;p&gt;The system is a MediaNav Evolution from Renault (which Dacia is a subsidiary of), built by LG (FCC ID: &lt;a href=&quot;https://electric.garden/lg-usa-bej/radio-car-lan5900wr&quot;&gt;BEJLAN5900WR&lt;/a&gt;). It’s a Linux box.&lt;/p&gt;
&lt;p&gt;Over the years there have been various iterations of this system, the &lt;a href=&quot;https://menaco.co/medianav-linux-multimedia&quot;&gt;older devices&lt;/a&gt; used &lt;a href=&quot;https://en.wikipedia.org/wiki/Windows_Embedded_Compact&quot;&gt;WinCE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The navigation part of the software is by a company called &lt;a href=&quot;https://nng.com/&quot;&gt;NNG&lt;/a&gt; (&lt;a href=&quot;https://nng.com/products/nng-igo&quot;&gt;iGO&lt;/a&gt;?). Apparently, they provide navigation software for &lt;a href=&quot;https://www.naviextras.com/shop/portal/deviceSelect&quot;&gt;many other devices&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-0.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-0.jpg&quot; alt=&quot;MediaNav Evolution (unofficially called MediaNav 4)&quot; title=&quot;MediaNav Evolution (unofficially called MediaNav 4)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;MediaNav Evolution (unofficially called MediaNav 4)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;the-autorunsh&quot;&gt;The autorun.sh&lt;/h2&gt;
&lt;p&gt;Just by looking around on various forums, I knew of 3 special files that when placed on a USB drive would trigger some debug functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun_bavn/autorun.sh&lt;/code&gt;: a script that gets run as root&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;logfiles_bavn&lt;/code&gt;: a directory that gathers various system logs and files&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;usb_logging&lt;/code&gt;: a directory where the system continually dumps &lt;a href=&quot;https://github.com/COVESA/dlt-daemon&quot;&gt;dlt files&lt;/a&gt; (proprietary log system)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One good thing about the log files is that they contain the Wi-Fi password for the AP. This password can be reset on the UI, but it’s never visible. Knowing the password allows other devices to connect to it (e.g. PC). &lt;em&gt;When using wireless Android Auto it connects automatically, I think it bootstraps using Bluetooth.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I was most interested in the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun.sh&lt;/code&gt;… But it was not working, I couldn’t get the script to run.&lt;/p&gt;
&lt;h2 id=&quot;the-firmware&quot;&gt;The Firmware&lt;/h2&gt;
&lt;p&gt;At this point, I decided to start inspecting the firmware to see what was wrong, and if there was another way in. My device came with version 6.0.9.9.&lt;/p&gt;
&lt;p&gt;I wanted a recent update file, but the &lt;a href=&quot;https://dacia.welcome.naviextras.com/&quot;&gt;official website&lt;/a&gt; doesn’t provide a direct download.&lt;/p&gt;
&lt;p&gt;It requires installing a desktop application, “Toolbox”, which I ended up doing. The application can be used to buy map updates or download firmware/OS updates for free.&lt;/p&gt;
&lt;p&gt;The procedure starts with collecting some information about the system/car to a USB drive. After connecting it to a PC, the “Toolbox” software detects a new update and puts the new update file on the drive.&lt;/p&gt;
&lt;p&gt;I didn’t update it, I just wanted the file, it was version 6.0.10.2:&lt;/p&gt;
&lt;pre class=&quot;border rounded-2 p-2&quot; style=&quot;background-color:#eff1f5;color:#4c4f69; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt;: file upgrade.lgu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;upgrade.lgu: POSIX tar archive (GNU)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also had an older update file, version 6.0.9.7, that I found in some random forum.&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;Sometimes even &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;grep&lt;/code&gt; can be a great analysis tool. Just by running &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;grep -RF autorun.sh&lt;/code&gt; on the contents of both the new and old firmware, I could see that the new one had no matches.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Time to load Ghidra and see what’s going on…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/ghidra-autorun.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/ghidra-autorun.png&quot; alt=&quot;Version 6.0.9.7 has the autorun.sh feature, but it is not present on version 6.0.10.2&quot; title=&quot;Version 6.0.9.7 has the autorun.sh feature, but it is not present on version 6.0.10.2&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Version 6.0.9.7 has the autorun.sh feature, but it is not present on version 6.0.10.2&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Comparing the 2 files it was evident that they had removed the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun.sh&lt;/code&gt; backdoor. Even though I didn’t have the specific firmware for my installed version (6.0.9.9), it was clear that mine didn’t have it and that’s why I could never get it to work.&lt;/p&gt;
&lt;p&gt;This &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;miscmanager&lt;/code&gt; file is also responsible for the other USB debug features, these are all still there.&lt;/p&gt;
&lt;p&gt;The core OS appears to be from &lt;a href=&quot;https://en.wikipedia.org/wiki/COVESA&quot;&gt;GENIVI/COVESA&lt;/a&gt; (GitHub: &lt;a href=&quot;https://github.com/GENIVI&quot;&gt;GENIVI&lt;/a&gt;/&lt;a href=&quot;https://github.com/COVESA&quot;&gt;COVESA&lt;/a&gt;). I’m not familiar with these systems at all. &lt;em&gt;They have a fair bit of open-source stuff that will probably explore in the future.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I decompiled other binaries to try to look for some other interesting stuff. Found a lot of D-Bus stuff, that will be useful for getting vehicle information when I can run my own software. But my goal was to get root access first.&lt;/p&gt;
&lt;p&gt;One way would be to craft a new update file with a backdoor, which would require reverse engineering the whole upgrade procedure, and as expected the update files do have some signature hashes that presumably need to match.&lt;/p&gt;
&lt;p&gt;Getting root access directly would be the preferred way.&lt;/p&gt;
&lt;h2 id=&quot;the-android-update-app&quot;&gt;The Android Update App&lt;/h2&gt;
&lt;p&gt;Something I noticed on the official website was that they were promoting a &lt;a href=&quot;https://dacia.welcome.naviextras.com/pbmu_en.html&quot;&gt;new way to update the maps&lt;/a&gt;, using an Android phone app.&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;Could this be my way in?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nng.pbmu.dacia&quot;&gt;description on Google Play&lt;/a&gt; promises to “Eliminate the &lt;a href=&quot;https://en.wikipedia.org/wiki/Sneakernet&quot;&gt;Sneaker Network&lt;/a&gt;”, an expression that I had never heard, in reference to not requiring a USB drive.&lt;/p&gt;
&lt;p&gt;Of course I didn’t install it, there is no point in that. I just searched the id &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;com.nng.pbmu.dacia&lt;/code&gt; on Google to find one of the many sites that offer the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.apk&lt;/code&gt; file for download.&lt;/p&gt;
&lt;p&gt;I’m not an Android developer, I just know that deep inside there is some bytecode that traces its root back to Java, and I &lt;em&gt;know&lt;/em&gt; Java. I don’t care about Dalvik, ART, Zygote, or whatever. Just give me those Java classes.&lt;/p&gt;
&lt;p&gt;Over the years I’ve decompiled a few Android apps, my preferred way is just to unpack the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.apk&lt;/code&gt; as a &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.zip&lt;/code&gt; (that’s all it is), get the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.dex&lt;/code&gt; bytecode files, run them through &lt;a href=&quot;https://github.com/pxb1988/dex2jar&quot;&gt;dex2jar&lt;/a&gt; to get some &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.jar&lt;/code&gt; files and open them with good old &lt;a href=&quot;https://java-decompiler.github.io/&quot;&gt;JD-GUI&lt;/a&gt;. &lt;em&gt;Recently I’ve discovered &lt;a href=&quot;https://github.com/skylot/jadx&quot;&gt;jadx&lt;/a&gt; which provides a better experience for decompiling apps.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To my surprise the app was quite complex, it appears to include some sort of native bindings, and most of the functionality is implemented in some kind of proprietary &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts (similar to JavaScript). These are found on the app’s resources.&lt;/p&gt;
&lt;div style=&quot;display: flex&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/app-jdgui.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/app-jdgui.png&quot; alt=&quot;Android APIs are exported as modules to be used in the .xs scripts&quot; title=&quot;Android APIs are exported as modules to be used in the .xs scripts&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Android APIs are exported as modules to be used in the .xs scripts&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/app-assets.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/app-assets.png&quot; alt=&quot;Several native libraries and .xs scripts&quot; title=&quot;Several native libraries and .xs scripts&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Several native libraries and .xs scripts&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;It appears that the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;liblib_nng_sdk.so&lt;/code&gt; library is responsible for running these scripts, but I didn’t explore it further. My goal was just to focus on what kind of protocol was used to update the maps on the device.&lt;/p&gt;
&lt;p&gt;And I found it in the file &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;nftp.xs&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nftp-is-it-standard-ftp&quot;&gt;NFTP!? Is it standard FTP?&lt;/h2&gt;
&lt;p&gt;No, it’s not standard FTP or any other known protocol that I could find. It’s a new binary protocol for transferring files, implemented on these &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts.&lt;/p&gt;
&lt;p&gt;The app then uses &lt;a href=&quot;https://source.android.com/docs/core/interaction/accessories/protocol&quot;&gt;Android Open Accessory (AOA)&lt;/a&gt; as the transport layer for the protocol. AOA was totally new to me, but after some reading, it was clear that it is just a way of establishing a standard for an accessory to talk USB with an Android device.&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;The names are confusing, the “accessory” is actually the USB host (in this case, the head unit) and the Android device is the USB peripheral.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-other-side&quot;&gt;The Other Side&lt;/h2&gt;
&lt;p&gt;The new update file that I had was version 6.0.10.2, which, according to the website, was the version required for the new update app to work. That naturally means that there is some specific service/code on that file to handle the update on the head unit side.&lt;/p&gt;
&lt;p&gt;After some digging, I found it. It’s another set of &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts, these run on a native interpreter. There is also a native binary, &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt;, that bridges the gap between USB (AOA) and the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts by providing a pipe for the transfer protocol.&lt;/p&gt;
&lt;p&gt;It’s clear that this phone update feature is an afterthought, the binaries/scripts are not part of the standard upgrade filesystem, they are installed separately from a &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.ipk&lt;/code&gt; package file (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;yellowtool.ipk&lt;/code&gt;) when the system is updated. The internal name they use is YellowTool / YellowBox. And this is the only part of the entire system that is coded with these &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts, everything else is just native binaries.&lt;/p&gt;
&lt;div style=&quot;display: flex&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/ls-bin.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/ls-bin.png&quot; alt=&quot;Most of the system uses native binaries and Qt applications&quot; title=&quot;Most of the system uses native binaries and Qt applications&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Most of the system uses native binaries and Qt applications&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/ls-navi.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/ls-navi.png&quot; alt=&quot;The mobile update app feature uses .xs scripts&quot; title=&quot;The mobile update app feature uses .xs scripts&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The mobile update app feature uses .xs scripts&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Being plain text scripts, it was relatively easy to understand what the protocol does and what kind of access it provides, even though the coding style is atrocious.&lt;/p&gt;
&lt;h2 id=&quot;constructing-the-backdoor&quot;&gt;Constructing The Backdoor&lt;/h2&gt;
&lt;p&gt;At this point, just by reading the code, I was pretty sure that it was possible to write arbitrary files under the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;/navi&lt;/code&gt; directory, and that would give me full access if I carefully modified some files.&lt;/p&gt;
&lt;p&gt;I just needed to create a fake Android update app and connect using AOA. Well, as I said before, I’m not an Android developer, so I went with the next best thing, the Linux Kernel.&lt;/p&gt;
&lt;p&gt;As it turns out I’m also not a kernel developer… But I knew that it has something called gadget mode, where a device running Linux can act as a USB peripheral (instead of a host).&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;Could I make a Raspberry Pi act as an Android device in AOA mode?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gadget mode can be &lt;a href=&quot;https://docs.kernel.org/usb/gadget_configfs.html&quot;&gt;configured from userspace using configfs&lt;/a&gt; (just by writing specific &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;/sys/kernel/config/&lt;/code&gt; files), this way does not require writing any kernel code, but it’s limited to specific “functions” already implemented in the kernel (e.g. serial port, mass storage, ethernet adapter etc).&lt;/p&gt;
&lt;p&gt;Not unsurprisingly, that’s how the guys at Google implemented AOA, they &lt;a href=&quot;https://android.googlesource.com/kernel/common/+/refs/tags/android14-6.1-2023-12_r2/drivers/usb/gadget/function/f_accessory.c&quot;&gt;added a new “accessory” function&lt;/a&gt; to the kernel. They even tried to &lt;a href=&quot;https://patchwork.kernel.org/project/linux-usb/list/?series=363135&amp;#x26;state=%2A&amp;#x26;archive=both&quot;&gt;push it upstream&lt;/a&gt;, but it went nowhere, currently, &lt;a href=&quot;https://github.com/torvalds/linux/tree/v6.6/drivers/usb/gadget/function&quot;&gt;it’s not part of the Linux Kernel&lt;/a&gt;. I don’t think it will ever be, it’s probably too specific, and it’s kind of a weird protocol.&lt;/p&gt;
&lt;p&gt;After reading more about AOA, it was clear that it involved a kind of handshake where the accessory asks the Android device for AOA, and after that, the device just acts like a serial port (a “raw” data pipe), and it’s up to the developer to do the rest (this is a simplification, and there are other modes, &lt;a href=&quot;https://source.android.com/docs/core/interaction/accessories/aoa&quot;&gt;read more&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So maybe I could use the &lt;a href=&quot;https://docs.kernel.org/usb/gadget-testing.html#serial-function&quot;&gt;serial gadget function&lt;/a&gt; to fake an Android device already in accessory mode, without implementing the handshake.&lt;/p&gt;
&lt;p&gt;I also found the talk where they first announced AOA, back in 2011. It’s a nice talk if you are into USB stuff:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/s7szcpXf2rE?rel=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;the-testing-setup&quot;&gt;The Testing Setup&lt;/h2&gt;
&lt;p&gt;The system is something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android side:
&lt;ul&gt;
&lt;li&gt;Update App / “nftp” (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts) &amp;#x3C;=&gt; AOA &amp;#x3C;=&gt; USB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Head unit side:
&lt;ul&gt;
&lt;li&gt;USB (host) &amp;#x3C;=&gt; &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt; &amp;#x3C;=&gt; “nftp” (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts) &amp;#x3C;=&gt; [reads/writes system files]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For testing, I used 2 Raspberry Pies.&lt;/p&gt;
&lt;p&gt;Because the head unit is ARM-based as is the Raspberry Pi, I was able to run the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt; binary and &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; interpreter from the firmware, this simulated the head unit and acted like a USB host.&lt;/p&gt;
&lt;p&gt;The other RPi was the USB peripheral (using the On-The-Go, OTG port), which when configured correctly using the gadget mode, acted like an Android device in AOA mode.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/rpis.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/rpis.jpg&quot; alt=&quot;The smaller Raspberry Pi Zero 2 W can be powered from the OTG port and will act as the Android device&quot; title=&quot;The smaller Raspberry Pi Zero 2 W can be powered from the OTG port and will act as the Android device&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The smaller Raspberry Pi Zero 2 W can be powered from the OTG port and will act as the Android device&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;After messing about with multiple gadget configurations, I was seeing some promising debug messages from &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt;, that’s the binary extracted from the firmware that creates a pipe between the USB AOA and the weird “nftp” protocol (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts), on the head unit side.&lt;/p&gt;
&lt;p&gt;But it was not working…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/aoa-fail.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/aoa-fail.png&quot; alt=&quot;&amp;#x22;No AOA endpoint was found&amp;#x22;: My fake head unit was not recognizing my fake Android device&quot; title=&quot;&amp;#x22;No AOA endpoint was found&amp;#x22;: My fake head unit was not recognizing my fake Android device&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;&quot;No AOA endpoint was found&quot;: My fake head unit was not recognizing my fake Android device&lt;/figcaption&gt;&lt;/figure&gt;
&lt;pre class=&quot;border rounded-2 p-2&quot; style=&quot;background-color:#eff1f5;color:#4c4f69; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&gt;: file aoa2sock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;aoa2sock: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=XXXXXXXX, with debug_info, not stripped&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After inspecting the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt; binary in Ghidra (thanks for the debug info) and reading the kernel code, I finally found the issue. The kernel serial port gadget uses a different USB subclass from the one used by AOA, and it can’t be changed from userspace.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/kernel-compare.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/kernel-compare.png&quot; alt=&quot;Is this a bug? I think AOA is correct in using USB_SUBCLASS_VENDOR_SPEC for a generic interface&quot; title=&quot;Is this a bug? I think AOA is correct in using USB_SUBCLASS_VENDOR_SPEC for a generic interface&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Is this a bug? I think AOA is correct in using USB_SUBCLASS_VENDOR_SPEC for a generic interface&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;ok-lets-patch-the-kernel&quot;&gt;OK… Let’s patch the kernel&lt;/h2&gt;
&lt;p&gt;I ended up having to download the kernel source and patch the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;f_serial.c&lt;/code&gt; gadget function to change the USB subclass. After compiling the kernel module and loading it using &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;modprobe&lt;/code&gt;, it finally worked and the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt; binary recognized the device.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/aoa-success.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/aoa-success.png&quot; alt=&quot;My fake Android device was finally connected to my fake head unit&quot; title=&quot;My fake Android device was finally connected to my fake head unit&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;My fake Android device was finally connected to my fake head unit&lt;/figcaption&gt;&lt;/figure&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;Can I call myself a kernel developer now?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All that was left to do was to somehow recreate that “nftp” protocol. I didn’t really want to use the proprietary &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; files implementation, so I wrote my own in Python.&lt;/p&gt;
&lt;p&gt;At this point, I had all the pieces and the Raspberry Pi now replaced the Android app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi side:
&lt;ul&gt;
&lt;li&gt;Python Script (“nftp” implementation) &amp;#x3C;=&gt; USB Gadget Mode (emulates AOA)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Head unit side (same as before):
&lt;ul&gt;
&lt;li&gt;USB (host) &amp;#x3C;=&gt; &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;aoa2sock&lt;/code&gt; &amp;#x3C;=&gt; “nftp” (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;.xs&lt;/code&gt; scripts) &amp;#x3C;=&gt; [reads/writes system files]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Creating the backdoor involved issuing “nftp” commands to edit a specific file under the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;/navi&lt;/code&gt; directory and inject a call to a bash script, this bash script (also uploaded using “nftp”) contains the payload that runs as root.&lt;/p&gt;
&lt;h2 id=&quot;h4cking-time&quot;&gt;H4cking Time&lt;/h2&gt;
&lt;p&gt;After much testing with my dual RPi setup, I was confident that it was going to work…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-1-rpi.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-1-rpi.jpg&quot; alt=&quot;Raspberry Pi Zero 2 W (OTG port) connected to the infotainment head unit&quot; title=&quot;Raspberry Pi Zero 2 W (OTG port) connected to the infotainment head unit&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Raspberry Pi Zero 2 W (OTG port) connected to the infotainment head unit&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Setting up for an update…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-5-update.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-5-update.jpg&quot; alt=&quot;Ready to &amp;#x22;Update with Phone&amp;#x22;, that option is only available after version 6.0.10.2&quot; title=&quot;Ready to &amp;#x22;Update with Phone&amp;#x22;, that option is only available after version 6.0.10.2&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Ready to &quot;Update with Phone&quot;, that option is only available after version 6.0.10.2&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-6-update.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-6-update.jpg&quot; alt=&quot;Waiting for a phone&quot; title=&quot;Waiting for a phone&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Waiting for a phone&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Time to put the RPi in gadget mode (I was connected to it using SSH)…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-7-update.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-7-update.jpg&quot; alt=&quot;Sorry, it&amp;#x27;s not a phone and we are not sending any maps&quot; title=&quot;Sorry, it&amp;#x27;s not a phone and we are not sending any maps&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Sorry, it&apos;s not a phone and we are not sending any maps&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Sending and running the payload…&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/avn-8-pwned.jpg&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/avn-8-pwned.jpg&quot; alt=&quot;Got it!&quot; title=&quot;Got it!&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Got it!&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Success! I had root access.&lt;/p&gt;
&lt;blockquote class=&quot;blockquote border-start border-5 ps-3 py-2&quot;&gt;
&lt;p&gt;That payload is just call to a specific D-Bus method that I found while analyzing the firmware, it shows a popup with custom text and title. The text is the output of the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;id&lt;/code&gt; command.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally, after replacing the payload with something more useful, a simple &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;socat&lt;/code&gt; bind shell and connecting back to it using Wi-Fi, I had full access.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/socat-shell.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/socat-shell.png&quot; alt=&quot;Give me that root shell&quot; title=&quot;Give me that root shell&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Give me that root shell&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;If you didn’t follow it all the way, here’s a summary:&lt;/p&gt;
&lt;p&gt;I used a Raspberry Pi in USB gadget mode to simulate an Android device connected to the head unit. The head unit thinks it’s accepting a navigation maps update from the “phone”, but because the update protocol allows for arbitrary file changes, I can issue commands to modify a specific file and inject a call to a bash script that gets run as root.&lt;/p&gt;
&lt;h2 id=&quot;code-please&quot;&gt;Code Please&lt;/h2&gt;
&lt;p&gt;Everything is &lt;a href=&quot;https://github.com/goncalomb/mn4-tools/tree/master/mn4-pwned&quot;&gt;on GitHub with more detailed instructions&lt;/a&gt; (it contains no proprietary code).&lt;/p&gt;
&lt;p&gt;The key pieces are &lt;a href=&quot;https://github.com/goncalomb/mn4-tools/blob/master/mn4-pwned/scripts/ctrl-proto.py&quot;&gt;my implementation of the “nftp” protocol&lt;/a&gt; and &lt;a href=&quot;https://github.com/goncalomb/mn4-tools/blob/master/mn4-pwned/scripts/ctrl-gadget.sh&quot;&gt;the gadget configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;This is just the beginning, now it’s time to really explore the system.&lt;/p&gt;
&lt;p&gt;First, I’ll probably end up restoring the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;autorun.sh&lt;/code&gt; functionality, with a custom service, because I think that’s the easiest way to load software. That way I can keep all the new stuff on the drive and make as few changes to the system as possible.&lt;/p&gt;
&lt;p&gt;One of the main things I would like to do is record car parameters, stuff like speed, fuel, location etc. It remains to be seen if I can easily access that information through D-Bus, or if I need to go deeper. I’m not interested in adding anything that requires my attention while driving.&lt;/p&gt;
&lt;p&gt;But that’s for another time…&lt;/p&gt;
&lt;h2 id=&quot;some-extras-could-i-have-used-ssh&quot;&gt;Some Extras (Could I have used SSH?)&lt;/h2&gt;
&lt;p&gt;Two ports are open by default on the head unit, an SSH server, and some Apple service, probably related to CarPlay (&lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;Server: AirTunes/320.17.6&lt;/code&gt;), I didn’t really explore that.&lt;/p&gt;
&lt;p&gt;But I tried cracking the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;/etc/shadow&lt;/code&gt; root password from the update file using &lt;a href=&quot;https://github.com/hashcat/hashcat&quot;&gt;hashcat&lt;/a&gt; / &lt;a href=&quot;https://github.com/openwall/john&quot;&gt;john&lt;/a&gt; with some &lt;a href=&quot;https://github.com/NotSoSecure/password_cracking_rules&quot;&gt;rules&lt;/a&gt; and password &lt;a href=&quot;https://github.com/danielmiessler/SecLists/tree/master/Passwords/Leaked-Databases&quot;&gt;lists&lt;/a&gt;. I’m not an expert doing this at all, I don’t even know if I was doing it right, and was not successful.&lt;/p&gt;
&lt;p&gt;Not that it matters now, I could just change the root password or add a new user.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/f57cf19b/nmap-services.png&quot;&gt;&lt;img src=&quot;/blog/files/f57cf19b/nmap-services.png&quot; alt=&quot;SSH on port 22 / AirTunes/320.17.6 on port 7000&quot; title=&quot;SSH on port 22 / AirTunes/320.17.6 on port 7000&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;SSH on port 22 / AirTunes/320.17.6 on port 7000&lt;/figcaption&gt;&lt;/figure&gt;&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;Thanks for reading and using RSS. Full blog at &lt;a href=&quot;/blog&quot;&gt;goncalomb.com&lt;/a&gt; (&lt;a href=&quot;/blog/2024/01/30/f57cf19b-how-i-also-hacked-my-car&quot;&gt;this post&lt;/a&gt;).&lt;/p&gt;
&lt;ul style=&quot;list-style: none; padding-left: 1.5rem;&quot;&gt;
	&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:github&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:github&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59c.4.07.55-.17.55-.38c0-.19-.01-.82-.01-1.49c-2.01.37-2.53-.49-2.69-.94c-.09-.23-.48-.94-.82-1.13c-.28-.15-.68-.52-.01-.53c.63-.01 1.08.58 1.23.82c.72 1.21 1.87.87 2.33.66c.07-.52.28-.87.51-1.07c-1.78-.2-3.64-.89-3.64-3.95c0-.87.31-1.59.82-2.15c-.08-.2-.36-1.02.08-2.12c0 0 .67-.21 2.2.82c.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82c.44 1.1.16 1.92.08 2.12c.51.56.82 1.27.82 2.15c0 3.07-1.87 3.75-3.65 3.95c.29.25.54.73.54 1.48c0 1.07-.01 1.93-.01 2.2c0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:github&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://github.com/goncalomb&quot; rel=&quot;me noopener&quot;&gt;GitHub @goncalomb&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:mastodon&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:mastodon&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603c.348-1.778.32-4.339.32-4.339c0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091c.083 3.394.626 6.74 3.78 7.57c1.454.383 2.703.463 3.709.408c1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295c-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541c-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764c.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983c.74 0 1.336.259 1.791.764q.662.757.661 2.046z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:mastodon&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://fosstodon.org/@goncalomb&quot; rel=&quot;me noopener&quot;&gt;Mastodon @goncalomb@fosstodon.org&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:person-lines-fill&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:person-lines-fill&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6m-5 6s-1 0-1-1s1-4 6-4s6 3 6 4s-1 1-1 1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:person-lines-fill&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;/#contacts&quot; rel=&quot;me noopener&quot;&gt;(more contacts)&lt;/a&gt;

			&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;</content:encoded><category>hacking</category><category>car</category><category>dacia</category><category>rpi</category><author>goncalomb</author></item><item><title>Domus40 HA - Part 2 - Teardown</title><link>http://localhost:4321/blog/2023/07/15/e5cdc6ec-domus40-ha-part-2-teardown</link><guid isPermaLink="true">http://localhost:4321/blog/2023/07/15/e5cdc6ec-domus40-ha-part-2-teardown</guid><pubDate>Sat, 15 Jul 2023 21:48:17 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Domus40 HA series: &lt;a href=&quot;/blog/2023/06/16/78fb213b&quot;&gt;Part 1&lt;/a&gt; / Part 2 / Part 3 (TBA).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here we go, let’s take apart some Domus40 devices.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/boxes.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/boxes.jpg&quot; alt=&quot;Domus40 / Boxes&quot; title=&quot;Domus40 / Boxes&quot; width=&quot;50%&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Domus40 / Boxes&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/devices.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/devices.jpg&quot; alt=&quot;Domus40 / Push buttons, gateway and smart plug&quot; title=&quot;Domus40 / Push buttons, gateway and smart plug&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Domus40 / Push buttons, gateway and smart plug&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;gateway&quot;&gt;Gateway&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Also known as Installation Key (ref. 40925).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Starting with the gateway, the first thing I did was plug it into my Linux machine. Here’s the &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;dmesg&lt;/code&gt; output:&lt;/p&gt;
&lt;pre class=&quot;border rounded-2 p-2&quot; style=&quot;background-color:#eff1f5;color:#4c4f69; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.561987] usb 1-5: new full-speed USB device number 10 using xhci_hcd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.712637] usb 1-5: New USB device found, idVendor=0451, idProduct=16c8, bcdDevice= 1.00&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.712651] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.712657] usb 1-5: Product: CC2538 USB CDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.712661] usb 1-5: Manufacturer: Texas Instruments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.809695] cdc_acm 1-5:1.0: ttyACM0: USB ACM device&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.809771] usbcore: registered new interface driver cdc_acm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;[23756.809774] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We get some good information, it’s based on a &lt;a href=&quot;https://www.ti.com/product/CC2538&quot;&gt;TI CC2538&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/IEEE_802.15.4&quot;&gt;IEEE 802.15.4&lt;/a&gt; IC and exposes a USB serial port. Not unexpected for a Zigbee gateway, but it’s an older IC, newer alternatives are available (see &lt;a href=&quot;https://www.ti.com/lit/sg/slyb134f/slyb134f.pdf&quot;&gt;TI Zigbee Selection Guide, 2018&lt;/a&gt;).&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-teardown.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-teardown.jpg&quot; alt=&quot;Teardown of the gateway&quot; title=&quot;Teardown of the gateway&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Teardown of the gateway&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Good construction, but also very hard to take apart without breaking, I had to shim it at the slide point from both sides. It’s intact but not without scratches.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-top.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-top.jpg&quot; alt=&quot;Gateway PCB top (high-res)&quot; title=&quot;Gateway PCB top (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Gateway PCB top (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-bottom.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-bottom.jpg&quot; alt=&quot;Gateway PCB bottom (high-res)&quot; title=&quot;Gateway PCB bottom (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Gateway PCB bottom (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-bottom-ics.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-bottom-ics.jpg&quot; alt=&quot;Gateway PCB bottom, with ICs visible (high-res)&quot; title=&quot;Gateway PCB bottom, with ICs visible (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Gateway PCB bottom, with ICs visible (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-sd-card.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-sd-card.jpg&quot; alt=&quot;Gateway PCB top, MicroSD card (high-res)&quot; title=&quot;Gateway PCB top, MicroSD card (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Gateway PCB top, MicroSD card (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/gateway-ics.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/gateway-ics.jpg&quot; alt=&quot;Gateway PCB bottom, ICs close up (high-res)&quot; title=&quot;Gateway PCB bottom, ICs close up (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Gateway PCB bottom, ICs close up (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;As expected we have the CC2538SF53 as the main IC with a CC2592 RF front end and MCP73871 for battery management. Having a built-in battery is definitely the defining feature of this gateway.&lt;/p&gt;
&lt;h3 id=&quot;the-microsd-card&quot;&gt;The MicroSD card&lt;/h3&gt;
&lt;p&gt;The MicroSD card was a surprise, but I think it makes sense. I suspect that the SD card holds the Zigbee network information to allow the gateway to work while disconnected from the host (PC).&lt;/p&gt;
&lt;p&gt;The card contains a FAT32 partition, with a single &lt;code class=&quot;border rounded-1 p-1 bg-light-subtle&quot;&gt;System Volume Information&lt;/code&gt; directory. So it was connected to a Windows PC at some point, it’s dated April 2022.&lt;/p&gt;
&lt;pre class=&quot;border rounded-2 p-2&quot; style=&quot;background-color:#eff1f5;color:#4c4f69; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4A21-0000:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;total 32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;drwxr-xr-x 2 32768 2022-04-13 12:37:26.000000000 +0100 System Volume Information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4A21-0000/System Volume Information:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;total 64&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-rw-r--r-- 1 76 2022-04-13 12:37:28.000000000 +0100 IndexerVolumeGuid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-rw-r--r-- 1 12 2022-04-13 12:37:26.000000000 +0100 WPSettings.dat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I tried pairing it with another device to see if something changed but was unable to make it work. This is something to explore in the future.&lt;/p&gt;
&lt;h3 id=&quot;the-usb-serial-port&quot;&gt;The USB serial port&lt;/h3&gt;
&lt;p&gt;Something to also explore later is the serial port and its unknown protocol. I tried using Zigbee2MQTT, but it could not communicate with the gateway. I know that Zigbee2MQTT uses TI’s Z-Stack Monitor and Test API / Z-Stack ZNP, but I’m not familiar with these APIs at all. It remains to be seen if I can get it to work using the stock firmware.&lt;/p&gt;
&lt;h2 id=&quot;push-buttons&quot;&gt;Push buttons&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Also known as Wireless 4-Gang Push Button (ref. 40227).&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/buttons-teardown.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/buttons-teardown.jpg&quot; alt=&quot;Teardown of the push buttons&quot; title=&quot;Teardown of the push buttons&quot; width=&quot;50%&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Teardown of the push buttons&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/buttons-top.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/buttons-top.jpg&quot; alt=&quot;Push buttons PCB top (high-res)&quot; title=&quot;Push buttons PCB top (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Push buttons PCB top (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/buttons-bottom.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/buttons-bottom.jpg&quot; alt=&quot;Push buttons PCB bottom (high-res)&quot; title=&quot;Push buttons PCB bottom (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Push buttons PCB bottom (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;It’s based on a CC2530 IC, powered by a coin cell. Nothing special, similar to other Zigbee buttons, well constructed. Some pads are not populated.&lt;/p&gt;
&lt;h3 id=&quot;connecting-to-zigbee2mqtt&quot;&gt;Connecting to Zigbee2MQTT&lt;/h3&gt;
&lt;p&gt;As expected, it’s not supported by Zigbee2MQTT out of the box, this should be just a missing configuration. But we get some information.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/zigbee2mqtt-buttons.png&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/zigbee2mqtt-buttons.png&quot; alt=&quot;Push buttons connected to Zigbee2MQTT (using a generic CC2531 adapter)&quot; title=&quot;Push buttons connected to Zigbee2MQTT (using a generic CC2531 adapter)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Push buttons connected to Zigbee2MQTT (using a generic CC2531 adapter)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;cover&quot;&gt;Cover&lt;/h3&gt;
&lt;p&gt;Just as a side note, these buttons are made to be used with a cover, sold separately. They can be made to match other switches around the house. But they also work fine as a portable device.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/buttons-cover.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/buttons-cover.jpg&quot; alt=&quot;Push buttons cover&quot; title=&quot;Push buttons cover&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Push buttons cover&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;smart-plug&quot;&gt;Smart plug&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Also known as Mobile Schuko Socket 10A with Metering (ref. 40961).&lt;/em&gt;&lt;/p&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-teardown-a.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-teardown-a.jpg&quot; alt=&quot;The smart plug teardown&quot; title=&quot;The smart plug teardown&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The smart plug teardown&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-teardown-b.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-teardown-b.jpg&quot; alt=&quot;The smart plug teardown&quot; title=&quot;The smart plug teardown&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The smart plug teardown&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Again, good construction but hard to take apart. The screws are only visible after removing the front bezel.&lt;/p&gt;
&lt;p&gt;An internal metal tab for the earth connection broke after I bend it to remove the PCB. I removed the earth contact to avoid future issues, if I end up using this plug it will be only for testing or low-power stuff without an earth connection.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-teardown-c.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-teardown-c.jpg&quot; alt=&quot;The smart plug teardown&quot; title=&quot;The smart plug teardown&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The smart plug teardown&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A small piece of PCB material was loose inside (see previous image), not broken from the main PCB.&lt;/p&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-pcb-a.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-pcb-a.jpg&quot; alt=&quot;Smart plug PCB&quot; title=&quot;Smart plug PCB&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug PCB&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-pcb-b.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-pcb-b.jpg&quot; alt=&quot;Smart plug PCB&quot; title=&quot;Smart plug PCB&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug PCB&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-pcb-c.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-pcb-c.jpg&quot; alt=&quot;Smart plug PCB&quot; title=&quot;Smart plug PCB&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug PCB&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;It uses a very interesting layout with 3 PCBs to make use of every bit of space. It’s probably not a cheap device to manufacture (the final price is also not cheap). The main PCB is also multilayer.&lt;/p&gt;
&lt;p&gt;The power supply for the low-voltage circuit it’s inside the plug connector on the 2 smaller PCBs, it’s a non-isolated design using an LNK302DG IC.&lt;/p&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-pcb-top.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-pcb-top.jpg&quot; alt=&quot;Smart plug PCB top (high-res)&quot; title=&quot;Smart plug PCB top (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug PCB top (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/plug-pcb-bottom.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/plug-pcb-bottom.jpg&quot; alt=&quot;Smart plug PCB bottom (high-res)&quot; title=&quot;Smart plug PCB bottom (high-res)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug PCB bottom (high-res)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;It uses the same main IC as the gateway, a CC2538SF53 with a CC2592 RF front end. This is expected, being a mains-powered device, it also acts as a Zigbee router not just an end device. The other 2 ICs are an SST25VF020B serial flash and CS5490-ISZ for power measurement.&lt;/p&gt;
&lt;p&gt;As with the other devices, the debug header is exposed. But it’s not safe to use while powered by AC because of the non-isolated design.&lt;/p&gt;
&lt;h3 id=&quot;connecting-to-zigbee2mqtt-1&quot;&gt;Connecting to Zigbee2MQTT&lt;/h3&gt;
&lt;p&gt;Not supported by Zigbee2MQTT at the moment, the same as the push buttons.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/zigbee2mqtt-plug.png&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/zigbee2mqtt-plug.png&quot; alt=&quot;Smart plug connected to Zigbee2MQTT (using a generic CC2531 adapter)&quot; title=&quot;Smart plug connected to Zigbee2MQTT (using a generic CC2531 adapter)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Smart plug connected to Zigbee2MQTT (using a generic CC2531 adapter)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;are-these-old-designs&quot;&gt;Are these old designs?&lt;/h2&gt;
&lt;p&gt;I noticed that these devices appear a few years old, even though they were first released in late 2021.&lt;/p&gt;
&lt;div style=&quot;display: flex; align-items: center;&quot;&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/pcb-markings.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/pcb-markings.jpg&quot; alt=&quot;Markings on all PCBs (2014?)&quot; title=&quot;Markings on all PCBs (2014?)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Markings on all PCBs (2014?)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/e5cdc6ec/platic-markings.jpg&quot;&gt;&lt;img src=&quot;/blog/files/e5cdc6ec/platic-markings.jpg&quot; alt=&quot;Date stamps on gateway (04/2022) and plug (07/2016)&quot; title=&quot;Date stamps on gateway (04/2022) and plug (07/2016)&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Date stamps on gateway (04/2022) and plug (07/2016)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The PCBs, according to the markings, were possibly designed sometime in 2014, which also explains the use of older ICs. Then we have some plastics from 2016 and 2022, some firmware from 2017, and the filesystem on the gateway SD card is dated 2022.&lt;/p&gt;
&lt;p&gt;So the gateway that I have is from last year, but the other devices appear to be older. The coin cell that came with the buttons is almost expired (12/2023). Weird.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;Getting these devices connected with &lt;a href=&quot;https://www.zigbee2mqtt.io/&quot;&gt;Zigbee2MQTT&lt;/a&gt; is my main goal.&lt;/p&gt;
&lt;p&gt;The gateway is by far the most interesting device. I would like to retain the function of pairing devices while away from the host (PC), which probably requires keeping the stock firmware. Knowing the serial port protocol is key make it work with Zigbee2MQTT and it will require some research on my part (I don’t have the &lt;em&gt;Home Server&lt;/em&gt;, which is the official way to use the gateway, see part 1). Let’s hope it uses some standard TI API (Z-Stack ZNP?).&lt;/p&gt;
&lt;p&gt;The other 2 devices can already be semi-recognized by Zigbee2MQTT, they might need some extra configuration, but should not require custom firmware.&lt;/p&gt;
&lt;p&gt;Updating the firmware would be nice. But that’s probably done automatically by the &lt;em&gt;Home Server&lt;/em&gt;. EFAPEL does not publish the firmware on their website and discovering some unknown repository URL without inspecting the &lt;em&gt;Home Server&lt;/em&gt; is probably impossible.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I have no affiliation with EFAPEL, all opinions are my own.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Domus40 HA series: &lt;a href=&quot;/blog/2023/06/16/78fb213b&quot;&gt;Part 1&lt;/a&gt; / Part 2 / Part 3 (TBA).&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;Thanks for reading and using RSS. Full blog at &lt;a href=&quot;/blog&quot;&gt;goncalomb.com&lt;/a&gt; (&lt;a href=&quot;/blog/2023/07/15/e5cdc6ec-domus40-ha-part-2-teardown&quot;&gt;this post&lt;/a&gt;).&lt;/p&gt;
&lt;ul style=&quot;list-style: none; padding-left: 1.5rem;&quot;&gt;
	&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:github&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:github&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59c.4.07.55-.17.55-.38c0-.19-.01-.82-.01-1.49c-2.01.37-2.53-.49-2.69-.94c-.09-.23-.48-.94-.82-1.13c-.28-.15-.68-.52-.01-.53c.63-.01 1.08.58 1.23.82c.72 1.21 1.87.87 2.33.66c.07-.52.28-.87.51-1.07c-1.78-.2-3.64-.89-3.64-3.95c0-.87.31-1.59.82-2.15c-.08-.2-.36-1.02.08-2.12c0 0 .67-.21 2.2.82c.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82c.44 1.1.16 1.92.08 2.12c.51.56.82 1.27.82 2.15c0 3.07-1.87 3.75-3.65 3.95c.29.25.54.73.54 1.48c0 1.07-.01 1.93-.01 2.2c0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:github&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://github.com/goncalomb&quot; rel=&quot;me noopener&quot;&gt;GitHub @goncalomb&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:mastodon&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:mastodon&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603c.348-1.778.32-4.339.32-4.339c0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091c.083 3.394.626 6.74 3.78 7.57c1.454.383 2.703.463 3.709.408c1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295c-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541c-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764c.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983c.74 0 1.336.259 1.791.764q.662.757.661 2.046z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:mastodon&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://fosstodon.org/@goncalomb&quot; rel=&quot;me noopener&quot;&gt;Mastodon @goncalomb@fosstodon.org&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:person-lines-fill&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:person-lines-fill&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6m-5 6s-1 0-1-1s1-4 6-4s6 3 6 4s-1 1-1 1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:person-lines-fill&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;/#contacts&quot; rel=&quot;me noopener&quot;&gt;(more contacts)&lt;/a&gt;

			&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;</content:encoded><category>home-automation</category><author>goncalomb</author></item><item><title>Domus40 HA - Part 1 - Introduction</title><link>http://localhost:4321/blog/2023/06/16/78fb213b-domus40-ha-part-1-introduction</link><guid isPermaLink="true">http://localhost:4321/blog/2023/06/16/78fb213b-domus40-ha-part-1-introduction</guid><pubDate>Fri, 16 Jun 2023 18:51:30 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Domus40 HA series: Part 1 / &lt;a href=&quot;/blog/2023/07/15/e5cdc6ec&quot;&gt;Part 2&lt;/a&gt; / Part 3 (TBA).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Recently I’ve discovered a new line of home automation (HA) devices called &lt;a href=&quot;https://www.efapel.pt/pt/produtos/domus-40/mecanismos&quot;&gt;Domus40&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These devices are from a local Portuguese company, &lt;a href=&quot;https://www.efapel.pt/&quot;&gt;EFAPEL&lt;/a&gt;, that makes products for electrical installations.&lt;/p&gt;
&lt;p&gt;If you visit a newly renovated home here in Portugal there is some chance that it uses EFAPEL sockets and switches, in place of other more established brands like Legrand or Schneider.&lt;/p&gt;
&lt;p&gt;In this series of posts, I want to explore this new line of devices, show some internals and see if they are a good alternative to other devices like the &lt;a href=&quot;https://www.shelly.cloud/&quot;&gt;Shelly&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/78fb213b/domus40.png&quot;&gt;&lt;img src=&quot;/blog/files/78fb213b/domus40.png&quot; alt=&quot;Domus40 / Domus40 Technical Manual&quot; title=&quot;Domus40 / Domus40 Technical Manual&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Domus40 / Domus40 Technical Manual&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;devices-documentation-and-price&quot;&gt;Devices, Documentation and Price&lt;/h2&gt;
&lt;p&gt;From the &lt;a href=&quot;https://www.efapel.pt/pt/produtos/domus-40/mecanismos&quot;&gt;Domus40&lt;/a&gt; page, I’ve compiled the list of connected devices (see original page for images):&lt;/p&gt;





































































































&lt;table class=&quot;table table-sm&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ref.&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Price €&lt;/th&gt;&lt;th&gt;Manual&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;40930&lt;/td&gt;&lt;td&gt;Home Server&lt;/td&gt;&lt;td&gt;208.49&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40925&lt;/td&gt;&lt;td&gt;Installation Key&lt;/td&gt;&lt;td&gt;42.95&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/CHAVE-DA-INSTALACAO-D40-11-2021-290307-6149e1533d94c.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40213&lt;/td&gt;&lt;td&gt;Single Pole Switch with Metering&lt;/td&gt;&lt;td&gt;61.03&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/COMUTADOR-DE-1-CIRCUITO-METERING-D40-2021-290315--6149c5e619d45.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40214&lt;/td&gt;&lt;td&gt;Double Pole Switch with Metering&lt;/td&gt;&lt;td&gt;65.37&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/COMUTADOR-DE-2-CIRCUITOS-METERING-D40-2021-290305-6149c969ad07a.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40218&lt;/td&gt;&lt;td&gt;Blinds Control Switch with Metering&lt;/td&gt;&lt;td&gt;69.08&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/COMANDO-DE-PERSIANA-METERING-D40-1-2021-290306-6149c54d3ec67.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40215&lt;/td&gt;&lt;td&gt;250VA RLC Electronic Dimmer with Metering&lt;/td&gt;&lt;td&gt;74.23&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/REGULADOR-DE-LUZ-ELETR--250VA-RLC-METERING-D40-2021-290309-6149e2154f2bc.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40217&lt;/td&gt;&lt;td&gt;1-10V 50mA Electronic Dimmer with Metering&lt;/td&gt;&lt;td&gt;77.35&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/REGULADOR-DE-LUZ-ELETR--1-10V--50mA-METERING-D40-2021-290316-6149e280803ce.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40260&lt;/td&gt;&lt;td&gt;Schuko Socket 16A with Metering&lt;/td&gt;&lt;td&gt;47.68&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/TOMADA-SCHUKO-16A-METERING-D40-2021-290311-6149e2f07f94e.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40961&lt;/td&gt;&lt;td&gt;Mobile Schuko Socket 10A with Metering&lt;/td&gt;&lt;td&gt;62.72&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/TOMADA-SCHUKO-MOVEL-10A-METERING-D40-2021-290308-6149e0d932b76.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40226&lt;/td&gt;&lt;td&gt;4-Gang Push Button&lt;/td&gt;&lt;td&gt;41.34&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/BOTAO-DE-PRESSAO-QUADRUPLO-D40-2021-290304-6149c9f5128a7.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40227&lt;/td&gt;&lt;td&gt;Wireless 4-Gang Push Button&lt;/td&gt;&lt;td&gt;24.73&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/BOTAO-DE-PRESSAO-QUADRUPLO-SEM-FIOS-D40-2021-290312-6149ca7b33d03.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40235&lt;/td&gt;&lt;td&gt;Multifunction Sensor&lt;/td&gt;&lt;td&gt;51.44&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/SENSOR-MULTIFUNCOES-D40-2021-290310-6149caf41aeb4.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Domus40 Catalog (in Portuguese)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/Domotica-61ee7228c0610.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Domus40 Technical Manual (in Portuguese)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/Manual-Tecnico-Domus40-2021-290202-6149e3744b41f.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;EU Declaration of Conformity&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.efapel.pt/media/Declaracao-UE---Domus-40-64638961ab042.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The prices are from &lt;a href=&quot;https://loja.watt.pt/imgs/catalogos/081749_1_1535_-tabela-de-precos-fab-efapel-2023.pdf&quot;&gt;EFAPEL’s price table (2023-05-03)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The devices only appear on the Portuguese version of EFAPEL’s website, hinting at the fact that they may not be available outside Portugal at the moment.&lt;/p&gt;
&lt;p&gt;Most devices use the standard recessed style box used in home installations in Portugal and other EU countries.&lt;/p&gt;
&lt;h2 id=&quot;the-private-network&quot;&gt;The “private network”&lt;/h2&gt;
&lt;p&gt;What piqued my interest was the fact that, according to EFAPEL’s &lt;a href=&quot;https://www.efapel.pt/pt/informacoes-tecnicas/domus-40&quot;&gt;weird one-PDF-per-question FAQ&lt;/a&gt; (in Portuguese), they use a “private network of 2.4 GHz” and “it’s only possible to guarantee reliable communication between Domus40 devices”.&lt;/p&gt;
&lt;p&gt;Well, I suspect it’s Zigbee. And some posts on the &lt;a href=&quot;https://forum.cpha.pt/&quot;&gt;CPHA forum&lt;/a&gt; (in Portuguese) also point to that.&lt;/p&gt;
&lt;p&gt;In contrast, other brands like &lt;a href=&quot;https://www.google.com/search?q=legrand+netatmo+zigbee&quot;&gt;Legrand (Netatmo)&lt;/a&gt;, with similar devices, don’t hide the fact that they use Zigbee.&lt;/p&gt;
&lt;h2 id=&quot;the-home-server-ref-40930&quot;&gt;The Home Server (ref. 40930)&lt;/h2&gt;
&lt;p&gt;The system uses a proprietary &lt;em&gt;Home Server&lt;/em&gt; as the control unit. It apparently provides a web interface and connects to the internet for cloud and mobile access.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;Domus40 Technical Manual&lt;/em&gt; has very little information about the server. It shows a device with 8 ports in the back, but only the 5V in, 2 USBs and RJ45 are mentioned in the manual, the others appear to be an HDMI, Micro USB, some other 7-pin port and an unknown slot. If the images are to scale, then looking at the size of the ports, the server must be very small.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;Home Server&lt;/em&gt; is also missing from the &lt;em&gt;EU Declaration of Conformity&lt;/em&gt;, maybe it’s just a rebranded mini/embedded PC not produced by EFAPEL with custom firmware.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/78fb213b/home-server-trace.png&quot;&gt;&lt;img src=&quot;/blog/files/78fb213b/home-server-trace.png&quot; alt=&quot;Home Server / Domus40 Technical Manual - Some generic mini/embedded PC?&quot; title=&quot;Home Server / Domus40 Technical Manual - Some generic mini/embedded PC?&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Home Server / Domus40 Technical Manual - Some generic mini/embedded PC?&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;the-installation-key-ref-40925&quot;&gt;The Installation Key (ref. 40925)&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;Installation Key&lt;/em&gt; appears to be a USB gateway to connect all the wireless devices to the &lt;em&gt;Home Server&lt;/em&gt;. The cool thing is that it has an internal battery, supposedly you go around to all the devices, pair them with the key, and then connect the key to the server.&lt;/p&gt;
&lt;p&gt;If the protocol is indeed Zigbee, then it’s the only commercial Zigbee gateway that I’ve seen with an internal battery. In contrast, for Z-Wave, we have the &lt;a href=&quot;https://aeotec.com/products/aeotec-z-stick-gen5/&quot;&gt;Z-Stick Gen5+&lt;/a&gt; that also has a battery and works the same way.&lt;/p&gt;
&lt;figure class=&quot;media media-image&quot;&gt;&lt;a href=&quot;/blog/files/78fb213b/installation-key-trace.png&quot;&gt;&lt;img src=&quot;/blog/files/78fb213b/installation-key-trace.png&quot; alt=&quot;Installation Key / Domus40 Technical Manual - A Zigbee gateway?&quot; title=&quot;Installation Key / Domus40 Technical Manual - A Zigbee gateway?&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;Installation Key / Domus40 Technical Manual - A Zigbee gateway?&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;Well, I’ve already ordered 3 devices: the Installation Key (gateway), the Mobile Schuko Socket (smart plug) and the Wireless 4-Gang Push Button (smart switches). None of these are for permanent mains installation.&lt;/p&gt;
&lt;p&gt;As much as I would like to inspect and take apart the &lt;em&gt;Home Server&lt;/em&gt;, I can’t justify buying one, seeing that I don’t actually want to use the system.&lt;/p&gt;
&lt;p&gt;In the next series of posts, I will take apart these devices, inspect them and ultimately try to connect them to a Home Assistant instance.&lt;/p&gt;
&lt;p&gt;If anyone from EFAPEL is reading this, send me a &lt;em&gt;Home Server&lt;/em&gt; and I’ll tear it down. ;)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I have no affiliation with EFAPEL, all opinions are my own.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Domus40 HA series: Part 1 / &lt;a href=&quot;/blog/2023/07/15/e5cdc6ec&quot;&gt;Part 2&lt;/a&gt; / Part 3 (TBA).&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
&lt;aside&gt;&lt;p&gt;Thanks for reading and using RSS. Full blog at &lt;a href=&quot;/blog&quot;&gt;goncalomb.com&lt;/a&gt; (&lt;a href=&quot;/blog/2023/06/16/78fb213b-domus40-ha-part-1-introduction&quot;&gt;this post&lt;/a&gt;).&lt;/p&gt;
&lt;ul style=&quot;list-style: none; padding-left: 1.5rem;&quot;&gt;
	&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:github&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:github&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59c.4.07.55-.17.55-.38c0-.19-.01-.82-.01-1.49c-2.01.37-2.53-.49-2.69-.94c-.09-.23-.48-.94-.82-1.13c-.28-.15-.68-.52-.01-.53c.63-.01 1.08.58 1.23.82c.72 1.21 1.87.87 2.33.66c.07-.52.28-.87.51-1.07c-1.78-.2-3.64-.89-3.64-3.95c0-.87.31-1.59.82-2.15c-.08-.2-.36-1.02.08-2.12c0 0 .67-.21 2.2.82c.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82c.44 1.1.16 1.92.08 2.12c.51.56.82 1.27.82 2.15c0 3.07-1.87 3.75-3.65 3.95c.29.25.54.73.54 1.48c0 1.07-.01 1.93-.01 2.2c0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:github&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://github.com/goncalomb&quot; rel=&quot;me noopener&quot;&gt;GitHub @goncalomb&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:mastodon&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:mastodon&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603c.348-1.778.32-4.339.32-4.339c0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091c.083 3.394.626 6.74 3.78 7.57c1.454.383 2.703.463 3.709.408c1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295c-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541c-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764c.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983c.74 0 1.336.259 1.791.764q.662.757.661 2.046z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:mastodon&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;https://fosstodon.org/@goncalomb&quot; rel=&quot;me noopener&quot;&gt;Mastodon @goncalomb@fosstodon.org&lt;/a&gt;

			&lt;/li&gt;&lt;li&gt;
				&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; data-icon=&quot;bi:person-lines-fill&quot;&gt;
  
  
  &lt;symbol id=&quot;ai:bi:person-lines-fill&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6m-5 6s-1 0-1-1s1-4 6-4s6 3 6 4s-1 1-1 1zM11 3.5a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1h-4a.5.5 0 0 1-.5-.5m.5 2.5a.5.5 0 0 0 0 1h4a.5.5 0 0 0 0-1zm2 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1zm0 3a.5.5 0 0 0 0 1h2a.5.5 0 0 0 0-1z&quot;/&gt;&lt;/symbol&gt;&lt;use href=&quot;#ai:bi:person-lines-fill&quot;&gt;&lt;/use&gt;
      
&lt;/svg&gt;
&lt;a href=&quot;/#contacts&quot; rel=&quot;me noopener&quot;&gt;(more contacts)&lt;/a&gt;

			&lt;/li&gt;
&lt;/ul&gt;&lt;/aside&gt;</content:encoded><category>home-automation</category><author>goncalomb</author></item><item><title>[2023] Low-effort dark mode</title><link>http://localhost:4321/blog/2023/03/24/e8f3e4c3-loweffort-dark-mode</link><guid isPermaLink="true">http://localhost:4321/blog/2023/03/24/e8f3e4c3-loweffort-dark-mode</guid><pubDate>Fri, 24 Mar 2023 17:34:02 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2023/03/24/e8f3e4c3-loweffort-dark-mode&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>site</category><category>meta</category><author>goncalomb</author></item><item><title>[2023] AppleSocHot: Hot Hot Hot</title><link>http://localhost:4321/blog/2023/03/05/5406598f-applesochot-hot-hot-hot</link><guid isPermaLink="true">http://localhost:4321/blog/2023/03/05/5406598f-applesochot-hot-hot-hot</guid><pubDate>Sun, 05 Mar 2023 19:38:17 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2023/03/05/5406598f-applesochot-hot-hot-hot&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>apple</category><category>ipad</category><category>hacking</category><author>goncalomb</author></item><item><title>[2022] I got an e-ink display... And another... And another...</title><link>http://localhost:4321/blog/2022/12/04/53f6e0ad-i-got-an-eink-display-and-another-and-another</link><guid isPermaLink="true">http://localhost:4321/blog/2022/12/04/53f6e0ad-i-got-an-eink-display-and-another-and-another</guid><pubDate>Sun, 04 Dec 2022 23:04:04 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2022/12/04/53f6e0ad-i-got-an-eink-display-and-another-and-another&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>esl</category><category>e-ink</category><author>goncalomb</author></item><item><title>[2022] From a plastic box to a 100TB+ NAS</title><link>http://localhost:4321/blog/2022/11/18/1a18b7fa-from-a-plastic-box-to-a-100tb-nas</link><guid isPermaLink="true">http://localhost:4321/blog/2022/11/18/1a18b7fa-from-a-plastic-box-to-a-100tb-nas</guid><pubDate>Fri, 18 Nov 2022 19:37:25 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2022/11/18/1a18b7fa-from-a-plastic-box-to-a-100tb-nas&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>rpi</category><category>nas</category><author>goncalomb</author></item><item><title>[2022] Steam Deck first impressions</title><link>http://localhost:4321/blog/2022/05/09/0bd8cfa0-steam-deck-first-impressions</link><guid isPermaLink="true">http://localhost:4321/blog/2022/05/09/0bd8cfa0-steam-deck-first-impressions</guid><pubDate>Mon, 09 May 2022 21:48:04 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2022/05/09/0bd8cfa0-steam-deck-first-impressions&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>steam-deck</category><author>goncalomb</author></item><item><title>[2022] How to fix a LCD TV (the bad way)</title><link>http://localhost:4321/blog/2022/03/08/32b9b13f-how-to-fix-a-lcd-tv-the-bad-way</link><guid isPermaLink="true">http://localhost:4321/blog/2022/03/08/32b9b13f-how-to-fix-a-lcd-tv-the-bad-way</guid><pubDate>Tue, 08 Mar 2022 21:57:30 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2022/03/08/32b9b13f-how-to-fix-a-lcd-tv-the-bad-way&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>electronics</category><category>repair</category><category>lcd</category><author>goncalomb</author></item><item><title>[2021] I&apos;m back on IRC... yes, Internet Relay Chat</title><link>http://localhost:4321/blog/2021/04/30/42edf2a4-im-back-on-irc-yes-internet-relay-chat</link><guid isPermaLink="true">http://localhost:4321/blog/2021/04/30/42edf2a4-im-back-on-irc-yes-internet-relay-chat</guid><pubDate>Fri, 30 Apr 2021 22:47:15 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2021/04/30/42edf2a4-im-back-on-irc-yes-internet-relay-chat&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>irc</category><category>nostalgia</category><author>goncalomb</author></item><item><title>[2021] Check your connections</title><link>http://localhost:4321/blog/2021/03/31/917c377f-check-your-connections</link><guid isPermaLink="true">http://localhost:4321/blog/2021/03/31/917c377f-check-your-connections</guid><pubDate>Wed, 31 Mar 2021 21:21:49 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2021/03/31/917c377f-check-your-connections&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>usb</category><category>rpi</category><author>goncalomb</author></item><item><title>[2020] 2020</title><link>http://localhost:4321/blog/2020/12/30/12bbedac-2020</link><guid isPermaLink="true">http://localhost:4321/blog/2020/12/30/12bbedac-2020</guid><pubDate>Wed, 30 Dec 2020 23:45:09 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2020/12/30/12bbedac-2020&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>random</category><author>goncalomb</author></item><item><title>[2020] No more soggy toast</title><link>http://localhost:4321/blog/2020/11/22/2d1c7096-no-more-soggy-toast</link><guid isPermaLink="true">http://localhost:4321/blog/2020/11/22/2d1c7096-no-more-soggy-toast</guid><pubDate>Sun, 22 Nov 2020 22:31:28 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2020/11/22/2d1c7096-no-more-soggy-toast&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>random</category><author>goncalomb</author></item><item><title>[2020] Hello World</title><link>http://localhost:4321/blog/2020/10/10/fd32efd1-hello-world</link><guid isPermaLink="true">http://localhost:4321/blog/2020/10/10/fd32efd1-hello-world</guid><pubDate>Sat, 10 Oct 2020 20:20:20 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Older posts are not available directly on RSS, &lt;a href=&quot;/blog/2020/10/10/fd32efd1-hello-world&quot;&gt;click to view online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded><category>blog</category><category>meta</category><author>goncalomb</author></item></channel></rss>