<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>IOT on Mi&amp;Bee Blog</title><link>/en/categories/iot/</link><description>Recent content in IOT on Mi&amp;Bee Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>蓝宝石的傻话</managingEditor><lastBuildDate>Mon, 25 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="/en/categories/iot/rss.xml" rel="self" type="application/rss+xml"/><item><title>MiBeeNvr v0.4.0: Audio Recording Finally Arrives, Auto-Recovery When Cameras Go Down</title><link>/en/posts/iot/mibee-nvr-v0.4-promo/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.4-promo/</guid><description>&lt;p&gt;Previously, MiBeeNvr&amp;rsquo;s MP4 files only had a video track — playback was silent. v0.4.0 fills this gap with &lt;strong&gt;audio recording&lt;/strong&gt;. It also adds more practical &lt;strong&gt;camera health monitoring and auto-recovery&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="recordings-now-have-sound"&gt;Recordings Now Have Sound&lt;/h2&gt;
&lt;p&gt;Each camera can independently enable audio recording:&lt;/p&gt;
&lt;div class="code-block-wrapper" data-lang="yaml"&gt;
 &lt;div class="code-block-header"&gt;
 &lt;div class="code-block-meta"&gt;&lt;span class="code-language"&gt;yaml&lt;/span&gt;&lt;/div&gt;
 
 &lt;button class="copy-button" aria-label="Copy code"&gt;
 &lt;svg class="copy-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2"/&gt;&lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/&gt;&lt;/svg&gt;
 &lt;svg class="check-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;polyline points="20 6 9 17 4 12"/&gt;&lt;/svg&gt;
 &lt;/button&gt;
 
 &lt;/div&gt;
 &lt;div class="code-block-body"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;cameras&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;front-door&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Front Door Camera&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rtsp&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;h264&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audio_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Supported audio formats:&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.4.0: Audio Recording Pipeline and Multi-Layer Health Monitoring Architecture</title><link>/en/posts/iot/mibee-nvr-v0.4-tech/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.4-tech/</guid><description>&lt;p&gt;After v0.3.1 shipped, I put in another 196 commits. v0.4.0 is a feature-dense release: audio recording pipeline, multi-layer health monitoring engine, HLS/LL-HLS playback stability optimization, and a major UI redesign. For the full changelog, see &lt;a href="https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/tag/v0.4.0"&gt;GitHub Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The previous post covered v0.3.x&amp;rsquo;s multi-protocol streaming and Xiaomi camera support (&lt;a href="/en/posts/iot/mibee-nvr-v0.3-tech/"&gt;v0.3.0 Tech Post&lt;/a&gt;). If you haven&amp;rsquo;t read the first post, start with &lt;a href="/en/posts/iot/mibee-nvr-introduction/"&gt;MiBeeNvr Introduction&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="audio-recording-from-silent-to-sound"&gt;Audio Recording: From Silent to Sound&lt;/h2&gt;
