<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Iot on Marcello Barnaba</title>
    <link>https://sindro.me/tags/iot/</link>
    <description>Recent content in Iot on Marcello Barnaba</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 04 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sindro.me/tags/iot/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How I replaced the Verisure app with Home Assistant</title>
      <link>https://sindro.me/posts/2026-04-04-verisure-italy-home-assistant/</link>
      <pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/posts/2026-04-04-verisure-italy-home-assistant/</guid>
      <description>&lt;p&gt;The Verisure app is garbage. There, I said it.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s not that the alarm itself is bad — the SDVECU panel is solid, the&#xA;sensors are reliable, the installation is professional. But the app. Good&#xA;lord, the app.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The problem&lt;/h2&gt;&#xA;&lt;p&gt;You open the app to check your alarm status and you&amp;rsquo;re greeted by &lt;strong&gt;an ad&#xA;for Verisure itself&lt;/strong&gt;. I pay through the nose for the service and they&#xA;shove ads &lt;em&gt;inside&lt;/em&gt; the app. It&amp;rsquo;s 2026 and a security company is showing me&#xA;banner ads when I&amp;rsquo;m trying to verify that my house is protected.&lt;/p&gt;&#xA;&lt;p&gt;But the ads are the least of it. The real problems are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Blind routines.&lt;/strong&gt; Yes, the app has &amp;ldquo;routines&amp;rdquo; — arm at midnight,&#xA;disarm at 7. But they have no idea where you are. It&amp;rsquo;s midnight&#xA;and you&amp;rsquo;re still in the garden? The alarm arms and the sensors&#xA;go off. Window open? The panel announces it can&amp;rsquo;t arm, but if you&#xA;don&amp;rsquo;t hear it the alarm stays disarmed. Go on vacation and forget&#xA;to disable the morning disarm routine? Alarm off with an empty&#xA;house. And routine changes take &lt;em&gt;20 minutes to propagate&lt;/em&gt; — &amp;ldquo;or&#xA;the next day&amp;rdquo;. In 2026.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Zero presence awareness.&lt;/strong&gt; The app doesn&amp;rsquo;t know where you are.&#xA;It doesn&amp;rsquo;t know who&amp;rsquo;s home. It doesn&amp;rsquo;t know if the cleaning lady&#xA;has left. No location-based automation whatsoever.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;One camera at a time.&lt;/strong&gt; Want to see all your cameras? Tap, wait,&#xA;go back, tap the next one, wait. No overview. No &amp;ldquo;capture all&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Biblically slow.&lt;/strong&gt; Request an image, wait, wait, maybe it arrives.&#xA;Sometimes you reload the app and try again. In 2026.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No permanent storage.&lt;/strong&gt; Captured images vanish. There&amp;rsquo;s no&#xA;browsable history.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No timestamps on images.&lt;/strong&gt; You capture a photo and you don&amp;rsquo;t know&#xA;&lt;em&gt;when&lt;/em&gt; it was taken or &lt;em&gt;which camera&lt;/em&gt; took it. You have to&#xA;remember. For a security system, that&amp;rsquo;s embarrassing.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generic notifications.&lt;/strong&gt; One notification, same for everyone. No&#xA;actionable notifications, no critical alerts that bypass Do Not&#xA;Disturb.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;What I wanted: my alarm, integrated into my smart home, with intelligent&#xA;automations, notifications for all residents, and a dashboard that shows&#xA;&lt;em&gt;everything&lt;/em&gt; at a glance. No ads.&lt;/p&gt;</description>
    </item>
    <item>
      <title>wifi-dethrash: Finding and Fixing WiFi Mesh Thrashing on OpenWrt</title>
      <link>https://sindro.me/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</link>
      <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/</guid>
      <description>&lt;p&gt;It started with &lt;a href=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/&#34;&gt;WiFi presence detection&lt;/a&gt;. I had built a system that tracks which room everyone is in by scraping RSSI from my OpenWrt APs. It worked — but the room assignments kept flickering. Kitchen. Office. Kitchen. Office. Three times in ten seconds. The state machine was fine. The WiFi wasn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;My home network runs six OpenWrt APs across three floors, two SSIDs — Mercury on 5 GHz, Saturn on 2.4 GHz — all backed by 802.11r for fast roaming. From the outside, it looks like a proper mesh. From the inside, one phone was bouncing between access points &lt;strong&gt;129 times in 24 hours&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I didn&amp;rsquo;t know this until I built the tool to see it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-04-03-wifi-dethrash-openwrt-mesh-analyzer/roaming-timeline-24h.png&#34; alt=&#34;Roaming Timeline — 24 hours&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Each row is a WiFi client, the color shows which AP it&amp;rsquo;s connected to. Healthy clients show long solid bars. Sick ones look like barber poles. See &lt;code&gt;sara-iphone&lt;/code&gt;? That rainbow stripe is 129 connects in 24 hours — the phone is walking through an overlap zone between two APs where both have roughly equal (and terrible) signal.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem-you-cant-see&#34;&gt;The Problem You Can&amp;rsquo;t See&lt;/h2&gt;&#xA;&lt;p&gt;WiFi roaming is invisible. Your phone shows full bars, Netflix buffers for a moment, and you blame the internet. But what actually happened is your phone disconnected from one AP, scanned for alternatives, picked another one with a marginally different signal, associated, authenticated, and started streaming again — all in under a second if 802.11r is working, several seconds if it&amp;rsquo;s not.&lt;/p&gt;&#xA;&lt;p&gt;Do this 15 times in 2 minutes between two APs that both have garbage signal, and you get what I call &lt;strong&gt;thrashing&lt;/strong&gt;: rapid, pointless AP bouncing that kills throughput and wastes airtime.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WiFi Presence Detection for Home Assistant Using OpenWrt</title>
      <link>https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/</guid>
      <description>&lt;p&gt;I had two problems with Home Assistant&amp;rsquo;s presence detection.&lt;/p&gt;&#xA;&lt;p&gt;The first: GPS tells you &lt;em&gt;if&lt;/em&gt; someone is home, but not &lt;em&gt;where&lt;/em&gt; in the house they are. My home has six OpenWrt access points spread across three floors. They already know exactly which phone is connected to which AP at every moment — that&amp;rsquo;s room-level presence data, sitting right there in the WiFi stack, screaming to be used. Knowing who&amp;rsquo;s in which room opens up a whole class of automations that GPS can&amp;rsquo;t touch: lights that follow you, climate control per occupied room, a dashboard that shows the household at a glance.&lt;/p&gt;&#xA;&lt;p&gt;The second: our housekeeper stays at our place a couple days a week. I don&amp;rsquo;t want to set up a full HA account for her, install the companion app on her phone, or deal with GPS permissions. But I &lt;em&gt;do&lt;/em&gt; need to know if she&amp;rsquo;s home — because my alarm automation needs to know whether the house is actually empty before arming. Her phone connects to WiFi. That&amp;rsquo;s all I need.&lt;/p&gt;&#xA;&lt;p&gt;So I wrote &lt;a href=&#34;https://github.com/vjt/openwrt-ha-presence&#34; target=&#34;_blank&#34;&gt;openwrt-ha-presence&lt;/a&gt;: a state machine that scrapes RSSI metrics directly from your OpenWrt APs, figures out which room each person is in by signal strength, and publishes per-person home/away state to Home Assistant via MQTT Discovery. No cloud, no beacons, no log parsing, no time-series database. Python, async, ~600 lines of actual logic.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-02-15-wifi-presence-detection-home-assistant/home-assistant.png&#34; alt=&#34;Home Assistant room tracking history&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-it-works&#34;&gt;How It Works&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OpenWrt APs  →  openwrt-presence  →  MQTT  →  Home Assistant&#xA; (node-exporter-lua)  (state machine)    (discovery)   (device_tracker + sensor)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Every 5 seconds, &lt;code&gt;openwrt-presence&lt;/code&gt; hits the &lt;code&gt;/metrics&lt;/code&gt; endpoint on each AP and grabs &lt;code&gt;wifi_station_signal_dbm&lt;/code&gt; for every associated station. That&amp;rsquo;s the RSSI — how loud your phone&amp;rsquo;s signal is at that AP. The engine then processes the snapshot:&lt;/p&gt;</description>
    </item>
    <item>
      <title>5G as Fiber Backup: Never Miss a Meeting Again</title>
      <link>https://sindro.me/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/</link>
      <pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://sindro.me/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/</guid>
      <description>&lt;p&gt;A couple of months ago, my fiber went down. As per Murphy’s first corollary, it happened at the absolute worst moment: right before a crucial meeting with a partner company. I found myself frantically jamming between a distant neighbor’s AP and my phone’s hotspot, but both sucked hard. We’re talking 200ms RTT and 15% packet loss. I was apologizing profusely while my video feed turned into a 1998 slideshow; no one could parse a word I was saying. I ended up cutting the video and staying silent. Missed opportunity. &lt;strong&gt;Never. Again.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;So I went full paranoid and built a proper 5G backup setup.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-hardware&#34;&gt;The Hardware&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gl-inet.com/products/gl-x3000/&#34; target=&#34;_blank&#34;&gt;GL.iNet X-3000&lt;/a&gt; with a Quectel RM520N-GL modem&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://poynting.tech/antennas/xpol-24/&#34; target=&#34;_blank&#34;&gt;Poynting XPOL-24&lt;/a&gt; directional antenna mounted on the wall outside my home office&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;5G signal here is non-existing, so I had to use heavy artillery. The Poynting is a beast. 11 dBi gain, real 4x4 MIMO, cross-polarized, weather-sealed. Point it at the nearest tower and suddenly your SINR jumps from &amp;ldquo;meh&amp;rdquo; to &amp;ldquo;holy shit.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;But pointing a directional antenna without visual feedback is painful. You&amp;rsquo;re basically spinning in circles, refreshing a web UI, cursing at the sky.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-software&#34;&gt;The Software&lt;/h2&gt;&#xA;&lt;p&gt;I wrote a set of tools to solve this: &lt;a href=&#34;https://github.com/vjt/quectel-5g-tools&#34; target=&#34;_blank&#34;&gt;quectel-5g-tools&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;5g-info&lt;/code&gt; dumps everything your modem knows in a readable format:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/5g-info.png&#34; alt=&#34;5g-info output&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;5g-monitor&lt;/code&gt; is an ncurses TUI that refreshes in real-time and—here&amp;rsquo;s the good part—&lt;strong&gt;beeps based on your SINR&lt;/strong&gt;. Higher signal quality = more beeps. Point the antenna, listen for beeps, tighten the bolts. Done.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sindro.me/posts/2026-01-31-quectel-5g-modem-tools-for-openwrt/5g-monitor.png&#34; alt=&#34;5g-monitor TUI&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s like a metal detector, but for 5G.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
