<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Esp32 on tsvinc</title>
		<link>https://tsvinc.dev/tags/esp32/</link>
		<description>Recent content in Esp32 on tsvinc</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 02 Nov 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://tsvinc.dev/tags/esp32/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>The DJI went silent for four hours</title>
				<link>https://tsvinc.dev/posts/dji-went-silent-four-hours/</link>
				<pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/dji-went-silent-four-hours/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://tsvinc.dev/posts/dji-power-2000-ups-over-bluetooth/&#34;&gt;Part 4&lt;/a&gt; ended on a rule for the observer, the Go service on my router that turns two power stations&#39; readings into NUT (Network UPS Tools) status for the machines they keep running: a DJI that stops answering for minutes is an alert in its own right, never a sign that the grid is fine. On 20 October the DJI Power 2000 stopped answering at about 13:10. It answered again a little before 18:00, after I power-cycled it. While the grid was up, nothing alerted me to the silence.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The UPS said 2 minutes at 95 %</title>
				<link>https://tsvinc.dev/posts/ups-said-two-minutes-at-95/</link>
				<pubDate>Mon, 02 Nov 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/ups-said-two-minutes-at-95/</guid>
				<description>&lt;p&gt;My storage box and gaming PC run on a DJI Power 2000 power station used as a UPS, and a monitor on my router decides when they shut down. At 11:39:39 on 1 November, twenty-three minutes into a power cut, my alert channels got this from it:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ups dji2000-t2: LOW BATTERY, its hosts should shut down (runtime 2m0s &amp;lt;= 20m0s (ABC))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the same for the third tier, against its 8-minute limit. Two minutes of runtime left on the DJI. I could see the station&#39;s display at the time. It said about 95 %.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Pulling plugs on purpose</title>
				<link>https://tsvinc.dev/posts/pulling-plugs-on-purpose/</link>
				<pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/pulling-plugs-on-purpose/</guid>
				<description>&lt;p&gt;A test that passes tells you the thing works. That is the reading everyone defaults to, and the first power-bank test of the ESP32 bridge was a clean example of why it&#39;s wrong.&lt;/p&gt;&#xA;&lt;p&gt;The bridge from &lt;a href=&#34;https://tsvinc.dev/posts/esp32-bluetti-ac180-bridge/&#34;&gt;the second UPS post&lt;/a&gt; runs off a USB power bank, which charges from the wall. The worry was simple: when the grid goes and the power bank stops charging, does it hold its output steady, or does the board reboot right at the start of the outage it is supposed to report? I cut the power bank&#39;s charging, and the board&#39;s uptime counter kept going, from 14160 seconds to 14180. No reboot.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The guard rails that said no</title>
				<link>https://tsvinc.dev/posts/guard-rails-that-said-no/</link>
				<pubDate>Sun, 18 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/guard-rails-that-said-no/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Script Error: failure: mountpoint usb1-part1 is used by log-&amp;gt;file:/blockylog.0.txt (/disk/set *0 = *0) (/disk/set; line 7) (:import; line 1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ABORT: whole SSD still shared (smb/media entries: 2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That was the deploy script for the MQTT broker on the router, stopping itself at step 0. Nothing after that line ran: no router backup, no password file, no broker. The second line had been added to the script two minutes earlier.&lt;/p&gt;&#xA;&lt;p&gt;The project behind &lt;a href=&#34;https://tsvinc.dev/posts/esp32-bluetti-ac180-bridge/&#34;&gt;the power station bridge&lt;/a&gt; hit several refusals like this one in a single day. Some came from scripts, one from a permission check in my tooling, one from a review note. Each one made the result better. The only expensive failure of the day came from a tool that didn&#39;t refuse at all.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The DJI&#39;s grid flag is labeled charge type</title>
				<link>https://tsvinc.dev/posts/dji-power-2000-ups-over-bluetooth/</link>
				<pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/dji-power-2000-ups-over-bluetooth/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update, 2026-11-02:&lt;/strong&gt; The station&#39;s minutes field has a second meaning. Byte 4 of its battery record (tag &lt;code&gt;0x3020&lt;/code&gt;) is a time type, and while it is &lt;code&gt;1&lt;/code&gt; the minutes are a recharging time, the time to full charge, not a runtime. The bridge now leaves &lt;code&gt;runtime_min&lt;/code&gt; out whenever that byte says recharging, and the observer ignores the field while input power flows. The story is in &lt;a href=&#34;https://tsvinc.dev/posts/ups-said-two-minutes-at-95/&#34;&gt;The UPS said 2 minutes at 95 %&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Secure session ready. Battery: ?</title>
				<link>https://tsvinc.dev/posts/esp32-bluetti-ac180-bridge/</link>
				<pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://tsvinc.dev/posts/esp32-bluetti-ac180-bridge/</guid>
				<description>&lt;p&gt;Porting a key exchange from Python to C++ should be the boring part. The Python works, it is already validated against this exact station, and mbedTLS ships every primitive it uses: MD5, AES-CBC, P-256, ECDSA, ECDH. Translate, compile, flash. The first run on the ESP32 went along with that, right up to the last line:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;found AC180&amp;lt;redacted&amp;gt; XX:XX:XX:XX:XX:XX rssi=-57&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;connected, mtu=517&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KEX: challenge answered&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KEX: challenge accepted&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KEX: pubkey sent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KEX: pubkey sent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KEX: secure session ready&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;handshake 1913 ms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RESULT BATTERY_SOC=? DC_OUTPUT_POWER=? AC_OUTPUT_POWER=?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Every step of the handshake reported success. Then came the reads, the part that was supposed to be easy, and the first three came back as question marks. The capture ended there.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