&lt;p&gt;In the v0.3.x era, recorded MP4 files only had a video track. v0.4.0 introduces a complete audio capture and muxing pipeline, supporting AAC audio from RTSP cameras and G.711 audio from ONVIF/Xiaomi cameras.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.3.1: Multi-Protocol Streaming and Native Xiaomi Camera Support</title><link>/en/posts/iot/mibee-nvr-v0.3-tech/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.3-tech/</guid><description>&lt;p&gt;A lot of work went into the releases after v0.2.0. v0.3.x brings several major updates: native Xiaomi camera support, recording archiving, multi-protocol streaming architecture (WebRTC/HTTP-FLV/RTMP/SRT/LL-HLS), and a wave of security hardening. The architectural evolution from external dependencies to built-in implementation, from single protocol to full protocol support, was much more曲折 than I expected.&lt;/p&gt;
&lt;p&gt;The previous post introduced v0.2.0&amp;rsquo;s 15 new features (&lt;a href="/en/posts/iot/mibee-nvr-v0.2/"&gt;v0.2.0 Update&lt;/a&gt;). If you haven&amp;rsquo;t read the first post, start with &lt;a href="/en/posts/iot/mibee-nvr-introduction/"&gt;MiBeeNvr Introduction&lt;/a&gt;. v0.3.0 focuses on deep Xiaomi camera integration, and v0.3.1 builds on that with a complete multi-protocol streaming architecture. For the full changelog, see &lt;a href="https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/tag/v0.3.1"&gt;GitHub Release Notes&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.3.0: One-Click Xiaomi Camera Integration, Recordings Never Lost</title><link>/en/posts/iot/mibee-nvr-v0.3-promo/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.3-promo/</guid><description>&lt;p&gt;Got Xiaomi cameras at home? Want to keep your recordings on your own storage instead of relying on the cloud?&lt;/p&gt;
&lt;p&gt;As someone with several Xiaomi cameras at home, I always had one frustration: every time I wanted to check the footage from my doorbell camera, I had to log into Xiaomi Cloud, wait for ages while it loaded, and it would often just spin. Plus, cloud storage charges by the day — it adds up over the month. And if you swap cameras, all your old recordings are gone. Pretty frustrating.&lt;/p&gt;</description></item><item><title>MiBeeNvr v0.2.0 Update: Docker Deployment, HLS Streaming, Recording Merging, and a Complete Installation Guide</title><link>/en/posts/iot/mibee-nvr-v0.2/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-v0.2/</guid><description>&lt;p&gt;The previous article introduced MiBeeNvr&amp;rsquo;s basic features and design philosophy. It&amp;rsquo;s only been a week since v0.1.0, and v0.2.0 follows right behind. This update is substantial — 15 new features, some I needed myself, others from community feedback.&lt;/p&gt;
&lt;p&gt;This article covers three things: what&amp;rsquo;s new in v0.2.0, how to deploy from scratch, and some practical tips for real-world use.&lt;/p&gt;
&lt;h2 id="v020-new-features-overview"&gt;v0.2.0 New Features Overview&lt;/h2&gt;
&lt;p&gt;This update has a lot of content. Here&amp;rsquo;s a breakdown by category:&lt;/p&gt;</description></item><item><title>ESP32-CAM Monitor: DIY Auto Flash for Dark Scenes</title><link>/en/posts/iot/ai-thinker-esp32-cam-flash/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/ai-thinker-esp32-cam-flash/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;I built a surveillance camera with ESP32-S3 before, and it worked well. Later, while rummaging through a drawer, I found an AI-Thinker ESP32-CAM development board — that classic board costing about ten bucks with a built-in OV2640 camera and TF card slot. No reason to let it go to waste, so I built another one: &lt;a href="https://github.com/Mi-Bee-Studio/ai-thinker-esp32-cam"&gt;ai-thinker-esp32-cam&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This time I wrote the firmware from scratch using ESP-IDF again, with similar capabilities to the previous project but with lots of adaptations for the AI-Thinker board. Here&amp;rsquo;s what it ended up doing:&lt;/p&gt;</description></item><item><title>MiBeeNvr: A Lightweight Home NVR System I Built</title><link>/en/posts/iot/mibee-nvr-introduction/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/mibee-nvr-introduction/</guid><description>&lt;p&gt;I have several cameras at home — a few Xiaomi cameras, some DIY ESP32 cameras, and multiple Raspberry Pi CSI cameras. I&amp;rsquo;d been using cloud storage solutions, but I was never comfortable with them: vendor lock-in, network dependency, and the costs add up. So I decided to build my own NVR system, called MiBeeNvr.&lt;/p&gt;
&lt;h2 id="why-build-mibeenvr"&gt;Why Build MiBeeNvr&lt;/h2&gt;
&lt;p&gt;To be honest, I was never satisfied with existing cloud storage solutions. Take Xiaomi cameras, for example. By default, you can only view them through the Mi Home app. Recordings are either stored on an SD card (limited capacity, frequent plugging/unplugging) or in the cloud. Cloud storage costs tens of dollars per month, and there&amp;rsquo;s the privacy concern — you never know when the manufacturer might use your video data for AI training or sell it to third parties. Not to mention vendor lock-in — switching platforms is nearly impossible.&lt;/p&gt;</description></item><item><title>Building a Surveillance Camera with ESP32-S3 — WiFi, TF Card, Video Output Pitfalls</title><link>/en/posts/iot/esp32s3-cam-monitor/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp32s3-cam-monitor/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;We have a few parrots at home, and during the workday nobody&amp;rsquo;s around. I wanted to check in on them anytime. The requirement sounds simple: real-time video streaming, recording to storage, and ideally automatic backup to NAS. Off-the-shelf cameras are either expensive or require installing apps, registering accounts, and binding phone numbers — privacy concerns. I just want to watch my birds, not stream video to someone else&amp;rsquo;s server.&lt;/p&gt;</description></item><item><title>Replacing VMs with ESP32 for Network Probing — esp32-blackbox Project in Action</title><link>/en/posts/iot/esp32-blackbox/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp32-blackbox/</guid><description>&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;I have several LANs in different locations around the city, roughly 10 km apart. To make these networks talk to each other, I used tools like NetBird, ZeroTier, and Cloudflare Tunnel to set up a cross-region virtual LAN.&lt;/p&gt;
&lt;p&gt;The network was set up, but how to ensure stability? After all, these tunnels traverse the public internet with varying link quality. The most direct approach is to use Prometheus&amp;rsquo;s blackbox_exporter for probing — periodic HTTP requests, Pings, DNS queries — feeding results into a time-series database with alert rules, so problems are detected immediately.&lt;/p&gt;</description></item><item><title>Temperature and Humidity Monitoring with ESP01 Board</title><link>/en/posts/iot/esp-01-dht11/</link><pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate><guid>/en/posts/iot/esp-01-dht11/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In IoT applications, temperature and humidity monitoring is a common and important requirement. The ESP01, as a low-cost, low-power WiFi module, provides a convenient solution for implementing temperature and humidity monitoring. This article details how to use the ESP01 board for temperature and humidity monitoring development, including hardware connections, code implementation, and functional analysis.&lt;/p&gt;
&lt;h2 id="hardware-preparation"&gt;Hardware Preparation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ESP01 Board&lt;/strong&gt;: Core control module, responsible for data collection and network communication.
&lt;img src="/posts/iot/images/esp01-dht11-01.jpg" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DHT Temperature and Humidity Sensor&lt;/strong&gt;: Used to measure ambient temperature and humidity.
&lt;img src="/posts/iot/images/esp01-dht11-02.jpg" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dupont Wires&lt;/strong&gt;: Used to connect the ESP01 and DHT sensor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Connect the DHT sensor&amp;rsquo;s VCC pin to the ESP01&amp;rsquo;s 3.3V pin, the GND pin to GND, and the data pin to the designated pin on the ESP01 (defined as &lt;code&gt;DHTPIN&lt;/code&gt; in the code).&lt;/p&gt;</description></item></channel></rss>