<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AIoT.IO.VN</title><link>https://aiot.io.vn/en/</link><description>Recent content on AIoT.IO.VN</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Wed, 14 Oct 2026 05:14:00 +0000</lastBuildDate><atom:link href="https://aiot.io.vn/en/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Configure PPPoE on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/</link><pubDate>Tue, 05 Jan 2021 05:21:39 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;This guide configures PPPoE on OpenWrt after the ISP modem has been placed in bridge mode.&lt;/p&gt;&#10;&lt;p&gt;It covers &lt;strong&gt;PPPoE without a VLAN&lt;/strong&gt;. Use it when your ISP does not require a VLAN, or when the modem can set the &lt;strong&gt;VLAN ID&lt;/strong&gt; in its bridge configuration.&lt;/p&gt;&#10;&lt;p&gt;If the modem has no VLAN field but the PPPoE connection requires one, use &lt;a href="https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/"&gt;the OpenWrt PPPoE with VLAN guide&lt;/a&gt; instead.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;hr /&gt;&#10;&lt;p&gt;&lt;strong&gt;Log in to OpenWrt&lt;/strong&gt; and open &lt;strong&gt;Network&lt;/strong&gt; &amp;gt; &lt;strong&gt;Interfaces&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>How to Configure PPPoE with a VLAN ID on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/</link><pubDate>Wed, 06 Jan 2021 03:49:11 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;In the previous article, I explained &lt;a href="https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-openwrt-quay-pppoe/"&gt;how to configure PPPoE on OpenWrt&lt;/a&gt; when the ISP does not use a VLAN, or when the ISP modem can set the &lt;strong&gt;VLAN&lt;/strong&gt; inside its bridge configuration.&lt;/p&gt;&#10;&lt;p&gt;This guide configures &lt;strong&gt;PPPoE with a VLAN&lt;/strong&gt; directly on OpenWrt. Some ISP modems do not provide a VLAN field in bridge mode even though the PPPoE connection requires one. In that case, the VLAN must be created on OpenWrt. &lt;strong&gt;Your router must support VLANs.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Viettel SDMC NR3053 Teardown</title><link>https://aiot.io.vn/en/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</link><pubDate>Wed, 14 Oct 2026 05:14:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</guid><description/></item><item><title>Viettel SDMC NR3053 Teardown: MediaTek Filogic 820 Platform &amp; Hardware Analysis</title><link>https://aiot.io.vn/en/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</link><pubDate>Wed, 14 Oct 2026 05:14:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/kham-pha-phan-cung-viettel-nr3053/</guid><description>&lt;p&gt;As part of the rollout strategy for next-generation broadband Internet and the &lt;strong&gt;Home WiFi 6&lt;/strong&gt; ecosystem, Vietnamese telco Viettel partnered with leading telecommunications equipment manufacturer &lt;strong&gt;SDMC&lt;/strong&gt; (Shenzhen SDMC Technology Co., Ltd.) to deploy the Wi-Fi Mesh router model &lt;strong&gt;Viettel SDMC NR3053&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;What quickly grabbed the attention of network enthusiasts and hardware tinkerers is its generous internal hardware specifications: a &lt;strong&gt;MediaTek Filogic 820 (MT7981BA)&lt;/strong&gt; processor, &lt;strong&gt;512MB of RAM&lt;/strong&gt;, and &lt;strong&gt;256MB of Flash storage&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Vietnamese Lunar Calendar &amp; Event Countdowns</title><link>https://aiot.io.vn/en/amlich/</link><pubDate>Tue, 13 Oct 2026 20:30:00 +0700</pubDate><guid>https://aiot.io.vn/en/amlich/</guid><description/></item><item><title>Xiaomi AX3000T New Revision Teardown: Qualcomm IPQ5018 Platform &amp; No Custom ROM Support</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</link><pubDate>Tue, 13 Oct 2026 07:00:29 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</guid><description/></item><item><title>Xiaomi AX3000T New Revision Teardown: Qualcomm IPQ5018 Platform &amp; No Custom ROM Support</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</link><pubDate>Tue, 13 Oct 2026 07:00:29 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-ax3000t-ban-qualcomm/</guid><description>&lt;p&gt;The budget-friendly Wi-Fi 6 router &lt;strong&gt;Xiaomi AX3000T&lt;/strong&gt; earned widespread popularity thanks to its initial MediaTek Filogic 820 (MT7981B) platform, which enjoyed extensive community support, easy SSH unlocking, U-Boot Mod, and rich OpenWrt builds. However, in recent production batches, Xiaomi has silently changed the internal hardware architecture to a &lt;strong&gt;Qualcomm&lt;/strong&gt; chipset.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Crucial notice for buyers seeking to flash OpenWrt / Custom ROMs:&lt;/strong&gt;&#10;Official e-commerce listings in China have confirmed that the original MediaTek version is discontinued. All newly shipped units on the market are now the &lt;strong&gt;Qualcomm IPQ5018 version&lt;/strong&gt;. As of now, this Qualcomm variant &lt;strong&gt;cannot be flashed with OpenWrt or third-party custom firmware&lt;/strong&gt; like the MediaTek revision!&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;To verify and analyze this silent hardware overhaul, the unit examined here was acquired second-hand (specifically to ensure that it was indeed the Qualcomm revision).&lt;/p&gt;</description></item><item><title>LG SoundBar SK8 - Reviving a Decade-Old Dolby Atmos Soundbar with Custom Firmware</title><link>https://aiot.io.vn/en/serial/lg-soundbar/lg-soundbar-sk8-hoi-sinh-soundbar-10-nam-tuoi/</link><pubDate>Mon, 28 Sep 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/lg-soundbar/lg-soundbar-sk8-hoi-sinh-soundbar-10-nam-tuoi/</guid><description>&lt;p&gt;Released around 2018, the &lt;strong&gt;LG Soundbar SK8&lt;/strong&gt; was once a flagship Dolby Atmos soundbar celebrated for its 360W output, wireless 5.8GHz subwoofer, and immersive cinema-grade audio. Fast forward nearly a decade, and this capable hardware has largely turned into an abandoned smart device: the &lt;em&gt;LG Music Flow&lt;/em&gt; app has stopped receiving updates, Google Cast 1.36 services have been deprecated, native Apple AirPlay was never supported, standalone Spotify Connect is absent, and local integration with modern smart home systems like OpenHAB or Home Assistant was virtually non-existent.&lt;/p&gt;</description></item><item><title>Wi-Fi Router Fast Roaming Protocols 802.11k, 802.11v, 802.11r Compatibility Database</title><link>https://aiot.io.vn/en/posts/tra-cuu-router-ho-tro-roaming-80211k-v-r/</link><pubDate>Mon, 14 Sep 2026 16:30:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/tra-cuu-router-ho-tro-roaming-80211k-v-r/</guid><description>&lt;p&gt;This article provides a verified compatibility database for Wi-Fi routers supporting fast roaming protocols (&lt;strong&gt;802.11k&lt;/strong&gt;, &lt;strong&gt;802.11v&lt;/strong&gt;, and &lt;strong&gt;802.11r&lt;/strong&gt;). Beyond the raw lookup table, we will break down the real-world mechanics of these standards, clarify the relationship between Mesh networking and seamless roaming, and show how to inspect beacon frames using WinFi on Windows.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; The table below is formatted as plain text for quick lookup. Press &lt;strong&gt;Ctrl + F&lt;/strong&gt; (or use &amp;ldquo;Find in page&amp;rdquo; on mobile browsers) to search directly for your router model.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="i-technical-breakdown-80211k-80211v-and-80211r"&gt;I. Technical Breakdown: 802.11k, 802.11v, and 802.11r&lt;/h2&gt;&#10;&lt;p&gt;When moving through your home or office, your client devices (smartphones, laptops, tablets) need to transition from one Access Point (AP) to another. To ensure this handover occurs without dropping packets or terminating active connections, IEEE defined three complementary roaming standards:&lt;/p&gt;</description></item><item><title>About Me // Engineering Profile</title><link>https://aiot.io.vn/en/about/</link><pubDate>Thu, 10 Sep 2026 08:00:00 +0700</pubDate><guid>https://aiot.io.vn/en/about/</guid><description>&lt;p&gt;Hello! I am &lt;strong&gt;Nghia Nguyen&lt;/strong&gt;, a Software Engineer and Tech Lead passionate about &lt;strong&gt;Distributed Systems Architecture&lt;/strong&gt;, &lt;strong&gt;Golang&lt;/strong&gt;, &lt;strong&gt;Kubernetes&lt;/strong&gt;, and high-performance cloud-native computing.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AIoT.IO.VN&lt;/strong&gt; serves as an open technical ledger where I document real-world engineering experiences, system teardowns, and architecture lessons learned while building platforms serving millions of concurrent users.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="engineering-principles"&gt;Engineering Principles&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Simplicity Over Cleverness&lt;/strong&gt;: Explicit, maintainable, and debuggable code trumps overly clever abstractions.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Data-Driven Performance&lt;/strong&gt;: Never speculate on performance; always measure with benchmarks, pprof traces, and distributed telemetry.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Fail Fast, Recover Faster&lt;/strong&gt;: Hardware and networks fail constantly. Design with fault isolation and automated self-healing boundaries.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="core-technologies"&gt;Core Technologies&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Backend&lt;/strong&gt;: Golang, Python, C++, gRPC, Protobuf, WebSockets&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Databases &amp;amp; Caching&lt;/strong&gt;: PostgreSQL, Redis, ScyllaDB, Elasticsearch&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cloud &amp;amp; DevOps&lt;/strong&gt;: Kubernetes, Docker, Terraform, AWS, Cloudflare, CI/CD&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Streaming &amp;amp; Messaging&lt;/strong&gt;: Apache Kafka, RabbitMQ, NATS&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt;: Prometheus, Grafana, OpenTelemetry, Jaeger&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="connect"&gt;Connect&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com"&gt;github.com&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a href="https://linkedin.com"&gt;linkedin.com&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Twitter / X&lt;/strong&gt;: &lt;a href="https://twitter.com"&gt;twitter.com&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;: &lt;code&gt;contact@example.com&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Stock ROM Archive for Redmi AX5400 Gaming Edition</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax5400-gaming/</link><pubDate>Tue, 08 Sep 2026 16:45:00 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax5400-gaming/</guid><description>&lt;p&gt;This post compiles the direct download links for the official stock firmware of the &lt;strong&gt;Redmi AX5400 Gaming Edition&lt;/strong&gt; (Device Code: &lt;strong&gt;RB04&lt;/strong&gt;).&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;Important Note:&lt;/strong&gt;&#10;Xiaomi has enabled &lt;strong&gt;Secure Boot&lt;/strong&gt; on the Redmi AX5400 Gaming Edition. This means flashing Custom ROMs (like OpenWrt) via SSH or mtd write is &lt;strong&gt;currently impossible&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Redmi AX5400 Gaming Edition Teardown – No 1G Bottleneck</title><link>https://aiot.io.vn/en/serial/disassemble/redmi-ax5400-teardown/</link><pubDate>Tue, 08 Sep 2026 16:24:25 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/redmi-ax5400-teardown/</guid><description>&lt;p&gt;This article shares the internal teardown process of the &lt;strong&gt;Redmi AX5400 Gaming Edition&lt;/strong&gt; router. Before disassembly, the packaging of the Redmi AX5400 looks quite premium:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4251.jpg" alt="Redmi AX5400 Packaging" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Back of the package:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4253.jpg" alt="Back of the package" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;Body and included accessories:&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2022/02/DSC_4256.jpg" alt="Accessories" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Redmi AX5400 Gaming Edition Teardown &amp; Hardware Review</title><link>https://aiot.io.vn/en/serial/disassemble/redmi-ax5400-teardown/</link><pubDate>Tue, 08 Sep 2026 16:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/redmi-ax5400-teardown/</guid><description/></item><item><title>Back Up and Restore OpenWrt Configuration with LuCI and SSH</title><link>https://aiot.io.vn/en/serial/openwrt/backup-restore-config/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/backup-restore-config/</guid><description>&lt;p&gt;I separate two operations that are often both called an “OpenWrt backup.” This guide covers &lt;strong&gt;configuration files&lt;/strong&gt;, not a block-level NOR/NAND image. The goal is to keep an archive that can be carried into an installation or restored after an upgrade.[24]&lt;/p&gt;&#10;&lt;h2 id="scope-and-prerequisites"&gt;Scope and prerequisites&lt;/h2&gt;&#10;&lt;p&gt;I need access to LuCI or SSH/console, plus the ability to manage configuration, packages, services, and logs. Extroot or additional overlay layouts require extra consideration; the official page points block-level work to the Generic backup guide instead.[24]&lt;/p&gt;</description></item><item><title>Build a Docker Host inside a Proxmox VE LXC with TurnKey Core</title><link>https://aiot.io.vn/en/posts/docker-host-proxmox-lxc-i12bretro-595/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/posts/docker-host-proxmox-lxc-i12bretro-595/</guid><description>&lt;p&gt;i12bretro tutorial 0595 places a Docker host inside a Proxmox VE Linux container (CT) using the &lt;strong&gt;TurnKey Core&lt;/strong&gt; template. It downloads the template, creates a CT named Docker with 2048 MB RAM, updates the OS, installs Docker, and optionally adds Portainer.[10]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/q98XUBf2YO4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;This is the original tutorial video.[15]&lt;/p&gt;&#10;&lt;h2 id="1-create-the-container"&gt;1. Create the container&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Proxmox VE web UI.[10]&lt;/li&gt;&#10;&lt;li&gt;Select a left-panel storage that permits Container templates.[10]&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;CT Templates&lt;/strong&gt; in the sub-navigation.[10]&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Templates&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Search for &lt;code&gt;core&lt;/code&gt;, select &lt;strong&gt;TurnKey Core&lt;/strong&gt;, and click &lt;strong&gt;Download&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Wait for the download to finish and close the download dialog.[10]&lt;/li&gt;&#10;&lt;li&gt;Right-click the Proxmox node and choose &lt;strong&gt;Create CT&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Set Hostname to &lt;code&gt;Docker&lt;/code&gt;, enter and confirm a password locally, then click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Select the storage holding the template and choose the TurnKey Core template, then click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Select the storage that will hold the container, then click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;CPU&lt;/strong&gt;, keep the defaults and click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Memory&lt;/strong&gt;, set Memory to &lt;code&gt;2048&lt;/code&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Network&lt;/strong&gt;, keep the defaults; configure a static IP from the router if needed, then click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;DNS&lt;/strong&gt;, keep the defaults and click &lt;strong&gt;Next&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Review the summary and click &lt;strong&gt;Finish&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;When creation completes, close the download dialog if it remains open.[10]&lt;/li&gt;&#10;&lt;li&gt;Right-click the Docker LXC in the left navigation and choose &lt;strong&gt;Start&lt;/strong&gt;.[10]&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Console&lt;/strong&gt; in the sub-navigation.[10]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Enter the CT password during creation; use a unique password and do not store it in a file or script.[10]&lt;/p&gt;</description></item><item><title>DNS over TLS on OpenWrt with Unbound: Configuration and Leak Checks</title><link>https://aiot.io.vn/en/serial/openwrt/dns-over-tls-unbound/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/dns-over-tls-unbound/</guid><description>&lt;p&gt;The goal here is to send DNS from the router to upstream resolvers through DNS over TLS (DoT) with Unbound. I decide first whether dnsmasq will give up its DNS role or keep port 53 and forward to Unbound; the two models use different configuration blocks.[27]&lt;/p&gt;&#10;&lt;h2 id="goals-and-prerequisites"&gt;Goals and prerequisites&lt;/h2&gt;&#10;&lt;p&gt;The OpenWrt page describes DoT for encrypted DNS, reduced DNS leak/hijacking exposure, and optional public providers. I need LuCI or SSH access, package/service/log administration, and a console fallback in case a DNS change breaks resolution.[27]&lt;/p&gt;</description></item><item><title>LuCI Essentials on OpenWrt: Installation, HTTPS, Alternate Ports, and Offline Setup</title><link>https://aiot.io.vn/en/serial/openwrt/luci-essentials/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/luci-essentials/</guid><description>&lt;p&gt;LuCI is the web interface for many OpenWrt administration tasks. Stable releases usually include it, while snapshots may need an extra install; a device with only 4 MB flash or 32 MB RAM may not have room for the full package. In that situation I select an image with LuCI included or build a smaller image instead of filling flash blindly.[28]&lt;/p&gt;&#10;&lt;h2 id="1-use-firmware-selector"&gt;1. Use Firmware Selector&lt;/h2&gt;&#10;&lt;p&gt;Open:[28]&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;https://firmware-selector.openwrt.org/?version=SNAPSHOT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the exact device, click the small arrow beside &lt;strong&gt;Customize installed packages and/or first boot script&lt;/strong&gt;, then:[28]&lt;/p&gt;</description></item><item><title>Run an OpenWrt x86 VM on Proxmox VE: i12bretro Tutorial Adaptation</title><link>https://aiot.io.vn/en/posts/openwrt-vm-proxmox-i12bretro-405/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/posts/openwrt-vm-proxmox-i12bretro-405/</guid><description>&lt;p&gt;i12bretro tutorial 0405 builds an OpenWrt x86 VM on Proxmox VE. I keep the example values—VM ID &lt;code&gt;123&lt;/code&gt;, storage &lt;code&gt;HDD_500GB&lt;/code&gt;, and LAN IP &lt;code&gt;10.10.27.151&lt;/code&gt;—so the original sequence remains reproducible; replace them with values from the local infrastructure.[9]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/_fh7tnQW034" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The original video demonstrates the same process on YouTube.[14]&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;I need the Proxmox web UI at &lt;code&gt;https://ProxMoxDNSorIP:8006/&lt;/code&gt;, permission to open the node Shell, storage for the imported disk, and a LAN addressing plan. The OpenWrt root password is entered interactively at the console rather than stored in a file.[9]&lt;/p&gt;</description></item><item><title>Run Healthchecks in Docker: Monitor Cron Jobs with HTTP Pings</title><link>https://aiot.io.vn/en/posts/healthchecks-docker-i12bretro-813/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/posts/healthchecks-docker-i12bretro-813/</guid><description>&lt;p&gt;Healthchecks receives HTTP requests or email “pings” from cron jobs and alerts when a ping is late. Tutorial 0813 runs Healthchecks with PostgreSQL in Docker, then creates an administrator account on port 8000.[12]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/4l57CgiHKRI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The original i12bretro video remains on YouTube.[17]&lt;/p&gt;&#10;&lt;h2 id="1-install-docker"&gt;1. Install Docker&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Linux device.[12]&lt;/li&gt;&#10;&lt;li&gt;Run:[12]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reauthenticate after the Docker group change and check the daemon.[12]&lt;/p&gt;</description></item><item><title>Run HostMon in Docker: A HomeLab Host Monitor and Dashboard</title><link>https://aiot.io.vn/en/posts/hostmon-docker-i12bretro-706/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/posts/hostmon-docker-i12bretro-706/</guid><description>&lt;p&gt;HostMon is a small web dashboard for monitoring hosts and services in a HomeLab. i12bretro tutorial 0706 describes real-time ping, Wake-on-LAN, an SSH client, and a link to Apache Guacamole; the application is written in JavaScript and uses SQLite.[11]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/DvPxP8y65Qs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The original tutorial video is available on YouTube.[16]&lt;/p&gt;&#10;&lt;h2 id="1-install-docker-on-the-linux-host"&gt;1. Install Docker on the Linux host&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Linux device.[11]&lt;/li&gt;&#10;&lt;li&gt;Open a terminal and run:[11]&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After reauthenticating, check &lt;code&gt;docker version&lt;/code&gt;/&lt;code&gt;docker ps&lt;/code&gt; before starting HostMon.[11]&lt;/p&gt;</description></item><item><title>Run PhotoPrism in Docker with MariaDB and Persistent Photo Storage</title><link>https://aiot.io.vn/en/posts/photoprism-docker-i12bretro-902/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/posts/photoprism-docker-i12bretro-902/</guid><description>&lt;p&gt;PhotoPrism is a photo application that can tag and find pictures automatically and can run at home, on a private server, or in the cloud.[13]&#10;i12bretro tutorial 0902 runs PhotoPrism with MariaDB in Docker, persists &lt;code&gt;storage&lt;/code&gt; and &lt;code&gt;originals&lt;/code&gt; on the host, and exposes the web UI on port 2342.[13]&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/R2T89oz0jTA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The original tutorial video is linked on YouTube.[13]&lt;/p&gt;</description></item><item><title>Samba File Sharing on OpenWrt: Configuration, Firewall, and Troubleshooting</title><link>https://aiot.io.vn/en/serial/openwrt/samba-network-share/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/samba-network-share/</guid><description>&lt;p&gt;Samba on OpenWrt is useful when I want to share a mounted HDD, SSD, or flash drive with Windows, Linux, or macOS clients on the LAN. OpenWrt also offers &lt;code&gt;ksmbd&lt;/code&gt;, a lower-resource SMBv3 kernel server with fewer features; this article follows the official &lt;code&gt;luci-app-samba4&lt;/code&gt; path.[26]&lt;/p&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;The USB/eSATA drive must already have its driver, filesystem, and mount point. A common package set is:[26]&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;USB drivers: kmod-usb3 kmod-usb-storage-uas usbutils block-mount mount-utils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Filesystems: kmod-fs-ext4 e2fsprogs kmod-fs-exfat exfat-fsck kmod-fs-ntfs3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Drive idle: luci-app-hd-idle&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In LuCI, mount the drive under &lt;strong&gt;System → Mount Points&lt;/strong&gt;, enable the entry, click &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt;, and use &lt;strong&gt;Generate Config&lt;/strong&gt; if needed. Record the mount point, for example &lt;code&gt;/dev/sda1&lt;/code&gt; becoming &lt;code&gt;/mnt/sda1&lt;/code&gt;. The source recommends at least 128 MB RAM; lower-memory machines may need another 128–256 MB of swap.[26]&lt;/p&gt;</description></item><item><title>Using a USB Storage Device with OpenWrt: Drivers, Partitions, and Automount</title><link>https://aiot.io.vn/en/serial/openwrt/usb-storage-devices/</link><pubDate>Tue, 01 Sep 2026 18:13:55 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/usb-storage-devices/</guid><description>&lt;p&gt;I use OpenWrt&amp;rsquo;s USB storage page when I need an HDD, SSD, or flash drive for data, Samba/NAS, or a general file store. If the goal is extending the overlay to install more packages, this is not the whole extroot procedure; I keep the two goals separate.[25]&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Formatting deletes data from the partition. Before running &lt;code&gt;mkfs.*&lt;/code&gt;, confirm the correct &lt;code&gt;/dev/sda1&lt;/code&gt; or equivalent device and keep a separate backup.[25]&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="1-install-and-verify-usb-drivers"&gt;1. Install and verify USB drivers&lt;/h2&gt;&#10;&lt;p&gt;Refresh package indexes, install storage support, and add UAS if the device needs it:[25]&lt;/p&gt;</description></item><item><title>Add Storage to Proxmox VE: Local ZFS and a CIFS ISO Share</title><link>https://aiot.io.vn/en/posts/proxmox-storage-zfs-cifs-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/posts/proxmox-storage-zfs-cifs-i12bretro/</guid><description>&lt;p&gt;This tutorial has two storage branches: create local ZFS from a disk installed in Proxmox, then create a Windows share and register it as CIFS in Datacenter. The steps below follow the original order; replace the example server, share, user, and password with values from your system.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/hkrFZoiYX_0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-local-storage-zfs-single-disk-steps-110"&gt;1. Local storage: ZFS Single Disk (steps 1–10)&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install the physical disk in the Proxmox server hardware.&lt;/li&gt;&#10;&lt;li&gt;Power on the Proxmox server.&lt;/li&gt;&#10;&lt;li&gt;Open a browser and navigate to the Proxmox web UI.&lt;/li&gt;&#10;&lt;li&gt;Log in.&lt;/li&gt;&#10;&lt;li&gt;Click the node with the new disk in the left navigation menu.&lt;/li&gt;&#10;&lt;li&gt;Expand &lt;strong&gt;Disks → ZFS&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Create ZFS&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Give the ZFS storage a name and set &lt;strong&gt;Raid Level = Single Disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the new disk from the drive list and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;The new disk is now available for storing VMs in the tutorial&amp;rsquo;s flow.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Single Disk has no redundancy.&lt;/strong&gt; If the disk fails, this ZFS pool is not a backup; choose another layout when fault tolerance is required.&lt;/p&gt;</description></item><item><title>Connect 2G/3G/4G/5G Modems to OpenWrt with ModemManager</title><link>https://aiot.io.vn/en/serial/openwrt/modemmanager-wwan/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/modemmanager-wwan/</guid><description>&lt;p&gt;ModemManager is a service that sets up and connects 2G/3G/4G/5G modems while presenting their differences through a common abstraction. The OpenWrt documentation lists modem initialization, Internet access, SMS, and firmware upgrades for selected QMI modems as examples of its capabilities.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;p&gt;This article uses the source&amp;rsquo;s example APN and sysfs path. The &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, and &lt;code&gt;pincode&lt;/code&gt; values below are safe placeholders; replace them locally and never put SIM credentials in Git.&lt;/p&gt;</description></item><item><title>Controlled Docker Image Updates with Watchtower: Preview, Cleanup, and Stopped Containers</title><link>https://aiot.io.vn/en/posts/watchtower-docker-update-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/posts/watchtower-docker-update-i12bretro/</guid><description>&lt;p&gt;Watchtower monitors Docker containers for changes to their source images and can restart them with a newer image. The i12bretro tutorial separates preview, update, and cleanup; Review the changes before enabling an automated update command.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ZCTHCB5liiU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-pull-the-watchtower-image"&gt;1. Pull the Watchtower image&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 1/10:&lt;/strong&gt; Log into the Docker host.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 2/10:&lt;/strong&gt; Pull the image:&lt;/p&gt;</description></item><item><title>Expand OpenWrt Overlay with Extroot: USB, ext4, and Recovery Paths</title><link>https://aiot.io.vn/en/serial/openwrt/extroot-configuration/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/extroot-configuration/</guid><description>&lt;p&gt;&lt;code&gt;extroot&lt;/code&gt; uses external storage as a writable overlay, giving OpenWrt room for packages and persistent data without replacing the router&amp;rsquo;s internal flash. This article follows the OpenWrt documentation from device discovery and partitioning through the post-reboot checks, recovery paths, and advanced options.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; This procedure touches partitions and filesystems. Back up the configuration, identify the correct &lt;code&gt;/dev/sdX&lt;/code&gt;, and treat the &lt;code&gt;parted&lt;/code&gt; example below as a destructive command. Never run it unchanged on a disk containing data.&lt;/p&gt;</description></item><item><title>OpenWrt 25.12+: Use apk Instead of opkg Without Bricking the Router</title><link>https://aiot.io.vn/en/serial/openwrt/apk-package-manager/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/apk-package-manager/</guid><description>&lt;p&gt;From OpenWrt 25.12, the package manager is &lt;strong&gt;apk version 3&lt;/strong&gt;; &lt;code&gt;opkg&lt;/code&gt; has ended development and is no longer the primary choice on the new release. This &lt;code&gt;apk&lt;/code&gt; is Alpine Package Keeper, not an Android APK.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Start with the release check:&lt;/strong&gt; this guide targets OpenWrt 25.12 and newer. If the firmware still uses &lt;code&gt;opkg&lt;/code&gt;, follow that release&amp;rsquo;s documentation and do not mix package managers or repositories.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apk --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-basic-commands"&gt;1. Basic commands&lt;/h2&gt;&#10;&lt;p&gt;The OpenWrt documentation lists these core commands:&lt;/p&gt;</description></item><item><title>OpenWrt Wi‑Fi Repeater with relayd: LuCI, CLI, IPv6, and Recovery</title><link>https://aiot.io.vn/en/serial/openwrt/relayd-wifi-repeater/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/relayd-wifi-repeater/</guid><description>&lt;p&gt;&lt;code&gt;relayd&lt;/code&gt; is a last-resort way to turn an OpenWrt router into a Wi‑Fi extender when the main router does not run OpenWrt or does not support WDS/802.11s as needed. One radio provides a wireless uplink and another radio provides an AP for local clients; the &lt;code&gt;relayd&lt;/code&gt; package provides bridge-like forwarding between the two sides.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;p&gt;The source&amp;rsquo;s example topology is:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The main router is &lt;code&gt;192.168.1.1/24&lt;/code&gt;, with LAN serving clients and WAN reaching the Internet.&lt;/li&gt;&#10;&lt;li&gt;The extender has a separate management subnet, &lt;code&gt;192.168.2.0/24&lt;/code&gt;, for example LAN &lt;code&gt;192.168.2.1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The &lt;code&gt;wwan&lt;/code&gt; interface connects wirelessly to the main router.&lt;/li&gt;&#10;&lt;li&gt;Clients behind the relay receive DHCP from the main network, while &lt;code&gt;192.168.2.1&lt;/code&gt; is used only to manage the extender.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The two subnets must be different. &lt;code&gt;relayd&lt;/code&gt; is not a complete Layer 2 bridge and usually handles IPv4 only; DHCP, mDNS, and upstream performance may not behave like a wired bridge. When I control both devices, WDS or 802.11s remains the preferred choice.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Pass a Physical Disk Through to a Proxmox VM with /dev/disk/by-id</title><link>https://aiot.io.vn/en/posts/proxmox-physical-disk-passthrough-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/posts/proxmox-physical-disk-passthrough-i12bretro/</guid><description>&lt;p&gt;Passing a physical disk through lets a guest see a real drive rather than a virtual disk. The i12bretro tutorial has exactly &lt;strong&gt;five steps&lt;/strong&gt;; step three contains the &lt;code&gt;DEVICE-ID(S)&lt;/code&gt; lookup and &lt;code&gt;qm set&lt;/code&gt; command. Replace the identifiers and placeholders with values from the actual system.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ASwS8hZP5fE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-open-the-proxmox-web-shell"&gt;1. Open the Proxmox web shell&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 1/5:&lt;/strong&gt; Log into Proxmox VE at the console or web UI and launch the web shell.&lt;/p&gt;</description></item><item><title>Run Mattermost in Docker: Compose, PostgreSQL, and Workspace Initialization</title><link>https://aiot.io.vn/en/posts/mattermost-docker-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/posts/mattermost-docker-i12bretro/</guid><description>&lt;p&gt;Mattermost is a self-hosted collaboration platform. The i12bretro tutorial uses the official Docker repository, an &lt;code&gt;.env&lt;/code&gt; file, PostgreSQL, and a compose profile without Nginx; Use a private password instead of the sample value.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/kdYCCozEyrY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-install-docker-on-linux"&gt;1. Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 1/12:&lt;/strong&gt; Log into the Linux device.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 2/12:&lt;/strong&gt; Install the prerequisites and Docker:&lt;/p&gt;</description></item><item><title>Self-Host LimeSurvey CE in Docker: MariaDB, Persistent Data, and Port 8080</title><link>https://aiot.io.vn/en/posts/limesurvey-docker-i12bretro/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/posts/limesurvey-docker-i12bretro/</guid><description>&lt;p&gt;LimeSurvey CE is an open-source survey platform. The i12bretro tutorial runs MariaDB and LimeSurvey on one Docker network, persists survey uploads on the host, and exposes the administration page on port 8080. Use a private password instead of the sample value.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/BWJ7c4uGfac" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-install-docker-on-the-linux-host"&gt;1. Install Docker on the Linux host&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 1/5:&lt;/strong&gt; Log into the Linux host and run the Docker installation sequence in a terminal:&lt;/p&gt;</description></item><item><title>Static Routes on OpenWrt: IPv4, IPv6, and netifd Routing Tables</title><link>https://aiot.io.vn/en/serial/openwrt/static-routes-netifd/</link><pubDate>Mon, 31 Aug 2026 18:19:54 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/static-routes-netifd/</guid><description>&lt;p&gt;&lt;code&gt;netifd&lt;/code&gt; lets OpenWrt define static IP routes in &lt;code&gt;/etc/config/network&lt;/code&gt;. Unlike a temporary &lt;code&gt;ip route add&lt;/code&gt;, a &lt;code&gt;route&lt;/code&gt; or &lt;code&gt;route6&lt;/code&gt; section is managed by UCI and can be reloaded with its interface.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; This is about static routes, not dynamic routing protocols. Before applying a route, know which interface reaches the next hop and keep a console or SSH recovery path in case management traffic loses its return route.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="1-basic-ipv4-routes"&gt;1. Basic IPv4 routes&lt;/h2&gt;&#10;&lt;p&gt;An IPv4 route is a &lt;code&gt;route&lt;/code&gt; section attached to a logical interface. The source&amp;rsquo;s minimal example is:&lt;/p&gt;</description></item><item><title>802.11s mesh on OpenWrt: wpad preparation, configuration, and peer checks</title><link>https://aiot.io.vn/en/serial/openwrt/80211s-mesh-peer-checks/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/80211s-mesh-peer-checks/</guid><description>&lt;p&gt;802.11s is a Layer 2 mesh: nodes can see one another as if they were connected to one switch, while DHCP, routing, or Batman/OLSR sits above it. I check the driver and wpad first; a mesh interface alone does not mean every radio supports mesh point mode.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="prerequisites-and-limits"&gt;Prerequisites and limits&lt;/h2&gt;&#10;&lt;p&gt;The source records reliable operation with OpenWrt 19.07 and later when the hardware/driver supports it and &lt;code&gt;wpad-mesh-openssl&lt;/code&gt; (or an equivalent) is installed. It also records an ARP relay issue in 19.07.4 that made Mesh Points reliable only within range of a Mesh Portal. I therefore verify the release and topology before production use.&lt;/p&gt;</description></item><item><title>Build a WireGuard server on OpenWrt with UCI and verify the tunnel</title><link>https://aiot.io.vn/en/serial/openwrt/wireguard-server-uci/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/wireguard-server-uci/</guid><description>&lt;p&gt;A WireGuard server on OpenWrt has three boundaries: server/client keys, the firewall rule for the UDP listen port, and the VPN interface&amp;rsquo;s firewall zone. Generate private keys, PSKs, and passwords locally; never store them in Markdown.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="goals-and-assumptions"&gt;Goals and assumptions&lt;/h2&gt;&#10;&lt;p&gt;The source targets encrypted VPN access, remote LAN services, split/full tunnel operation, and client-side leak prevention. I assume a working WAN, a client that can generate keys, and a UDP port forward to &lt;code&gt;VPN_PORT&lt;/code&gt; if the router is behind another modem. This is not a substitute for the WireGuard client/extras pages.&lt;/p&gt;</description></item><item><title>Disable the Proxmox enterprise repository and subscription notice</title><link>https://aiot.io.vn/en/posts/proxmox-community-repository-subscription-notice/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/posts/proxmox-community-repository-subscription-notice/</guid><description>&lt;p&gt;A Proxmox VE installation may point at the enterprise repository and display a subscription notice. This i12bretro tutorial switches to &lt;code&gt;pve-no-subscription&lt;/code&gt; and provides separate notice-edit branches for Proxmox 6, 7, 8, and 9. Each branch targets a different release; choose the one that matches the installed version.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/1liGVX6oSrE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Log in to Proxmox VE at the console or root web shell. This changes package repositories and Proxmox Perl/JavaScript files, so I record &lt;code&gt;pveversion --verbose&lt;/code&gt;, keep the console available, and retain the &lt;code&gt;.bak&lt;/code&gt; files for rollback. Use the community repository only with a clear understanding of support and licensing.&lt;/p&gt;</description></item><item><title>Homepage dashboard in Docker: collect HomeLab services on port 8006</title><link>https://aiot.io.vn/en/posts/homepage-application-dashboard-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/posts/homepage-application-dashboard-docker/</guid><description>&lt;p&gt;Homepage is a fast, static, customizable dashboard for collecting HomeLab services. The i12bretro tutorial uses Docker, stores configuration under &lt;code&gt;~/homepage&lt;/code&gt;, and mounts the Docker socket so Homepage can discover containers through labels.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/BzjL3tZ-NQs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log in to the Linux Docker host and run:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="run-homepage"&gt;Run Homepage&lt;/h2&gt;&#10;&lt;p&gt;The source first checks the UID/GID, creates the configuration directory, and runs the container. Check the UID/GID of the user that will run the container, then set PUID/PGID:&lt;/p&gt;</description></item><item><title>IPv6 configuration on OpenWrt: WAN, prefix delegation, RA, and relay</title><link>https://aiot.io.vn/en/serial/openwrt/ipv6-wan-prefix-ra-relay/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/ipv6-wan-prefix-ra-relay/</guid><description>&lt;p&gt;IPv6 on OpenWrt has two halves: receiving an address/prefix upstream and distributing a prefix downstream to LAN. I do not treat a single checkbox as a finished configuration; I identify whether the ISP uses native DHCPv6, PPPoE, static addressing, relay, or a tunnel, then test RA, DHCPv6, routes, and source policy.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="compliance-and-general-features"&gt;Compliance and general features&lt;/h2&gt;&#10;&lt;p&gt;The default firmware commonly includes &lt;code&gt;odhcp6c&lt;/code&gt; as the DHCPv6 client, &lt;code&gt;odhcpd&lt;/code&gt; as the RA/DHCPv6 server, and IPv6 firewall support; LuCI needs &lt;code&gt;luci-proto-ipv6&lt;/code&gt;. A custom image must include the corresponding packages. The source aims at RFC 7084 but lists known gaps, so I test the actual behavior instead of treating the RFC target as an absolute guarantee.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>OpenWrt failsafe and factory reset: recover configuration before wiping it</title><link>https://aiot.io.vn/en/serial/openwrt/failsafe-factory-reset-recovery/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/failsafe-factory-reset-recovery/</guid><description>&lt;p&gt;When OpenWrt becomes unreachable after a network or firewall change, I do not jump straight to a factory reset. Failsafe boots a minimal state so I can repair &lt;code&gt;/etc/config&lt;/code&gt;, while a factory reset removes the overlay and installed packages. Recovery/re-flashing is a separate path controlled by the device bootloader.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="check-the-prerequisites"&gt;Check the prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Failsafe is useful with a SquashFS image that has a read-only root and a separate overlay. It cannot repair failed hardware or a broken kernel. x86 builds using an ext4 read-write rootfs do not reset this way. First check:&lt;/p&gt;</description></item><item><title>PBR with netifd on OpenWrt: split VPN, WAN, and exception routes</title><link>https://aiot.io.vn/en/serial/openwrt/pbr-netifd-routing/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/pbr-netifd-routing/</guid><description>&lt;p&gt;I use &lt;code&gt;netifd&lt;/code&gt; to separate routing decisions instead of piling several default routes into one table. The official guide covers both IPv4 and IPv6, so this adaptation keeps every meaningful scenario rather than reducing it to one generic VPN configuration.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="scope-and-limits"&gt;Scope and limits&lt;/h2&gt;&#10;&lt;p&gt;PBR selects a path from administrator-defined policies. With &lt;code&gt;pbr_netifd&lt;/code&gt;, each interface receives its own routing table and rules with explicit priorities select the table for matching traffic. This is suitable for interfaces, subnets, IP addresses, and ports; domain matching belongs in PBR app. &lt;code&gt;mwan3&lt;/code&gt; is for multi-WAN load balancing or failover, not a direct replacement for the individual rules below.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Pi.Alert in Docker: detect unknown devices on the LAN</title><link>https://aiot.io.vn/en/posts/pialert-network-intrusion-monitor-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/posts/pialert-network-intrusion-monitor-docker/</guid><description>&lt;p&gt;Pi.Alert monitors Wi-Fi/LAN devices and can alert on unknown devices or devices that should remain online. I run it on a Linux Docker host with host networking so it can observe the local network; that also requires a trust boundary and the UI should not be exposed directly to the Internet.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/qpDptKzTepc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;Log in to the Linux device and run the source block:&lt;/p&gt;</description></item><item><title>Self-host Mastodon with Docker: PostgreSQL, Redis, SSL, and Nginx</title><link>https://aiot.io.vn/en/posts/mastodon-federated-social-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/posts/mastodon-federated-social-docker/</guid><description>&lt;p&gt;Mastodon is federated, so this tutorial is more than one Docker container: it needs a stable domain, PostgreSQL, Redis, secrets, VAPID, streaming, Sidekiq, and an HTTPS reverse proxy. &lt;code&gt;LOCAL_DOMAIN&lt;/code&gt; should not be changed casually after the instance is in use.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/_K5la-WchuY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="1-domain-and-docker-prerequisites"&gt;1. Domain and Docker prerequisites&lt;/h2&gt;&#10;&lt;p&gt;The Certbot host must be reachable from the Internet on port 80 or 443 for Let&amp;rsquo;s Encrypt validation. In a HomeLab I forward port 80 to the host during the handshake, verify DNS, and stop any web server already using port 80.&lt;/p&gt;</description></item><item><title>VSCodium in Docker: a web IDE for the HomeLab on port 8003</title><link>https://aiot.io.vn/en/posts/vscodium-web-ide-docker/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/posts/vscodium-web-ide-docker/</guid><description>&lt;p&gt;VSCodium is a community build of Visual Studio Code intended to provide binaries without Microsoft&amp;rsquo;s telemetry/tracking. The i12bretro tutorial runs the LinuxServer image in Docker, persists &lt;code&gt;config&lt;/code&gt; and &lt;code&gt;code&lt;/code&gt; on the host, and exposes the IDE on port 8003.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/dJgh13kYmoI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log in to the Linux Docker host:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="run-vscodium"&gt;Run VSCodium&lt;/h2&gt;&#10;&lt;p&gt;Check UID/GID, create persistent directories, and start the container. Check the UID/GID of the user that will run the container, then set PUID/PGID:&lt;/p&gt;</description></item><item><title>ZTE Starry MAX and BE3600Pro+: wired mesh first, wireless mesh second</title><link>https://aiot.io.vn/en/serial/zte-starry-max-be3600pro-mesh/</link><pubDate>Sun, 30 Aug 2026 18:38:31 +0000</pubDate><guid>https://aiot.io.vn/en/serial/zte-starry-max-be3600pro-mesh/</guid><description>&lt;p&gt;This ACWiFi article answers a practical question: can the ZTE Starry MAX mesh with the Starry BE3600Pro+ kit? I classify it as a serial/network guide rather than a teardown; it also has a different purpose from the BE3600Pro+ hardware article already on the blog.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="build-the-wired-mesh"&gt;Build the wired mesh&lt;/h2&gt;&#10;&lt;p&gt;If the BE3600Pro+ is fresh from the box, connect a LAN port on the Starry MAX, acting as the main router, to the WAN port of the node with Ethernet. The system should create a wired mesh automatically. In the ZTE Smart Life app, open &lt;strong&gt;组网管理&lt;/strong&gt; and confirm that the method &lt;strong&gt;有线&lt;/strong&gt; is shown.&lt;/p&gt;</description></item><item><title>Connect OpenWrt to another Wi‑Fi network as a routed client</title><link>https://aiot.io.vn/en/serial/openwrt/client-wifi-routed/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/client-wifi-routed/</guid><description>&lt;p&gt;This guide turns OpenWrt into a &lt;strong&gt;routed Wi‑Fi client&lt;/strong&gt;: an OpenWrt radio joins an upstream network, the &lt;code&gt;wwan&lt;/code&gt; interface receives DHCP, and the downstream LAN uses a different subnet and NAT. This is not a bridged AP design; use the source&amp;rsquo;s WDS or relayd guides when both sides must share one subnet.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Do not connect the OpenWrt router to the main router while changing its LAN address. Reset to OpenWrt defaults when necessary, configure through a LAN port, and keep a direct recovery path for any change that removes LuCI access.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Firewall4 and /etc/config/firewall on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/firewall4-etc-config-firewall/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/firewall4-etc-config-firewall/</guid><description>&lt;p&gt;From OpenWrt 22.03 onward, firewall4 (&lt;code&gt;fw4&lt;/code&gt;) uses nftables as its default backend while retaining the familiar UCI syntax in &lt;code&gt;/etc/config/firewall&lt;/code&gt;. UCI covers a reasonable subset of Netfilter; special nftables behavior should use the include mechanisms instead of forcing everything into one &lt;code&gt;config rule&lt;/code&gt;.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Back up &lt;code&gt;/etc/config/firewall&lt;/code&gt; before editing. Double-check the result before reloading; if access is lost, use Failsafe to restore it. Never expose an Internet port just because a rule looks plausible.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Installing OpenWrt: four methods and the recovery boundary</title><link>https://aiot.io.vn/en/serial/openwrt/install-openwrt-methods/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/install-openwrt-methods/</guid><description>&lt;p&gt;OpenWrt installation is &lt;strong&gt;device-specific&lt;/strong&gt;. The generic page is a map of technical paths, not a universal flashing recipe; before writing anything, open the correct device page in the Table of Hardware and never reuse another router&amp;rsquo;s IP, filename, or command.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; These operations can damage firmware or hardware. If installation fails, move to the model-specific debrick/recovery documentation. Do not overwrite or alter the bootloader unless the device page explicitly says to do so.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Prepare TFTP recovery over Ethernet for OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/tftp-recovery-ethernet/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/tftp-recovery-ethernet/</guid><description>&lt;p&gt;TFTP recovery over Ethernet is only the &lt;strong&gt;host preparation&lt;/strong&gt; part. The router&amp;rsquo;s bootloader decides the IP address, filename, button, port, and flash procedure; not every model supports TFTP. The OpenWrt page describes two directions: the router can run a TFTP client and download from the computer, or the router can run a TFTP server and receive an upload. This guide prepares the TFTP host and does not invent a model-specific trigger.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Run Actual Budget in Docker</title><link>https://aiot.io.vn/en/posts/actual-budget-docker-i12bretro-969/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/posts/actual-budget-docker-i12bretro-969/</guid><description>&lt;p&gt;Actual Budget is a local-first finance tool written in NodeJS, with synchronization between devices. This procedure runs the server in Docker, stores &lt;code&gt;config.json&lt;/code&gt; and data separately, and creates an administrator password through the web interface.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/LOsnghXY3uU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux with &lt;code&gt;sudo&lt;/code&gt; access and run:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates git curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;apt-key&lt;/code&gt; is deprecated on current distributions; compare the command with the current Docker documentation before using the older form.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Run MeshCentral for remote computer management in Docker</title><link>https://aiot.io.vn/en/posts/meshcentral-docker-i12bretro-963/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/posts/meshcentral-docker-i12bretro-963/</guid><description>&lt;p&gt;MeshCentral is a self-hosted web site for managing and controlling computers on a LAN or over the Internet. This adaptation keeps the i12bretro order: one MongoDB container, one MeshCentral container, separated data directories, and HTTPS on port 8086.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/V94q02P1zwM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux with &lt;code&gt;sudo&lt;/code&gt; access and run the source command set:&lt;/p&gt;</description></item><item><title>Run MkDocs in Docker and switch to the Read the Docs theme</title><link>https://aiot.io.vn/en/posts/mkdocs-docker-i12bretro-986/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/posts/mkdocs-docker-i12bretro-986/</guid><description>&lt;p&gt;MkDocs is a static site generator that uses Markdown and one YAML configuration file to build project documentation. This guide runs the &lt;code&gt;polinux/mkdocs&lt;/code&gt; image, stores the project under &lt;code&gt;~/docker/mkdocs&lt;/code&gt;, then stops the container to switch &lt;code&gt;mkdocs.yml&lt;/code&gt; to the &lt;code&gt;readthedocs&lt;/code&gt; theme.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/Fnx8w_uqyuM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;Log into the Linux device and run:&lt;/p&gt;</description></item><item><title>Run OctoPrint in Docker with a USB printer device</title><link>https://aiot.io.vn/en/posts/octoprint-docker-i12bretro-990/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/posts/octoprint-docker-i12bretro-990/</guid><description>&lt;p&gt;OctoPrint provides a web UI for controlling a 3D printer. This guide runs the container with data under &lt;code&gt;~/docker/octoprint&lt;/code&gt;, passes through &lt;code&gt;/dev/ttyACM0&lt;/code&gt;, and exposes the web UI on port 8041.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/Q0b6gNJlZ2g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux and run:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the current Docker documentation if the distribution has removed &lt;code&gt;apt-key&lt;/code&gt;.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Run the Dashy dashboard in Docker</title><link>https://aiot.io.vn/en/posts/dashy-docker-i12bretro-992/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/posts/dashy-docker-i12bretro-992/</guid><description>&lt;p&gt;Dashy is a self-hosted personal dashboard with status checking, widgets, themes, icon packs, and a UI editor. This guide uses &lt;code&gt;lissy93/dashy:latest&lt;/code&gt;, binds the &lt;code&gt;user-data&lt;/code&gt; directory, and exposes the dashboard on port 8080.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/GfuTdFSh1xc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log into the Linux Docker host and run:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install prerequisites&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker gpg key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add docker software repository&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# install docker&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable and start docker service&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# add the current user to the docker group&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# reauthenticate for the new group membership to take effect&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the current distribution no longer supports &lt;code&gt;apt-key&lt;/code&gt;, use the current Docker documentation instead of ignoring the warning.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>VLAN on OpenWrt: swconfig, driver VLANs, and DSA</title><link>https://aiot.io.vn/en/serial/openwrt/vlan-swconfig-dsa-guide/</link><pubDate>Sat, 29 Aug 2026 18:30:50 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/vlan-swconfig-dsa-guide/</guid><description>&lt;p&gt;VLANs on OpenWrt are not just a matter of adding &lt;code&gt;.106&lt;/code&gt; to an interface name. First identify whether the device uses a legacy hardware switch, driver-created VLANs, or DSA; since the OpenWrt 21.02 transition, the syntax and port mapping can differ substantially. This guide keeps all three paths from the official documentation.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; A wrong tagged/untagged state or CPU port can remove the entire LAN. Back up the configuration and keep a console path before editing &lt;code&gt;/etc/config/network&lt;/code&gt;. Never copy a port map from another model.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Host draw.io on Windows with Apache Tomcat</title><link>https://aiot.io.vn/en/posts/host-your-own-draw-io-visio-style-diagram-maker-on-wind-i12bretro-950/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/host-your-own-draw-io-visio-style-diagram-maker-on-wind-i12bretro-950/</guid><description>&lt;p&gt;draw.io is a web-based diagramming and whiteboard application. This rewrite keeps the source choices while adding official download links and separating Tomcat, draw.io, and the optional root-path steps.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/QZeGx67ZJ4c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="download-and-prepare-java"&gt;Download and prepare Java&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download &lt;a href="https://jdk.java.net/"&gt;OpenJDK&lt;/a&gt;, &lt;a href="https://tomcat.apache.org/download-10.cgi"&gt;Apache Tomcat 10&lt;/a&gt;, and the latest &lt;code&gt;draw.war&lt;/code&gt; from &lt;a href="https://github.com/jgraph/drawio/releases/latest"&gt;draw.io releases&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Extract the OpenJDK ZIP archive.&lt;/li&gt;&#10;&lt;li&gt;Copy the extracted folder to &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open Start and go to &lt;strong&gt;Control Panel &amp;gt; System &amp;gt; Advanced System Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Environment Variables&lt;/strong&gt;. Under &lt;strong&gt;System Variables&lt;/strong&gt;, click &lt;strong&gt;New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set &lt;strong&gt;Variable Name&lt;/strong&gt; to &lt;code&gt;JAVA_HOME&lt;/code&gt; and &lt;strong&gt;Variable Value&lt;/strong&gt; to &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;, then click &lt;strong&gt;OK&lt;/strong&gt; to close the dialogs.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-apache-tomcat"&gt;Install Apache Tomcat&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Run the Apache Tomcat installer.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;, then &lt;strong&gt;I Agree&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Choose Components&lt;/strong&gt;, clear everything except &lt;strong&gt;Core&lt;/strong&gt;, &lt;strong&gt;Service Startup&lt;/strong&gt;, and &lt;strong&gt;Native&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set port &lt;code&gt;8000&lt;/code&gt; and the Service Name, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;At the Java Virtual Machine screen, select &lt;code&gt;C:\Program Files\OpenJDK&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Confirm the install location, click &lt;strong&gt;Install&lt;/strong&gt;, then &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNSorIP:8000&lt;/code&gt;. The Tomcat splash page should show the running version.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-drawio"&gt;Install draw.io&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Copy &lt;code&gt;draw.war&lt;/code&gt; into Apache Tomcat&amp;rsquo;s &lt;code&gt;webapps&lt;/code&gt; directory.&lt;/li&gt;&#10;&lt;li&gt;Wait for Tomcat to extract it into a &lt;code&gt;draw&lt;/code&gt; directory. If it does not, open &lt;code&gt;services.msc&lt;/code&gt; and restart the Apache Tomcat service.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNSorIP:8000/draw&lt;/code&gt; to test draw.io.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="remove-draw-from-the-url-optional"&gt;Remove &lt;code&gt;/draw&lt;/code&gt; from the URL (optional)&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open the &lt;code&gt;webapps&lt;/code&gt; folder in File Explorer.&lt;/li&gt;&#10;&lt;li&gt;Delete &lt;code&gt;ROOT&lt;/code&gt; if it exists.&lt;/li&gt;&#10;&lt;li&gt;Rename &lt;code&gt;draw&lt;/code&gt; to &lt;code&gt;ROOT&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNS-or-IP:8000/&lt;/code&gt; to reach draw.io at the root path.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Check the Tomcat service write permissions and back up &lt;code&gt;webapps&lt;/code&gt; before renaming directories.&lt;/p&gt;</description></item><item><title>Run Easy!Appointments in Docker</title><link>https://aiot.io.vn/en/posts/run-easy-appointments-appointment-scheduler-system-in-d-i12bretro-949/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/run-easy-appointments-appointment-scheduler-system-in-d-i12bretro-949/</guid><description>&lt;p&gt;Easy!Appointments is an open-source web application for customer bookings and can synchronize with Google Calendar. This guide uses a private Docker network and stores the database under &lt;code&gt;~/docker/mariadb&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/FDdDQinpzq4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux with a &lt;code&gt;sudo&lt;/code&gt;-capable account and run the commands below. The source uses &lt;code&gt;apt-key&lt;/code&gt;; on a current distribution, also check the &lt;a href="https://docs.docker.com/engine/install/"&gt;official Docker installation documentation&lt;/a&gt; because this command is deprecated.&lt;/p&gt;</description></item><item><title>Run OpenVPN Access Server in Docker</title><link>https://aiot.io.vn/en/posts/run-openvpn-access-server-in-docker-i12bretro-946/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/run-openvpn-access-server-in-docker-i12bretro-946/</guid><description>&lt;p&gt;OpenVPN Access Server is a self-hosted VPN solution with a web administration interface. This version keeps the source ports, volume, and operation order while separating commands and adding practical safety notes.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/YQQjyWefFNA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux with a &lt;code&gt;sudo&lt;/code&gt;-capable account and run the commands below. The source uses &lt;code&gt;apt-key&lt;/code&gt;; on a current distribution, also check the &lt;a href="https://docs.docker.com/engine/install/"&gt;official Docker installation documentation&lt;/a&gt; because this command is deprecated.&lt;/p&gt;</description></item><item><title>Run Seafile in Docker</title><link>https://aiot.io.vn/en/posts/run-seafile-cloud-storage-system-in-docker-i12bretro-952/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/run-seafile-cloud-storage-system-in-docker-i12bretro-952/</guid><description>&lt;p&gt;Seafile is an open-source file synchronization and sharing platform. This guide runs MariaDB and Seafile on one Docker network and stores their data under &lt;code&gt;~/docker/mariadb&lt;/code&gt; and &lt;code&gt;~/docker/seafile&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/mEIBA3Tlcb0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker"&gt;Install Docker&lt;/h2&gt;&#10;&lt;p&gt;Log into Linux with &lt;code&gt;sudo&lt;/code&gt; access and run:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg-agent -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/gpg | sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;] https://download.docker.com/linux/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;awk -F&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/^ID=/{ print $NF }&amp;#39;&lt;/span&gt; /etc/os-release&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install docker-ce docker-compose containerd.io -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable docker &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su - $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a current distribution, also see the &lt;a href="https://docs.docker.com/engine/install/"&gt;Docker documentation&lt;/a&gt; because &lt;code&gt;apt-key&lt;/code&gt; is deprecated.&lt;/p&gt;</description></item><item><title>Running a macOS 15 Sequoia VM in VMware</title><link>https://aiot.io.vn/en/posts/running-a-macos-15-sequoia-vm-in-vmware-i12bretro-945/</link><pubDate>Fri, 28 Aug 2026 03:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/running-a-macos-15-sequoia-vm-in-vmware-i12bretro-945/</guid><description>&lt;p&gt;This rewrite follows the source tutorial in four sections: preparing VMware, creating the VM, installing macOS, and installing VMware Tools. The procedure requires a CPU with AVX2 support. Running macOS on non-Apple hardware may also be restricted by Apple&amp;rsquo;s license and VMware compatibility, so use it only lawfully. Take a snapshot before editing &lt;code&gt;.vmx&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/I_wu1a_WtEE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="prepare-vmware-and-the-unlocker"&gt;Prepare VMware and the Unlocker&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Obtain a macOS Sequoia ISO lawfully, or create one using the &lt;a href="https://youtu.be/JFMvUpdCMwo"&gt;source video&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Download &lt;a href="https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html"&gt;VMware Workstation Player&lt;/a&gt; and &lt;a href="https://github.com/paolo-projects/auto-unlocker/releases"&gt;MacOS Unlocker&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Install VMware with the default options.&lt;/li&gt;&#10;&lt;li&gt;Extract the Unlocker, right-click &lt;code&gt;Unlocker.exe&lt;/code&gt;, choose &lt;strong&gt;Run as administrator&lt;/strong&gt;, and click &lt;strong&gt;Patch&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Wait for patching to finish.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="create-the-sequoia-vm"&gt;Create the Sequoia VM&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Launch VMware, choose &lt;strong&gt;Continue&lt;/strong&gt; for free non-commercial use, then click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;strong&gt;Create a New Virtual Machine&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Installer disc image file (iso)&lt;/strong&gt;, browse to the ISO, and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Apple Mac OS X&lt;/strong&gt; and &lt;code&gt;macOS 13&lt;/code&gt;, or the closest version to macOS 15, then &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Name the VM &lt;code&gt;MacOS15&lt;/code&gt;, choose its storage path, and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set the disk size, choose to store it as a &lt;strong&gt;single file&lt;/strong&gt;, and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Customize Hardware&amp;hellip;&lt;/strong&gt;, assign &lt;strong&gt;8 GB or more&lt;/strong&gt; RAM and &lt;strong&gt;4 cores&lt;/strong&gt;, and set &lt;strong&gt;Network Adapter: Bridged&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Close &amp;gt; Finish&lt;/strong&gt;. With the VM powered off, open its &lt;code&gt;.vmx&lt;/code&gt; file.&lt;/li&gt;&#10;&lt;li&gt;Set or append:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;board-id.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ethernet0.virtualDev&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vmxnet3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;board-id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Mac-AA95B1DDAB278B95&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;hw.model.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;hw.model&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iMac20,1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;serialNumber.reflectHost&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;FALSE&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;serialNumber&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;C01234567890&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="10"&gt;&#10;&lt;li&gt;Return to VMware, right-click &lt;code&gt;MacOS15&lt;/code&gt;, and choose &lt;strong&gt;Power On&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-macos-sequoia"&gt;Install macOS Sequoia&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Select a language, then choose &lt;strong&gt;Disk Utility&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;VMware Virtual SATA Hard Drive Media&lt;/strong&gt; and click &lt;strong&gt;Erase&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Name it &lt;code&gt;MacOS&lt;/code&gt;, choose &lt;strong&gt;APFS&lt;/strong&gt;, click &lt;strong&gt;Erase &amp;gt; Done&lt;/strong&gt;, and close Disk Utility.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;strong&gt;Install macOS &amp;gt; Continue &amp;gt; Agree &amp;gt; Agree&lt;/strong&gt;, select &lt;code&gt;MacOS&lt;/code&gt;, and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Wait while the VM reboots several times.&lt;/li&gt;&#10;&lt;li&gt;Select the country, language, and keyboard layout.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;strong&gt;Not Now&lt;/strong&gt; for Accessibility and Migration Assistant; choose &lt;strong&gt;Continue&lt;/strong&gt; for Data &amp;amp; Privacy.&lt;/li&gt;&#10;&lt;li&gt;On Apple ID, choose &lt;strong&gt;Set Up Later &amp;gt; Skip&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Accept the terms, create a local account, choose Location Services and a time zone.&lt;/li&gt;&#10;&lt;li&gt;Clear &lt;strong&gt;Share Mac Analytics with Apple&lt;/strong&gt;, choose &lt;strong&gt;Set Up Later&lt;/strong&gt; for Screen Time, choose a theme, and reach the desktop.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-vmware-tools"&gt;Install VMware Tools&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Right-click &lt;strong&gt;Install macOS&lt;/strong&gt; on the desktop and choose &lt;strong&gt;Eject&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Player &amp;gt; Removable Devices &amp;gt; CD/DVD &amp;gt; Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Browse&lt;/strong&gt;, open the Unlocker &lt;code&gt;tools&lt;/code&gt; folder, select &lt;code&gt;darwin.iso&lt;/code&gt;, check &lt;strong&gt;Connected&lt;/strong&gt;, and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;In macOS, open VMware Tools and run the installer.&lt;/li&gt;&#10;&lt;li&gt;Open Security, scroll down, click &lt;strong&gt;Allow&lt;/strong&gt; beside VMware, and reboot.&lt;/li&gt;&#10;&lt;li&gt;After rebooting, run the installer again and reboot once more after it succeeds.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="checks"&gt;Checks&lt;/h2&gt;&#10;&lt;p&gt;Confirm that the VM can reboot, has networking, and sees its assigned resources. If it will not boot, restore the snapshot and recheck AVX2, VMware compatibility, and the &lt;code&gt;.vmx&lt;/code&gt; lines. Do not use the sample serial as a real identity.&lt;/p&gt;</description></item><item><title>Audit and Manage OpenWrt Base Services</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-base-system-services-audit/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-base-system-services-audit/</guid><description>&lt;p&gt;Before installing DNS, DDNS, VPN, or another service, record what is running, which ports are listening, where configuration lives, and how the init script behaves.&lt;/p&gt;&#10;&lt;h2 id="1-record-the-baseline"&gt;1. Record the baseline&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show system&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show dhcp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -l /etc/init.d/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;service list 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ss -lntup 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; netstat -lntup&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Record each port, process, bind address, interface, and service owner.&lt;/p&gt;&#10;&lt;h2 id="2-inspect-logs-and-dependencies"&gt;2. Inspect logs and dependencies&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logread | tail -n &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logread -e dnsmasq&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logread -e netifd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps w&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before replacing DNS, determine whether &lt;code&gt;dnsmasq&lt;/code&gt; provides DHCP, DNS forwarding, or both. Do not stop it simply because an external guide says so.&lt;/p&gt;</description></item><item><title>Block-Level NOR Backups on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-generic-nor-backup/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-generic-nor-backup/</guid><description>&lt;p&gt;This guide covers block-level flash backups on NOR-based OpenWrt devices. It is different from &lt;code&gt;sysupgrade -b&lt;/code&gt;, which archives configuration files. The goal is to preserve MTD partition contents for analysis or targeted recovery.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Confirm that the device uses NOR before following this procedure. Do not use &lt;code&gt;dd&lt;/code&gt; casually on NAND; NAND requires tools that understand ECC and bad-block handling. Never write a dump from another device. Bootloader, ART/NVRAM, factory/calibration, and similar partitions may contain device-specific data; losing them can remove Wi-Fi calibration or MAC data and may prevent booting.&lt;/p&gt;</description></item><item><title>Building a bridged Wi-Fi AP with LuCI, DHCP, and configuration files</title><link>https://aiot.io.vn/en/serial/openwrt/bridged-ap/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/bridged-ap/</guid><description>&lt;p&gt;OpenWrt can act as a bridged access point, but “bridge” does not mean that every port can be used interchangeably. This guide uses a simple LAN-to-LAN design: the main router provides DHCP and DNS while OpenWrt only provides Wi-Fi and forwards traffic to the main LAN.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; connect the management computer to the correct LAN port, back up the network configuration first, and keep a direct recovery path. Never run two DHCP servers on the same LAN.&lt;/p&gt;</description></item><item><title>Install Debian Sid in a Proxmox VE VM</title><link>https://aiot.io.vn/en/posts/debian-sid-proxmox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/debian-sid-proxmox/</guid><description>&lt;p&gt;Debian Sid is Debian&amp;rsquo;s rolling/unstable branch and is better suited to a HomeLab experiment than a production service. This article adapts the complete installation sequence from i12bretro and uses placeholders for accounts so credentials are not published.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0929.html"&gt;i12bretro – Debian Sid in Proxmox VE&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=ZsBsGravlbo"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ZsBsGravlbo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="what-is-debian-sid"&gt;What is Debian Sid?&lt;/h2&gt;&#10;&lt;p&gt;Sid is a rolling/unstable branch where packages can change quickly. Take a VM snapshot before upgrades and do not use this VM as the only copy of important data.&lt;/p&gt;</description></item><item><title>Installing and expanding OpenWrt on x86: PC, VM, and server</title><link>https://aiot.io.vn/en/serial/openwrt/x86-openwrt/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/x86-openwrt/</guid><description>&lt;p&gt;OpenWrt on x86 uses different images and installation steps from a conventional router flash. Distinguish a combined image with a partition table from a filesystem-only image, and identify the destination disk before writing. One incorrect &lt;code&gt;dd&lt;/code&gt; target can erase an entire server.&lt;/p&gt;&#10;&lt;h2 id="choose-the-image-and-identify-the-disk"&gt;Choose the image and identify the disk&lt;/h2&gt;&#10;&lt;p&gt;Download the image for the intended use from the &lt;a href="https://openwrt.org/docs/guide-user/installation/openwrt_x86"&gt;OpenWrt x86 documentation&lt;/a&gt;. For bare-metal installs, a &lt;code&gt;generic-ext4-combined&lt;/code&gt; image normally contains boot and rootfs. For a VM, select a disk/controller that matches the hypervisor and decide whether it boots through BIOS or UEFI.&lt;/p&gt;</description></item><item><title>OpenWrt Network Configuration with UCI: Devices and Interfaces</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-network-uci-model/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-network-uci-model/</guid><description>&lt;p&gt;This guide keeps the complete practical workflow for editing &lt;code&gt;/etc/config/network&lt;/code&gt;. UCI separates physical devices, bridges, logical interfaces, addresses, and routes. Confusing these layers can immediately disconnect LAN or SSH.&lt;/p&gt;&#10;&lt;h2 id="1-prepare-and-back-up"&gt;1. Prepare and back up&lt;/h2&gt;&#10;&lt;p&gt;Use wired LAN or a console when changing WAN, bridge, or VLAN settings. Record the model, release, current address, and recovery method. Create a configuration archive and a direct copy:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/config-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/network /tmp/network.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip -br link&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip -br addr&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-inspect-the-current-model"&gt;2. Inspect the current model&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/config/network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show network&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip addr&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip route&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;code&gt;config device&lt;/code&gt; describes a low-level device or bridge. A &lt;code&gt;config interface&lt;/code&gt; describes a logical network such as &lt;code&gt;lan&lt;/code&gt; or &lt;code&gt;wan&lt;/code&gt;. A logical name is not necessarily an Ethernet card name. Wireless interfaces should normally be attached through the &lt;code&gt;network&lt;/code&gt; option in &lt;code&gt;/etc/config/wireless&lt;/code&gt;; do not assume dynamic Wi-Fi names are stable devices.&lt;/p&gt;</description></item><item><title>OpenWrt owut: controlled upgrades and package handling</title><link>https://aiot.io.vn/en/serial/openwrt/owut/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/owut/</guid><description>&lt;p&gt;&lt;code&gt;owut&lt;/code&gt; is a shell-based OpenWrt upgrade tool. It cannot make an image for the wrong target safe, and it is not a substitute for a backup. A controlled upgrade checks the board, release, packages, and free space before allowing a reboot and flash.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Do not start with &lt;code&gt;owut upgrade&lt;/code&gt;.&lt;/strong&gt; Keep a spare SSH/LuCI access path and copy the configuration off the router first.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="inspect-the-router-and-create-a-backup"&gt;Inspect the router and create a backup&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/config-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy &lt;code&gt;/tmp/config-backup.tar.gz&lt;/code&gt; to another machine. Record the model, target/subtarget, current release, extra packages, and the device&amp;rsquo;s recovery method.&lt;/p&gt;</description></item><item><title>Organizing OpenWrt Interfaces and Firewall Zones</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-firewall-interface-zones/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-firewall-interface-zones/</guid><description>&lt;p&gt;OpenWrt firewall policy is applied through zones. A zone contains one or more logical networks; forwarding controls traffic between zones.&lt;/p&gt;&#10;&lt;h2 id="1-back-up-and-identify-the-backend"&gt;1. Back up and identify the backend&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/firewall-network-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/firewall /tmp/firewall.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/config/network /tmp/network.before&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show firewall&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uci show network&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Newer releases commonly use firewall4/nftables; older releases may use firewall3/iptables. Do not mix configuration or inspection commands without checking the release.&lt;/p&gt;&#10;&lt;h2 id="2-understand-the-baseline"&gt;2. Understand the baseline&lt;/h2&gt;&#10;&lt;p&gt;Typical policy boundaries are &lt;code&gt;lan&lt;/code&gt; (trusted management), &lt;code&gt;wan&lt;/code&gt; (outside), and &lt;code&gt;guest&lt;/code&gt; (untrusted Internet-only). Inspect existing sections before adding duplicates:&lt;/p&gt;</description></item><item><title>Reducing bufferbloat on OpenWrt with SQM and CAKE</title><link>https://aiot.io.vn/en/serial/openwrt/sqm-bufferbloat/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/sqm-bufferbloat/</guid><description>&lt;p&gt;Bufferbloat occurs when a network device builds an oversized queue while the link is full. Latency rises even though download and upload speed still look high. OpenWrt SQM controls that queue by shaping traffic; it does not increase the line rate.&lt;/p&gt;&#10;&lt;h2 id="measure-first"&gt;Measure first&lt;/h2&gt;&#10;&lt;p&gt;Measure the connection while idle and during a loaded download/upload test. Record the real WAN rates rather than the advertised plan. SQM normally needs a value below the measured rate to leave headroom; 90% is only a starting point, not a universal setting.&lt;/p&gt;</description></item><item><title>Run Debian Sid in VirtualBox for a Lab</title><link>https://aiot.io.vn/en/posts/debian-sid-virtualbox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/debian-sid-virtualbox/</guid><description>&lt;p&gt;This article adapts the complete VirtualBox workflow for running Debian Sid, useful for testing packages and Linux procedures without touching a physical host. Debian Sid is rolling/unstable, so take a snapshot before major changes.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0928.html"&gt;i12bretro – Debian Sid in VirtualBox&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=sdhjhq3Y4Ms"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/sdhjhq3Y4Ms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="create-the-vm-and-attach-the-iso"&gt;Create the VM and attach the ISO&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download Debian Unstable/Sid, for example the &lt;a href="https://d-i.debian.org/daily-images/amd64/daily/netboot/mini.iso"&gt;Debian mini.iso&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open VirtualBox.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Machine &amp;gt; New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Finish the initial VM wizard and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;In Create Virtual Hard Disk, create a disk sized for the lab and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the VM and open &lt;strong&gt;Settings &amp;gt; System &amp;gt; Processor&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Assign at least &lt;code&gt;2&lt;/code&gt; processors.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Display&lt;/strong&gt; and set Video Memory to &lt;code&gt;128 MB&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Network&lt;/strong&gt; and select &lt;strong&gt;Bridged Adapter&lt;/strong&gt; if the VM must appear as a separate LAN device; use NAT when it only needs Internet access.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Storage&lt;/strong&gt; and select the CD-ROM drive.&lt;/li&gt;&#10;&lt;li&gt;Open the disk menu on the right and choose &lt;strong&gt;Choose a virtual optical disc file&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the downloaded Debian mini.iso.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the Debian Sid VM and click &lt;strong&gt;Start &amp;gt; Normal&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-debian-sid"&gt;Install Debian Sid&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;When the installer appears, press &lt;strong&gt;Enter&lt;/strong&gt; to select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select a language.&lt;/li&gt;&#10;&lt;li&gt;Select a location.&lt;/li&gt;&#10;&lt;li&gt;Select a keyboard layout.&lt;/li&gt;&#10;&lt;li&gt;Enter a hostname.&lt;/li&gt;&#10;&lt;li&gt;Enter a domain name or leave it empty.&lt;/li&gt;&#10;&lt;li&gt;Choose a mirror location.&lt;/li&gt;&#10;&lt;li&gt;Choose a mirror.&lt;/li&gt;&#10;&lt;li&gt;Enter an HTTP proxy if needed, or leave it empty.&lt;/li&gt;&#10;&lt;li&gt;Leave the root password empty, press &lt;strong&gt;Enter&lt;/strong&gt;, and press &lt;strong&gt;Enter&lt;/strong&gt; again to confirm.&lt;/li&gt;&#10;&lt;li&gt;Enter the full name for the new user.&lt;/li&gt;&#10;&lt;li&gt;Enter the username.&lt;/li&gt;&#10;&lt;li&gt;Enter and confirm the user&amp;rsquo;s password.&lt;/li&gt;&#10;&lt;li&gt;Select a timezone.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Guided - use entire disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;VBOX HARDDISK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;All files in one partition&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Finish partitioning and write changes to disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Yes&lt;/strong&gt; to write the changes.&lt;/li&gt;&#10;&lt;li&gt;Select a country for the apt mirror.&lt;/li&gt;&#10;&lt;li&gt;Select a mirror.&lt;/li&gt;&#10;&lt;li&gt;Configure the HTTP proxy if necessary.&lt;/li&gt;&#10;&lt;li&gt;Choose whether to participate in the package usage survey.&lt;/li&gt;&#10;&lt;li&gt;Select the optional software to install.&lt;/li&gt;&#10;&lt;li&gt;Wait while Debian Sid installs its files.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Yes&lt;/strong&gt; to install GRUB.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;code&gt;/dev/sda&lt;/code&gt; as the boot loader location.&lt;/li&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Enter&lt;/strong&gt; after installation to reboot.&lt;/li&gt;&#10;&lt;li&gt;If VirtualBox boots the installer again, use &lt;strong&gt;Devices &amp;gt; Optical Drives&lt;/strong&gt; to remove the ISO.&lt;/li&gt;&#10;&lt;li&gt;Log into Debian Sid with the account created during installation.&lt;/li&gt;&#10;&lt;li&gt;Confirm that the system has loaded.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="install-guest-additions"&gt;Install Guest Additions&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;From the VM menu, select &lt;strong&gt;Devices &amp;gt; Insert Guest Additions CD image&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open Files.&lt;/li&gt;&#10;&lt;li&gt;Select the Guest Additions Disc.&lt;/li&gt;&#10;&lt;li&gt;Right-click the empty area and choose &lt;strong&gt;Open terminal here&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Update repositories:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Install available updates:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Clean the apt cache:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Install build tools, DKMS, and the current kernel headers:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install build-essential dkms linux-headers-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;uname -r&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="9"&gt;&#10;&lt;li&gt;Run the Guest Additions installer:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sh ./VBoxLinuxAdditions.run&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="10"&gt;&#10;&lt;li&gt;Reboot the VM:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo reboot&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="11"&gt;&#10;&lt;li&gt;After reboot, test full-screen mode and confirm that the resolution follows the window size.&lt;/li&gt;&#10;&lt;li&gt;Log back into Debian.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Bridged Adapter puts the VM on the physical LAN. Debian Sid is less predictable than stable; NAT and snapshots are safer for initial experiments.&lt;/p&gt;</description></item><item><title>Run HomeDash on Linux: a Lightweight HomeLab Dashboard</title><link>https://aiot.io.vn/en/posts/homedash-linux/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/homedash-linux/</guid><description>&lt;p&gt;HomeDash is a Java dashboard for collecting information about HomeLab services and servers. This article keeps the complete command sequence from the i12bretro tutorial while resolving the latest release through the GitHub API instead of committing a binary to the repository.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0904.html"&gt;i12bretro – Run HomeDash on Linux&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=fQdQs4mnczs"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/fQdQs4mnczs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-java-and-maven"&gt;Install Java and Maven&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Linux device.&lt;/li&gt;&#10;&lt;li&gt;Update the package list:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Install available updates:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Install the default JDK and Maven:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install default-jdk maven -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Check Java:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Check Maven:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="download-and-run-homedash"&gt;Download and run HomeDash&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create the working directory:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir /opt/homedash2 -p&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Assign the directory to the current user:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown $USER:$USER /opt/homedash2 -R&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Change into the directory:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /opt/homedash2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Resolve the latest JAR release URL through the GitHub API:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;regex&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;browser_download_url&amp;#34;: &amp;#34;(https:\/\/github.com\/lamarios\/Homedash2\/releases\/download\/[^/]*\/Homedash-[^/]*\.jar)&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;curl -H &lt;span style="color:#e6db74"&gt;&amp;#34;Accept: application/vnd.github.v3+json&amp;#34;&lt;/span&gt; https://api.github.com/repos/lamarios/Homedash2/releases/latest&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $response &lt;span style="color:#f92672"&gt;=&lt;/span&gt;~ $regex &lt;span style="color:#f92672"&gt;]]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; downloadURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;BASH_REMATCH[1]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Download the JAR to a fixed local filename:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O ./homedash.jar $downloadURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Generate the configuration file:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -jar ./homedash.jar -create-config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Run HomeDash with the generated configuration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -Dconfig.file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/opt/homedash2/homedash.properties -jar homedash.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNSorIP:4567&lt;/code&gt; in a browser.&lt;/li&gt;&#10;&lt;li&gt;Confirm that the HomeDash page is available.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Operations note:&lt;/strong&gt; Do not expose port &lt;code&gt;4567&lt;/code&gt; directly to the Internet. Use a VPN or an authenticated reverse proxy for remote access. Protect &lt;code&gt;homedash.properties&lt;/code&gt;, inspect logs, and create a systemd unit only after confirming the Java/JAR versions work together.&lt;/p&gt;</description></item><item><title>Run macOS Sequoia 15 in a Proxmox VE VM</title><link>https://aiot.io.vn/en/posts/macos-sequoia-proxmox/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/macos-sequoia-proxmox/</guid><description>&lt;p&gt;This article adapts i12bretro&amp;rsquo;s complete workflow for running macOS Sequoia 15 in Proxmox VE. It is a HomeLab experiment; verify licensing, hardware compatibility, and the ability to recover the VM before using it for anything important.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0944.html"&gt;i12bretro – Running a MacOS 15 Sequoia VM in Proxmox VE&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=ApldztEgh8o"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/ApldztEgh8o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="files-and-prerequisites"&gt;Files and prerequisites&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A CPU with AVX2 support for macOS versions newer than 12.&lt;/li&gt;&#10;&lt;li&gt;A legally obtained macOS Sequoia ISO. The source tutorial references &lt;a href="https://archive.org/search.php?query=MacOS%2015&amp;amp;and[]=mediatype%3A%22software%22"&gt;Internet Archive&lt;/a&gt;; verify your own usage rights.&lt;/li&gt;&#10;&lt;li&gt;The KVM OpenCore bootloader ISO from &lt;a href="https://github.com/thenickdude/KVM-Opencore/releases"&gt;KVM-OpenCore releases&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;The KVM OpenCore EFI folder for the post-install EFI step.&lt;/li&gt;&#10;&lt;li&gt;MountEFI from &lt;a href="https://github.com/corpnewt/MountEFI"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;An unused VM ID; the examples below use &lt;code&gt;1500&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="create-the-vm-in-proxmox"&gt;Create the VM in Proxmox&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Upload the Sequoia ISO and KVM OpenCore ISO to the Proxmox ISO library.&lt;/li&gt;&#10;&lt;li&gt;Log into the Proxmox Web UI.&lt;/li&gt;&#10;&lt;li&gt;Right-click the Proxmox node name and select &lt;strong&gt;Create VM&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set the VM name to &lt;code&gt;MacOSSequoia&lt;/code&gt;; use VM ID &lt;code&gt;1500&lt;/code&gt; if it is free, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;OS&lt;/strong&gt;, choose &lt;strong&gt;Type: Other&lt;/strong&gt; and select the KVM OpenCore ISO in &lt;strong&gt;ISO Image&lt;/strong&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;System&lt;/strong&gt;, set &lt;strong&gt;Graphic card&lt;/strong&gt; to &lt;code&gt;VMware compatible&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set &lt;strong&gt;BIOS&lt;/strong&gt; to &lt;code&gt;OVMF (UEFI)&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Clear &lt;strong&gt;Pre-Enroll Keys&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Enable &lt;strong&gt;Add EFI Disk&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set &lt;strong&gt;Machine&lt;/strong&gt; to &lt;code&gt;q35&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set &lt;strong&gt;SCSI Controller&lt;/strong&gt; to &lt;code&gt;VirtIO SCSI&lt;/code&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Hard Disk&lt;/strong&gt;, set &lt;strong&gt;Bus/Device&lt;/strong&gt; to &lt;code&gt;VirtIO Block&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Set the disk size to &lt;code&gt;64 GB&lt;/code&gt; or more.&lt;/li&gt;&#10;&lt;li&gt;Set &lt;strong&gt;Cache&lt;/strong&gt; to &lt;code&gt;Write back (unsafe)&lt;/code&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;CPU&lt;/strong&gt;, set &lt;strong&gt;Cores&lt;/strong&gt; to &lt;code&gt;4&lt;/code&gt; and &lt;strong&gt;Type&lt;/strong&gt; to &lt;code&gt;host&lt;/code&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Memory&lt;/strong&gt;, assign &lt;code&gt;8192 MB&lt;/code&gt; or more, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On &lt;strong&gt;Network&lt;/strong&gt;, set &lt;strong&gt;Model&lt;/strong&gt; to &lt;code&gt;VMware vmxnet3&lt;/code&gt;, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Verify the summary and click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="attach-the-sequoia-iso-and-edit-the-vm-configuration"&gt;Attach the Sequoia ISO and edit the VM configuration&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Select &lt;code&gt;MacOSSequoia&lt;/code&gt; and open &lt;strong&gt;Hardware&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;strong&gt;Add &amp;gt; CD/DVD Drive&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the uploaded Sequoia ISO and click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Right-click the Proxmox node and open &lt;strong&gt;Console&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Edit the VM configuration. Replace &lt;code&gt;1500&lt;/code&gt; if the VM ID is different:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nano /etc/pve/qemu-server/1500.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;On an Intel host, append this line to the configuration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;args: -device isa-applesmc,osk=&amp;#34;ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc&amp;#34; -smbios type=2 -device qemu-xhci -device usb-kbd -device usb-tablet -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -cpu host,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;On an AMD host, use this CPU argument instead:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;args: -device isa-applesmc,osk=&amp;#34;ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc&amp;#34; -smbios type=2 -device qemu-xhci -device usb-kbd -device usb-tablet -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off -cpu Haswell-noTSX,vendor=GenuineIntel,+invtsc,+hypervisor,kvm=on,vmware-cpuid-freq=on&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Ctrl+W&lt;/strong&gt; and search for &lt;code&gt;,media=cdrom&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Remove &lt;code&gt;,media=cdrom&lt;/code&gt; from the KVM OpenCore and Sequoia ISO entries.&lt;/li&gt;&#10;&lt;li&gt;Add &lt;code&gt;cache=unsafe&lt;/code&gt; to the two ISO devices according to the source workflow.&lt;/li&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Ctrl+O&lt;/strong&gt;, Enter, then &lt;strong&gt;Ctrl+X&lt;/strong&gt; to save and exit nano.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-macos-sequoia"&gt;Install macOS Sequoia&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Return to the Proxmox Web UI, right-click &lt;code&gt;MacOSSequoia&lt;/code&gt;, and select &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Console&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;At the OpenCore menu, press &lt;strong&gt;Enter&lt;/strong&gt; to start the installer.&lt;/li&gt;&#10;&lt;li&gt;If &lt;strong&gt;Install macOS&lt;/strong&gt; is not listed, select &lt;strong&gt;UEFI Shell&lt;/strong&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;In the UEFI Shell, switch to the filesystem containing the Sequoia ISO. The number may differ:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fs0:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Launch the installer:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System\Library\CoreServices\boot.efi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Wait through the initialization sequence until macOS Setup appears.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Disk Utility&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;VIRTIO Block Media&lt;/strong&gt; and click &lt;strong&gt;Erase&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Name the disk &lt;code&gt;MacOS&lt;/code&gt;, choose &lt;code&gt;APFS&lt;/code&gt;, and click &lt;strong&gt;Erase&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Done&lt;/strong&gt; and close Disk Utility.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Install macOS Sequoia&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;, &lt;strong&gt;Agree&lt;/strong&gt;, and &lt;strong&gt;Agree&lt;/strong&gt; again.&lt;/li&gt;&#10;&lt;li&gt;Select the formatted macOS disk and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Wait while macOS copies files; the VM will reboot several times.&lt;/li&gt;&#10;&lt;li&gt;Select the country or region and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Confirm the languages and keyboard layout and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Not Now&lt;/strong&gt; on the Accessibility screen.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt; on Data &amp;amp; Privacy.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Not Now&lt;/strong&gt; on Migration Assistant.&lt;/li&gt;&#10;&lt;li&gt;On the Apple ID screen, choose &lt;strong&gt;Set Up Later&lt;/strong&gt;, then choose &lt;strong&gt;Skip&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On Terms and Conditions, click &lt;strong&gt;Agree&lt;/strong&gt;, then &lt;strong&gt;Agree&lt;/strong&gt; again.&lt;/li&gt;&#10;&lt;li&gt;Enter a name, username, and password, then click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Continue&lt;/strong&gt;, then choose &lt;strong&gt;Use&lt;/strong&gt; or &lt;strong&gt;Don&amp;rsquo;t Use&lt;/strong&gt; for Location Services.&lt;/li&gt;&#10;&lt;li&gt;Select a timezone and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Clear &lt;strong&gt;Share Mac Analytics with Apple&lt;/strong&gt; and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Set Up Later&lt;/strong&gt; on Screen Time.&lt;/li&gt;&#10;&lt;li&gt;Select a theme and click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Confirm that macOS Sequoia 15 has loaded.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="configure-booting-without-the-opencore-iso"&gt;Configure booting without the OpenCore ISO&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the &lt;code&gt;MacOSSequoia&lt;/code&gt; VM.&lt;/li&gt;&#10;&lt;li&gt;Open a browser and download the KVM OpenCore EFI folder.&lt;/li&gt;&#10;&lt;li&gt;Download MountEFI from &lt;a href="https://github.com/corpnewt/MountEFI"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open LaunchPad from the dock.&lt;/li&gt;&#10;&lt;li&gt;Search for &lt;code&gt;Terminal&lt;/code&gt; and launch it.&lt;/li&gt;&#10;&lt;li&gt;Run:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/Downloads/MountEFI-update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x MountEFI.command&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./MountEFI.command&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Enter the number corresponding to the macOS disk created during installation, for example &lt;code&gt;2&lt;/code&gt;, and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open a Finder window.&lt;/li&gt;&#10;&lt;li&gt;Navigate to the mounted EFI location.&lt;/li&gt;&#10;&lt;li&gt;If an &lt;code&gt;EFI&lt;/code&gt; folder already exists, rename it to &lt;code&gt;EFI.orig&lt;/code&gt; as a backup.&lt;/li&gt;&#10;&lt;li&gt;Copy the downloaded KVM OpenCore EFI folder to the mounted EFI partition.&lt;/li&gt;&#10;&lt;li&gt;Shut down the VM after the copy completes.&lt;/li&gt;&#10;&lt;li&gt;In Proxmox, select &lt;code&gt;MacOSSequoia&lt;/code&gt; and open &lt;strong&gt;Hardware&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the OpenCore ISO and click &lt;strong&gt;Detach&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the macOS Sequoia ISO and click &lt;strong&gt;Detach&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Right-click &lt;code&gt;MacOSSequoia&lt;/code&gt; and select &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Console&lt;/strong&gt; and confirm that Sequoia still boots without the OpenCore disk image mounted.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; This is an experimental workflow. Snapshot or back up the VM configuration before updates, avoid untrusted ISO/EFI files, and verify the macOS license before use.&lt;/p&gt;</description></item><item><title>Self-Host BookStack on Linux</title><link>https://aiot.io.vn/en/posts/bookstack-linux/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/bookstack-linux/</guid><description>&lt;p&gt;BookStack is a self-hosted wiki platform for organizing HomeLab documentation. This article adapts the complete Linux installation flow from i12bretro, including Apache, MariaDB, PHP, Composer, the &lt;code&gt;.env&lt;/code&gt; file, and the Apache site configuration. Example credentials from the source are replaced with placeholders; generate your own secrets during deployment.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0919.html"&gt;i12bretro – Install BookStack on Linux&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=7DY-BaOEnpM"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/7DY-BaOEnpM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A Linux host with &lt;code&gt;sudo&lt;/code&gt; access.&lt;/li&gt;&#10;&lt;li&gt;A hostname or domain for BookStack.&lt;/li&gt;&#10;&lt;li&gt;MariaDB, Apache, and PHP compatible with the BookStack release being installed.&lt;/li&gt;&#10;&lt;li&gt;A separate database password and an app key generated by Artisan.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="install-the-base-packages"&gt;Install the base packages&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Linux host.&lt;/li&gt;&#10;&lt;li&gt;Update the package list:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Install available updates:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt upgrade -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Install the required tools:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install git openssl curl wget zip composer -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Install Apache and MariaDB:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apache2 mariadb-server mariadb-client -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Install PHP and the extensions commonly required by BookStack:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install php libapache2-mod-php php-curl php-tokenizer php-ldap php-cli php-json php-gd php-mbstring php-mysql php-xml php-zip php-bcmath -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="secure-mariadb"&gt;Secure MariaDB&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Start the MariaDB security wizard:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mysql_secure_installation&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Enter&lt;/strong&gt; at the root login prompt if the installation does not yet have a root password.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;code&gt;Y&lt;/code&gt; to set a root password and enter it twice. Never put the real password in this article, logs, or Git.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;code&gt;Y&lt;/code&gt; to remove anonymous users.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;code&gt;Y&lt;/code&gt; to disallow remote root login.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;code&gt;Y&lt;/code&gt; to remove the test database.&lt;/li&gt;&#10;&lt;li&gt;Choose &lt;code&gt;Y&lt;/code&gt; to reload privilege tables.&lt;/li&gt;&#10;&lt;li&gt;Log into MariaDB:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysql -u root -p&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="9"&gt;&#10;&lt;li&gt;Enter the root password created earlier.&lt;/li&gt;&#10;&lt;li&gt;Create a dedicated BookStack database and user. Replace &lt;code&gt;[DB_PASSWORD]&lt;/code&gt; with a secret stored outside the repository:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DATABASE&lt;/span&gt; bookstack;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;GRANT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ALL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; bookstack.&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TO&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bookstack_rw&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;@&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt; IDENTIFIED &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;[DB_PASSWORD]&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FLUSH &lt;span style="color:#66d9ef"&gt;PRIVILEGES&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;EXIT;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="11"&gt;&#10;&lt;li&gt;Exit the shell if necessary:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="download-bookstack-and-create-the-environment-file"&gt;Download BookStack and create the environment file&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Clone the release branch into &lt;code&gt;/var/www/bookstack&lt;/code&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch /var/www/bookstack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Copy the sample environment file:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo cp /var/www/bookstack/.env.example /var/www/bookstack/.env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Open the configuration file:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nano /var/www/bookstack/.env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Adjust the main variables below. Do not use sample passwords, mail hosts, or app keys:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-dotenv" data-lang="dotenv"&gt;APP_ENV=production&#10;APP_DEBUG=false&#10;APP_KEY=&#10;APP_URL=http://DNSorIP/bookstack&#10;APP_TIMEZONE=Asia/Ho_Chi_Minh&#10;APP_LOCALE=en&#10;&#10;DB_CONNECTION=mysql&#10;DB_HOST=127.0.0.1&#10;DB_DATABASE=bookstack&#10;DB_USERNAME=bookstack_rw&#10;DB_PASSWORD=[DB_PASSWORD]&#10;&#10;MAIL_DRIVER=smtp&#10;MAIL_HOST=[SMTP_HOST]&#10;MAIL_PORT=25&#10;MAIL_USERNAME=null&#10;MAIL_PASSWORD=null&#10;MAIL_ENCRYPTION=null&#10;MAIL_FROM_ADDR=bookstack@[YOUR_DOMAIN]&#10;MAIL_FROM_NAME=&amp;#39;BookStack&amp;#39;&#10;MAIL_REPLYTO_ADDR=bookstack@[YOUR_DOMAIN]&#10;MAIL_REPLYTO_NAME=&amp;#39;BookStack&amp;#39;&#10;MAIL_AUTO_EMBED_METHOD=&amp;#39;attachment&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Set &lt;code&gt;APP_URL&lt;/code&gt; to the real URL. Use &lt;code&gt;https://&lt;/code&gt; when the site is served through HTTPS.&lt;/li&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Ctrl+O&lt;/strong&gt;, Enter, then &lt;strong&gt;Ctrl+X&lt;/strong&gt; to save and close nano.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-dependencies-and-generate-the-app-key"&gt;Install dependencies and generate the app key&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Set the BookStack directory owner:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R www-data:www-data /var/www/bookstack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Create the Composer working directory and assign its owner:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir /var/www/.composer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R www-data:www-data /var/www/.composer&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Change into the BookStack directory:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /var/www/bookstack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Install production dependencies:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo -u www-data composer install --no-dev --no-plugins&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Generate the app key with Artisan:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo php artisan key:generate --no-interaction --force&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;&#10;&lt;li&gt;Run the database migration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo php artisan migrate --no-interaction --force&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="7"&gt;&#10;&lt;li&gt;Open the Apache site configuration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nano /etc/apache2/sites-available/bookstack.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="8"&gt;&#10;&lt;li&gt;Add the following configuration and adjust the path/domain if using a different deployment path:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-apache" data-lang="apache"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Alias &lt;span style="color:#e6db74"&gt;/bookstack&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/var/www/bookstack/public&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;Directory&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/www/bookstack/public&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Options Indexes FollowSymLinks&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AllowOverride &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Require &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; granted&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span style="color:#e6db74"&gt;mod_rewrite.c&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span style="color:#e6db74"&gt;mod_negotiation.c&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Options -MultiViews -Indexes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteEngine &lt;span style="color:#66d9ef"&gt;On&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{HTTP:Authorization} .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_FILENAME} !-d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_URI} (.+)/$&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteRule ^ %1 [L,R=301]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_FILENAME} !-d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteCond %{REQUEST_FILENAME} !-f&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RewriteRule ^ index.php [L]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="9"&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Ctrl+O&lt;/strong&gt;, Enter, then &lt;strong&gt;Ctrl+X&lt;/strong&gt; to save the file.&lt;/li&gt;&#10;&lt;li&gt;Enable rewrite, enable the BookStack site, and restart Apache:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2enmod rewrite&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2ensite bookstack&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="complete-the-web-installer"&gt;Complete the Web Installer&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNSorIP/bookstack&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Use the default first-login information only when confirmed by the BookStack version documentation; immediately replace it with a unique account and password.&lt;/li&gt;&#10;&lt;li&gt;Open the user dropdown in the top-right corner and select &lt;strong&gt;My Account&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Update the username and email, then click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Access &amp;amp; Security&lt;/strong&gt; in the left navigation.&lt;/li&gt;&#10;&lt;li&gt;Enter and confirm a new password, then click &lt;strong&gt;Update&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open the user dropdown and select &lt;strong&gt;Logout&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Log in again with the updated email and password.&lt;/li&gt;&#10;&lt;li&gt;Verify that BookStack can read the database, write uploads, and load the wiki pages.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Operations note:&lt;/strong&gt; Enable HTTPS, back up both the database and &lt;code&gt;/var/www/bookstack&lt;/code&gt;, protect &lt;code&gt;.env&lt;/code&gt;, disallow remote MariaDB root login, and test compatibility before updating the release branch.&lt;/p&gt;</description></item><item><title>Separating Guest Wi-Fi with OpenWrt VLAN and Firewall</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-guest-wifi-vlan-boundary/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-guest-wifi-vlan-boundary/</guid><description>&lt;p&gt;A different SSID is not a security boundary. This procedure separates the guest network at the network/VLAN layer, gives it its own DHCP scope, attaches the SSID to the correct interface, and permits only Internet forwarding.&lt;/p&gt;&#10;&lt;h2 id="1-model-and-prerequisites"&gt;1. Model and prerequisites&lt;/h2&gt;&#10;&lt;p&gt;Example: management/LAN VLAN 10 with &lt;code&gt;192.168.1.0/24&lt;/code&gt;, guest VLAN 20 with &lt;code&gt;192.168.20.0/24&lt;/code&gt;, and a trunk between router, switch, and AP. Confirm VLAN tagging support and the target&amp;rsquo;s DSA/switch layout. Names such as &lt;code&gt;br-guest&lt;/code&gt; and &lt;code&gt;eth0.20&lt;/code&gt; are not universal.&lt;/p&gt;</description></item><item><title>Upgrading OpenWrt with LuCI and CLI without accidental configuration loss</title><link>https://aiot.io.vn/en/serial/openwrt/sysupgrade-cli/</link><pubDate>Fri, 28 Aug 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/sysupgrade-cli/</guid><description>&lt;p&gt;Upgrading OpenWrt writes firmware. “Keep configuration” does not mean that every package and local change will remain valid. Before using LuCI or the CLI, confirm the model/target, image, release, and recovery path.&lt;/p&gt;&#10;&lt;h2 id="prepare-and-back-up"&gt;Prepare and back up&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ubus call system board&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /etc/openwrt_release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df -h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sysupgrade -b /tmp/config-backup.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy the backup off the router. A configuration archive is not a full flash dump and cannot restore a damaged bootloader or ART partition. For an important device, prepare the model-specific UART or recovery method.&lt;/p&gt;</description></item><item><title>Run Home Assistant in Docker</title><link>https://aiot.io.vn/en/posts/home-assistant-docker-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:25:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/home-assistant-docker-i12bretro/</guid><description>&lt;p&gt;Home Assistant is an open-source home automation platform that works well on a Linux server or HomeLab. This article adapts the Docker-based setup and stores the application configuration in a dedicated directory.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0672.html"&gt;i12bretro – Running Home Assistant in Docker&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=lTHW_4MlUQo"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/lTHW_4MlUQo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="install-docker-on-linux"&gt;Install Docker on Linux&lt;/h2&gt;&#10;&lt;p&gt;On the Linux host, run the following commands to install Docker:&lt;/p&gt;</description></item><item><title>Install OPNsense Firewall/Router in VirtualBox</title><link>https://aiot.io.vn/en/posts/opnsense-firewall-router-virtualbox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:20:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/opnsense-firewall-router-virtualbox-i12bretro/</guid><description>&lt;p&gt;This article adapts the installation of OPNsense in VirtualBox with two network adapters for a HomeLab firewall/router test. Identify the WAN and LAN roles before connecting the VM to a physical network.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0236.html"&gt;i12bretro – Install OPNsense in VirtualBox&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=f4M_wRnKZIo"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/f4M_wRnKZIo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="create-the-virtual-machine"&gt;Create the virtual machine&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download OPNsense from &lt;a href="https://opnsense.org/download/"&gt;opnsense.org/download&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Extract the &lt;code&gt;.bz2&lt;/code&gt; archive and open VirtualBox.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Machine &amp;gt; New&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Name the VM &lt;code&gt;OPNSense&lt;/code&gt;, set Type to &lt;code&gt;BSD&lt;/code&gt;, and Version to &lt;code&gt;FreeBSD (64-bit)&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Assign &lt;code&gt;1024 MB&lt;/code&gt; of memory and create a virtual hard disk.&lt;/li&gt;&#10;&lt;li&gt;Name the disk &lt;code&gt;OPNSense.vdi&lt;/code&gt;, set its size to &lt;code&gt;8 GB&lt;/code&gt;, choose &lt;code&gt;VDI&lt;/code&gt;, and use &lt;strong&gt;Dynamically Allocated&lt;/strong&gt; storage.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Settings &amp;gt; Display&lt;/strong&gt; and set Video Memory to &lt;code&gt;128 MB&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Storage&lt;/strong&gt; and attach the OPNsense ISO to the CD-ROM drive.&lt;/li&gt;&#10;&lt;li&gt;In &lt;strong&gt;Network&lt;/strong&gt;, set Adapter 1 to &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Enable Adapter 2 and also set it to &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-opnsense"&gt;Install OPNsense&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Start the VM with &lt;strong&gt;Start &amp;gt; Normal&lt;/strong&gt; and wait for the login prompt.&lt;/li&gt;&#10;&lt;li&gt;Log in to the installer with &lt;code&gt;installer&lt;/code&gt; / &lt;code&gt;opnsense&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Enter&lt;/strong&gt; at the Welcome screen.&lt;/li&gt;&#10;&lt;li&gt;Change the keymap or video font if necessary, then select &lt;strong&gt;Accept these Settings&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Guided installation&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the &lt;code&gt;ada0&lt;/code&gt; disk and choose &lt;code&gt;GPT/UEFI&lt;/code&gt; mode.&lt;/li&gt;&#10;&lt;li&gt;Wait for OPNsense to copy files and complete the installation.&lt;/li&gt;&#10;&lt;li&gt;Set and confirm a new root password, then choose &lt;strong&gt;Accept and Set Password&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Reboot&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Before rebooting, use VirtualBox &lt;strong&gt;Devices &amp;gt; Optical Drives &amp;gt; Remove disk from virtual drive&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Machine &amp;gt; Reset&lt;/strong&gt; so the VM boots from its virtual disk.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="configure-the-lan-and-web-ui"&gt;Configure the LAN and Web UI&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log in to the terminal as &lt;code&gt;root&lt;/code&gt; with the new root password.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Set interface IP address&lt;/strong&gt; by entering &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the interface that will be used as LAN.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;n&lt;/code&gt; at the DHCP prompt.&lt;/li&gt;&#10;&lt;li&gt;Enter a LAN IP on the same subnet as the management network.&lt;/li&gt;&#10;&lt;li&gt;Enter bit count &lt;code&gt;24&lt;/code&gt; when using a &lt;code&gt;/24&lt;/code&gt; subnet.&lt;/li&gt;&#10;&lt;li&gt;Leave the IPv4 upstream gateway empty.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;n&lt;/code&gt; for IPv6 WAN tracking.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;n&lt;/code&gt; for IPv6 DHCP, then leave the IPv6 address empty.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;n&lt;/code&gt; at the DHCP server prompt.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;y&lt;/code&gt; at the revert-to-HTTP prompt if this is only initial setup on a trusted LAN.&lt;/li&gt;&#10;&lt;li&gt;Record the Web UI address shown by the terminal.&lt;/li&gt;&#10;&lt;li&gt;Open that address in a browser and log in as &lt;code&gt;root&lt;/code&gt; with the new password.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Do not keep the default password. Bridged Adapter can place OPNsense directly on the physical network; assigning the two adapters incorrectly can create a loop or interrupt connectivity.&lt;/p&gt;</description></item><item><title>Connect to Your HomeLab Remotely with Tailscale in Docker</title><link>https://aiot.io.vn/en/posts/tailscale-docker-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:15:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/tailscale-docker-i12bretro/</guid><description>&lt;p&gt;Tailscale creates a private WireGuard-based network for reaching HomeLab services without exposing every service port to the Internet. This article adapts the Docker-based setup and enables subnet routing into a LAN.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0110.html"&gt;i12bretro – Tailscale in Docker&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=0bVX6msiqQk"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/0bVX6msiqQk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="prepare-the-tailscale-account"&gt;Prepare the Tailscale account&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open &lt;a href="https://login.tailscale.com/"&gt;login.tailscale.com&lt;/a&gt; and sign in with an available SSO method.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;DNS &amp;gt; Add nameserver &amp;gt; Custom&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Enter the DNS server used by the LAN and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Settings &amp;gt; Keys&lt;/strong&gt; under Personal Settings.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Generate auth key&amp;hellip;&lt;/strong&gt;, enable &lt;strong&gt;Reusable&lt;/strong&gt;, and generate the key.&lt;/li&gt;&#10;&lt;li&gt;Keep the auth key secure for the container step. Never place the real key in Markdown, logs, or Git.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-docker-on-the-linux-host"&gt;Install Docker on the Linux host&lt;/h2&gt;&#10;&lt;p&gt;On the Linux machine that will run the gateway, install Docker and enable its service:&lt;/p&gt;</description></item><item><title>Run Home Assistant OS as a VM on Proxmox VE</title><link>https://aiot.io.vn/en/posts/home-assistant-os-proxmox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:10:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/home-assistant-os-proxmox-i12bretro/</guid><description>&lt;p&gt;This article adapts the process of creating a Home Assistant OS (HAOS) VM on Proxmox VE, downloading the latest qcow2 image from GitHub, and importing it into Proxmox storage. The CPU and memory values are starting points; adjust them for the actual integrations and add-ons in use.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0877.html"&gt;i12bretro – Running HAOS VM in Proxmox VE&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=nFoa9Tfjw14"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/nFoa9Tfjw14" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="create-the-haos-vm-on-proxmox"&gt;Create the HAOS VM on Proxmox&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log into the Proxmox Web UI.&lt;/li&gt;&#10;&lt;li&gt;Right-click the Proxmox node and select &lt;strong&gt;Create VM&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Assign a unique VM ID and name; record the VM ID for the disk import step.&lt;/li&gt;&#10;&lt;li&gt;On the &lt;strong&gt;OS&lt;/strong&gt; tab, select &lt;strong&gt;Do not use any media&lt;/strong&gt;, leaving Type as &lt;code&gt;Linux&lt;/code&gt; and Version as &lt;code&gt;5.x - 2.6 Kernel&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;On the &lt;strong&gt;System&lt;/strong&gt; tab, select BIOS &lt;code&gt;OVMF (UEFI)&lt;/code&gt;, enable &lt;strong&gt;Add EFI Disk&lt;/strong&gt;, and disable &lt;strong&gt;Pre-Enroll Keys&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;On the &lt;strong&gt;Hard Disk&lt;/strong&gt; tab, delete the default &lt;code&gt;scsi0&lt;/code&gt; disk.&lt;/li&gt;&#10;&lt;li&gt;On the &lt;strong&gt;CPU&lt;/strong&gt; tab, assign at least &lt;code&gt;2&lt;/code&gt; cores and set Type to &lt;code&gt;host&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;On the &lt;strong&gt;Memory&lt;/strong&gt; tab, set memory to &lt;code&gt;2048&lt;/code&gt; MB or more as needed.&lt;/li&gt;&#10;&lt;li&gt;Keep the defaults on the &lt;strong&gt;Network&lt;/strong&gt; tab, verify the summary, and click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="download-and-import-the-qcow2-image"&gt;Download and import the qcow2 image&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Select the Proxmox node and open &lt;strong&gt;Shell&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Install the &lt;code&gt;xz&lt;/code&gt; extraction utility:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apt install xz-utils -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;Resolve the latest HAOS release image through the GitHub API:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;regex&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;browser_download_url&amp;#34;: &amp;#34;(https:\/\/github.com\/home-assistant\/operating-system\/releases\/download\/[^/]*\/haos_ova-[^/]*\.qcow2\.xz)&amp;#34;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;response&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;curl -s https://api.github.com/repos/home-assistant/operating-system/releases/latest&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $response &lt;span style="color:#f92672"&gt;=&lt;/span&gt;~ $regex &lt;span style="color:#f92672"&gt;]]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; downloadURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;BASH_REMATCH[1]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;&#10;&lt;li&gt;Download the image to a temporary directory and extract it:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /tmp/HAOS.qcow2.xz $downloadURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unxz /tmp/HAOS.qcow2.xz -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;&#10;&lt;li&gt;Import the disk into the VM. Replace &lt;code&gt;104&lt;/code&gt; with the real VM ID and &lt;code&gt;SSD_100GB&lt;/code&gt; with a Proxmox storage name:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qm importdisk &lt;span style="color:#ae81ff"&gt;104&lt;/span&gt; /tmp/HAOS.qcow2 SSD_100GB&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="attach-the-disk-and-boot-haos"&gt;Attach the disk and boot HAOS&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Return to the Web UI, select the HAOS VM, and open &lt;strong&gt;Hardware&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Double-click &lt;strong&gt;Unused Disk&lt;/strong&gt; and click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Options&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Double-click &lt;strong&gt;Boot Order&lt;/strong&gt;, enable &lt;code&gt;scsi0&lt;/code&gt;, and move it above &lt;code&gt;net0&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;, then click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Console&lt;/strong&gt; to confirm that HAOS has started.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="complete-home-assistant-setup"&gt;Complete Home Assistant setup&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open &lt;code&gt;http://DNSorIP:8123&lt;/code&gt; in a browser.&lt;/li&gt;&#10;&lt;li&gt;Create a Home Assistant Name, Username, and Password.&lt;/li&gt;&#10;&lt;li&gt;Name the installation, for example &lt;code&gt;Home&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Detect&lt;/strong&gt; to set the installation location.&lt;/li&gt;&#10;&lt;li&gt;Verify the Unit System and Currency, then click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select any anonymous data to share with the Home Assistant development team.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Do not reuse the example VM ID or storage name unless they exist on the local system. Back up Proxmox and make sure the target storage has enough free space before importing the image.&lt;/p&gt;</description></item><item><title>Install AdGuard Home on an OpenWrt Router</title><link>https://aiot.io.vn/en/posts/adguardhome-openwrt-router-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:05:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/adguardhome-openwrt-router-i12bretro/</guid><description>&lt;p&gt;AdGuard Home can act as a network DNS server that centrally filters ads and tracking domains. This article adapts the direct-on-router installation flow for OpenWrt; check RAM, flash storage, and the current owner of DNS port 53 before starting.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0442.html"&gt;i12bretro – Install AdGuard Home on an OpenWRT Router&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=JExdRIHZDMU"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/JExdRIHZDMU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;An OpenWrt router with working LuCI and SSH access.&lt;/li&gt;&#10;&lt;li&gt;The router CPU architecture: &lt;code&gt;arm32&lt;/code&gt;, &lt;code&gt;arm64&lt;/code&gt;, &lt;code&gt;mipsel&lt;/code&gt;, or another supported target.&lt;/li&gt;&#10;&lt;li&gt;Enough storage for the binary, filters, query logs, and statistics.&lt;/li&gt;&#10;&lt;li&gt;The router IP address, SSH credentials, and a management computer.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;AdGuard Home normally needs DNS port &lt;code&gt;53&lt;/code&gt; to receive queries directly. Dnsmasq or another resolver may need to move to a different port, so inspect the current services before stopping anything.&lt;/p&gt;</description></item><item><title>Install pfSense Firewall/Router in VirtualBox</title><link>https://aiot.io.vn/en/posts/pfsense-firewall-router-virtualbox-i12bretro/</link><pubDate>Thu, 27 Aug 2026 13:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/pfsense-firewall-router-virtualbox-i12bretro/</guid><description>&lt;p&gt;This article adapts the process of creating a pfSense virtual machine in VirtualBox with two network adapters for WAN and LAN. It focuses on the initial installation; network subnets, DHCP, and firewall rules should be designed for the actual lab topology.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Source reference: &lt;a href="https://i12bretro.github.io/tutorials/0235.html"&gt;i12bretro – Install pfSense Firewall and Router in VirtualBox&lt;/a&gt;. The original video belongs to &lt;a href="https://www.youtube.com/watch?v=mNtr5wAIlsk"&gt;i12bretro on YouTube&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] shadow-[0_4px_20px_rgba(0,0,0,0.1)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.5)] overflow-hidden bg-black aspect-video max-w-4xl"&gt;&#10;&lt;iframe class="w-full h-full" src="https://www.youtube.com/embed/mNtr5wAIlsk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen loading="lazy"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The pfSense installer from the &lt;a href="https://www.pfsense.org/download/"&gt;official download page&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;VirtualBox installed on the host.&lt;/li&gt;&#10;&lt;li&gt;Two network connections if the VM will operate as a router: one WAN and one LAN connection.&lt;/li&gt;&#10;&lt;li&gt;Back up the current network configuration before testing.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="create-the-vm-and-attach-the-iso"&gt;Create the VM and attach the ISO&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Extract the pfSense &lt;code&gt;.gz&lt;/code&gt; archive if the download is compressed.&lt;/li&gt;&#10;&lt;li&gt;Open VirtualBox, select &lt;strong&gt;Machine &amp;gt; New&lt;/strong&gt;, create the VM, and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Create a virtual disk sized for the lab and finish the wizard.&lt;/li&gt;&#10;&lt;li&gt;Select the VM, open &lt;strong&gt;Settings &amp;gt; Display&lt;/strong&gt;, and set Video Memory to &lt;code&gt;128 MB&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Storage&lt;/strong&gt;, select the CD-ROM drive, then choose &lt;strong&gt;Choose a virtual optical disc file&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the pfSense ISO and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Network&lt;/strong&gt; and set Adapter 1 to &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open the &lt;strong&gt;Adapter 2&lt;/strong&gt; tab, enable it, and also select &lt;strong&gt;Bridged Adapter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;OK&lt;/strong&gt;, select the VM, and choose &lt;strong&gt;Start &amp;gt; Normal&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="install-pfsense"&gt;Install pfSense&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Press &lt;strong&gt;Enter&lt;/strong&gt; to accept the copyright and distribution notice.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Install pfSense&lt;/strong&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the required keyboard mapping.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Auto (UFS) Guided Disk Setup&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Wait while pfSense copies files and installs to the virtual disk.&lt;/li&gt;&#10;&lt;li&gt;At &lt;strong&gt;Manual Configuration&lt;/strong&gt;, select &lt;strong&gt;No&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Reboot&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Before the VM boots again, use &lt;strong&gt;Devices &amp;gt; Optical Drives &amp;gt; Remove disk from virtual drive&lt;/strong&gt; in VirtualBox.&lt;/li&gt;&#10;&lt;li&gt;Select &lt;strong&gt;Machine &amp;gt; Reset&lt;/strong&gt; so the VM boots from its virtual disk.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="assign-the-lan-address-and-open-the-web-ui"&gt;Assign the LAN address and open the Web UI&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;In the pfSense menu, select &lt;strong&gt;Set interface(s) IP address&lt;/strong&gt; by entering &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the interface that will be used as LAN.&lt;/li&gt;&#10;&lt;li&gt;Enter a LAN address on the same subnet as the management computer.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;24&lt;/code&gt; at the bit-count prompt when using a &lt;code&gt;/24&lt;/code&gt; network.&lt;/li&gt;&#10;&lt;li&gt;Leave the IPv4 upstream gateway empty for the LAN interface.&lt;/li&gt;&#10;&lt;li&gt;Leave the IPv6 address empty if IPv6 is not being used.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;n&lt;/code&gt; when asked whether to enable the DHCP server; DHCP can be configured later in the Web UI.&lt;/li&gt;&#10;&lt;li&gt;Enter &lt;code&gt;y&lt;/code&gt; when asked to revert to HTTP if this is only an initial setup on a trusted lab network.&lt;/li&gt;&#10;&lt;li&gt;Note the Web UI address shown in the terminal.&lt;/li&gt;&#10;&lt;li&gt;Open that address in a browser from the management computer.&lt;/li&gt;&#10;&lt;li&gt;Log in initially with &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;pfsense&lt;/code&gt;, then open &lt;strong&gt;System &amp;gt; User Manager&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Edit the &lt;code&gt;admin&lt;/code&gt; account, set a new password, save it, log out, and log in again.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Do not keep the default password. Use Bridged Adapter only when the role of each interface is understood; an incorrect topology can create a loop or interrupt the physical network.&lt;/p&gt;</description></item><item><title>OpenWrt Multi-WAN with mwan3-nft: Requirements and Preparation</title><link>https://aiot.io.vn/en/serial/openwrt/multiwan-mwan3-nft-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:30:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/multiwan-mwan3-nft-openwrt/</guid><description>&lt;p&gt;Multi-WAN allows a router to use several Internet connections for load balancing or failover. On newer OpenWrt releases, &lt;code&gt;mwan3-nft&lt;/code&gt; is the nftables-compatible branch, but several requirements must be checked before installation.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="version-requirements"&gt;Version requirements&lt;/h2&gt;&#10;&lt;p&gt;The OpenWrt documentation currently states that the nftables version of mwan3 is supported only on &lt;strong&gt;OpenWrt 25.12 or newer&lt;/strong&gt;. Although OpenWrt has used firewall4 and nftables since 22.03, compatibility with older releases has not been verified.&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Reduce Bufferbloat on OpenWrt with SQM for a Home Network</title><link>https://aiot.io.vn/en/serial/openwrt/sqm-giam-bufferbloat-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:20:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/sqm-giam-bufferbloat-openwrt/</guid><description>&lt;p&gt;When someone downloads a file, watches video, or synchronizes large data, ping can rise sharply even though the connection is still fast. This is commonly called &lt;strong&gt;bufferbloat&lt;/strong&gt;. On OpenWrt, SQM can control the queues and keep latency more stable.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="what-does-sqm-solve"&gt;What does SQM solve?&lt;/h2&gt;&#10;&lt;p&gt;SQM does not make an Internet plan faster. It schedules and regulates packets so the router does not keep too much data in its buffers. Latency-sensitive activities such as video calls, VoIP, and gaming are therefore less affected by background traffic.&lt;/p&gt;</description></item><item><title>Basic Network Configuration on OpenWrt with LuCI and UCI</title><link>https://aiot.io.vn/en/serial/openwrt/cau-hinh-mang-co-ban-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:10:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/cau-hinh-mang-co-ban-openwrt/</guid><description>&lt;p&gt;In OpenWrt, a logical interface does not necessarily correspond to one physical Ethernet port.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; An interface can represent a bridge, VLAN, Wi-Fi network, or tunnel. Understanding this helps avoid mistakes when adding VLANs or multiple WANs.&lt;/p&gt;&#10;&lt;h2 id="three-components-to-distinguish"&gt;Three components to distinguish&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Device:&lt;/strong&gt; a lower-level network device or bridge.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Interface:&lt;/strong&gt; a logical configuration containing a protocol, IP address, and gateway.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Firewall zone:&lt;/strong&gt; a group of interfaces sharing firewall policies.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;For example, &lt;code&gt;lan&lt;/code&gt; can run on a bridge device containing several LAN ports and internal SSIDs.&lt;/p&gt;</description></item><item><title>OpenWrt Firewall Zone: Create a Guest Network with Internet-Only Access</title><link>https://aiot.io.vn/en/serial/openwrt/firewall-zone-guest-openwrt/</link><pubDate>Thu, 27 Aug 2026 06:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/firewall-zone-guest-openwrt/</guid><description>&lt;p&gt;Creating a Guest SSID alone does not protect the internal network. To prevent Guest clients from reaching NAS devices, cameras, or management interfaces, create a separate network and control forwarding with a firewall zone.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#10;&lt;h2 id="suggested-model"&gt;Suggested model&lt;/h2&gt;&#10;&lt;p&gt;A simple model contains:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;lan&lt;/code&gt;: the home network, allowed to access the router and internal services.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;guest&lt;/code&gt;: the Guest network with its own DHCP service.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;wan&lt;/code&gt;: the path to the Internet.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The Guest zone should:&lt;/p&gt;</description></item><item><title>Basic Wi-Fi Configuration on OpenWrt for Beginners</title><link>https://aiot.io.vn/en/serial/openwrt/cau-hinh-wifi-co-ban-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:50:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/cau-hinh-wifi-co-ban-openwrt/</guid><description>&lt;p&gt;OpenWrt separates the physical radio from the Wi-Fi network configuration.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; After installing the firmware, Wi-Fi may remain disabled until the radio is enabled, an SSID is configured, and the interface is attached to the correct network.&lt;/p&gt;&#10;&lt;h2 id="preparation"&gt;Preparation&lt;/h2&gt;&#10;&lt;p&gt;Before configuring Wi-Fi, confirm:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The router is running firmware for the correct model.&lt;/li&gt;&#10;&lt;li&gt;The computer can access LuCI over Ethernet.&lt;/li&gt;&#10;&lt;li&gt;The name of the current LAN network, usually &lt;code&gt;lan&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;A country code appropriate for the location.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="configure-wi-fi-with-luci"&gt;Configure Wi-Fi with LuCI&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Network → Wireless&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the 2.4 GHz or 5 GHz radio.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Enable&lt;/strong&gt; if the radio is disabled.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Edit&lt;/strong&gt; on the Wi-Fi interface.&lt;/li&gt;&#10;&lt;li&gt;Set the SSID in &lt;strong&gt;General Setup&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Under &lt;strong&gt;Network&lt;/strong&gt;, select &lt;code&gt;lan&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Wireless Security&lt;/strong&gt; and choose WPA2-PSK or WPA3-SAE if clients support it.&lt;/li&gt;&#10;&lt;li&gt;Set a strong password and click &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Do not reuse the same SSID for different networks unless you understand how the bridge and firewall zones work.&lt;/p&gt;</description></item><item><title>How to Safely Back Up and Restore OpenWrt Configuration</title><link>https://aiot.io.vn/en/serial/openwrt/backup-restore-cau-hinh-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:40:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/backup-restore-cau-hinh-openwrt/</guid><description>&lt;p&gt;Once an OpenWrt configuration is stable, the first thing I usually do is create a backup.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; It makes recovery much faster after testing packages, changing firewall rules, or upgrading firmware.&lt;/p&gt;&#10;&lt;h2 id="when-should-you-create-a-backup"&gt;When should you create a backup?&lt;/h2&gt;&#10;&lt;p&gt;Back up before:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Upgrading firmware.&lt;/li&gt;&#10;&lt;li&gt;Changing network, VLAN, or firewall settings.&lt;/li&gt;&#10;&lt;li&gt;Installing packages that affect DNS, DHCP, or Wi-Fi.&lt;/li&gt;&#10;&lt;li&gt;Moving a configuration to the same model and compatible firmware version.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;A configuration backup does not replace firmware verification. A backup from one router may not be suitable for another model.&lt;/p&gt;</description></item><item><title>RouterOS v7: Route Clients Through Multiple WANs with Routing Rules</title><link>https://aiot.io.vn/en/serial/mikrotik/routeros-routing-rules-routing-client/</link><pubDate>Thu, 27 Aug 2026 05:30:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/mikrotik/routeros-routing-rules-routing-client/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;This article uses a real RouterOS 7.21.5 configuration to demonstrate how individual clients can be routed through multiple WANs. The IP addresses and interface names are kept in the examples so they can be compared with WinBox.&lt;/p&gt;&#10;&lt;p&gt;Do not copy the complete configuration to another router. Check interface names, gateways, routing tables, and IP ranges first.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="configuration-goal"&gt;Configuration goal&lt;/h2&gt;&#10;&lt;p&gt;The goal is to select a WAN for each LAN client:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Client &lt;code&gt;10.0.0.10&lt;/code&gt; uses &lt;code&gt;VNPT1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Client &lt;code&gt;10.0.0.11&lt;/code&gt; uses &lt;code&gt;VT2&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Client &lt;code&gt;10.0.0.12&lt;/code&gt; uses the &lt;code&gt;main&lt;/code&gt; table.&lt;/li&gt;&#10;&lt;li&gt;Client &lt;code&gt;10.0.0.15&lt;/code&gt; uses &lt;code&gt;VNPT1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Client &lt;code&gt;10.0.1.25&lt;/code&gt; uses &lt;code&gt;VNPT1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This is commonly called policy routing or source-based routing: the router selects a path based on the source address instead of using only one shared default route.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>OpenWrt SDK and Toolchain: Choosing the Correct Build Tool</title><link>https://aiot.io.vn/en/serial/openwrt/openwrt-sdk-toolchain/</link><pubDate>Thu, 27 Aug 2026 05:10:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/openwrt-sdk-toolchain/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;The SDK and toolchain can produce incompatible packages when the branch, target, or ABI differs. Always use the tool that matches the target firmware.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="sdk-toolchain-and-build-system"&gt;SDK, toolchain, and build system&lt;/h2&gt;&#10;&lt;p&gt;These concepts are related but different:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Build system:&lt;/strong&gt; the complete OpenWrt build environment. It can create the toolchain, kernel, root filesystem, packages, and firmware image.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Toolchain:&lt;/strong&gt; the compiler and cross-compilation tools used to build for the target architecture, such as ARM or MIPS rather than the build computer&amp;rsquo;s CPU.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SDK:&lt;/strong&gt; a smaller environment normally used to compile external packages for a known firmware target.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The SDK is useful when you need to build an individual package without rebuilding the entire firmware.&lt;/p&gt;</description></item><item><title>How to Use the OpenWrt ImageBuilder</title><link>https://aiot.io.vn/en/serial/openwrt/su-dung-imagebuilder-openwrt/</link><pubDate>Thu, 27 Aug 2026 05:05:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/su-dung-imagebuilder-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;ImageBuilder is suitable only when its version, target, subtarget, and profile match the router. Never use an ImageBuilder for another model.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="what-is-imagebuilder"&gt;What is ImageBuilder?&lt;/h2&gt;&#10;&lt;p&gt;ImageBuilder is a precompiled environment for quickly creating a customized firmware image from packages already available in the repository. It can add or remove packages, add configuration files, and create a flashable image without compiling all of OpenWrt from source.&lt;/p&gt;&#10;&lt;p&gt;If you need to modify the kernel, drivers, target, or a package that has no matching binary, use the full source build system instead.&lt;/p&gt;</description></item><item><title>How to Build OpenWrt from Source for Beginners</title><link>https://aiot.io.vn/en/serial/openwrt/build-openwrt-tu-source/</link><pubDate>Thu, 27 Aug 2026 05:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/build-openwrt-tu-source/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;This article is based on the official OpenWrt documentation, with additional explanations for beginners. Never flash an image built for one model onto another model without checking the target, profile, and recovery method.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="when-should-you-build-openwrt-from-source"&gt;When should you build OpenWrt from source?&lt;/h2&gt;&#10;&lt;p&gt;A source build is useful when you want to customize the kernel, packages, patches, default configuration, or firmware for a specific target. If you only need to add packages to an existing image, ImageBuilder is usually faster and simpler.&lt;/p&gt;</description></item><item><title>TP-Link TL-AC100 v6.0: Hardware and Feature Overview</title><link>https://aiot.io.vn/en/posts/tl-ac100-v6-0-tom-tat/</link><pubDate>Thu, 27 Aug 2026 04:30:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/tl-ac100-v6-0-tom-tat/</guid><description>&lt;h2 id="what-is-the-tl-ac100-v60-used-for"&gt;What is the TL-AC100 v6.0 used for?&lt;/h2&gt;&#10;&lt;p&gt;The TP-Link TL-AC100 is a centralized controller for TP-Link access point systems. It can discover, authorize, and manage multiple APs from one interface, making it suitable for a large home network, a small office, or a shop that needs to manage several access points.&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="notable-points-of-version-60"&gt;Notable points of version 6.0&lt;/h2&gt;&#10;&lt;p&gt;According to the acwifi.net teardown, the TL-AC100 v6.0 retains a metal enclosure and five Gigabit Ethernet ports. This is a notable improvement over versions up to v4.0, which used Fast Ethernet ports.&lt;/p&gt;</description></item><item><title>Xiaomi BE3600 Black Edition (RD16) Teardown: MediaTek Platform &amp; Impressive 5GHz Range</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</link><pubDate>Sun, 21 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</guid><description/></item><item><title>Xiaomi BE3600 Black Edition (RD16) Teardown: MediaTek Platform &amp; Impressive 5GHz Range</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</link><pubDate>Sun, 21 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-mau-den-rd16/</guid><description>&lt;p&gt;Following the release of the Qualcomm-powered white version, Xiaomi released a new &lt;strong&gt;Black Edition of the BE3600&lt;/strong&gt;, designated under product model &lt;strong&gt;RD16&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;While it carries the identical &lt;strong&gt;BE3600&lt;/strong&gt; commercial badge, the internals are entirely different: &lt;strong&gt;Xiaomi replaced the entire Qualcomm platform with a MediaTek / Airoha chipset&lt;/strong&gt;, omitted the 2.5GbE port, and fitted four standard Gigabit Ethernet ports.&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2026/06/DSC_7025.jpg" alt="Xiaomi BE3600 Black retail box" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Xiaomi BE3600 1.25A White Teardown: Internal Hardware &amp; Cost-Down Analysis</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</link><pubDate>Thu, 11 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</guid><description/></item><item><title>Xiaomi BE3600 1.25A White Teardown: Internal Hardware &amp; Cost-Down Analysis</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</link><pubDate>Thu, 11 Jun 2026 09:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-xiaomi-be3600-ban-1.25a/</guid><description>&lt;p&gt;The popular budget Wi-Fi 7 router &lt;strong&gt;Xiaomi BE3600&lt;/strong&gt; has recently seen a new hardware revision in the market. In this article, we tear down the &lt;strong&gt;Xiaomi BE3600 1.25A white version&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;We specifically designate this unit as the &lt;strong&gt;1.25A White version&lt;/strong&gt; for two main reasons:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Xiaomi subsequently introduced a black version under model code &lt;strong&gt;RD16&lt;/strong&gt; (which features all 1Gbps Gigabit Ethernet ports without the 2.5G port).&lt;/li&gt;&#10;&lt;li&gt;The initial white BE3600 batches shipped with a &lt;strong&gt;12V / 1.5A&lt;/strong&gt; DC power adapter, whereas this recent production batch ships with a &lt;strong&gt;12V / 1.25A&lt;/strong&gt; power supply.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;The unit examined here was manufactured in April 2024. Its serial number (SN) prefix remains &lt;code&gt;54817&lt;/code&gt;, and its product model number is still officially &lt;strong&gt;RD15&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>TP-LINK 7DR7299 No-Disassembly OpenWrt Flashing Guide &amp; Performance Benchmark</title><link>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299-posts/huong-dan-flash-openwrt-tplink-7dr7299/</link><pubDate>Fri, 27 Mar 2026 08:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299-posts/huong-dan-flash-openwrt-tplink-7dr7299/</guid><description>&lt;p&gt;The &lt;strong&gt;TP-LINK TL-7DR7299&lt;/strong&gt; Wi-Fi 7 router is powered by the &lt;strong&gt;MediaTek MT7988AV (Filogic 880)&lt;/strong&gt; quad-core Cortex-A73 SoC @ 1.8GHz, complemented by 1GB of RAM and a potent dual 10G + quad 2.5G port array. Recently, a breakthrough flashing method has emerged that allows deploying &lt;strong&gt;OpenWrt / ImmortalWrt&lt;/strong&gt; on this device &lt;strong&gt;without physical disassembly or UART soldering&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Here is a hands-on walkthrough of the web-based flashing procedure, CoreMark CPU benchmark results, Argon theme and iStore deployment, as well as an honest look at existing software limitations.&lt;/p&gt;</description></item><item><title>TP-LINK TL-7DR7299 BE7200 Specifications and Firmware</title><link>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299/</guid><description>&lt;h2 id="i-overview"&gt;I. Overview&lt;/h2&gt;&#10;&lt;p&gt;The &lt;strong&gt;TP-Link TL-7DR7299&lt;/strong&gt; is a dual-band BE7200 Wi-Fi 7 router housed in TP-Link&amp;rsquo;s renowned &amp;ldquo;Feiliu&amp;rdquo; chassis. It delivers a standout combination of multi-gigabit interfaces and powerful processing at an accessible price point (~999 RMB / $140 USD):&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Processor (SoC)&lt;/strong&gt;: MediaTek &lt;strong&gt;MT7988AV&lt;/strong&gt; (Filogic 880) featuring 4x ARM Cortex-A73 cores at 1.8GHz on an efficient 12nm process, with dual 10G USXGMII buses.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Memory&lt;/strong&gt;: &lt;strong&gt;1GB DDR4 RAM&lt;/strong&gt; (2x 512MB EtronTech) and &lt;strong&gt;128MB SPI NAND Flash&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Port Array&lt;/strong&gt;: &lt;strong&gt;Dual 10G interfaces&lt;/strong&gt; (1x 10G SFP+ optical cage and 1x 10G RJ45 copper port), &lt;strong&gt;four 2.5GbE ports&lt;/strong&gt;, &lt;strong&gt;two 1GbE ports&lt;/strong&gt;, and a &lt;strong&gt;USB 3.0 Type-C port&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Wireless Performance&lt;/strong&gt;: Wi-Fi 7 BE7200 (2.4GHz 1376 Mbps + 5GHz 5765 Mbps) with 4T4R on 2.4G and 4T5R on 5G, supported by high-power external Front-End Modules (Vanchip VC5333 + Kangxi KCT8548HE-1).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Custom Firmware&lt;/strong&gt;: Supported by OpenWrt / ImmortalWrt builds with a &lt;strong&gt;web-based flashing method requiring no physical chassis disassembly&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="ii-detailed-hardware-specifications"&gt;II. Detailed Hardware Specifications&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Category&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Hardware Details&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;TP-LINK TL-7DR7299 (Hardware Ver: 1.0)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Wi-Fi Standard&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;IEEE 802.11a/b/g/n/ac/ax/be (Wi-Fi 7 BE7200)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Max Wireless Rates&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;2.4GHz: &lt;strong&gt;1376 Mbps&lt;/strong&gt; (40MHz, 4096-QAM)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;5GHz: &lt;strong&gt;5765 Mbps&lt;/strong&gt; (160MHz, 4096-QAM)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Antenna Layout&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;6 external antennas (1 dual-band 2.4G/5G, 1 dedicated 2.4G, 4 dedicated 5G)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;2.4G: 4T4R, 5G: &lt;strong&gt;4T5R&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Processor (SoC)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;MediaTek MT7988AV (Quad-core Cortex-A73 @ 1.8GHz, 12nm)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;1GB DDR4-3200 (EtronTech M16U4G16256A-QLBG x2)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Flash Memory&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;128MB SPI NAND (ESMT F50L1G41LC)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Switch &amp;amp; PHY Silicon&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;2.5G Switch: Realtek RTL8372N (2x 10G USXGMII + 4x 2.5G PHY)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;10G PHY: Realtek RTL8261D (100M/1G/2.5G/5G/10G)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Physical I/O&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;- 1x 10G SFP+ optical cage&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1x 10G RJ45 copper port&lt;/li&gt;&#10;&lt;li&gt;4x 2.5GbE RJ45&lt;/li&gt;&#10;&lt;li&gt;2x 1GbE RJ45&lt;/li&gt;&#10;&lt;li&gt;1x USB 3.0 Type-C (ASMedia ASM1543 controller) |&#10;| &lt;strong&gt;Wireless Features&lt;/strong&gt; | 802.11k/v Fast Roaming, MU-MIMO, Beamforming, MLO, 4096-QAM |&#10;| &lt;strong&gt;Power Supply&lt;/strong&gt; | Included 12V/4A (48W). Real consumption: 8.2W (idle) to 13.8W (all ports linked) |&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="iii-featured-articles-for-tp-link-7dr7299"&gt;III. Featured Articles for TP-LINK 7DR7299&lt;/h2&gt;&#10;&lt;h3 id="1-hardware-teardown--component-analysis"&gt;1. Hardware Teardown &amp;amp; Component Analysis&lt;/h3&gt;&#10;&lt;p&gt;Explore the internal layout, aluminum heat spreaders, individual chip packages, and the 14.21 Mpps small-packet test:&#10;👉 &lt;strong&gt;&lt;a href="https://aiot.io.vn/en/serial/disassemble/mo-xe-tplink-7dr7299/"&gt;TP-Link TL-7DR7299 Teardown: BE7200 Wi-Fi 7, Dual 10G Ports, Quad 2.5G Ports, and MediaTek MT7988A&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>TP-LINK TL-7DR7299 Teardown: BE7200 Wi-Fi 7, Dual 10G Ports, Quad 2.5G Ports</title><link>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299-posts/mo-xe-tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/tp-link/tplink-7dr7299-posts/mo-xe-tplink-7dr7299/</guid><description/></item><item><title>TP-LINK TL-7DR7299 Teardown: BE7200 Wi-Fi 7, Dual 10G Ports, Quad 2.5G Ports</title><link>https://aiot.io.vn/en/serial/disassemble/mo-xe-tplink-7dr7299/</link><pubDate>Thu, 26 Mar 2026 01:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/mo-xe-tplink-7dr7299/</guid><description>&lt;p&gt;The &lt;strong&gt;TP-Link TL-7DR7299&lt;/strong&gt; might easily be the coolest-running wireless router to date housed in the iconic &amp;ldquo;Feiliu&amp;rdquo; dual-band chassis (the classic mold shared with the XDR5480, XDR6080, and 7DR7290).&lt;/p&gt;&#10;&lt;p&gt;In the dual-band &lt;strong&gt;BE7200 Wi-Fi 7&lt;/strong&gt; space, the 7DR7299 makes a bold statement by packing &lt;strong&gt;dual 10-Gigabit ports (one 10G SFP+ optical cage and one 10G RJ45 copper port)&lt;/strong&gt;, accompanied by &lt;strong&gt;four 2.5GbE ports&lt;/strong&gt;, &lt;strong&gt;two Gigabit ports&lt;/strong&gt;, and a &lt;strong&gt;USB 3.0 Type-C interface&lt;/strong&gt;—all under a price tag of roughly 999 RMB (around $140 USD).&lt;/p&gt;</description></item><item><title>KiddoCare: The All-in-One Digital Journal &amp; Pediatric Growth Assistant</title><link>https://aiot.io.vn/en/posts/kiddocare-ung-dung-theo-doi-bach-phan-vi-tre-em/</link><pubDate>Tue, 23 Dec 2025 16:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/kiddocare-ung-dung-theo-doi-bach-phan-vi-tre-em/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Medical Disclaimer:&lt;/strong&gt; The app provides information derived from established research published by world-renowned health institutions (WHO, CDC, US National Institutes of Health NIH), and vaccination timelines adhere to national expanded immunization guidelines. All data and tools are designed for scientific educational reference and should never substitute professional medical advice, diagnosis, or clinical care.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;When vibrant Neo-Brutalism design meets stringent WHO &amp;amp; Denver II pediatric benchmarks – empowering parents with a child-care companion that is scientifically rigorous, dependable, intuitive, and inspiring.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Introducing the AIoT.IO.VN Firmware Translator</title><link>https://aiot.io.vn/en/posts/aiot-io-vn-firmware-translator/</link><pubDate>Fri, 31 Oct 2025 02:00:00 +0000</pubDate><guid>https://aiot.io.vn/en/posts/aiot-io-vn-firmware-translator/</guid><description>&lt;h2 id="i-main-features"&gt;I. Main features&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;unPack / rePack Firmware: Extract and repack firmware images.&lt;/li&gt;&#10;&lt;li&gt;Resign Firmware: Automatically re-sign firmware with a custom RSA key.&lt;/li&gt;&#10;&lt;li&gt;Translation Tool: Scan, extract, and translate the language strings in a firmware user interface, making it easier to localize firmware into another language.&lt;/li&gt;&#10;&lt;li&gt;Firmware Customization: Add personal branding, customize SSH settings such as the port and password, disable automatic upgrades, and change firmware signatures.&lt;/li&gt;&#10;&lt;li&gt;Flash Tool: Flash firmware quickly over SSH, send firmware directly to the router, monitor progress in real time, and automatically verify the result.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;At the moment, the software supports Xiaomi router firmware only. Support for other router families may be added in the future based on user contributions.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_hu_c5cda82329cad8e1.webp" width="1280" height="780" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_1_hu_80739cc6d413c170.webp" width="1279" height="689" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/translator/31-10-2025_08h50_2_hu_829a1988a34b2856.webp" width="1280" height="779" alt="AIoT.IO.VN Firmware Translator" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;AIoT.IO.VN Firmware Translator&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Xiaomi BE3600 — The Popular Wi-Fi 7 Successor to AX3000/CR880x?</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-be3600/</link><pubDate>Sun, 04 May 2025 02:53:29 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-be3600/</guid><description>&lt;h3 id="i-overview"&gt;I. Overview&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi Router BE3600 is Xiaomi&amp;rsquo;s most affordable Wi-Fi 7 router. It launched in China on January 30, 2024, in three versions: RD15 (2.5G), RD16 (Gigabit), and RN06 (Global). It uses a Qualcomm IPQ5312, 256MB RAM, and 128MB flash; supports Wi-Fi 7 (802.11a/n/ac/ax/be); reaches up to 3600 Mbps (2.4GHz: 688 Mbps, 5GHz: 2882 Mbps); and has four high-performance antennas, dual WAN/LAN, one 2.5G port on RD15/RN06, and three Gigabit ports. It uses passive cooling and supports IoT.&lt;/p&gt;</description></item><item><title>[OpenHAB] Share a Vietnamese Lunar Calendar Script for OpenHAB</title><link>https://aiot.io.vn/en/serial/smarthome/openhab-amlich-vietnam/</link><pubDate>Sat, 12 Apr 2025 10:59:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/smarthome/openhab-amlich-vietnam/</guid><description>&lt;h2 id="openhab-lunar-calendar"&gt;OpenHAB Lunar Calendar&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Vietnamese lunar calendar for OpenHAB by &lt;a href="https://aiot.io.vn/serial/smarthome/openhab-amlich-vietnam/"&gt;AIoT.io.vn&lt;/a&gt;. The file is based on the original repository: &lt;code&gt;https://github.com/quangvinh86/SolarLunarCalendar/blob/master/LunarSolar.py&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Adds &lt;em&gt;solar terms&lt;/em&gt;, &lt;em&gt;Buddhist calendar&lt;/em&gt; dates, and annual &lt;em&gt;holidays and anniversaries&lt;/em&gt; using the algorithm by &lt;strong&gt;Ho Ngoc Duc&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Download &lt;a href="https://raw.githubusercontent.com/NghiaMaster/OpenHAB-Lunar-Calendar/refs/heads/main/OpenHABLunarCalendar.py"&gt;OpenHABLunarCalendar.py&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Create these items in OpenHAB:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;AL_PhatLich&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_ThangNhuan&lt;/code&gt; - Number (0 = not a leap month, 1 = leap month)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_Holiday&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_TietKhi&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiNam&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiThang&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_CanChiNgay&lt;/code&gt; - String&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;AL_Today&lt;/code&gt; - DateTime&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Edit the information on lines &lt;code&gt;296&lt;/code&gt; and &lt;code&gt;319-326&lt;/code&gt; of the script.&lt;/li&gt;&#10;&lt;li&gt;Create a rule that runs the script every day at 00:01.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="copy-the-file-to-openhab-userdata"&gt;Copy the file to OpenHAB userdata&lt;/h2&gt;&#10;&lt;p&gt;The default userdata directory is &lt;code&gt;/var/lib/openhab/&lt;/code&gt;; adjust it for your installation.&lt;/p&gt;</description></item><item><title>[OpenHAB] Xiaomi LYWSD03MMC Temperature and Humidity Sensor with ESPHome on ESP32-C3</title><link>https://aiot.io.vn/en/serial/smarthome/openhab-lywsd03mmc-esphome/</link><pubDate>Sat, 12 Apr 2025 10:59:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/smarthome/openhab-lywsd03mmc-esphome/</guid><description>&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;The &lt;em&gt;MQTT binding&lt;/em&gt; is installed.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;LYWSD03MMC&lt;/code&gt; sensors — see &lt;a href="https://s.shopee.vn/8fRt15y0Z2"&gt;Shopee&lt;/a&gt;. Flash them with the &lt;code&gt;ATC_MiThermometer&lt;/code&gt; custom firmware (&lt;a href="https://github.com/atc1441/ATC_MiThermometer"&gt;guide&lt;/a&gt;).&lt;/li&gt;&#10;&lt;li&gt;An ESP32 or ESP32-C3 SuperMini. For an ESP32-C3 SuperMini, a model with an antenna is recommended (see &lt;a href="https://s.shopee.vn/1g5C6zT21O"&gt;Shopee&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/lywsd03mmc_hu_4274364a8c5836bd.webp" width="1052" height="178" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h3 id="build-with-esphome"&gt;Build with ESPHome&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;See the ESPHome project &lt;a href="https://esphome.io/"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Install ESPHome on your PC using &lt;a href="https://esphome.io/guides/installing_esphome"&gt;this guide&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;The following configuration sends data to the MQTT broker.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&#10;&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;&#10;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;49&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;50&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;51&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;52&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;53&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;54&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;55&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;56&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;57&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;58&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;59&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;60&#10;&lt;/span&gt;&lt;span style="background-color:#3c3d38"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;61&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;62&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;63&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;64&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;65&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;66&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;67&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;68&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;69&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;70&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;71&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;72&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;73&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;74&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;75&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;76&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;77&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;78&#10;&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;79&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;&#10;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;display:grid;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esphome&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;lywsd03mmc-mqtt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;friendly_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LYWSD03MMC to MQTT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;min_version&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2025.3.2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name_add_mac_suffix&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;platformio_options&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.f_flash&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;40000000L&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.flash_mode&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dio&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board_build.flash_size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4MB&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esp32&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;board&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esp32-c3-devkitm-1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;framework&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esp-idf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;sdkconfig_options&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CONFIG_BT_BLE_42_FEATURES_SUPPORTED&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;y&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CONFIG_BT_BLE_50_FEATURES_SUPPORTED&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;n&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;logger&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;level&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;ota&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;esphome&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;******&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;wifi&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssid&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WIFI SSID&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;mqtt&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;broker&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;192.168.0.4&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;username&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;password&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;discovery&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;discover_ip&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;esp32_ble_tracker&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;scan_parameters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;active&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;sensor&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ble_rssi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;aa:aa:aa:aa:aa:aa&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu BLE Thermometer RSSI&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ble_rssi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bb:bb:bb:bb:bb:bb&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach BLE Thermometer RSSI&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;atc_mithermometer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;aa:aa:aa:aa:aa:aa&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Temperature&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;humidity&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Humidity&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;battery_level&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pNgu Battery Level&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;atc_mithermometer&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex; background-color:#3c3d38"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mac_address&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;bb:bb:bb:bb:bb:bb&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;temperature&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Temperature&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;humidity&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Humidity&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;battery_level&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;pKhach Battery Level&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WiFi Signal dB&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal_db&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;update_interval&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;300s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;platform&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;copy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;source_id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;wifi_signal_db&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;WiFi Signal Percent&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;filters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;lambda&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;return min(max(2 * (x + 100.0), 0.0), 100.0);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;unit_of_measurement&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Signal %&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Line &lt;em&gt;24&lt;/em&gt; configures the OTA update password.&lt;/li&gt;&#10;&lt;li&gt;Lines &lt;em&gt;27-28&lt;/em&gt; configure Wi-Fi.&lt;/li&gt;&#10;&lt;li&gt;Lines &lt;em&gt;31-33&lt;/em&gt; configure the MQTT broker.&lt;/li&gt;&#10;&lt;li&gt;Lines &lt;em&gt;44&lt;/em&gt;, &lt;em&gt;48&lt;/em&gt;, &lt;em&gt;52&lt;/em&gt;, and &lt;em&gt;61&lt;/em&gt; contain the sensor Bluetooth MAC addresses.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Check the MQTT broker to confirm that it has received the sensor data.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/mmc03_mqttdata_hu_30242bbe5229a753.webp" width="374" height="228" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[OpenHAB] Energy Meter with PZEM004T and ESPHome on ESP32-C3</title><link>https://aiot.io.vn/en/serial/smarthome/openhab-pzem004t-esphome/</link><pubDate>Fri, 11 Apr 2025 02:47:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/smarthome/openhab-pzem004t-esphome/</guid><description>&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;The &lt;em&gt;MQTT binding&lt;/em&gt; is installed.&lt;/li&gt;&#10;&lt;li&gt;PZEM004T v1 (export version) or local V3 — see &lt;a href="https://s.shopee.vn/6fTs4EHaJL"&gt;Shopee&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;An ESP32 or ESP32-C3 SuperMini. For an ESP32-C3 SuperMini, a model with an antenna is recommended (see &lt;a href="https://s.shopee.vn/1g5C6zT21O"&gt;Shopee&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/pzem004t_esp32_mqtt_openhab_hu_bc50db236ad0c88d.webp" width="1280" height="285" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h2 id="additional-hardware-reference"&gt;Additional hardware reference&lt;/h2&gt;&#10;&lt;p&gt;If the current PZEM004T model is unsuitable or you want to compare another version, see &lt;a href="https://s.shopee.vn/7fZLqePIqg"&gt;another PZEM004T model on Shopee&lt;/a&gt;. Before wiring it, verify the exact version, pinout, and module voltage.&lt;/p&gt;</description></item><item><title>[OpenHAB] Share a Remote-Control Widget for LG WebOS TV</title><link>https://aiot.io.vn/en/serial/smarthome/share-widget-lgtv-remote/</link><pubDate>Wed, 12 Mar 2025 02:40:00 +0000</pubDate><guid>https://aiot.io.vn/en/serial/smarthome/share-widget-lgtv-remote/</guid><description>&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OpenHAB version: &lt;strong&gt;4.3.3&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;The &lt;em&gt;LG WebOS binding&lt;/em&gt; is installed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;I redesigned this widget based on widgets shared on the OpenHAB community site. If you copy it, please keep the attribution. ^^.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/smarthome/webostvremote_hu_17f055303d33fda1.webp" width="391" height="803" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;h3 id="usage"&gt;Usage&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;em&gt;MENU&lt;/em&gt; &amp;gt; &lt;em&gt;Developer Tools&lt;/em&gt; &amp;gt; &lt;em&gt;Widgets&lt;/em&gt;, add a new widget, paste the code, and enjoy.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;uid&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LGWebOSremote&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;tags&lt;/span&gt;: []&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;props&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;parameters&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the RCButton item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Simulate a Remote Control button press&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the Power switch item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Power ON/OFF TV&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;context&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Select the Mute switch item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;label&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mute audio of the device&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;parameterGroups&lt;/span&gt;: []&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;timestamp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Mar 11, 2025, 8:00:38 PM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-card&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--f7-card-margin-horizontal&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(26, 26, 26)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;48rem&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;23rem&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;slots&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;default&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Label&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;18px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;22px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;32px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;overflow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hidden&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text-overflow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ellipsis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text-shadow&lt;/span&gt;: -&lt;span style="color:#ae81ff"&gt;1px 1px 1px hsl(0,0%,66%)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;white-space&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nowrap&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=&amp;#34;LG WebOS TV&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.power].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;ON&amp;#39; : &amp;#39;OFF&amp;#39; &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;power&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.power].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;green&amp;#39; : &amp;#39;red&amp;#39; &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;HOME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;house&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 0 0 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;45px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;136px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;EXIT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;THOÁT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;187px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;136px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;VOLUMEUP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;plus&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 50px 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;153px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;VOLUMEDOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;minus&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;UP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_up&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;RIGHT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_right&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;right&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;DOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_down&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;154px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;290px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;LEFT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;chevron_left&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-badge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white solid 1px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;f7-badge&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;84px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;150px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ENTER&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;149px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;220px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;65px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CHANNELUP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_up&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 50px 0 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;297px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;153px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CHANNELDOWN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_down&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;35&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;95px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;297px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;z-index&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;BACK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;arrow_uturn_left&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;11px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;BACK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MENU&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MENU&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;INFO&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;55px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;267px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;357px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;MUTE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;=(items[props.mute].state === &amp;#39;OFF&amp;#39;) ? &amp;#39;white&amp;#39; : &amp;#39;red&amp;#39;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;speaker_slash_rtl&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50px 0 0 50px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;PAUSE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;pause_fill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;PLAY&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconF7&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;play_fill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;iconSize&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50px 50px 0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;428px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;494px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;560px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;44px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;236px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;625px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;component&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;oh-button&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;action&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionCommand&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;actionItem&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;=props.item&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;style&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rgb(53,53,53)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;white&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;display&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flex&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;60px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;140px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;position&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absolute&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;690px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90px&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;text&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Adding a VLAN to Guest Wi-Fi on Xiaomi AX9000 Stock Firmware</title><link>https://aiot.io.vn/en/posts/them-vlan-vao-guest-wifi-firmware-goc-xiaomi-ax9000/</link><pubDate>Tue, 28 Jan 2025 14:50:20 +0000</pubDate><guid>https://aiot.io.vn/en/posts/them-vlan-vao-guest-wifi-firmware-goc-xiaomi-ax9000/</guid><description>&lt;blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;I am using a Xiaomi AX9000. Xiaomi&amp;rsquo;s stock firmware has many limitations. I tried several custom firmware options, from official OpenWrt builds to Qualcomm-based QSDK versions, but none of the AX9000 builds I tested was stable enough. The stock firmware remains the most practical choice for this setup.&lt;/li&gt;&#10;&lt;li&gt;Xiaomi firmware is also based on OpenWrt, although it has been heavily customized. This makes it possible to configure some functions directly in the system without using Xiaomi&amp;rsquo;s normal web interface.&lt;/li&gt;&#10;&lt;li&gt;After reading the wiki and other references, I successfully configured a VLAN on the Xiaomi AX9000.&lt;/li&gt;&#10;&lt;li&gt;This guide is not intended for beginners.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="i-overview"&gt;I. Overview&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SSH is enabled on the Xiaomi AX9000.&lt;/li&gt;&#10;&lt;li&gt;The Xiaomi AX9000 is running in AP mode.&lt;/li&gt;&#10;&lt;li&gt;The main router is RouterOS (MikroTik), with VLAN 10 configured for Guest using &lt;code&gt;10.0.3.0/24&lt;/code&gt; and the main LAN using &lt;code&gt;10.0.0.1/23&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The AX9000 WAN port is connected to the MikroTik router. The remaining AX9000 ports are used by a PC and a TV on the main LAN.&lt;/li&gt;&#10;&lt;li&gt;The guest Wi-Fi added to the AX9000 is assigned to VLAN 10. Clients connected to it receive addresses from &lt;code&gt;10.0.3.0/24&lt;/code&gt; through the main router.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; These values depend on your network. Other Xiaomi routers may use a similar approach, but the exact configuration is not guaranteed because the CPU, switch, and vendor changes can affect the commands.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="ii-configuration"&gt;II. Configuration&lt;/h2&gt;&#10;&lt;p&gt;The two main files to edit are &lt;code&gt;/etc/config/network&lt;/code&gt; and &lt;code&gt;/etc/config/wireless&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>How to Enable SSH on the Xiaomi BE3600 2.5GbE</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-be3600-posts/mo-ssh-xiaomi-be3600-25g/</link><pubDate>Wed, 13 Nov 2024 09:55:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-be3600-posts/mo-ssh-xiaomi-be3600-25g/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; This is a quick guide for advanced users. If you get stuck, leave a comment with the exact step and error.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="i-requirements"&gt;I. Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xiaomi BE3600 running firmware &lt;a href="https://wwuc.lanzoub.com/i9sXh29qzrid"&gt;&lt;strong&gt;1.0.65&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://download.mobatek.net/2362023122033030/MobaXterm_Portable_v23.6.zip"&gt;MobaXterm&lt;/a&gt;, &lt;a href="https://www.putty.org/"&gt;PuTTY&lt;/a&gt;, PowerShell, or an equivalent terminal application.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;If the firmware is newer than the version above, downgrade it with &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWiFi RepairTool&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Exploring the New CR880x Hardware Revision</title><link>https://aiot.io.vn/en/firmware/xiaomi/cr880x-posts/cr880x-phien-ban-phan-cung-moi/</link><pubDate>Tue, 05 Mar 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/cr880x-posts/cr880x-phien-ban-phan-cung-moi/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Information about new CR880x hardware appeared on the Chinese Right.com.cn forum in late 2023. Some Vietnamese shops have since received this revision. I have not personally handled this version, so this article collects information from forum reports. Let us see what changed.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;The information comes from CR8808 units reported by users on right.com.cn.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The new revision ships with firmware &lt;em&gt;1.4.01 for CR8808&lt;/em&gt; and &lt;em&gt;7.0.1 for CR8806&lt;/em&gt;. The management interface identifies it as CR8808 &lt;em&gt;VER.B&lt;/em&gt;, codename &lt;em&gt;CR8818&lt;/em&gt;. &lt;strong&gt;It does not share firmware with the older CR8808 revision.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Stock Firmware CR8816, CR8819 - Also known as CR880x Ver.B.</title><link>https://aiot.io.vn/en/firmware/xiaomi/cr880x-posts/cr8819-cr8816-stock-firmware/</link><pubDate>Tue, 05 Mar 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/cr880x-posts/cr8819-cr8816-stock-firmware/</guid><description>&lt;p&gt;Link collected from Chinese forums, currently I only have 2 versions, 8816 and 8819, haven&amp;rsquo;t found the link for 8818, you can use them for now.&lt;/p&gt;&#10;&lt;p&gt;Use &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWifiRepairTool&lt;/a&gt; to flash&lt;/p&gt;&#10;&lt;p&gt;Version 8816 can use MiHome app and open SSH&lt;/p&gt;&#10;&lt;p&gt;Download link for CR8816: &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/cr8816/miwifi_cr8816_firmware_2266a_6.40.44.bin"&gt;Xiaomi CDN&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Download link for CR8819: &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/cr8819/miwifi_cr8819_firmware_17b3c_6.60.72.bin"&gt;Xiaomi CDN&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Enable SSH for CR8816:&lt;/p&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://\&lt;routerIP\&gt;/cgi-bin/luci/;stok=\&lt;token\&gt;/api/misystem/set_telnet?enable=1&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;</description></item><item><title>IPv4 Subnets Cheat Sheet</title><link>https://aiot.io.vn/en/posts/ipv4-subnets-cheatsheet/</link><pubDate>Fri, 26 Jan 2024 04:05:59 +0000</pubDate><guid>https://aiot.io.vn/en/posts/ipv4-subnets-cheatsheet/</guid><description>&lt;h2 id="subnets"&gt;Subnets&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;CIDR&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;SUBNET MASK&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;NUMBER OF ADDRESSES&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;WILDCARD&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/32&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/31&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.254&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/30&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.252&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.3&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/29&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.248&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.7&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/28&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.240&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.15&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/27&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.224&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.31&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/26&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.192&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.63&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/25&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.128&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.127&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/24&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;256&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/23&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.254.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.1.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/22&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.252.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1,024&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.3.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/21&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.248.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,048&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.7.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/20&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.240.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4,096&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.15.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/19&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.224.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8,192&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.31.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/18&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.192.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16,384&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.63.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/17&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.128.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32,768&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.127.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/16&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;65,536&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/15&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.254.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;131,072&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.1.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/14&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.252.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;262,144&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.3.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/13&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.248.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;524,288&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.7.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/12&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.240.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1,048,576&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.15.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/11&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.224.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,097,152&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.31.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/10&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.192.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4,194,304&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.63.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/9&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.128.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8,388,608&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.127.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/8&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16,777,216&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;254.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;33,554,432&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;252.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;67,108,864&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;248.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;134,217,728&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;7.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;240.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;268,435,456&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;15.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;224.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;536,870,912&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;31.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1,073,741,824&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;63.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2,147,483,648&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4,294,967,296&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="ip-address-classes"&gt;IP address classes&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Class&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Address range&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0.0.0.0 – 127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128.0.0.0 – 191.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.0.0.0 – 223.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;224.0.0.0 – 239.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;E&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;240.0.0.0 – 255.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="private-address-ranges"&gt;Private address ranges&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Range type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Address range&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Class A private&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;10.0.0.0 – 10.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Class B private&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;172.16.0.0 – 172.31.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Class C private&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;192.168.0.0 – 192.168.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Localhost&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;127.0.0.0 – 127.255.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Zeroconf (APIPA/Bonjour)&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;169.254.0.0 – 169.254.255.255&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;</description></item><item><title>Xiaomi AX3000T (RD03) Firmware Collection and Related Information</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-ax3000t/</link><pubDate>Wed, 24 Jan 2024 08:33:29 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-ax3000t/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi presents this router almost like a flagship, complete with a polished landing page (&lt;a href="https://www.mi.com/xiaomi-ax3000t"&gt;see it here&lt;/a&gt;).&lt;/p&gt;&#10;&lt;p&gt;The Xiaomi AX3000T has an attractive design and strong specifications for its price, and it is highly regarded by Chinese users.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Overview&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Length × width × height&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;With antennas: 225mm × 172mm × 208.8mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Without antennas: 225mm × 172mm × 51mm&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Model&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Xiaomi Router AX3000T (RB03)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;CPU&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;2.4GHz Wi-Fi&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;5GHz Wi-Fi&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Antennas&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Cooling&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Ethernet&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Standards&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Wireless&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Dual-band&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz and 5GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Channels&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5GHz: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modulation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Rate set&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h2 id="i-enable-ssh"&gt;I. Enable SSH&lt;/h2&gt;&#10;&lt;p&gt;See the Xiaomi AX3000T SSH guide &lt;a href="https://aiot.io.vn/en/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Enable SSH on Xiaomi BE6500 Pro / AX3000T</title><link>https://aiot.io.vn/en/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/</link><pubDate>Thu, 18 Jan 2024 03:14:03 +0000</pubDate><guid>https://aiot.io.vn/en/posts/mo-ssh-xiaomi-be6500-pro-ax3000t/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; This is a quick guide for advanced users. If you get stuck, leave a comment with the exact step and error.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="i-requirements"&gt;I. Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Xiaomi AX3000T running firmware &lt;a href="https://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rd03/miwifi_rd03_firmware_ef0ee_1.0.47.bin"&gt;&lt;strong&gt;1.0.47&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Xiaomi BE6500 Pro running firmware &lt;a href="https://wwzv.lanzouu.com/iEZlv1kzynsh"&gt;&lt;strong&gt;1.0.46&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;(password: gwhx)&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://download.mobatek.net/2362023122033030/MobaXterm_Pt_Portable_v23.6.zip"&gt;MobaXterm&lt;/a&gt;, &lt;a href="https://www.putty.org/"&gt;PuTTY&lt;/a&gt;, PowerShell, or an equivalent terminal application.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;If the firmware is newer than the versions above, downgrade it with &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWiFi RepairTool&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>TP-LINK BE6500/7DR6560 Specifications and Stock Firmware</title><link>https://aiot.io.vn/en/firmware/tp-link/be6500-7dr6560/</link><pubDate>Tue, 16 Jan 2024 05:35:21 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/tp-link/be6500-7dr6560/</guid><description>&lt;h2 id="i-specifications"&gt;I. Specifications&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a/b/g/n/ac/ax/be&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Maximum wireless rate 6500Mbps (2.4GHz 689Mbps, 5GHz 5765Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Beamforming&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4×4 MU-MIMO&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi multi-frequency combination&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Multi-Link Operation (MLO)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Preamble puncture&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Ethernet ports&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 × 2.5Gbps (the four ports share a maximum of 5Gbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;293 × 264 × 72 mm; weight 620g&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Antenna type&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 dual-band antennas, 4 5GHz antennas&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Bridge (wireless repeater)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Signal conditioning&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Terminal management&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IP and MAC address binding&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AP isolation&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Virtual server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dynamic Domain Name Service (DDNS)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DMZ host&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Automatic cleaning&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wireless time switch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Local online/local firmware/remote upgrade&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Power&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;12V, 2.5A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;See the inside of the TP-LINK BE6500/7DR6560 &lt;a href="https://aiot.io.vn/en/serial/disassemble/kham-pha-tplink-be6500-7dr6560/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Inside the TP-LINK BE6500 7DR6560 Wi-Fi 7 Router</title><link>https://aiot.io.vn/en/serial/disassemble/kham-pha-tplink-be6500-7dr6560/</link><pubDate>Tue, 16 Jan 2024 10:15:14 +0700</pubDate><guid>https://aiot.io.vn/en/serial/disassemble/kham-pha-tplink-be6500-7dr6560/</guid><description>&lt;p&gt;&lt;strong&gt;TP-LINK BE6500 7DR6560&lt;/strong&gt; is a new Wi-Fi 7 router from TP-LINK. Let us explore the inside.&lt;/p&gt;&#10;&lt;p&gt;The 7DR6560 box:&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0778.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;TL-7DR6560 Easy Turbo version, EasyMESH 3.0, with four 2.5G ports.&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0779.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;The product and accessories:&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0780.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;&#10;&lt;p&gt;It uses a 12V/2.5A power adapter. In testing, standby power was 9.2W with one 1Gbps optical-modem LAN port connected. With all four 2.5Gbps ports connected, consumption reached 12.8W, which is relatively high.&#10;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://www.acwifi.net/wp-content/uploads/2024/01/DSC_0781.jpg" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Wi-Fi 7 Has Been Officially Introduced</title><link>https://aiot.io.vn/en/posts/wifi7-chinh-thuc-ra-mat/</link><pubDate>Tue, 16 Jan 2024 00:00:05 +0000</pubDate><guid>https://aiot.io.vn/en/posts/wifi7-chinh-thuc-ra-mat/</guid><description>&lt;p&gt;This article summarizes the Wi-Fi Alliance announcement about Wi-Fi CERTIFIED 7. See the &lt;a href="https://www.wi-fi.org/news-events/newsroom/wi-fi-alliance-introduces-wi-fi-certified-7"&gt;original announcement&lt;/a&gt; for the complete information.&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;On January 8, 2024&lt;/strong&gt;, in &lt;strong&gt;Austin, Texas&lt;/strong&gt;, the Wi-Fi Alliance officially introduced the next generation of Wi-Fi with new features designed to improve performance and connectivity across many environments. Wi-Fi 7&amp;rsquo;s advanced features support higher throughput, more predictable latency, and greater reliability for important traffic.&lt;/p&gt;</description></item><item><title>MikroTik Firewall Filter Rules for Better Security</title><link>https://aiot.io.vn/en/serial/mikrotik/firewall-rule-tang-cuong-bao-mat/</link><pubDate>Sun, 14 Jan 2024 01:30:21 +0000</pubDate><guid>https://aiot.io.vn/en/serial/mikrotik/firewall-rule-tang-cuong-bao-mat/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;MikroTik security problems often come from configuration mistakes: unchanged admin passwords, weak credentials, factory-reset devices, or unnecessary SSH and Telnet services left enabled. These settings can allow attackers to take control of the router or use it for abuse.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;The following filter rules are collected from public references. Review every rule against your own RouterOS version and network before applying it.&lt;/p&gt;&#10;&lt;p&gt;Copy each command and paste it into the &lt;em&gt;Terminal&lt;/em&gt; in &lt;em&gt;WinBox&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>What Is UART on a Router? How to Identify and Use It</title><link>https://aiot.io.vn/en/posts/uart-la-gi/</link><pubDate>Fri, 12 Jan 2024 09:16:15 +0700</pubDate><guid>https://aiot.io.vn/en/posts/uart-la-gi/</guid><description>&lt;h2 id="i-a-brief-introduction-to-uart"&gt;I. A brief introduction to UART&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Most routers today include a UART interface connected to the system processor. Its pins are routed to the printed circuit board (PCB) to support debugging, firmware replacement, or connection to serial devices such as modems.&lt;/p&gt;&#10;&lt;p&gt;A router normally starts with its built-in bootloader. The bootloader handles the first steps of locating firmware, checking hardware, and launching the system. During these early stages, it often outputs information through a serial port and may respond to its own command set. These are not commands from a normal operating system; they are predefined commands built into the bootloader. Different bootloaders from different vendors have different command sets.&lt;/p&gt;</description></item><item><title>Flash International Firmware on ZTE E1600/E2603/E2615</title><link>https://aiot.io.vn/en/firmware/zte/e1600-2603-2615/</link><pubDate>Thu, 11 Jan 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/zte/e1600-2603-2615/</guid><description>&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Overview&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;The &lt;em&gt;ZTE E1600/E2603/E2615&lt;/em&gt; share the same hardware and differ mainly by carrier distribution. They use a &lt;strong&gt;ZX279128R CPU&lt;/strong&gt;, &lt;strong&gt;256MB RAM&lt;/strong&gt;, and &lt;strong&gt;128MB NAND&lt;/strong&gt; for Wi-Fi 6 AX1800. In Vietnam, FPT distributes related units under the &lt;strong&gt;H3601&lt;/strong&gt; (AZ1800) name.&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h2 id="i-prepare"&gt;I. Prepare&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A USB-to-TTL adapter using an IC such as CH340, CH340G, or FT232. I use this &lt;a href="https://shope.ee/4VDCxqxOs6"&gt;FT232&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;If you need a device for practice, see the &lt;a href="https://s.shopee.vn/7fZLow1MyN"&gt;ZTE E1600/E2603/E2615 on Shopee&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;A LAN connection to the PC.&lt;/li&gt;&#10;&lt;li&gt;Three copper probes for the board (1mm copper wire sharpened at one end).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/zte/ax1800az/11-01-2024_09h17_hu_95b32e04c623d9e2.webp" width="359" height="257" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>RG-MA3062 ROM Collection (Stock and ASUSWRT) and Flashing Guide</title><link>https://aiot.io.vn/en/firmware/ruijie/rg-ma3062/</link><pubDate>Wed, 10 Jan 2024 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/ruijie/rg-ma3062/</guid><description>&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Overview&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Broadcom BCM6756, 4 cores, 1.7GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM/ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512MB/256MB or 256MB/256MB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 antennas, AX3000, 2 × 2.4GHz FEM + 2 × 5GHz FEM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;There is little international information about this model; the component photos are shown below.&lt;/p&gt;</description></item><item><title>How to Unbrick the Redmi AX6000</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/unbrick-xiaomi-redmi-ax6000/</link><pubDate>Thu, 28 Dec 2023 01:06:53 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/unbrick-xiaomi-redmi-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;A router can be bricked by flashing the wrong firmware, damaging the bootloader, or interrupting a flash.&lt;/p&gt;&#10;&lt;p&gt;Bootloader damage is the hardest case because it requires hardware intervention. A wrong firmware image may be recoverable depending on which bootloader is installed.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="case-1-bricked-by-incorrect-firmware"&gt;Case 1: Bricked by incorrect firmware&lt;/h2&gt;&#10;&lt;h3 id="with-the-stock-bootloader"&gt;With the stock bootloader&lt;/h3&gt;&#10;&lt;p&gt;Use &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWiFiRepair Tools&lt;/a&gt; to return to the manufacturer&amp;rsquo;s stock ROM, then reinstall the desired firmware.&lt;/p&gt;&#10;&lt;h3 id="with-openwrt-u-boot-mod"&gt;With OpenWrt U-Boot Mod&lt;/h3&gt;&#10;&lt;p&gt;When the system breaks, OpenWrt may enter recovery automatically. Set up a TFTP server so recovery can load the initramfs image, then reinstall firmware.&lt;/p&gt;</description></item><item><title>Return the Redmi AX6000 to Stock ROM from OpenWrt</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/huong-dan-quay-ve-rom-goc-rm-ax6000/</link><pubDate>Wed, 27 Dec 2023 03:12:53 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/huong-dan-quay-ve-rom-goc-rm-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;For OpenWrt using the stock U-Boot, download stock firmware from &lt;a href="http://miwifi.com/miwifi_download.html"&gt;Xiaomi&lt;/a&gt; and use MiWiFiRepair Tool to return to stock. See the &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWiFiRepair Tool guide&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;For OpenWrt using U-Boot Mod, restore the stock U-Boot first, then use &lt;a href="https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/"&gt;MiWiFiRepair Tool&lt;/a&gt; to return to stock.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="flash-the-stock-u-boot"&gt;Flash the stock U-Boot&lt;/h2&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;Touching the bootloader has a high brick risk. Verify everything before starting.&#10;&lt;ul&gt;&#10;&lt;li&gt;Ensure a reliable connection between the router and PC.&lt;/li&gt;&#10;&lt;li&gt;Verify downloaded-file integrity.&lt;/li&gt;&#10;&lt;li&gt;Be careful with commands and understand the terminal output.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;This guide uses the official OpenWrt.org U-Boot Mod layout. Other ROMs or U-Boot versions such as hanwckf may use different partitions and numbers; check them first.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The &lt;a href="https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/"&gt;U-Boot Mod installation guide&lt;/a&gt; explains how to back up the original bootloader. Use the backup from the same router whenever possible so all partitions match. If no backup exists, using another user&amp;rsquo;s backup has a higher brick risk.&lt;/p&gt;</description></item><item><title>How to Install OpenWrt on the Redmi AX6000</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/</link><pubDate>Mon, 25 Dec 2023 01:06:53 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000-posts/huong-dan-cai-dat-openwrt-redmi-ax6000/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; These procedures are not for beginners. Proceeding means accepting the risk; I am not responsible for damage, although I will try to help if problems occur.&lt;/p&gt;</description></item><item><title>Xiaomi Redmi AX6000: Firmware Collection and SSH Guide</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000/</link><pubDate>Sun, 24 Dec 2023 12:39:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6000/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;The Redmi AX6000 uses eight spatial streams, supports 160MHz bandwidth, and reaches up to 6000 megabits of wireless throughput. Compared with the AX3000, it doubles the connection rate and increases coverage distance by about 40%.&lt;/p&gt;&#10;&lt;p&gt;If you need the exact router for this guide, see the &lt;a href="https://s.shopee.vn/7KwVQK2deH"&gt;Redmi AX6000 on Shopee&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;It is Redmi&amp;rsquo;s first router with an eight-channel signal amplifier. Inside is a quad-core MediaTek Filogic 830 at 2GHz per core, 512MB RAM, and support for up to 248 simultaneous devices. It has four adaptive network ports, supports LAN aggregation and IPTV, and can be managed through the Xiaomi mobile app.&lt;/p&gt;</description></item><item><title>How to Resize the OpenWrt RootFS for EXT4 and SquashFS</title><link>https://aiot.io.vn/en/serial/openwrt/resize-rootfs-openwrt/</link><pubDate>Mon, 18 Dec 2023 00:48:40 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/resize-rootfs-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;When OpenWrt is flashed to storage such as a microSD card or USB drive on a Raspberry Pi, NanoPi, or Orange Pi, it may initially use only a small part of the available capacity.&lt;/p&gt;&#10;&lt;p&gt;Even if the card or drive is 32 GB or 64 GB, OpenWrt may use only a few hundred megabytes. This prevents installing larger packages or applications such as Docker and PassWall.&lt;/p&gt;&#10;&lt;p&gt;This guide explains how to expand OpenWrt&amp;rsquo;s root filesystem to use more of the available SD-card or USB capacity.&lt;/p&gt;</description></item><item><title>How I Flashed Global Firmware on a Huawei AX3 Pro</title><link>https://aiot.io.vn/en/posts/minh-da-up-rom-quoc-te-cho-huawei-ax3-pro-nhu-the-nao/</link><pubDate>Sun, 17 Dec 2023 01:43:59 +0000</pubDate><guid>https://aiot.io.vn/en/posts/minh-da-up-rom-quoc-te-cho-huawei-ax3-pro-nhu-the-nao/</guid><description>&lt;p&gt;This article summarizes how I dumped a global ROM from an AX3 Pro Global unit and flashed it onto a domestic AX3 Pro.&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Huawei firmware is very different from that of many other brands such as Xiaomi, ZTE, and H3C. Although the CPU and Wi-Fi chips may be similar, Huawei encrypts and packages many parts of its software. Even a small mistake while dumping the ROM can brick the router.&lt;/li&gt;&#10;&lt;li&gt;There are generally two ways to modify the system:&#10;&lt;ul&gt;&#10;&lt;li&gt;The first is through software: find and use a security vulnerability, then install new firmware. This avoids hardware work and can use a backup supplied by someone with a global-ROM device, but finding a usable vulnerability is difficult and reliable information is scarce. I did not use this method.&lt;/li&gt;&#10;&lt;li&gt;The second is through hardware. It can dump the system storage without the software restrictions, but requires hardware skills, several tools, and many complicated steps. It also requires access to a router already running global firmware. I used this method after &lt;a href="https://shopee.vn/shopwifigiadinh"&gt;CheeStore&lt;/a&gt; provided a device for the work.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Huawei uses common NAND manufacturers such as Winbond, MXIC, Toshiba, and GigaDevice. These NAND chips commonly have capacities from 128 MB to 512 MB and use a WSON8 package.&#10;&lt;ul&gt;&#10;&lt;li&gt;Unlike leaded NAND packages that can be quickly connected to a T48 with a clip, WSON8 is an SMD package and cannot be connected with the same type of clip.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/icons/wson8_hu_165321089f219cbd.webp" width="500" height="500" alt="WSON8" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;WSON8&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>How to Install AdGuard Home Directly on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/huong-dan-cai-dat-adguardhome-truc-tiep-len-openwrt/</link><pubDate>Thu, 19 Oct 2023 08:28:22 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/huong-dan-cai-dat-adguardhome-truc-tiep-len-openwrt/</guid><description>&lt;h2 id="i-preparation"&gt;I. Preparation&lt;/h2&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Routers with &lt;strong&gt;low RAM or storage&lt;/strong&gt;, or a &lt;strong&gt;slow CPU&lt;/strong&gt;, may not be suitable for running &lt;em&gt;AdGuard Home&lt;/em&gt;. This is a general guide for OpenWrt devices. If you run into resource or performance problems, remove AdGuard Home or move it to a stronger device such as a Raspberry Pi or mini PC.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;At least 50 MB of free RAM.&lt;/li&gt;&#10;&lt;li&gt;At least 100 MB of free storage.&lt;/li&gt;&#10;&lt;li&gt;Preferably a higher-performance CPU, such as a dual-core processor with a higher clock speed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Required RAM also depends on the filter lists you enable. Routers with less than 128 MB of RAM or only a single CPU core tend to perform poorly.&lt;/p&gt;</description></item><item><title>Manually Install AdGuard Home in a MikroTik Container (Method 2)</title><link>https://aiot.io.vn/en/serial/mikrotik/huong-dan-cai-adguard-home-mikrotik-cach2/</link><pubDate>Fri, 22 Sep 2023 05:06:33 +0000</pubDate><guid>https://aiot.io.vn/en/serial/mikrotik/huong-dan-cai-adguard-home-mikrotik-cach2/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;In the &lt;a href="https://aiot.io.vn/en/serial/mikrotik/adguardhome-on-mikrotik/"&gt;previous guide&lt;/a&gt;, I installed an AdGuard Home container using a ready-made Docker image.&lt;/p&gt;&#10;&lt;p&gt;That approach is fast, but some installations fail even after repeated attempts. This guide uses a &lt;strong&gt;blank Docker image&lt;/strong&gt; with no service installed, then installs AdGuard Home inside it.&lt;/p&gt;&#10;&lt;p&gt;The offline image can reduce image-pull failures and allows other services to be added. The trade-off is more setup work.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="i-enable-container-support"&gt;I. Enable &lt;strong&gt;Container&lt;/strong&gt; support&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;em&gt;Terminal&lt;/em&gt; and run &lt;code&gt;/system/device-mode/update container=yes&lt;/code&gt;.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/0_hu_e7447d989a414e05.webp" width="1054" height="658" alt="0" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;0&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;When prompted, power-cycle the router.&lt;/li&gt;&#10;&lt;li&gt;After reboot, run &lt;code&gt;/system/device-mode/print&lt;/code&gt; and confirm &lt;code&gt;container: yes&lt;/code&gt;.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/0.1_hu_e9a93a80cd42a69f.webp" width="623" height="404" alt="0.1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;0.1&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ii-prepare-container-networking-and-install-the-blank-image"&gt;II. Prepare container networking and install the blank image&lt;/h2&gt;&#10;&lt;h3 id="iia-prepare-networking"&gt;II.A. Prepare networking&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create a bridge named &lt;em&gt;dockers&lt;/em&gt;.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/1_hu_e9de9604ad7585b7.webp" width="1280" height="618" alt="1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;1&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Assign an IP address.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/2_hu_29d3a095abcd4bb2.webp" width="1040" height="655" alt="2" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;2&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a VETH interface.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/3_hu_5e2e97dd9d0f8e3d.webp" width="1280" height="633" alt="3" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;3&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Add the port to the &lt;em&gt;dockers&lt;/em&gt; bridge.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adguardhome/4_hu_fed86837367a3e15.webp" width="1280" height="633" alt="4" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;4&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="iib-install-the-blank-docker-image"&gt;II.B. Install the blank Docker image&lt;/h3&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; This image was built for &lt;strong&gt;x86_64&lt;/strong&gt;. Do not use it on ARM, ARM64, or 32-bit x86 routers.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download the blank image from &lt;a href="https://drive.google.com/file/d/1foNfcRaKHomcPLrNf8mSaB_txHSp7R9Y/view?usp=sharing"&gt;Google Drive&lt;/a&gt; or the &lt;a href="https://mega.nz/file/2IxixbBS#9eWs4I_oxGIvKfwCvBMUx4Na5KhtXSt_0KFxT9cFGBw"&gt;Mega mirror&lt;/a&gt;.&#10;&lt;ul&gt;&#10;&lt;li&gt;It is based on Alpine Linux 3.17 Slim.&lt;/li&gt;&#10;&lt;li&gt;It uses Supervisor to start services.&lt;/li&gt;&#10;&lt;li&gt;It contains no personal customization or harmful scripts.&lt;/li&gt;&#10;&lt;li&gt;If you do not trust a prebuilt image, build your own.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Upload the image to MikroTik through &lt;strong&gt;Files&lt;/strong&gt; in WinBox.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adg_c2/b1_hu_631b13adcee2c025.webp" width="1280" height="697" alt="B1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;B1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adg_c2/b1_1_hu_90c6900265bb4f55.webp" width="784" height="393" alt="B1_1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;B1_1&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Container&lt;/strong&gt;, click &lt;strong&gt;Add&lt;/strong&gt;, and configure:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;Field&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;File&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;The Docker image filename (&lt;code&gt;file.tar&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Interface&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;The VETH created in II.A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Root Dir&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;The container storage directory&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Logging&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Show logs in WinBox; enable while troubleshooting&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Start On Boot&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Start after MikroTik boots&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/adg_c2/b2_hu_679b823c22884362.webp" width="1280" height="699" alt="B2" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;B2&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Tips for Optimizing Ping and Bufferbloat on MikroTik</title><link>https://aiot.io.vn/en/serial/mikrotik/toi-uu-ping-bufferbload-mikrotik/</link><pubDate>Tue, 29 Aug 2023 13:02:07 +0000</pubDate><guid>https://aiot.io.vn/en/serial/mikrotik/toi-uu-ping-bufferbload-mikrotik/</guid><description>&lt;h3 id="what-is-fq_"&gt;What is &lt;strong&gt;FQ_CoDel&lt;/strong&gt;?&lt;/h3&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;FQ-CoDel combines Fair Queuing with Controlled Delay. It classifies incoming packets into flows and shares bandwidth fairly between them. Each flow is managed by the CoDel queue discipline, which internally uses a FIFO algorithm.&#10;Learn more in the &lt;a href="https://help.mikrotik.com/docs/display/ROS/Queues#Queues-FQ-Codel"&gt;MikroTik FQ-CoDel documentation&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;This guide was originally shared by &lt;a href="https://www.facebook.com/groups/1525204464202568/user/1835086851/"&gt;Phạm Đình Đức&lt;/a&gt; in the &lt;em&gt;Wi-Fi Technology Community&lt;/em&gt; Facebook group.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/mikrotik/fq_codel/0_hu_3a8fc7dd3c6170e6.webp" width="684" height="167" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Wi-Fi 6 vs. 6E vs. 7: A Detailed Comparison</title><link>https://aiot.io.vn/en/posts/wifi6-wifi6e-wifi7-comparison/</link><pubDate>Fri, 09 Jun 2023 03:31:05 +0000</pubDate><guid>https://aiot.io.vn/en/posts/wifi6-wifi6e-wifi7-comparison/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;The main features of Wi-Fi 6 and Wi-Fi 6E are similar, except that Wi-Fi 6E adds the 6 GHz band, making it easier to operate in congested environments. The next generation, Wi-Fi 7, doubles the bandwidth and can deliver up to three times the throughput.&lt;/p&gt;&#10;&lt;p&gt;With more advanced modulation and twice as many spatial streams &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, Wi-Fi 7 aims to make wireless networking feel closer to a wired connection. How does it do that? Let&amp;rsquo;s take a closer look.&lt;/p&gt;</description></item><item><title>How to Unlock SSH on Xiaomi Routers with Vulnerable Stock Firmware</title><link>https://aiot.io.vn/en/posts/miwifi-vulnerable-unlock-ssh-original-firmware/</link><pubDate>Sat, 03 Jun 2023 05:07:46 +0000</pubDate><guid>https://aiot.io.vn/en/posts/miwifi-vulnerable-unlock-ssh-original-firmware/</guid><description>&lt;h3 id="0-firmware-versions-affected-by-the-vulnerability"&gt;0. Firmware versions affected by the vulnerability&lt;/h3&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Model&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Version&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX3600&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_5da25_1.0.17.bin"&gt;1.0.17&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX1800&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_firmware_6718d_1.0.34.bin"&gt;1.0.34&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_all_65ab2_1.0.328.bin"&gt;1.0.328&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/rm1800/miwifi_rm1800_firmware_fafda_1.0.336.bin"&gt;1.0.336&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX5&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/ra67/miwifi_ra67_firmware_63805_1.0.16.bin"&gt;1.0.16&lt;/a&gt;/&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/ra67/miwifi_ra67_all_f3fac_1.0.26.bin"&gt;1.0.26&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AC2100&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r2100/miwifi_r2100_firmware_4b519_2.0.722.bin"&gt;2.0.722&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h4 id="1-downgrade-the-firmware"&gt;1. Downgrade the firmware&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;To enable OpenSSH, first downgrade the firmware to one of the vulnerable versions listed in section &lt;a href="https://aiot.io.vn/en/posts/miwifi-vulnerable-unlock-ssh-original-firmware/#0-firmware-versions-affected-by-the-vulnerability"&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/a&gt;.&#10;&lt;ul&gt;&#10;&lt;li&gt;Log in to the router&amp;rsquo;s management page and downgrade to a vulnerable version.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_0_hu_4df25b0089f0b013.webp" width="1215" height="586" alt="MiWiFi downgrade 0" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;MiWiFi downgrade 0&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/MI-AX3600/DG_1_hu_9f3f256256aec401.webp" width="1073" height="476" alt="MiWiFi downgrade 1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;MiWiFi downgrade 1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;The router will reboot automatically after the downgrade.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-enable-openssh"&gt;2. Enable OpenSSH&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;After the router reboots, log in to its management page again. The URL should look similar to this:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i style="color:#f00"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/web/home#router&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Replace the token in the URL with the copied token, using a request similar to this:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i style="color:#f00"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3Bnvram%20set%20ssh%5Fen%3D1%3B%20nvram%20commit%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Press Enter. If the screen shows &lt;code&gt;{&amp;quot;code&amp;quot;:0}&lt;/code&gt;, continue with the next request.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="urlbox-container my-4 p-3 sm:p-3.5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-neutral-100/80 dark:bg-[#161618] flex items-center justify-between gap-3 shadow-[inset_0_1px_2px_rgba(0,0,0,0.04)] dark:shadow-[inset_0_1px_2px_rgba(0,0,0,0.4)] transition-all group"&gt;&#10;&lt;div class="urlbox-content font-mono text-xs sm:text-sm text-neutral-800 dark:text-neutral-200 break-all select-all flex-1 min-w-0 font-medium tracking-tight"&gt;&#10;http://192.168.31.1/cgi-bin/luci/;stok=&lt;i style="color:#f00"&gt;d2d55f6e595e236044bfff0b444e2c51&lt;/i&gt;/api/misystem/set_config_iotdev?bssid=Xiaomi&amp;user_id=longdike&amp;ssid=-h%3B%20nvram%20set%20ssh_en%3D1%3B%20nvram%20commit%3B%20sed%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%5C%22debug%5C%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%3B%20%2Fetc%2Finit.d%2Fdropbear%20start%3B&#10;&lt;/div&gt;&#10;&lt;button type="button" class="copy-urlbox-btn apple-pill-btn apple-pill-gray text-xs px-3.5 py-1.5 shrink-0 flex items-center gap-1.5 font-bold transition-all active:scale-95" aria-label="Copy to clipboard" title="Copy"&gt;&#10;&lt;span class="btn-icon"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M7.5 3.75A1.5 1.5 0 0 0 6 5.25v13.5a1.5 1.5 0 0 0 1.5 1.5h6a1.5 1.5 0 0 0 1.5-1.5V5.25a1.5 1.5 0 0 0-1.5-1.5h-6Z" /&gt;&#10; &lt;path d="M16.5 6a.75.75 0 0 1 .75.75v12a3 3 0 0 1-3 3H7.5a.75.75 0 0 1 0-1.5h6.75a1.5 1.5 0 0 0 1.5-1.5V6.75A.75.75 0 0 1 16.5 6Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="btn-text"&gt;COPY&lt;/span&gt;&#10;&lt;/button&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;script&gt;&#10;(function() {&#10; function initUrlBoxes() {&#10; document.querySelectorAll('.copy-urlbox-btn').forEach((btn) =&gt; {&#10; if (btn.dataset.initialized) return;&#10; btn.dataset.initialized = 'true';&#10; btn.addEventListener('click', async () =&gt; {&#10; const container = btn.closest('.urlbox-container');&#10; const content = container ? container.querySelector('.urlbox-content') : null;&#10; const text = content ? content.textContent.trim() : '';&#10; if (!text) return;&#10; try {&#10; await navigator.clipboard.writeText(text);&#10; const btnText = btn.querySelector('.btn-text');&#10; const originalText = btnText ? btnText.textContent : 'COPY';&#10; if (btnText) btnText.textContent = 'COPIED!';&#10; btn.classList.remove('apple-pill-gray');&#10; btn.classList.add('bg-[#34C759]', 'text-white');&#10; setTimeout(() =&gt; {&#10; if (btnText) btnText.textContent = originalText;&#10; btn.classList.remove('bg-[#34C759]', 'text-white');&#10; btn.classList.add('apple-pill-gray');&#10; }, 2000);&#10; } catch (e) {}&#10; });&#10; });&#10; }&#10; if (document.readyState === 'loading') {&#10; document.addEventListener('DOMContentLoaded', initUrlBoxes);&#10; } else {&#10; initUrlBoxes();&#10; }&#10;})();&#10;&lt;/script&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;Log in to SSH with the username &lt;em&gt;root&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>How to Change TTL on Padavan Firmware</title><link>https://aiot.io.vn/en/posts/huong-dan-change-ttl-tren-fw-padavan/</link><pubDate>Wed, 31 May 2023 13:42:45 +0000</pubDate><guid>https://aiot.io.vn/en/posts/huong-dan-change-ttl-tren-fw-padavan/</guid><description>&lt;p&gt;Time to live can be understood as the number of hops a packet is allowed to remain in a network. When the value reaches zero, the packet is discarded and is not forwarded any further.&lt;/p&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;TTL is not measured in seconds; it is a hop count. If a packet starts with TTL &lt;code&gt;n&lt;/code&gt;, every router or Layer 3 device it crosses decreases the value by 1 before forwarding it. When the value reaches 0, the device discards the packet. TTL helps prevent routing loops; switched networks use mechanisms such as spanning tree for a different class of loop prevention.&lt;/p&gt;</description></item><item><title>Using Python to Automatically Create Subtitles for Videos</title><link>https://aiot.io.vn/en/posts/tu-dong-tao-sub-cho-video-bang-python/</link><pubDate>Mon, 29 May 2023 09:03:58 +0000</pubDate><guid>https://aiot.io.vn/en/posts/tu-dong-tao-sub-cho-video-bang-python/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Sometimes I find interesting videos in English while browsing the web, but my English is not good enough to follow everything. Creating subtitles and translating them into my native language is a practical solution. One option is to upload the video to YouTube and let YouTube generate subtitles, but that can take time.&lt;/p&gt;&#10;&lt;p&gt;A few days ago, I found a useful Facebook post explaining how to use Python to automatically create an &lt;code&gt;.srt&lt;/code&gt; subtitle file. Once the subtitle file is available, it can be translated with another tool.&lt;/p&gt;</description></item><item><title>Xiaomi Mi AIoT Router AX3600 Firmware Collection and Related Information</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-ax3600/</link><pubDate>Wed, 24 May 2023 23:55:29 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-ax3600/</guid><description>&lt;h3 id="i-specifications"&gt;I. Specifications&lt;/h3&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Specifications table&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;CPU&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.4GHz quad-core A53 IPQ8071A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Network processor&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;ROM&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Memory&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;2.4G Wi-Fi&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;5G Wi-Fi&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Antennas&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Cooling&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Ports&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;LEDs&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Reset buttons&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Power ports&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Standards&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Wireless&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Dual-band&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz and 5GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Modulation&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Operating system&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mi Wi-Fi Smart Router OS based on a heavily customized OpenWrt version&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Wireless security&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Management&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;em&gt;Security&lt;/em&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h3 id="ii-stock-rom-collection"&gt;II. Stock ROM collection&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;China stock ROM&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.17&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.50&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.66&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.67&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.74&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.79&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.1.15&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.1.19&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;International stock ROM&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.0.22&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="iii-enable-openssh-on-stock-firmware"&gt;III. Enable OpenSSH on stock firmware&lt;/h3&gt;&#10;&lt;h4 id="1-downgrade-the-firmware"&gt;1. Downgrade the firmware&lt;/h4&gt;&#10;&lt;p&gt;To enable OpenSSH, first downgrade to a vulnerable firmware version. Log in to the router and downgrade to &lt;strong&gt;1.0.17&lt;/strong&gt; using the &lt;a href="http://cdn.cnbj1.fds.api.mi-img.com/xiaoqiang/rom/r3600/miwifi_r3600_firmware_5da25_1.0.17.bin"&gt;Xiaomi CDN&lt;/a&gt; or &lt;a href="https://mega.nz/file/WZQGwLpZ#VMBcTjZysvjmjUjSgeV5bD-vx-V7L8zfJAjsfKwhmMQ"&gt;mirror&lt;/a&gt;. The router reboots after the downgrade.&lt;/p&gt;</description></item><item><title>[Tutorial] MiWiFi Firmware Modification</title><link>https://aiot.io.vn/en/posts/miwifi-firmware-modification/</link><pubDate>Mon, 22 May 2023 01:44:51 +0000</pubDate><guid>https://aiot.io.vn/en/posts/miwifi-firmware-modification/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi router stock firmware uses a custom format and verifies an RSA signature during flashing. This makes flashing modified firmware nearly impossible through the normal process.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;By analyzing the firmware tool &lt;em&gt;mkxqimage&lt;/em&gt;, the firmware packaging and unpacking process can be understood. If you package the firmware with your own RSA private key and replace &lt;code&gt;/usr/share/xiaoqiang/public.pem&lt;/code&gt; with the corresponding public key, the web interface can accept a self-made firmware image.&lt;/p&gt;</description></item><item><title>How to Install AdGuard Home Directly on a MikroTik Router</title><link>https://aiot.io.vn/en/serial/mikrotik/adguardhome-on-mikrotik/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/en/serial/mikrotik/adguardhome-on-mikrotik/</guid><description>&lt;h2 id="what-is-adguard-home"&gt;What is AdGuard Home?&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;AdGuard Home blocks advertisements and trackers for an entire network. Once configured, all clients can use it without installing software on each device.&lt;/p&gt;&#10;&lt;p&gt;It works as a DNS server and redirects tracking domains to a non-routable destination, preventing devices from connecting to those servers.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="containers-on-mikrotik"&gt;Containers on MikroTik&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;A container is similar to Docker on Linux or Windows. It provides an isolated Linux environment in which services can run.&lt;/p&gt;</description></item><item><title>NX30</title><link>https://aiot.io.vn/en/firmware/h3c/nx30/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/h3c/nx30/</guid><description>&lt;p&gt;Placeholder&lt;/p&gt;</description></item><item><title>RT-AC86U</title><link>https://aiot.io.vn/en/firmware/asus/ac86u/</link><pubDate>Sat, 11 Feb 2023 03:02:21 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/asus/ac86u/</guid><description>&lt;p&gt;A dual-band Gigabit Wi-Fi AC2900 gaming router with MU-MIMO, AiMesh for whole-home Wi-Fi, Trend Micro AiProtection network security, WTFast game acceleration, and Adaptive QoS.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;High-end gaming experience&lt;/strong&gt; — built-in WTFast® game acceleration and Adaptive QoS deliver smoother online gaming and 4K UHD streaming.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;High-performance Wi-Fi&lt;/strong&gt; — AC2900 speeds are enhanced by NitroQAM™ for busy home networks.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Wide coverage&lt;/strong&gt; — high-performance antennas, ASUS AiRadar, and Range Boost reduce dead zones, while MU-MIMO improves multi-device performance.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Powerful processor&lt;/strong&gt; — a PC-class 1.8 GHz dual-core processor provides smoother networking and faster data transfer.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Business-grade security&lt;/strong&gt; — Trend Micro™ AiProtection blocks and neutralizes Internet security threats for connected smart devices.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AiMesh support&lt;/strong&gt; — combine the RT-AC86U with compatible ASUS networking products to create one whole-home Wi-Fi network.&lt;/li&gt;&#10;&lt;li&gt;Coverage up to 400 m² **&lt;/li&gt;&#10;&lt;li&gt;Supports approximately 50–70 connected devices *&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Model&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;RT-AC86U&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Standards&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11a&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11b&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IEEE 802.11g&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi 4 (802.11n)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi 5 (802.11ac)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Product Segment&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AC2900 ultimate AC performance: 750+2167 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Data rate&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11a: up to 54 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11b: up to 11 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11g: up to 54 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;802.11n: up to 450 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi 5 (802.11ac): up to 1734 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1024QAM (2.4GHz): up to 750 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1024QAM (5GHz): up to 2167 Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 × external detachable antennas&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1 × internal antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Transmit/receive&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIMO technology&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4 GHz 3 × 3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5 GHz 4 × 4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;See the detailed specifications &lt;a href="https://www.asus.com/vn/networking-iot-servers/wifi-routers/asus-wifi-routers/rt-ac86u/techspec/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Xiaomi CR880x (M79) / CR8808 and AX3000 (M81) Firmware Collection</title><link>https://aiot.io.vn/en/firmware/xiaomi/cr880x/</link><pubDate>Sat, 24 Dec 2022 00:20:03 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/cr880x/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi &lt;strong&gt;CR880x&lt;/strong&gt; uses the carrier number as the suffix: CR880&lt;strong&gt;6&lt;/strong&gt; is China Unicom, CR880&lt;strong&gt;8&lt;/strong&gt; is China Mobile, and CR880&lt;strong&gt;9&lt;/strong&gt; is China Telecom. The main difference is that &lt;strong&gt;CR880x M79&lt;/strong&gt; uses the &lt;strong&gt;MXD7223&lt;/strong&gt; 2.4GHz Wi-Fi FEM, while &lt;strong&gt;CR8808 M81&lt;/strong&gt; uses the &lt;strong&gt;RTC66266&lt;/strong&gt; FEM. They can use similar firmware and flashing methods.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;CR8808&lt;/strong&gt; has two motherboard revisions, &lt;strong&gt;M79&lt;/strong&gt; and &lt;strong&gt;M81&lt;/strong&gt;. &lt;strong&gt;M81 is essentially the same platform as the Redmi AX3000&lt;/strong&gt;, so stock AX3000 firmware can be flashed without reduced signal performance. &lt;strong&gt;M79 is similar to 8806/8809&lt;/strong&gt; and is not fully compatible with stock AX3000 firmware because 2.4GHz cannot use the full range when the FEM lacks an integrated LNA.&lt;/p&gt;</description></item><item><title>How to Configure DDNS on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/</link><pubDate>Wed, 30 Nov 2022 11:28:12 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Many services provide DDNS, and each service has its own configuration and usage policy. This guide uses &lt;em&gt;Cloudflare&lt;/em&gt; for a domain you already own and manage through Cloudflare. Other DDNS services follow a similar process.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="i-preparation"&gt;I. Preparation&lt;/h2&gt;&#10;&lt;h3 id="i1-install-the-required-packages"&gt;I.1 Install the required packages&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Log in to the router and open &lt;strong&gt;System&lt;/strong&gt; &amp;gt; &lt;strong&gt;Software&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/1_hu_4ce2ab014ecab071.webp" width="420" height="293" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Update Lists&lt;/strong&gt; to refresh the package list.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/2_hu_d0577b8088582766.webp" width="957" height="215" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;Find and install &lt;em&gt;ddns-scripts&lt;/em&gt; and &lt;em&gt;luci-app-ddns&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/3_hu_200d34b7d4d873c3.webp" width="960" height="362" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; For Cloudflare DDNS, also install &lt;em&gt;ddns-scripts-cloudflare&lt;/em&gt;.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h4 id="i11-configure-cloudflare-ddns"&gt;I.1.1 Configure Cloudflare DDNS&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Services&lt;/strong&gt; &amp;gt; &lt;strong&gt;Dynamic DNS&lt;/strong&gt;, remove the two default entries, and click &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/4_hu_5b46ab6d8f9f8b89.webp" width="503" height="90" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/5_hu_b0aa3c33a23c8817.webp" width="959" height="216" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Add new service&amp;hellip;&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/6_hu_9f69c593a0e7014b.webp" width="965" height="279" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;pre&gt;&lt;code&gt;2.1. Enter any name and select **Cloudflare.com-v4** as the **DDNS Service provider**.&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/7_hu_a7e1c155ebe1f1cc.webp" width="917" height="546" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;pre&gt;&lt;code&gt;2.2. Click **Create service**, then **Cancel** to close the dialog.&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Edit&lt;/strong&gt; on the new service.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt_ddns/8_hu_3df9e22956b76b6e.webp" width="959" height="286" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; For Cloudflare, obtain the Global API Key using &lt;a href="https://developers.cloudflare.com/fundamentals/api/get-started/keys/"&gt;Cloudflare&amp;rsquo;s documentation&lt;/a&gt;.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;In &lt;strong&gt;Basic Settings&lt;/strong&gt;, enter:&lt;/p&gt;</description></item><item><title>How to Use MiWiFi RepairTool</title><link>https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/</link><pubDate>Sun, 30 Oct 2022 05:40:09 +0000</pubDate><guid>https://aiot.io.vn/en/posts/huong-da-su-dung-miwifi-repairtool/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Temporarily disable antivirus on the PC before starting.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;If the router is running stock firmware normally, upgrade through OTA or the router&amp;rsquo;s management interface instead.&lt;/li&gt;&#10;&lt;li&gt;Use an Ethernet cable to connect the router to the PC.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="b1-download-miwifi-repairtool"&gt;B1. Download MiWiFi RepairTool&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;a href="http://www.miwifi.com/miwifi_download.html"&gt;http://www.miwifi.com/miwifi_download.html&lt;/a&gt;.&#10;&lt;ul&gt;&#10;&lt;li&gt;Scroll down to the middle of the page and click the blue download button.&lt;/li&gt;&#10;&lt;li&gt;Download English versions here: &lt;a href="https://mega.nz/file/rJ5ERDRB#0GZevYTDQvSVcWkTJg6XKK5nVrgpqwO9S6YrXwRu9DM"&gt;Link Mega.nz&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;Click the button highlighted in red.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/miwifi-repairtool/DLRepairTool_hu_e510c71849941ad5.webp" width="1085" height="253" alt="Download MiWiFi RepairTool" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Download MiWiFi RepairTool&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;If antivirus software blocks the download, disable it temporarily and enable it again when finished.&lt;/li&gt;&#10;&lt;li&gt;This is Xiaomi&amp;rsquo;s official tool, downloaded from Xiaomi&amp;rsquo;s official website.&lt;/li&gt;&#10;&lt;li&gt;Some network adapters disconnect automatically. If this happens, try another adapter.&lt;/li&gt;&#10;&lt;li&gt;Some Windows 11 versions may be incompatible or produce errors.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="b2-restore-stock-firmware-with-miwifi-repairtool"&gt;B2. Restore stock firmware with MiWiFi RepairTool&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Unplug the router, hold the reset button, and reconnect power. Wait until the yellow light flashes quickly.&lt;/li&gt;&#10;&lt;li&gt;Connect the router to the PC with an Ethernet cable.&lt;/li&gt;&#10;&lt;li&gt;Extract the downloaded &lt;code&gt;MiWiFiRepairTool.x86.zip&lt;/code&gt; archive.&lt;/li&gt;&#10;&lt;li&gt;Double-click &lt;code&gt;MiWiFiRepairTool.x86.exe&lt;/code&gt; to launch the tool.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Follow the instructions shown in each screenshot:&lt;/p&gt;</description></item><item><title>How to Redirect All DNS Queries to OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/redirect-all-dns-requests-to-opnsense/</link><pubDate>Thu, 15 Sep 2022 16:18:12 +0700</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/redirect-all-dns-requests-to-opnsense/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;My OPNsense installation runs AdGuard Home to filter advertisements and malicious websites, but many phone and computer applications hard-code external DNS servers such as Google DNS or 1.1.1.1. This can bypass AdGuard Home.&lt;/p&gt;</description></item><item><title>Online Router Interface Demos: DD-WRT, Gargoyle, TP-Link, ASUS, Linksys, D-Link, Belkin, Cisco, and MikroTik</title><link>https://aiot.io.vn/en/posts/chia-se-cac-trang-demo-giao-dien-cua-cac-router-pho-bien/</link><pubDate>Mon, 12 Sep 2022 09:16:15 +0700</pubDate><guid>https://aiot.io.vn/en/posts/chia-se-cac-trang-demo-giao-dien-cua-cac-router-pho-bien/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;These demos are useful if you are considering router firmware but do not yet know what the interface looks like or how easy it is to configure. They let you explore the menus before making a decision.&lt;/p&gt;&#10;&lt;p&gt;They can also help when choosing a new wireless router and comparing brands such as &lt;em&gt;Netgear&lt;/em&gt;, &lt;em&gt;TP-Link&lt;/em&gt;, &lt;em&gt;ASUS&lt;/em&gt;, &lt;em&gt;Linksys&lt;/em&gt;, and &lt;em&gt;D-Link&lt;/em&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;em&gt;The following table lists online emulators for common wireless-router interfaces:&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How to Port Forward on OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/huong-dan-mo-port-tren-fw-openwrt/</link><pubDate>Wed, 27 Jul 2022 02:16:39 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/huong-dan-mo-port-tren-fw-openwrt/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Practical example:&lt;/strong&gt; I use the domain [&lt;strong&gt;https://openwrt.router.io.vn&lt;/strong&gt;] and want to reach [&lt;strong&gt;https://openwrt.router.io.vn:5353&lt;/strong&gt;] remotely to configure the &lt;strong&gt;OpenWrt&lt;/strong&gt; router at home. I use &lt;strong&gt;DDNS&lt;/strong&gt; and open &lt;strong&gt;port 5353&lt;/strong&gt;, forwarding it to the router&amp;rsquo;s &lt;strong&gt;port 80&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://aiot.io.vn/en/serial/openwrt/huong-dan-cau-hinh-ddns-tren-openwrt/"&gt;How to configure DDNS on OpenWrt&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Log in to OpenWrt&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;em&gt;Network&lt;/em&gt; &amp;gt; &lt;em&gt;Firewall&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward1_hu_7226c9d00784d5c9.webp" width="983" height="654" alt="OpenWrt port forwarding 1" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;OpenWrt port forwarding 1&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open the &lt;em&gt;Port Forward&lt;/em&gt; tab and click &lt;em&gt;Add&lt;/em&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward2_hu_7c69505eb42afb56.webp" width="995" height="644" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Fill in the popup as follows:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Any memorable name.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;External port:&lt;/strong&gt; The Internet-facing port, such as &lt;strong&gt;5353&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Internal IP address:&lt;/strong&gt; The LAN IP of the target device. For example, the router may be &lt;code&gt;192.168.1.1&lt;/code&gt;, with its web interface on port &lt;strong&gt;80&lt;/strong&gt;. For a camera, use its IP, such as &lt;code&gt;192.168.1.10&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Internal port:&lt;/strong&gt; The port used by the target device. If a camera uses port &lt;strong&gt;1234&lt;/strong&gt;, enter &lt;strong&gt;1234&lt;/strong&gt; here.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/openwrt/OpenWRT_PortForward3_hu_dcd7e55342e54eb.webp" width="905" height="528" alt="" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;p&gt;Do not forget to click &lt;strong&gt;Save &amp;amp; Apply&lt;/strong&gt; to apply the change.&lt;/p&gt;</description></item><item><title>Xiaomi Redmi AX6: OpenSSH and OpenWrt Installation</title><link>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6/</link><pubDate>Tue, 20 Jul 2021 15:59:36 +0700</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/redmi-ax6/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;The router is not officially supported by OpenWrt, but the LEDE project by Lean provides firmware for the Redmi AX6.&lt;/li&gt;&#10;&lt;li&gt;This guide covers unlocking SSH and installing OpenWrt on the Redmi AX6 (RA69).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="specifications"&gt;Specifications&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPQ8071A 4-core A53 1.4GHz + dual-core 1.7GHz NPU&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Router class&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AX3000&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi class&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2T2R 2.4GHz 574Mbit/s + 4T4R (2T2R-160MHz, 4T4R-80MHz) 2402Mbit/s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qualcomm QCN5024, 2x2 802.11ax, up to 574Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5GHz&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Qualcomm QCN5054, 4x4 802.11ax, up to 2402Mbps&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6 external high-gain antennas with external dual-band amplifiers&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ports&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1x 10/100/1000 WAN + 3x 10/100/1000 LAN, Auto MDI/MDIX&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modulation&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;DSSS: DBPSK, DQPSK, CCK&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11a/g&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OFDM: BPSK, QPSK, 16QAM, 64QAM&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11n: MIMO-OFDM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;BPSK, QPSK, 16QAM, 64QAM; MCS0–MCS15&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ac: MIMO-OFDM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;BPSK, QPSK, 16QAM, 64QAM, 256QAM; MCS0–MCS9&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rate set&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MCS0–MCS9, up to 4 streams&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;11ax&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIMO-OFDM with BPSK, QPSK, 16QAM, 64QAM, 256QAM, and 1024QAM; MCS0–MCS11&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF3B30]/[0.06] dark:bg-[#FF3B30]/[0.10] border-[#FF3B30]/25 dark:border-[#FF3B30]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF3B30] dark:text-[#FF453A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M7.72 2.25a.75.75 0 0 0-.53.22L2.47 7.19a.75.75 0 0 0-.22.53v8.56c0 .2.08.39.22.53l4.72 4.72c.14.14.33.22.53.22h8.56c.2 0 .39-.08.53-.22l4.72-4.72c.14-.14.22-.33.22-.53V7.72c0-.2-.08-.39-.22-.53L16.81 2.47a.75.75 0 0 0-.53-.22H7.72ZM12 7.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 12 7.5Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;!!! HIGH-RISK PROCEDURE&lt;/p&gt;</description></item><item><title>Xiaomi CR660x: ROM Collection, OpenSSH, and Related Tips</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-cr660x/</link><pubDate>Sat, 10 Jul 2021 09:01:56 +0700</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-cr660x/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Xiaomi &lt;strong&gt;CR660&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; uses the carrier number as its suffix: CR660&lt;strong&gt;6&lt;/strong&gt; is China Unicom, CR660&lt;strong&gt;8&lt;/strong&gt; is China Mobile, and CR660&lt;strong&gt;9&lt;/strong&gt; is China Telecom. The hardware is essentially the same, so the firmware and SSH procedure are similar.&lt;/p&gt;&#10;&lt;p&gt;Most units imported into Vietnam are &lt;strong&gt;CR6608&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; The procedures below are collected from community reports and were not all tested by me. Following them means accepting the risk. I am not responsible for damage, although I will try to help when possible.&lt;/p&gt;</description></item><item><title>Configuring Multi-WAN Load Balancing on Gocloud Firmware</title><link>https://aiot.io.vn/en/posts/huong-dan-can-thiet-lap-can-bang-tai-rom-gocloud/</link><pubDate>Thu, 10 Jun 2021 07:40:17 +0700</pubDate><guid>https://aiot.io.vn/en/posts/huong-dan-can-thiet-lap-can-bang-tai-rom-gocloud/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;If you use a &lt;em&gt;Newifi3 D2&lt;/em&gt; or &lt;em&gt;Gocloud&lt;/em&gt; firmware, you have probably seen the terms &lt;em&gt;load balancing&lt;/em&gt; and &lt;em&gt;Multi-WAN&lt;/em&gt; on networking forums. This guide shows how to configure them on &lt;em&gt;Gocloud&lt;/em&gt;.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;This configuration may not work in some regions.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;This guide uses the &lt;em&gt;Gocloud&lt;/em&gt; 4.x interface. Some menus may be different in version 5.x.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Download &lt;a href="https://aiot.io.vn/posts/tong-hop-firmware-newifi3d2/#iii-firmware-gocloud"&gt;&lt;strong&gt;Gocloud&lt;/strong&gt; firmware for Newifi3 D2&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Configure NordVPN and VietPN on Padavan Firmware</title><link>https://aiot.io.vn/en/posts/huong-dan-cau-hinh-nordvpn-tren-padavan/</link><pubDate>Wed, 09 Jun 2021 07:33:40 +0700</pubDate><guid>https://aiot.io.vn/en/posts/huong-dan-cau-hinh-nordvpn-tren-padavan/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; To use &lt;em&gt;NordVPN&lt;/em&gt; or &lt;em&gt;VietPN&lt;/em&gt;, you must have an account with the service first.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 p-4 rounded-2xl border border-dashed border-black/[0.12] dark:border-white/[0.12] bg-black/[0.02] dark:bg-white/[0.02] text-center text-xs text-neutral-400 dark:text-neutral-500 font-medium tracking-wide"&gt;&#10;&lt;span&gt;Tài trợ / Quảng cáo&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;PADAVAN is well known for its stability and relatively simple interface. Routers such as the &lt;em&gt;Newifi 3D2&lt;/em&gt; can run it well. See the &lt;a href="https://aiot.io.vn/firmware/lenovo/tong-hop-firmware-newifi3d2/#iii-firmware-gocloud"&gt;Newifi 3D2 firmware collection&lt;/a&gt; for related information.&lt;/p&gt;</description></item><item><title>Xiaomi Mi Router 3C Firmware Collection</title><link>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-router-3c/</link><pubDate>Thu, 27 May 2021 19:45:12 +0700</pubDate><guid>https://aiot.io.vn/en/firmware/xiaomi/xiaomi-router-3c/</guid><description>&lt;p&gt;&lt;span style="display:flex;justify-content:center;"&gt;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/thumbnails/router3c_hu_91907000e3778531.webp" width="378" height="321" alt="Mi Router 3C" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Mi Router 3C&lt;/figcaption&gt;&lt;/figure&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;h2 id="hardware-overview"&gt;Hardware overview&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Type&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Router&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Model&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Mi Router 3C / R3L&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7628N&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Network&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2.4GHz up to 300Mbps, 802.11b/g/n&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Security&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WPA-PSK, WPA2-PSK&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Antenna&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4 external 5dBi&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ports&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 LAN, 1 WAN (100Mbps)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Power supply&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;5V / 1A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr/&gt;&#10;&lt;h2 id="firmware-upgrade-notes"&gt;Firmware upgrade notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Updating this router requires some electronics and software knowledge.&lt;/li&gt;&#10;&lt;li&gt;One method that does not require opening the case or using a CH341 programmer is the &lt;a href="https://github.com/acecilia/OpenWRTInvasion"&gt;OpenWRTInvasion script&lt;/a&gt;. It enables OpenSSH, after which Breed can be flashed and used to install firmware. A mistake while flashing Breed can brick the router and require a CH341 programmer for recovery.&lt;/li&gt;&#10;&lt;li&gt;This page collects firmware; a detailed upgrade tutorial may be added later.&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Attachments&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;1 files&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Xiaomi/Xiaomi-Router-3C.files/breed-mt7628-hiwifi-hc5661a.bin" download="breed-mt7628-hiwifi-hc5661a.bin" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="breed-mt7628-hiwifi-hc5661a.bin"&gt;breed-mt7628-hiwifi-hc5661a.bin&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;88.0 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Xiaomi/Xiaomi-Router-3C.files/breed-mt7628-hiwifi-hc5661a.bin" download="breed-mt7628-hiwifi-hc5661a.bin" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;GET&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr/&gt;&#10;&lt;h2 id="firmware-collection"&gt;Firmware collection&lt;/h2&gt;&#10;&lt;h3 id="1-chinese-stock-firmware"&gt;1. Chinese stock firmware&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Version 2.14.45 (updated March 26, 2019). Download the official file &lt;a href="http://bigota.miwifi.com/xiaoqiang/rom/r3l/miwifi_r3l_firmware_0b49f_2.14.45.bin" title="Download Mi Router 3C stock firmware"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Changelog&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Solves DNS-resolution errors and intermittent network instability.&lt;/li&gt;&#10;&lt;li&gt;Solves a rare configuration-loss issue after power failure.&lt;/li&gt;&#10;&lt;li&gt;Optimizes the app-binding process.&lt;/li&gt;&#10;&lt;li&gt;Optimizes system memory; the system is smaller and more stable.&lt;/li&gt;&#10;&lt;li&gt;Fixes several minor issues and further improves stability.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;h3 id="2-english-stock-firmware"&gt;2. English stock firmware&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Can be flashed directly through the Chinese firmware web interface.&lt;/li&gt;&#10;&lt;li&gt;Version 2.8.51. Download from Google Drive &lt;a href="https://drive.google.com/file/d/1TLYGXdCvG_mqF6OHyrZItUZa15uvHDMg/view?usp=sharing" title="Download Mi Router 3C English firmware"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-padavan-jump-firmware-port"&gt;3. PADAVAN Jump firmware (port)&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Flash through Breed Bootloader or a CH341 programmer.&lt;/li&gt;&#10;&lt;li&gt;Download from Google Drive &lt;a href="https://drive.google.com/file/d/1TIF0NtEaScbACQyQSemvPIir5qT_U5Al/view?usp=sharing" title="Download PADAVAN Jump"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Credit: &lt;a href="https://4pda.to/forum/index.php?showuser=4645599" title="Stels8800 4PDA"&gt;&lt;em&gt;Stels8800&lt;/em&gt;&lt;/a&gt;, 4PDA Russia.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-padavan-linaro-firmware-version-3439l-100_939f130--usb--breed"&gt;4. PADAVAN Linaro firmware, version 3.4.3.9L-100_939f130 + USB + Breed&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Flash through Breed Bootloader or a CH341 programmer.&lt;/li&gt;&#10;&lt;li&gt;Download from Google Drive &lt;a href="https://drive.google.com/file/d/1argnhHEryuF7D0ANO_lIRKHIFvWSxIs0/view?usp=sharing" title="PADAVAN Linaro R3C"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Credit: &lt;a href="https://4pda.to/forum/index.php?showuser=80862" title="Sedy 4PDA"&gt;&lt;em&gt;Sedy&lt;/em&gt;&lt;/a&gt;, 4PDA Russia.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-openwrt-18061"&gt;5. OpenWrt 18.06.1&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Flash through Breed Bootloader or a CH341 programmer.&#10;&lt;ul&gt;&#10;&lt;li&gt;Wi-Fi password: &lt;em&gt;1234567890&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Download from Google Drive &lt;a href="https://drive.google.com/file/d/1yY5Q1cIX6IYKOqDAIAr5coGinZF9HwZh/view?usp=sharing" title="Download OpenWrt R3C"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Credit: &lt;em&gt;mogvai&lt;/em&gt;, 4PDA Russia.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="6-zyxel-keenetic-lite-iii-revb"&gt;6. ZyXEL Keenetic Lite III rev:B&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Flash through Breed Bootloader or a CH341 programmer.&#10;&lt;ul&gt;&#10;&lt;li&gt;Wi-Fi: &lt;em&gt;Keenetic-3C&lt;/em&gt; / Password: &lt;em&gt;1234567890&lt;/em&gt; / WPS: &lt;em&gt;76133565&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Download from Google Drive &lt;a href="https://drive.google.com/file/d/1H6DRLmFaPFZqP36XTEio2gWZ_dEvRIOB/view?usp=sharing" title="Download Keenetic R3C"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Credit: &lt;a href="https://4pda.to/forum/index.php?showuser=80862" title="Sedy 4PDA"&gt;&lt;em&gt;Sedy&lt;/em&gt;&lt;/a&gt;, 4PDA Russia.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Screenshot&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/r3c/keenetic_hu_30b4b489b5026f76.webp" width="1095" height="547" alt="Keenetic" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Keenetic&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Some hardware revisions fail to boot after flashing this firmware. To fix that, desolder the two resistors at R23 and move them to R24 and R25 to R26 as shown in the images.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/r3c/fixKeeR3c_hu_586ea1fc23d5f828.webp" width="651" height="279" alt="Fix Keenetic not booting" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Fix Keenetic not booting&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/r3c/fixKeeR3c__hu_6375bc076bf364dc.webp" width="686" height="362" alt="Fix Keenetic not booting" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Fix Keenetic not booting&lt;/figcaption&gt;&lt;/figure&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;strong&gt;Leave questions in the comments or message me; I will help if possible.&lt;/strong&gt;&#10;&lt;em&gt;Good luck.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How to Connect NordVPN and Isolate VPN Traffic on a Separate AP (Part 1)</title><link>https://aiot.io.vn/en/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan1/</link><pubDate>Sat, 01 May 2021 08:25:14 +0700</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan1/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; This is an advanced, multi-part configuration covering VLANs, interfaces, firewall rules, VPN, and the Wi-Fi AP. Read the menus carefully before applying changes.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;h3 id="i-create-a-vlan-and-interface"&gt;I. Create a VLAN and interface&lt;/h3&gt;&#10;&lt;h4 id="1-create-a-vlan"&gt;1. Create a VLAN&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Log in to OPNsense and open &lt;strong&gt;Interfaces&lt;/strong&gt; &amp;gt; &lt;strong&gt;Other Types&lt;/strong&gt; &amp;gt; &lt;strong&gt;VLAN&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Select the LAN port as &lt;strong&gt;Parent interface&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Enter a VLAN tag such as &lt;code&gt;11&lt;/code&gt;, add a description such as &lt;code&gt;VPN&lt;/code&gt;, and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-create-an-interface-for-the-vlan"&gt;2. Create an interface for the VLAN&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;strong&gt;Interfaces&lt;/strong&gt; &amp;gt; &lt;strong&gt;Assignments&lt;/strong&gt; and add an interface. Under &lt;strong&gt;New interface&lt;/strong&gt;, select &lt;code&gt;vlan11 on xxx (VPN)&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;The new interface may be named &lt;code&gt;OPT1&lt;/code&gt;. Open it, enable it, and configure:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Field&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Value&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Notes&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Description&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VPN_LAN&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Easy-to-remember name&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Block Private networks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Unchecked&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Block bogon networks&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Unchecked&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv4 Configuration Type&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Static IPv4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv6 Configuration Type&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;None&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MAC address / MTU / MSS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Empty&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Speed and duplex&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Default&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Static IPv4 address&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;192.168.200.1/24&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Use a subnet appropriate for your OPNsense LAN&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IPv4 Upstream Gateway&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Auto-detect&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;, then &lt;strong&gt;Apply changes&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>How to Connect NordVPN and Isolate VPN Traffic on a Separate AP (Part 2)</title><link>https://aiot.io.vn/en/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan2/</link><pubDate>Sat, 01 May 2021 08:24:14 +0700</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan2/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; This is an advanced configuration. You should understand the OPNsense menus and have a recovery path before changing VPN routing.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;See &lt;a href="https://aiot.io.vn/en/serial/opnsense/huong-dan-ket-noi-nordvpn-va-chia-vlan-phan1/"&gt;Part 1 — Add a VLAN and assign it to an interface&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Configure Fast Roaming with OpenWrt</title><link>https://aiot.io.vn/en/serial/openwrt/cau-hinh-wifi-roaming-voi-openwrt/</link><pubDate>Sun, 21 Mar 2021 02:49:09 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/cau-hinh-wifi-roaming-voi-openwrt/</guid><description>&lt;h2 id="what-is-fast-roaming"&gt;What is Fast Roaming?&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;Fast Roaming&lt;/em&gt; allows a client to move from one Wi-Fi coverage area to another with less interruption. IEEE 802.11r and 802.11k are designed to make wireless roaming more seamless.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;A roaming system needs:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;All APs configured with the same SSID, encryption, and password. Channels may be the same or different.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;All APs on the same LAN and able to communicate with one another.&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr /&gt;&#10;&lt;p&gt;Advantages:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Each AP uses Ethernet backhaul to the same router or switch, so roaming does not reduce the backhaul speed.&lt;/li&gt;&#10;&lt;li&gt;The connection speed in each AP area usually suffers less loss.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr /&gt;&#10;&lt;p&gt;Disadvantages:&lt;/p&gt;</description></item><item><title>How to Change Newifi3 D2 Stock Firmware from Chinese to English</title><link>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-stock-english-firmware/</link><pubDate>Wed, 06 Jan 2021 10:38:05 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-stock-english-firmware/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;This guide changes the interface from Chinese to English (you can translate it to Vietnamese yourself 🤣). It is for users who like the stock firmware but do not read Chinese.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A computer or phone that can use &lt;strong&gt;SCP&lt;/strong&gt;. This guide uses a PC.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WinSCP&lt;/strong&gt; for Windows, available &lt;a href="https://winscp.net/eng/download.php" title="Download WinSCP"&gt;here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;The English language file. You can translate it into Vietnamese if needed, but keep the syntax and leave the filename as &lt;strong&gt;base.cn.json&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Attachments&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;1 files&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Lenovo/Newifi3D2/Newifi3-d2-stock-english-firmware.files/base.cn.json" download="base.cn.json" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="base.cn.json"&gt;base.cn.json&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;36.2 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/firmware/Lenovo/Newifi3D2/Newifi3-d2-stock-english-firmware.files/base.cn.json" download="base.cn.json" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;GET&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;If the attachment cannot be downloaded, use this Drive link: &lt;a href="https://drive.google.com/file/d/1UFKAXUbXqfgwT4h-YyZ2V0mP6nktXB3X/view?usp=sharing" title="Download base.cn.json"&gt;Download&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Configure a Captive Portal on OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/opnsense-cau-hinh-captive-portal/</link><pubDate>Fri, 25 Dec 2020 02:30:14 +0000</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/opnsense-cau-hinh-captive-portal/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;See the &lt;a href="https://aiot.io.vn/en/serial/opnsense/"&gt;OPNsense configuration series&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Cloudflare DDNS, Let's Encrypt SSL, and Reverse Proxy on OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/opnsense-domain-ddns-letsencrypt-reveserproxy/</link><pubDate>Thu, 24 Dec 2020 06:01:14 +0000</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/opnsense-domain-ddns-letsencrypt-reveserproxy/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;See the &lt;a href="https://aiot.io.vn/en/serial/opnsense/"&gt;OPNsense configuration series&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Install AdGuard Home on OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/opnsense-install-adguardhome/</link><pubDate>Thu, 24 Dec 2020 06:00:39 +0000</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/opnsense-install-adguardhome/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;See the &lt;a href="https://aiot.io.vn/en/serial/opnsense/"&gt;OPNsense configuration series&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;To redirect all client DNS queries through AdGuard Home, see &lt;a href="https://aiot.io.vn/en/serial/opnsense/redirect-all-dns-requests-to-opnsense/"&gt;Redirect all DNS queries to OPNsense&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Important notes&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Basic command-line and SSH knowledge is required.&lt;/li&gt;&#10;&lt;li&gt;Copy and type commands carefully. A mistake can make the installation fail or require OPNsense to be reinstalled.&lt;/li&gt;&#10;&lt;li&gt;You can use Windows PowerShell, PuTTY, Linux Terminal, or an Android SSH client such as Termius or ConnectBot.&lt;/li&gt;&#10;&lt;li&gt;Connect the computer to OPNsense by LAN or Wi-Fi; it must be on the same network.&lt;/li&gt;&#10;&lt;li&gt;This guide uses &lt;code&gt;192.168.1.1&lt;/code&gt; as the example OPNsense address.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;hr /&gt;&#10;&lt;h2 id="step-1-configure-dns-and-enable-ssh"&gt;Step 1: Configure DNS and enable SSH&lt;/h2&gt;&#10;&lt;h3 id="enable-ssh"&gt;Enable SSH&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Log in to &lt;code&gt;https://192.168.1.1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;System&lt;/strong&gt; &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Administration&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Under &lt;strong&gt;Secure Shell&lt;/strong&gt;, enable SSH, select the &lt;code&gt;wheel,admins&lt;/code&gt; login group, and enable &lt;strong&gt;Permit root user login&lt;/strong&gt; and &lt;strong&gt;Permit password login&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Leave other options at their defaults and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="configure-dns"&gt;Configure DNS&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Open &lt;strong&gt;System&lt;/strong&gt; &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;General&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Add Google DNS (&lt;code&gt;8.8.8.8&lt;/code&gt;, &lt;code&gt;8.8.4.4&lt;/code&gt;) or Cloudflare DNS (&lt;code&gt;1.1.1.1&lt;/code&gt;, &lt;code&gt;1.0.0.1&lt;/code&gt;) under &lt;strong&gt;DNS Servers&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Enable &lt;strong&gt;Do not use the local DNS service as a nameserver for this system&lt;/strong&gt; and save.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="disable-unbound-dns"&gt;Disable Unbound DNS&lt;/h3&gt;&#10;&lt;p&gt;Unbound normally uses port 53. Disable it so AdGuard Home can listen on port 53:&lt;/p&gt;</description></item><item><title>Create a Guest VLAN, Limit Bandwidth, and Configure Captive Portal on OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/opnsense-vlan-captiveportal-bwmanagement/</link><pubDate>Thu, 24 Dec 2020 05:58:08 +0000</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/opnsense-vlan-captiveportal-bwmanagement/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; See the &lt;a href="https://aiot.io.vn/en/serial/opnsense/"&gt;OPNsense configuration series&lt;/a&gt;.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;A Guest VLAN allows one LAN port to carry separate networks, which is useful on routers with limited ports. It can provide free guest Wi-Fi, limit guest speed, use a separate DHCP server, or show a captive-portal page before Internet access.&lt;/p&gt;</description></item><item><title>How to Configure PPPoE on OPNsense</title><link>https://aiot.io.vn/en/serial/opnsense/opnsense-pppoe/</link><pubDate>Thu, 24 Dec 2020 05:45:58 +0000</pubDate><guid>https://aiot.io.vn/en/serial/opnsense/opnsense-pppoe/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#FF9500]/[0.06] dark:bg-[#FF9500]/[0.10] border-[#FF9500]/25 dark:border-[#FF9500]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#FF9500] dark:text-[#FF9F0A] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;strong&gt;Outdated&lt;/strong&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;See the &lt;a href="https://aiot.io.vn/en/serial/opnsense/"&gt;OPNsense configuration series&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Newifi3 D2 Firmware Collection</title><link>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/tong-hop-firmware-newifi3d2/</link><pubDate>Thu, 03 Sep 2020 02:46:40 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/tong-hop-firmware-newifi3d2/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Newifi3-D2 offers unusually strong hardware for its price: a dual-core, four-thread CPU and up to 512MB RAM. Its 2.4GHz Wi-Fi is not outstanding, but 5GHz performance is good, making it an interesting platform for custom firmware.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Newifi 3 D2 overview&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;CPU architecture:&lt;/strong&gt; &lt;em&gt;Ramips&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Package architecture:&lt;/strong&gt; &lt;em&gt;Mipsel_24kc&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bootloader:&lt;/strong&gt; &lt;em&gt;U-Boot; can be replaced by Breed Bootloader&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; &lt;em&gt;MediaTek MT7621AT&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cores/threads:&lt;/strong&gt; &lt;em&gt;2/4&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CPU speed:&lt;/strong&gt; &lt;em&gt;880MHz&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ROM/RAM:&lt;/strong&gt; &lt;em&gt;32MB/512MB&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WAN:&lt;/strong&gt; &lt;em&gt;1 × 10/100/1000&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LAN:&lt;/strong&gt; &lt;em&gt;4 × 10/100/1000&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Switch:&lt;/strong&gt; &lt;em&gt;MediaTek MT7621AT&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VLAN:&lt;/strong&gt; &lt;em&gt;Yes&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN hardware:&lt;/strong&gt; &lt;em&gt;MediaTek MT7603EN and MT7612EN, 2x2 MIMO&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN 2.4GHz:&lt;/strong&gt; &lt;em&gt;b/g/n&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;WLAN 5GHz:&lt;/strong&gt; &lt;em&gt;a/n/ac&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Stock OpenWrt WLAN driver:&lt;/strong&gt; &lt;em&gt;mt76&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;USB:&lt;/strong&gt; &lt;em&gt;1 × USB 3.0&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;details class="my-5 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] shadow-[0_2px_8px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.35)] overflow-hidden group transition-all duration-200"&gt;&#10;&lt;summary class="cursor-pointer font-semibold text-sm sm:text-base px-4 sm:px-5 py-3.5 bg-neutral-50/80 dark:bg-[#242426]/60 hover:bg-black/[0.03] dark:hover:bg-white/[0.04] flex items-center justify-between transition-colors list-none select-none text-neutral-900 dark:text-neutral-100 border-b border-transparent group-open:border-black/[0.06] dark:group-open:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0 pr-2"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0 shadow-2xs"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-90 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72.648 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='72.648' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M66.42 44.739C66.42 43.516 65.974 42.439 65.031 41.506L26.337 3.684C25.518 2.814 24.43 2.379 23.187 2.379C20.649 2.379 18.691 4.274 18.691 6.823C18.691 8.014 19.23 9.143 19.986 10.003L55.521 44.739L19.986 79.476C19.23 80.335 18.691 81.413 18.691 82.656C18.691 85.204 20.649 87.1 23.187 87.1C24.43 87.1 25.518 86.665 26.337 85.795L65.031 47.972C65.974 47.04 66.42 45.962 66.42 44.739Z' fill="currentColor" fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="truncate"&gt;Newifi3 D2 firmware upgrade guide&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;span class="w-6 h-6 rounded-full bg-black/[0.04] dark:bg-white/[0.08] flex items-center justify-center shrink-0 text-neutral-500 dark:text-neutral-400"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 group-open:rotate-180 transition-transform duration-200 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 109.73 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='109.73' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M54.884 70.758C56.118 70.758 57.319 70.281 58.17 69.327L95.95 30.654C96.768 29.825 97.266 28.769 97.266 27.515C97.266 24.977 95.359 23.019 92.822 23.019C91.63 23.019 90.439 23.547 89.62 24.314L52.251 62.483L57.476 62.483L20.096 24.314C19.288 23.547 18.189 23.019 16.957 23.019C14.408 23.019 12.461 24.977 12.461 27.515C12.461 28.769 12.969 29.835 13.787 30.665L51.609 69.338C52.5 70.291 53.599 70.758 54.884 70.758Z' fill='#000' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;/summary&gt;&#10;&lt;div class="p-4 sm:p-5 text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 overflow-x-auto [&amp;_table]:w-full"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Follow the &lt;a href="https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/"&gt;Newifi3 D2 firmware upgrade guide&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Default LAN IP, username, and password vary by firmware. Most Padavan builds use &lt;code&gt;192.168.123.1&lt;/code&gt;; OpenWrt and OpenWrt-based builds commonly use &lt;code&gt;192.168.1.1&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&#10;&lt;hr /&gt;&#10;&lt;h2 id="0-stock-firmware--xcloudos"&gt;0. Stock firmware — xCloudOS&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;The factory firmware is called &lt;strong&gt;xCloudOS&lt;/strong&gt; and uses Chinese by default. The &lt;a href="https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-stock-english-firmware/"&gt;English-language guide&lt;/a&gt; explains how to replace the language file.&lt;/p&gt;</description></item><item><title>How to Configure OpenWrt as an Access Point and Add a Guest VLAN</title><link>https://aiot.io.vn/en/serial/openwrt/cau-hinh-openwrt-lam-ap-mode/</link><pubDate>Mon, 15 Jun 2020 13:07:56 +0000</pubDate><guid>https://aiot.io.vn/en/serial/openwrt/cau-hinh-openwrt-lam-ap-mode/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;See &lt;a href="huong-dan-cau-hinh-openwrt-quay-pppoe/"&gt;how to configure PPPoE on OpenWrt&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;See &lt;a href="huong-dan-cau-hinh-openwrt-quay-pppoe-with-vlan/"&gt;how to configure PPPoE with a VLAN ID&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;hr /&gt;&#10;&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Configure OpenWrt as an AP when another modem or router already provides DHCP.&#10;&lt;ul&gt;&#10;&lt;li&gt;In this mode, the OpenWrt router mainly provides Wi-Fi. DHCP, load balancing, DNS server, and firewall functions are disabled on it.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Create a VLAN-backed Guest Wi-Fi with multiple SSIDs and separate bandwidth policies.&#10;&lt;ul&gt;&#10;&lt;li&gt;Both the modem and router must support VLANs. Bandwidth limits, load balancing, and captive-portal features depend on the upstream router.&lt;/li&gt;&#10;&lt;li&gt;This example uses an OPNsense PC router behind a Viettel PPPoE connection. The main DHCP range is &lt;code&gt;172.16.1.1&lt;/code&gt; to &lt;code&gt;172.16.3.254&lt;/code&gt;; the Guest range is &lt;code&gt;172.16.16.1&lt;/code&gt; to &lt;code&gt;172.16.16.254&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="configure-openwrt-as-an-ap"&gt;Configure OpenWrt as an AP&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Connect a LAN cable from a &lt;strong&gt;LAN&lt;/strong&gt; port on the modem to a &lt;strong&gt;LAN&lt;/strong&gt; port on the router. You can use a &lt;a href="https://s.shopee.vn/8plJDOxNE5"&gt;Cat6 network cable from Shopee&lt;/a&gt; if you need a separate cable for configuration.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; Use &lt;strong&gt;LAN-to-LAN&lt;/strong&gt;. OpenWrt does not use the &lt;strong&gt;WAN&lt;/strong&gt; port in this AP mode.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Set a static LAN IP in the same subnet as the main modem.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; For example, if the modem is &lt;code&gt;172.16.1.1&lt;/code&gt;, set the AP to &lt;code&gt;172.16.1.2&lt;/code&gt;.&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;Set the DNS server and gateway to the modem address, &lt;code&gt;172.16.1.1&lt;/code&gt; in this example.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/Lan_Interface_hu_47ede0ee4eb7ea67.webp" width="1000" height="690" alt="LAN interface" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;LAN interface&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Under &lt;strong&gt;DHCP Server&lt;/strong&gt;, select &lt;strong&gt;Disable DHCP for this interface&lt;/strong&gt;.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/Lan_Interface2_hu_635e65a4b58e08c7.webp" width="982" height="645" alt="LAN interface 2" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;LAN interface 2&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;In the IPv6 tab, disable the options shown in the screenshot.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/LAN_ipv6_hu_e5cc779e6d94f38f.webp" width="990" height="519" alt="Disable IPv6" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Disable IPv6&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Open &lt;strong&gt;System&lt;/strong&gt; → &lt;strong&gt;Startup&lt;/strong&gt; and disable DHCP Server, Firewall, DNSMASQ, and ODHCPD if present.&#10;&lt;figure class="my-6 block text-center"&gt;&#10;&lt;img src="https://aiot.io.vn/images/newifi-d2/startup_hu_eeaed017b303c780.webp" width="929" height="637" alt="Disable startup services" loading="lazy" decoding="async" class="rounded-2xl border border-black/[0.06] dark:border-white/[0.08] shadow-sm max-w-full h-auto mx-auto inline-block" /&gt;&lt;figcaption class="text-center text-xs text-neutral-500 dark:text-neutral-400 mt-2 font-medium"&gt;Disable startup services&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;&#10;&lt;li&gt;Click &lt;strong&gt;Save and Apply&lt;/strong&gt;, connect the computer to port 2, and browse to &lt;code&gt;172.16.1.2&lt;/code&gt; to test.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#0071E3]/[0.05] dark:bg-[#2997FF]/[0.08] border-[#0071E3]/20 dark:border-[#2997FF]/25 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#0071E3] dark:text-[#2997FF] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 117.045 100' style='overflow:visible'&gt;&lt;rect x='0' y='-15' width='117.045' height='120' fill-opacity='0'/&gt;&lt;g&gt;&lt;path d='M58.496 94.513C85.719 94.513 108.321 71.963 108.321 44.739C108.321 17.516 85.667-5.034 58.444-5.034C31.262-5.034 8.723 17.516 8.723 44.739C8.723 71.963 31.314 94.513 58.496 94.513Z' fill="currentColor" fill-opacity='1' /&gt;&lt;path d='M49.71 73.019C47.606 73.019 46.032 71.516 46.032 69.392C46.032 67.475 47.606 65.869 49.71 65.869L55.929 65.869L55.929 42.893L50.529 42.893C48.528 42.893 46.902 41.391 46.902 39.267C46.902 37.339 48.528 35.743 50.529 35.743L60.052 35.743C62.611 35.743 63.989 37.598 63.989 40.291L63.989 65.869L70.207 65.869C72.249 65.869 73.886 67.475 73.886 69.392C73.886 71.516 72.249 73.019 70.207 73.019ZM58.082 27.439C54.412 27.439 51.468 24.454 51.468 20.784C51.468 17.062 54.412 14.159 58.082 14.159C61.752 14.159 64.603 17.062 64.603 20.784C64.603 24.454 61.752 27.439 58.082 27.439Z' fill='#ffffff' fill-opacity='1' /&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;p&gt;If the home network uses DLNA, UPnP, or SMB devices such as smart TVs and Chromecast speakers, enable &lt;code&gt;igmp_snooping&lt;/code&gt; to avoid discovery problems.&lt;/p&gt;</description></item><item><title>Upgrade Newifi3 D2 with Custom Firmware</title><link>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/</link><pubDate>Sat, 04 Apr 2020 01:59:53 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/</guid><description>&lt;hr /&gt;&#10;&lt;h2 id="i-specifications"&gt;I. Specifications&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Newifi 3 D2 specifications&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Target&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ramips&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7621AT, 2 cores / 4 threads, 800MHz&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ROM/RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;32MB / 512MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Wi-Fi&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MT7603EN, MT7612EN&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;More information is available on the &lt;a href="https://openwrt.org/toh/hwdata/d-team/d-team_newifi_d2"&gt;OpenWrt hardware page&lt;/a&gt;.&lt;/p&gt;&#10;&lt;hr /&gt;&#10;&lt;h2 id="ii-openssh-and-breed-bootloader"&gt;II. OpenSSH and Breed Bootloader&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Newifi3-D2 uses a simple U-Boot that does not support online firmware upgrades or a web interface. Breed is an alternative bootloader designed for routers and adds web-based firmware flashing. Breed is not open source, so &lt;strong&gt;using it means accepting the risk&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>OpenWrt by Lean (LEDE) for Newifi3 D2</title><link>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/openwrt-newifi3-d2/</link><pubDate>Thu, 02 Apr 2020 12:51:12 +0000</pubDate><guid>https://aiot.io.vn/en/firmware/lenovo/newifi3d2/openwrt-newifi3-d2/</guid><description>&lt;div class="my-6 rounded-2xl border p-4 sm:p-5 flex items-start gap-3.5 sm:gap-4 bg-[#34C759]/[0.06] dark:bg-[#34C759]/[0.10] border-[#34C759]/25 dark:border-[#34C759]/30 shadow-[0_2px_12px_rgba(0,0,0,0.03)] dark:shadow-[0_4px_20px_rgba(0,0,0,0.25)] transition-all"&gt;&#10; &lt;div class="shrink-0 text-[#34C759] dark:text-[#30D158] pt-0.5"&gt;&#10; &lt;span class="inline-flex shrink-0 items-center justify-center w-6 h-6 sm:w-7 sm:h-7 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path d="M12 2.25a7.5 7.5 0 0 0-7.5 7.5c0 2.58 1.306 4.856 3.284 6.183.336.226.541.603.541 1.005v.562c0 .966.784 1.75 1.75 1.75h3.85c.966 0 1.75-.784 1.75-1.75v-.562c0-.402.205-.779.541-1.005A7.48 7.48 0 0 0 19.5 9.75a7.5 7.5 0 0 0-7.5-7.5ZM9.75 21a.75.75 0 0 0 0 1.5h4.5a.75.75 0 0 0 0-1.5h-4.5Z" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="flex-1 min-w-0 pt-0.5"&gt;&#10; &#10; &lt;div class="text-sm sm:text-base text-neutral-700 dark:text-neutral-300 leading-relaxed prose dark:prose-invert max-w-none [&amp;&gt;p:first-child]:mt-0 [&amp;&gt;p:last-child]:mb-0 [&amp;&gt;p]:leading-relaxed"&gt;&#10; &lt;a href="https://aiot.io.vn/en/firmware/lenovo/newifi3d2/newifi3-d2-firmware-upgrade/#2-update-firmware"&gt;&lt;strong&gt;Firmware upgrade guide&lt;/strong&gt;&lt;/a&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;This ROM was built by &lt;em&gt;@kizimirua&lt;/em&gt; from &lt;em&gt;Lean OpenWrt&lt;/em&gt; &lt;a href="https://github.com/coolsnowwolf/lede"&gt;https://github.com/coolsnowwolf/lede&lt;/a&gt; for &lt;strong&gt;NEWIFI3 D2&lt;/strong&gt;, the third-generation OpenWrt build.&lt;/p&gt;</description></item><item><title>[Bash Script] Update a Cloudflare DNS Record with a Dynamic IPv4 Address</title><link>https://aiot.io.vn/en/posts/cloudflare-dynamic-ip-update/</link><pubDate>Sun, 22 Mar 2020 07:04:20 +0000</pubDate><guid>https://aiot.io.vn/en/posts/cloudflare-dynamic-ip-update/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;This script checks your current public IP and quickly updates the corresponding Cloudflare DNS records.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="cloudflare_dynamic_ip_updatebash"&gt;cloudflare_dynamic_ip_update.bash&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Author: Hyecheol (Jerry) Jang&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Shell Script that checks the current public (dynamic) IP address of a server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## and updates the Cloudflare DNS record after comparing it with the registered address.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Basic shell scripting guide: https://blog.gaerae.com/2015/01/bash-hello-world.html&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Use dig (https://en.wikipedia.org/wiki/Dig_(command)) to get the current public IP address.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;currentIP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dig -4 TXT +short o-o.myaddr.1.google.com @ns1.google.com&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;currentIP&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt; &lt;span style="color:#75715e"&gt;## when dig runs without an error,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## Keep only the IP address from the response.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## https://stackabuse.com/substrings-in-bash/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentIP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $currentIP | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;current public IP address is &amp;#34;&lt;/span&gt;$currentIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#75715e"&gt;## an error occurred,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Check your internet connection, or the Google DNS server may be interrupted.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Use the Cloudflare API to retrieve the existing record IP.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://api.cloudflare.com/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Read configuration from a separate cloudflare_config file in the same directory.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## https://stackoverflow.com/questions/10586153/split-string-into-an-array-in-bash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SCRIPT_PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dirname &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;realpath $0&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;readResult&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Store configuration.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt; read -r line &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readResult&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Delimiter: space.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readResult&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &amp;lt; $SCRIPT_PATH&lt;span style="color:#e6db74"&gt;&amp;#34;/cloudflare_config&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Use cloudflare_config.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset IFS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset SCRIPT_PATH&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Split the configuration string into its elements.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 1&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;email&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoneID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 3&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; read -r -a updateTarget &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $readResult | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 4&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset readResult&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset IFS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Allocate arrays for record IP addresses, types, and names.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordName&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a dnsID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a recordProxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; string in &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;updateTarget[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#75715e"&gt;## Retrieve each record&amp;#39;s IP address.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -s -X GET &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;$zoneID&lt;span style="color:#e6db74"&gt;/dns_records?name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;string&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Email: &lt;/span&gt;$email&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Key: &lt;/span&gt;$key&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## Parse JSON with jq.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## https://stackoverflow.com/questions/42427371/cloudflare-api-cut-json-response&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;## https://stedolan.github.io/jq/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ip&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.content) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.type) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.name) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.id) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; proxied&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $content | jq &lt;span style="color:#e6db74"&gt;&amp;#39;.result | map(.proxied) | add&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 2&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordIP&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordIP[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $ip&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordType&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordType[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $rType&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordName&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $name&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dnsID&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;dnsID[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $id&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; recordProxied&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordProxied[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; $proxied&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset rType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset ip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset content&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset string&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset proxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset updateTarget&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Compare currentIP with each recordIP.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;declare -a needUpdate &lt;span style="color:#75715e"&gt;## Store whether each record needs updating.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; string in &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordIP[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;string&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;currentIP&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; needUpdate&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; needUpdate&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;True&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; unset string&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordIP &lt;span style="color:#75715e"&gt;## No longer needed.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Update records that need it.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;count&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $count -lt &lt;span style="color:#e6db74"&gt;${#&lt;/span&gt;needUpdate[@]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;needUpdate[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;True&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;record IP needs to be updated for &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; success&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; curl -s -X PUT &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;$zoneID&lt;span style="color:#e6db74"&gt;/dns_records/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;dnsID[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Email: &lt;/span&gt;$email&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Auth-Key: &lt;/span&gt;$key&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --data &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;type&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordType[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;content&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$currentIP&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;,&amp;#34;proxied&amp;#34;:&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordProxied[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;}&amp;#39;&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; jq &lt;span style="color:#e6db74"&gt;&amp;#39;.success&amp;#39;&lt;/span&gt; | cut -d&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $success &lt;span style="color:#f92672"&gt;==&lt;/span&gt; true &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Success: updated the record IP of &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Failed to update the record IP of &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;\n&amp;#34;&amp;#34;Please check the result.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;record IP does not need to be updated for &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;recordName[count]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;count&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset count&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset currentIP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset key&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset email&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset zoneID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordType&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordName&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset dnsID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset recordProxied&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset needUpdate&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cloudflare_config"&gt;cloudflare_config&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Auth-Key=[Global API Key]&#10;Auth-Email=[Login Mail]&#10;Zone-ID=[Zone ID]&#10;Update-Target=subdomain.router.io.vn&#10;&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;&#10;&lt;h5 id="credit-hyecheol-jerry-jang"&gt;Credit: Hyecheol (Jerry) Jang&lt;/h5&gt;&#10;&lt;div class="my-6 rounded-2xl border border-black/[0.08] dark:border-white/[0.08] bg-white dark:bg-[#1C1C1E] p-5 sm:p-6 shadow-[0_2px_12px_rgba(0,0,0,0.04)] dark:shadow-[0_8px_30px_rgba(0,0,0,0.4)]"&gt;&#10;&lt;div class="flex items-center justify-between gap-2 pb-3 mb-4 border-b border-black/[0.06] dark:border-white/[0.08]"&gt;&#10;&lt;div class="flex items-center gap-2.5 font-bold text-sm sm:text-base text-neutral-900 dark:text-white"&gt;&#10;&lt;span class="w-7 h-7 rounded-lg bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4 h-4 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&lt;/span&gt;&#10;&lt;span&gt;Attachments&lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;span class="px-2.5 py-0.5 rounded-full text-xs font-semibold bg-black/[0.05] dark:bg-white/[0.1] text-neutral-600 dark:text-neutral-300"&gt;2 files&lt;/span&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="space-y-2.5 not-prose"&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_config" download="cloudflare_config" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="cloudflare_config"&gt;cloudflare_config&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;870 B&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_config" download="cloudflare_config" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;GET&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3 sm:px-4 bg-neutral-50 dark:bg-[#242426] rounded-xl border border-black/[0.04] dark:border-white/[0.06] hover:bg-neutral-100/80 dark:hover:bg-[#2C2C2E] transition-all group"&gt;&#10;&lt;div class="flex items-center gap-3 min-w-0"&gt;&#10;&lt;span class="w-9 h-9 rounded-xl bg-[#0071E3]/10 dark:bg-[#2997FF]/15 text-[#0071E3] dark:text-[#2997FF] flex items-center justify-center shrink-0"&gt;&lt;span class="inline-flex shrink-0 items-center justify-center w-4.5 h-4.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 107.046 120'&gt;&lt;path d='M34.149,31.913c-1.824,0 -3.161,-1.389 -3.161,-3.151c0,-1.72 1.337,-3.098 3.161,-3.098h40.601c1.783,0 3.12,1.378 3.12,3.098c0,1.762 -1.337,3.151 -3.12,3.151zM34.149,46.539c-1.824,0 -3.161,-1.379 -3.161,-3.151c0,-1.71 1.337,-3.047 3.161,-3.047h23.795c1.835,0 3.161,1.337 3.161,3.047c0,1.772 -1.326,3.151 -3.161,3.151zM34.97,96.294c-4.299,0 -6.728,-2.314 -6.728,-6.717v-27.944c0,-4.454 2.429,-6.717 6.728,-6.717h37.107c4.454,0 6.728,2.263 6.728,6.717v27.944c0,4.403 -2.274,6.717 -6.728,6.717zM12.461,97.004c0,10.232 5.034,15.318 15.111,15.318h51.851c10.087,0 15.163,-5.086 15.163,-15.318v-74.03c0,-10.18 -5.076,-15.317 -15.163,-15.317h-51.851c-10.077,0 -15.111,5.137 -15.111,15.317z' fill="currentColor" opacity='1'/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&#10;&lt;div class="min-w-0"&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_dynamic_ip_update.bash" download="cloudflare_dynamic_ip_update.bash" class="font-semibold text-xs sm:text-sm text-neutral-900 dark:text-white hover:text-[#0071E3] dark:hover:text-[#2997FF] truncate block transition-colors" title="cloudflare_dynamic_ip_update.bash"&gt;cloudflare_dynamic_ip_update.bash&lt;/a&gt;&#10;&lt;span class="text-[11px] font-mono text-neutral-500 dark:text-neutral-400"&gt;4.2 KB&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;a href="https://aiot.io.vn/posts/cloudflare-dynamic-ip-update.files/cloudflare_dynamic_ip_update.bash" download="cloudflare_dynamic_ip_update.bash" class="apple-pill-btn apple-pill-blue self-start sm:self-center shrink-0 text-xs py-1.5 px-4 font-bold flex items-center gap-1.5 shadow-xs"&gt;&#10;&lt;span&gt;GET&lt;/span&gt;&#10;&lt;span class="inline-flex shrink-0 items-center justify-center w-3.5 h-3.5 [&amp;&gt;svg]:w-full [&amp;&gt;svg]:h-full [&amp;&gt;svg]:fill-current"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"&gt;&#10; &lt;path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-.53 14.03a.75.75 0 0 0 1.06 0l3-3a.75.75 0 1 0-1.06-1.06l-1.72 1.72V7.5a.75.75 0 0 0-1.5 0v6.44l-1.72-1.72a.75.75 0 0 0-1.06 1.06l3 3Z" clip-rule="evenodd" /&gt;&#10;&lt;/svg&gt;&#10;&lt;/span&gt;&#10;&lt;/a&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;/div&gt;</description></item></channel></rss>