<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Electronics Archives - Víctor Dorado</title>
	<atom:link href="https://www.victordorado.es/category/electronics/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.victordorado.es/category/electronics/</link>
	<description></description>
	<lastBuildDate>Tue, 16 Jun 2026 11:16:33 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Upgrading TruMinus: From CYD-C5 to the Power of Guition JC4880P443C</title>
		<link>https://www.victordorado.es/2026/06/16/upgrading-truminus-from-cyd-c5-to-the-power-of-guition-jc4880p443c/</link>
					<comments>https://www.victordorado.es/2026/06/16/upgrading-truminus-from-cyd-c5-to-the-power-of-guition-jc4880p443c/#respond</comments>
		
		<dc:creator><![CDATA[vidorado]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 11:16:32 +0000</pubDate>
				<category><![CDATA[Electronics]]></category>
		<guid isPermaLink="false">https://www.victordorado.es/?p=2442</guid>

					<description><![CDATA[<p>From bench prototype to van-ready tech. Overhauling TruMinus with the JC4880P443C to solve safe OTA, carrier NAT, and hardware limits.</p>
<p>The post <a href="https://www.victordorado.es/2026/06/16/upgrading-truminus-from-cyd-c5-to-the-power-of-guition-jc4880p443c/">Upgrading TruMinus: From CYD-C5 to the Power of Guition JC4880P443C</a> appeared first on <a href="https://www.victordorado.es">Víctor Dorado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In Part 1, I proved it was possible: <strong>I used a CYD to reverse-engineer the Truma LIN/TIN-bus protocol and control my boiler from a phone.</strong> It was a great proof of concept but, with a bigger screen, a more powerful processor and a lot of more PSRAM, it could be much improved.</p>



<p class="wp-block-paragraph">It cost me six weeks of deep-dive engineering: <strong>a brand-new ESP32 platform, a complete build system overhaul, a cloud tunnel to escape CGNAT, support for an extra BLE device for fresh water level monitoring, and a safe OTA updater</strong> that won&#8217;t brick the system mid-download. Here is the full story of how it came together.</p>



<figure class="wp-block-image size-large" style="margin-bottom:0px"><img fetchpriority="high" decoding="async" width="1024" height="534" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-1024x534.jpg" alt="The original CYD-C5 display" class="wp-image-2443" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image-1024x534.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/06/image-300x156.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/06/image-768x400.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/06/image-1536x801.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/06/image.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-stackable-subtitle stk-block-subtitle stk-block stk-0aa06dd" data-block-id="0aa06dd"><style>.stk-0aa06dd {align-items:center !important;margin-top:3px !important;margin-bottom:50px !important;display:flex !important;}.stk-0aa06dd .stk-block-subtitle__text{font-family:"Montserrat", Sans-serif !important;}</style><p class="stk-block-subtitle__text stk-subtitle">The original CYD-C5 display</p></div>



<figure class="wp-block-image size-large" style="margin-bottom:0px"><img decoding="async" width="1024" height="500" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-1-1024x500.jpg" alt="" class="wp-image-2444" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image-1-1024x500.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/06/image-1-300x146.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/06/image-1-768x375.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/06/image-1-1536x750.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/06/image-1.jpg 1889w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-stackable-subtitle stk-block-subtitle stk-block stk-d221e55" data-block-id="d221e55"><style>.stk-d221e55 {align-items:center !important;margin-top:0px !important;margin-bottom:0px !important;display:flex !important;}.stk-d221e55 .stk-block-subtitle__text{font-family:"Montserrat", Sans-serif !important;}</style><p class="stk-block-subtitle__text stk-subtitle">The new JC4880P443C display</p></div>



<h2 class="wp-block-heading">Phase 6: Hitting the Wall with the Cheap Yellow Display</h2>



<p class="wp-block-paragraph">The CYD-C5 is a wonderful little board for the money, but I kept bumping into its ceiling. The 2.8&#8243; screen was cramped once I started adding solar and battery data. Moreover, the C5 was still a small single-core part. If I was going to live with this panel for years, I wanted room to grow.</p>



<h2 class="wp-block-heading">Phase 7: The Big Leap — ESP32-P4 and a Proper 4.3&#8243; Display</h2>



<p class="wp-block-paragraph">The new home for the project is a board called the&nbsp;<strong>JC4880P443C</strong>, built around Espressif&#8217;s&nbsp;<strong>ESP32-P4</strong>. On paper it&#8217;s a different league:</p>



<ul class="wp-block-list">
<li><strong>Dual-core RISC-V at 400 MHz</strong> — I can pin the blocking LIN serial task to one core and let WiFi, the web server and the screen breathe on the other.</li>



<li><strong>32 MB of PSRAM and 16 MB of flash</strong> — enough to hold a full framebuffer in memory and stop counting kilobytes.</li>



<li><strong>A 4.3&#8243; 800×480 ST7701 RGB panel</strong> with GT911 capacitive touch — more than four times the pixels of the CYD-C5.</li>
</ul>



<p class="wp-block-paragraph">There&#8217;s a catch, and it&#8217;s a big one: <strong>the P4 has <em>no built-in WiFi or Bluetooth</em>. Radio is handled by a separate ESP32-C6 co-processor</strong> that the P4 drives over a high-speed SDIO link. Two chips, two firmwares, one device. That architecture would later cause some of the most interesting bugs in the whole project (more on that below), but it also meant I could eventually update the radio chip&#8217;s firmware <em>through</em> the main chip, over the air.</p>



<h2 class="wp-block-heading">Phase 8: Leaving the Comfort Zone — From PlatformIO to ESP-IDF</h2>



<p class="wp-block-paragraph">The CYD firmware was built on the Arduino framework through PlatformIO — friendly, forgiving, and full of ready-made libraries. The P4 is so new that most of that ecosystem simply doesn&#8217;t support it yet. So I took the plunge and <strong>rewrote the entire build on Espressif&#8217;s native toolchain, ESP-IDF 6.0, driven by <code>idf.py</code></strong>.</p>



<p class="wp-block-paragraph">This was not a free afternoon. It meant swapping Arduino&#8217;s comfortable <code>String</code> and JSON helpers for lower-level C/C++, replacing the web server stack, and learning a long list of P4-specific quirks the hard way: linker settings for early silicon, an internal-RAM budget that had to be measured and trimmed, a USB serial console that fought me for control of the port, and a TLS engine whose <em>hardware</em> cryptography produced subtly invalid signatures on this chip revision — which I eventually had to disable in favour of <em>software </em>crypto. Every one of those traps now lives in a written &#8220;skill&#8221; file in the repository so I never have to rediscover it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Lesson learned:</strong>&nbsp;when you adopt brand-new hardware, budget most of your time for the toolchain, not the features. The heater logic from Part&nbsp;1 ported over in an afternoon. Getting it to&nbsp;<em>build and flash reliably</em>&nbsp;took weeks.</p>
</blockquote>



<h2 class="wp-block-heading">Phase 9: The Display, Reborn</h2>



<p class="wp-block-paragraph">With four times the pixels, <strong>I rebuilt the user interface from scratch in LVGL</strong>, the embedded graphics library. The screen is now three clean bands:</p>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="612" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-2-1024x612.jpg" alt="" class="wp-image-2447" style="aspect-ratio:1.6732317774601737;width:556px;height:auto" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image-2-1024x612.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2-300x179.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2-768x459.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2.jpg 1047w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li><strong>A top bar</strong> with the outdoor temperature, a settings gear and live status dots (cloud, Bluetooth, WiFi, LIN)</li>



<li><strong>A central dashboard</strong> split between the heater controls and the energy panels</li>



<li><strong>A bottom status bar</strong> with the network name and IP.</li>
</ul>



<p class="wp-block-paragraph">I used FontAwesome icons rendered as a custom font subset so the controls look like real product UI rather than a hobby project — thermometer, flame, fan, water drop, solar panel, battery. Little touches crept in over the weeks: caret triangles for the setpoint and fan controls, a boiler &#8220;thermometer&#8221; gauge, animated power-flow lines between the solar/battery/inverter panels.</p>



<h2 class="wp-block-heading">Phase 10: A Real Web App</h2>



<p class="wp-block-paragraph">The phone interface got the same treatment.<strong> Instead of embedding the web files inside the firmware binary, they now live in their own 8 MB filesystem partition</strong> and are served by the P4&#8217;s native HTTP server over a WebSocket connection. <strong>A build step automatically gzip-compresses every asset and stamps a version hash on each file, so browsers always refetch what changed</strong> and never serve a stale cached panel.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="779" height="376" src="https://www.victordorado.es/wp-content/uploads/2026/06/image.png" alt="" class="wp-image-2445" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image.png 779w, https://www.victordorado.es/wp-content/uploads/2026/06/image-300x145.png 300w, https://www.victordorado.es/wp-content/uploads/2026/06/image-768x371.png 768w" sizes="(max-width: 779px) 100vw, 779px" /></figure>



<p class="wp-block-paragraph">Crucially, <strong>the web UI now <em>mirrors the physical screen</em>: the same layout, the same panels, the same live data, kept in sync over the WebSocket.</strong> Touch the LCD and the phone updates; tap the phone and the LCD follows. It&#8217;s a Progressive Web App too, so it installs to the home screen like a native app, and it reflows cleanly from a desktop browser down to a phone in portrait.</p>



<h2 class="wp-block-heading">Phase 11: Escaping CGNAT — A Cloud Tunnel of My Own</h2>



<p class="wp-block-paragraph">Here&#8217;s the problem that nearly stopped the whole project: <strong>my motorhome connects through a mobile router, and like most cellular connections it sits behind Carrier-Grade NAT</strong>. There is no public IP address to forward a port to. From the open internet, the panel is simply unreachable. Every &#8220;just port-forward it&#8221; tutorial is useless here.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="500" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-2-3.jpg" alt="" class="wp-image-2451" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image-2-3.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2-3-300x146.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2-3-768x375.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The solution was to build my own secure reverse tunnel</strong>. A small Node.js bridge runs on my web server with a real public address; the firmware &#8220;dials out&#8221; to it over an encrypted WebSocket and holds the connection open. <strong>When I open the panel from my phone, my request goes to the cloud server, down through the tunnel, into the van, and back.</strong> The motorhome never needs to accept an incoming connection — it only ever makes outgoing ones, which CGNAT happily allows.</p>



<p class="wp-block-paragraph">Making that reliable over a flaky mobile link was its own saga: <strong>detecting a dead bridge in seconds rather than minutes, rebuilding a wedged connection automatically, surviving the server&#8217;s idle timeouts, adding password protection for the tunnelled web access</strong>, and teaching the bridge to shrug off the endless background noise of internet vulnerability scanners. The bridge eventually grew big enough to live in <a href="https://github.com/vidorado/truminus-cloud-server">its own repository</a>.</p>



<h2 class="wp-block-heading">Phase 12: More Senses — Inverter and Fresh Water Tank Level</h2>



<p class="wp-block-paragraph">With memory to spare, <strong>I kept adding data sources</strong>. The panel now reads, in addition to the solar charger and battery BMS from Part 1:</p>



<ul class="wp-block-list">
<li><strong>The Victron Multiplus inverter/charger</strong> over Bluetooth, showing live power flow in and out of the AC side — with animated arrows for charge vs. discharge.</li>



<li><strong>A wireless fresh-water tank sensor</strong> using the open <em>BTHome</em> standard.</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="312" height="144" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-2.png" alt="" class="wp-image-2452" srcset="https://www.victordorado.es/wp-content/uploads/2026/06/image-2.png 312w, https://www.victordorado.es/wp-content/uploads/2026/06/image-2-300x138.png 300w" sizes="(max-width: 312px) 100vw, 312px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="198" height="143" src="https://www.victordorado.es/wp-content/uploads/2026/06/image-3.png" alt="" class="wp-image-2453"/></figure>



<p class="wp-block-paragraph">Getting Bluetooth reception solid through the C6 co-processor took real detective work&nbsp;— modern Victron devices broadcast using BLE&nbsp;5 &#8220;extended advertising&#8221;, which I had to explicitly enable, and I had to widen the scan window to claw back range that the radio chip was losing to WiFi coexistence. I added a serial&nbsp;<code>scan</code>&nbsp;command just to see, live, which devices were in range and how strong their signal was.</p>



<h2 class="wp-block-heading">Phase 13: Updating in the Wild — Over-the-Air, Without the Fear</h2>



<p class="wp-block-paragraph"><strong>If I&#8217;m going to fix a bug while the van is parked, I need to push new firmware <em>over the air</em></strong> — and I absolutely cannot afford for a half-finished download to leave the panel dead.</p>



<p class="wp-block-paragraph">The system <strong>pulls releases straight from GitHub Releases</strong>, compares versions, and only nags me for a manual update on meaningful (minor/major) releases rather than every tiny patch. The download streams directly into a spare flash slot. The clever part is the safety net: <strong>after flashing, the new firmware boots into a probation period. </strong>It has to prove it can actually start up, get an IP and keep enough memory free; if it can&#8217;t, <strong>the panel automatically rolls back to the previous version</strong> on the next reboot. A bad update heals itself.</p>



<p class="wp-block-paragraph"><strong>It can even update the web interface assets separately from the firmware</strong>, <strong>and reflash the ESP32-C6 radio co-processor through the main chip</strong> when their versions drift apart. Getting all of this stable over a slow mobile connection meant <strong>a long tail of fixes:</strong> <strong>pausing Bluetooth during downloads to free up memory</strong>, <strong>adaptive download throttling</strong> <strong>so the SDIO link to the radio chip wouldn&#8217;t choke, </strong>and keeping the cloud tunnel alive through the whole process so <strong>I can watch progress remotely.</strong></p>



<p class="wp-block-paragraph">I have, genuinely, never been so relieved as the first time a remote update completed, rebooted, and reconnected on its own.</p>



<h2 class="wp-block-heading">Phase 14: Reorganizing the code and the knowledge</h2>



<p class="wp-block-paragraph">The code was a little bit unorganized after many tests, so <strong>it was refactored to a more modular system with test coverage.</strong> First,<strong> the tricky decoding logic — the byte-level parsers for every Bluetooth device, the LIN protocol checksums, the fault-log encoder — was pulled out into hardware-independent modules with automated tests</strong>. I can now verify the math that interprets a Victron broadcast or a heater frame.</p>



<p class="wp-block-paragraph">Second, <strong>the repository now carries a set of detailed &#8220;skill&#8221; documents</strong> — one for the build-system traps, one for each Bluetooth protocol, one for the cloud tunnel, one for the OTA system, one for the Truma LIN frames. Every painful lesson is captured the moment I learn it, <strong>so</strong> <strong>the next time I (or anyone) touch that corner of the code, the landmines are already mapped.</strong> It&#8217;s the documentation I wish every hardware project shipped with.</p>



<h2 class="wp-block-heading">Conclusion: From Proof of Concept to Daily Driver</h2>



<p class="wp-block-paragraph"><strong>Part 1 proved I could talk to the heater. Part 2 was about everything that turns a clever demo into something you trust with your family&#8217;s hot water on a winter night</strong>, hundreds of kilometres from your workbench.</p>



<ul class="wp-block-list">
<li><strong>A bigger, dual-core brain with room to grow</strong>.</li>



<li><strong>A proper 4.3&#8243; interface</strong> mirrored to a phone-friendly web app.</li>



<li><strong>A self-built cloud tunnel</strong> that punches through carrier NAT.</li>



<li><strong>A full picture of the van&#8217;s energy</strong> — solar, battery, inverter, water, weather.</li>



<li><strong>An over-the-air update system</strong> with a parachute, so I can keep improving it without ever opening the panel again.</li>
</ul>



<p class="wp-block-paragraph">The result is <strong>something that offers: global remote control and far richer telemetry than the original hardware, on a panel I can extend at will</strong>. </p>



<p class="wp-block-paragraph"><strong>The project is open source.</strong> If you want to dig into the code, the protocol notes, or the cloud bridge, it&#8217;s all on <a href="https://github.com/vidorado">GitHub</a> — and I&#8217;d love to hear from anyone tackling the same problem in their own van.</p>
<p>The post <a href="https://www.victordorado.es/2026/06/16/upgrading-truminus-from-cyd-c5-to-the-power-of-guition-jc4880p443c/">Upgrading TruMinus: From CYD-C5 to the Power of Guition JC4880P443C</a> appeared first on <a href="https://www.victordorado.es">Víctor Dorado</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.victordorado.es/2026/06/16/upgrading-truminus-from-cyd-c5-to-the-power-of-guition-jc4880p443c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Advanced Motorhome Truma Control Panel: A Custom ESP32 CYD Journey</title>
		<link>https://www.victordorado.es/2026/05/05/advanced-motorhome-truma-control-panel-a-custom-esp32-cyd-journey/</link>
		
		<dc:creator><![CDATA[vidorado]]></dc:creator>
		<pubDate>Mon, 04 May 2026 22:59:02 +0000</pubDate>
				<category><![CDATA[Electronics]]></category>
		<guid isPermaLink="false">https://www.victordorado.es/?p=2406</guid>

					<description><![CDATA[<p>Technical overview of a custom motorhome control panel implementation using the ESP32-CYD. This project integrates with Truma systems to provide an advanced interface for climate and hardware monitoring.</p>
<p>The post <a href="https://www.victordorado.es/2026/05/05/advanced-motorhome-truma-control-panel-a-custom-esp32-cyd-journey/">Advanced Motorhome Truma Control Panel: A Custom ESP32 CYD Journey</a> appeared first on <a href="https://www.victordorado.es">Víctor Dorado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Note:</strong> You can view the code related to this project at <a href="https://github.com/vidorado/truminus" target="_blank" rel="noreferrer noopener">https://github.com/vidorado/truminus</a></p>
</blockquote>



<h2 class="wp-block-heading">Introduction</h2>



<p class="wp-block-paragraph">If you own a motorhome with a Truma Combi heater, you’ve probably shared my frustration: <strong>You&#8217;d like to turn on your boiler 20 minutes before you come back to the van, so you can take a shower immediately</strong>, but the standard CPPlus controller doesn&#8217;t allow internet connectivity out of the box. Sure, you can buy an iNet Box, but it requires a yearly subscription and—here is the catch—your CPPlus unit must be &#8220;iNet Ready.&#8221; Mine wasn&#8217;t.</p>



<p class="wp-block-paragraph"><strong>Instead of paying for a subscription and upgrading my hardware to a closed ecosystem,</strong> <strong>I decided to build my own solution</strong>. Inspired by the <a href="https://github.com/olivluca/TruMinus">olivluca/truminus</a> and <a href="https://github.com/olivluca/TrumaDisplay">olivluca/TrumaDisplay</a> projects, my original plan was to build an iNet Box simulator that would sit in parallel on the Truma TIN bus. Even though my CPPlus didn&#8217;t say &#8220;iNet Ready,&#8221; it was a brand-new 2025 heater, so I gambled on it being compatible. Spoiler alert: <strong>I was wrong.</strong></p>



<p class="wp-block-paragraph"><strong>I&#8217;ve developed the core of the project using Claude Code and Kimi K2.6</strong>. It’s been an incredible experience <strong>acting as the orchestrator</strong>, focusing on the <strong>UX and QA</strong>, while letting the AI handle the heavy lifting of implementation details.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Phase 1: The &#8220;iNet&#8221; Gamble</h3>



<p class="wp-block-paragraph">My first approach was conservative. I didn&#8217;t want to remove the original CPPlus, so I planned to build a &#8220;Man-in-the-Middle&#8221; device. Using an <strong>ESP32 C3 Supermini</strong>, I tried to emulate an iNet Box to sit alongside the original controller on the <strong>TIN-Bus</strong>.</p>



<p class="wp-block-paragraph">I had high hopes. My heater was a brand-new 2025 model, and I assumed Truma would have made it compatible by default. I spent time trial-and-error-coding the emulation layer, but the heater simply wouldn&#8217;t recognize the device. The lesson? If the screen doesn&#8217;t say &#8220;iNet Ready,&#8221; it really isn&#8217;t.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702-1024x576.jpg" alt="The first prototype with the ESP32 C3 and wires everywhere" class="wp-image-2414" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702-1024x576.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702-300x169.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702-768x432.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702-1536x864.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260422_170036702.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The first prototype with the ESP32 C3 and wires everywhere</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Phase 2: Pivoting to the CYD (Cheap Yellow Display)</h3>



<p class="wp-block-paragraph">Since I couldn&#8217;t &#8220;talk&#8221; to the CPPlus, I decided to <strong>replace</strong> the CPPlus. I moved the project to the <strong>ESP32-2432S028</strong>, popularly known as the <strong>CYD (Cheap Yellow Display)</strong>. This gave me a 2.8-inch touchscreen and some GPIOs.</p>



<p class="wp-block-paragraph">To make it fit the motorhome&#8217;s aesthetic, I designed a custom PCB the exact same size as the screen. This &#8220;sandwich&#8221; design meant the unit would be deep but have a small footprint on the wall, making it much easier to mount.</p>



<p class="wp-block-paragraph"><strong>The Software Grind:</strong> I spent hours at my desk iterating on the UI (AI doesn&#8217;t hit the bullseye with C++ and embedded hardware as quick as with other more common technologies like PHP, Javascript&#8230; etc.</p>



<p class="wp-block-paragraph">I wanted a professional feel, with intuitive menus and a built-in web server. The biggest headache was the ESP32&#8217;s memory. Between the graphic library (LVGL/TFT_eSPI), the Wi-Fi stack, and the web server, I kept hitting &#8220;Out of Memory&#8221; crashes. It took many some nights of code optimization and AI-assisted debugging to get the loop running smoothly.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671-1024x576.jpg" alt="" class="wp-image-2415" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671-1024x576.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671-300x169.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671-768x432.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671-1536x864.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_111309671.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The CYD display showing the main menu</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Phase 3: Field Testing &amp; Reverse Engineering</h3>



<p class="wp-block-paragraph">Once the UI was stable, it was time to move from the desk to the van. This is where things got real. I used <strong>WomoLIN</strong> logs as a baseline, but since my heater was so new, the commands didn&#8217;t match perfectly, so I had to perform <strong>Live Sniffing</strong>. I connected the CYD in parallel with the original Truma panel and watched the hex codes fly by.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038-1024x576.jpg" alt="" class="wp-image-2416" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038-1024x576.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038-300x169.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038-768x432.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038-1536x864.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260423_175439038.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Working inside the van, wires connected to the Truma unit</strong></p>



<p class="wp-block-paragraph"><strong>The &#8220;Cold Sweat&#8221; Moment:</strong> During one of these tests, the heater suddenly locked up. A red light started flashing: <strong>Error E545</strong>. I searched every manual—nothing. The heater was unresponsive. I had to literally dismantle the furniture to reach the Combi unit&#8217;s core. After a few tense minutes of panic, I found the physical reset button. A long press later, the &#8220;clac-clac&#8221; of the diesel pump returned. I’ve never been so happy to hear a clicking noise in my life.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896-1024x576.jpg" alt="" class="wp-image-2428" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896-1024x576.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896-300x169.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896-768x432.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896-1536x864.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260427_151926896.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The Truma unit</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Phase 4: Adding the &#8220;Pro&#8221; Features (Victron &amp; Ultimatron)</h3>



<p class="wp-block-paragraph">Since I had a powerful screen, I figured: why stop at the heater? I wanted a &#8220;Command Center.&#8221;</p>



<ol start="1" class="wp-block-list">
<li><strong>Victron SmartSolar MPPT:</strong> I connected to it via bluetooth based on <a href="https://github.com/chrisj7903/Read-Victron-advertised-data">chrisj7903/Read-Victron-advertised-data</a> project. I had to fix some decryption issues because my newer MPPT used a slightly different frame format than the open-source libraries I found.</li>



<li><strong>Ultimatron LiFePo4:</strong> I integrated the battery status via Bluetooth/Serial based on the <a href="https://github.com/sergkh/node-ultimatron-battery">sergkh/node-ultimatron-battery</a> project.</li>
</ol>



<p class="wp-block-paragraph">Now, in one single glance, I could see my room temperature, manage my heater and boiler, and check my solar harvest and my battery percentage.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13-1024x576.jpeg" alt="" class="wp-image-2417" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13-1024x576.jpeg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13-300x169.jpeg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13-768x432.jpeg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13-1536x864.jpeg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/WhatsApp-Image-2026-05-01-at-20.43.13.jpeg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Screen showing the Solar and Battery stats</strong></p>



<p class="wp-block-paragraph">I also dedicated significant time to fine-tuning the web server to mirror the physical display&#8217;s state. By implementing a <strong>real-time WebSocket (WS) connection</strong>, I ensured that any change on the web interface is instantly reflected on the screen and vice versa, creating a seamless, <strong>zero-latency synchronization</strong></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="959" height="451" src="https://www.victordorado.es/wp-content/uploads/2026/05/image.png" alt="" class="wp-image-2429" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/image.png 959w, https://www.victordorado.es/wp-content/uploads/2026/05/image-300x141.png 300w, https://www.victordorado.es/wp-content/uploads/2026/05/image-768x361.png 768w" sizes="(max-width: 959px) 100vw, 959px" /></figure>



<p class="wp-block-paragraph"><strong>Landscape view of the web app</strong></p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="437" height="756" src="https://www.victordorado.es/wp-content/uploads/2026/05/image-1.png" alt="" class="wp-image-2430" style="width:347px;height:auto" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/image-1.png 437w, https://www.victordorado.es/wp-content/uploads/2026/05/image-1-173x300.png 173w" sizes="(max-width: 437px) 100vw, 437px" /></figure>



<p class="wp-block-paragraph"><strong>Portrait view of the web app</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Phase 5: 3D Case Design &amp; Installation</h3>



<p class="wp-block-paragraph">The final hurdle was physical. In my van, the auxiliary drop-down bed partially covers the original control area. I had to mount the new panel as low as possible so I could still see the temperature while lying in bed.</p>



<p class="wp-block-paragraph">I used <strong>Shapr3D</strong> to design a bespoke enclosure. I wanted it to look factory-spec, so I added a recessed Truma logo. A friend printed it for me on a multi-color Bambu Lab printer, and the result was incredible. To hide the old screw holes in the wood, I used a matching wood-effect vinyl—the integration is seamless.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1022" height="750" src="https://www.victordorado.es/wp-content/uploads/2026/05/image.jpg" alt="" class="wp-image-2419" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/image.jpg 1022w, https://www.victordorado.es/wp-content/uploads/2026/05/image-300x220.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/image-768x564.jpg 768w" sizes="(max-width: 1022px) 100vw, 1022px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="655" src="https://www.victordorado.es/wp-content/uploads/2026/05/image-1-1024x655.jpg" alt="" class="wp-image-2421" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/image-1-1024x655.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/image-1-300x192.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/image-1-768x491.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/image-1.jpg 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="995" height="1024" src="https://www.victordorado.es/wp-content/uploads/2026/05/image-2-995x1024.jpg" alt="" class="wp-image-2422" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/image-2-995x1024.jpg 995w, https://www.victordorado.es/wp-content/uploads/2026/05/image-2-291x300.jpg 291w, https://www.victordorado.es/wp-content/uploads/2026/05/image-2-768x791.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/image-2.jpg 1080w" sizes="(max-width: 995px) 100vw, 995px" /></figure>



<h3 class="wp-block-heading">Wood Machining &amp; Panel Adaptation</h3>



<p class="wp-block-paragraph">The physical integration was a delicate part of the project. In my motorhome, the auxiliary drop-down bed partially blocks the original control area when lowered. I had to study the dimensions carefully to reposition the new system as low as possible without losing visibility or functionality.</p>



<p class="wp-block-paragraph">After taking precision measurements, I proceeded to machine the original wooden panel. This required immense patience; it was crucial not to splinter the plywood while creating the exact cutouts for the CYD screen and the internal electronics. Ensuring everything was aligned and firm, while taking advantage of the empty space behind the panel, was a major milestone</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150-1024x576.jpg" alt="" class="wp-image-2426" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150-1024x576.jpg 1024w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150-300x169.jpg 300w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150-768x432.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150-1536x864.jpg 1536w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_145547150.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="576" height="1024" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393-576x1024.jpg" alt="" class="wp-image-2427" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393-576x1024.jpg 576w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393-169x300.jpg 169w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393-768x1365.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393-864x1536.jpg 864w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260430_172450393.jpg 1080w" sizes="(max-width: 576px) 100vw, 576px" /></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="576" height="1024" src="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471-576x1024.jpg" alt="" class="wp-image-2425" srcset="https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471-576x1024.jpg 576w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471-169x300.jpg 169w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471-768x1365.jpg 768w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471-864x1536.jpg 864w, https://www.victordorado.es/wp-content/uploads/2026/05/PXL_20260501_135144471.jpg 1080w" sizes="(max-width: 576px) 100vw, 576px" /></figure>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Conclusion</h3>



<p class="wp-block-paragraph"><strong>Developing this controller was a significant technical challenge</strong>. Reversing the proprietary TIN-bus protocol and resolving critical errors, such as the E545, required nerves of steel and extensive debugging.</p>



<p class="wp-block-paragraph">The result is a system that outperforms the original hardware in responsiveness and telemetry. It now offers global remote access and a data granularity that exceeds the official iNet Box&#8217;s capabilities. Future iterations may include water level monitoring, but the current focus is the system&#8217;s deployment in a live environment.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"></p>
</blockquote>
<p>The post <a href="https://www.victordorado.es/2026/05/05/advanced-motorhome-truma-control-panel-a-custom-esp32-cyd-journey/">Advanced Motorhome Truma Control Panel: A Custom ESP32 CYD Journey</a> appeared first on <a href="https://www.victordorado.es">Víctor Dorado</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
