<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Smrati</title>
    <description>The latest articles on DEV Community by Smrati (@smrati_verma).</description>
    <link>https://dev.to/smrati_verma</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3896217%2F617a46f9-c536-46ee-a5ec-a77babd4ef8d.png</url>
      <title>DEV Community: Smrati</title>
      <link>https://dev.to/smrati_verma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smrati_verma"/>
    <language>en</language>
    <item>
      <title>Edge vs. Cloud Processing for Factory Floor IoT: A Practical Tradeoff Analysis</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Mon, 03 Aug 2026 17:42:29 +0000</pubDate>
      <link>https://dev.to/smrati_verma/edge-vs-cloud-processing-for-factory-floor-iot-a-practical-tradeoff-analysis-dg0</link>
      <guid>https://dev.to/smrati_verma/edge-vs-cloud-processing-for-factory-floor-iot-a-practical-tradeoff-analysis-dg0</guid>
      <description>&lt;p&gt;In virtually every discussion about industrial IoT architecture, there's the inevitable question: how much data do we process on the edge (on-site gateways, local servers) versus the cloud? The truthful answer is "it depends," but that’s not particularly helpful as is, so here, let’s drill down into the practical tradeoffs with enough detail to guide you for a real deployment.&lt;/p&gt;

&lt;p&gt;This isn't an abstract discussion; these are the real factors that end up changing the answer for any given facility.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fundamental Tradeoff: Simple Version
&lt;/h2&gt;

&lt;p&gt;Edge processing provides lower latency, resilience to network failures, and reduced bandwidth usage, but comes with the cost of managing more dispersed hardware and has limited local compute power. Cloud processing offers centralized control, easier scalability, and the ability to handle heavier computations like training machine learning models, though it introduces latency and requires reliable connectivity to function.&lt;/p&gt;

&lt;p&gt;In most scenarios, the optimal solution involves a combination of both edge and cloud, so the real challenge lies not in picking one but deciding which specific jobs should run where.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases for Edge Processing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Timestamp Synchronisation and Duplication Handling.&lt;/strong&gt; These tasks need to be performed as close to the sensor as possible-before the data leaves the facility-because they address underlying hardware issues like clock skew and repeated reads that are best corrected at the source. If you process this in the cloud, you're already dealing with skewed orders when the data arrives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety Alerts.&lt;/strong&gt; Alerts for events such as proximity of a forklift to a person cannot tolerate the round-trip delay required for cloud communication nor can they stop during a network outage. Any situation where a delay or interruption can cause physical harm must be managed locally without question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Anomaly Detection for Real-Time Operational Decisions.&lt;/strong&gt; When an issue arises at a kitting station, like detecting the wrong component before a kit departs, a local alert provides immediate feedback instead of waiting for a round-trip notification from the cloud, particularly in environments where network reliability isn’t assured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases for Cloud Processing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model Training.&lt;/strong&gt; If you are training a model to predict congestion or recommend replenishment based on historical data accumulated over months across various zones, this is a compute-intensive, batch process that isn’t required on-site and benefits from the elastic cloud resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Facility Analytics.&lt;/strong&gt; For comparing performance across different plant locations or aggregating data for an enterprise-level report, this data naturally needs a central repository-making the cloud a logical fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-Term Data Storage and Audit Trails.&lt;/strong&gt; Essential for regulated industries requiring detailed records of operations and events, data durability and access availability are best delivered by a centralized service like the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best of Both Worlds: Inference on the Edge, Training in the Cloud
&lt;/h2&gt;

&lt;p&gt;A widely adopted model for many prediction-based scenarios involves training models in a centralised cloud environment using combined historical data, and then deploying these optimized (and relatively lightweight) models to edge devices for real-time prediction. This approach combines the benefits of cloud-scale training with the immediate responsiveness of local processing without being entirely reliant on constant cloud connectivity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Historical data from all zones] → [Cloud: model training] → [Deploy model artifact to edge]
                                                                        │
                                                                        ▼
[Live sensor data at edge] → [Edge: local inference] → [Immediate local alert if needed]
                                     │
                                     ▼
                        [Async sync to cloud for logging/retraining]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this architecture, a network outage won’t halt all functionality. Local inference capabilities will continue to operate, and any data generated will be stored on the edge device for subsequent synchronization with the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Variable: Network Reliability
&lt;/h2&gt;

&lt;p&gt;Frankly, the deciding factor for many edge vs. Cloud choices isn't just the technical superiority of one approach over the other; it's the actual reliability of the facility's network. Modern facilities with robust and redundant network infrastructure can more confidently leverage cloud processing without significant practical risk. &lt;/p&gt;

&lt;p&gt;Older facilities, or those in remote areas with less dependable connections, will inevitably have to push more functionality to the edge, regardless of which solution seems conceptually "cleaner." &lt;/p&gt;

&lt;p&gt;A realistic assessment of network stability during the planning phase is crucial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Practical Decision Framework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a three-question framework to guide your decisions on workload placement:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Would a delay or outage cause safety risks or immediate operational disruptions? =&amp;gt; Edge.&lt;/li&gt;
&lt;li&gt; Does this workload require access to data from multiple zones/facilities or intensive computation for training? =&amp;gt; Cloud.&lt;/li&gt;
&lt;li&gt; Must this function continue operating if the network connection fails? =&amp;gt; Edge, or at least with cloud sync capability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most workloads will fit neatly into these categories. For the less clear-cut cases, dedicating more design time will likely pay dividends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Edge vs. Cloud debate for industrial IoT isn’t a singular choice but a series of individual decisions based on the specific needs of each workload, taking into account facility constraints such as network reliability and safety priorities. Platforms offering genuine deployment flexibility – such as &lt;a href="https://plantlogai.com/" rel="noopener noreferrer"&gt;PlantLog AI&lt;/a&gt;, which specifically caters to cloud, on-premises, and hybrid deployments for on-site logistics – generally handle this nuanced landscape much better than rigid all-cloud or all-edge solutions.&lt;/p&gt;

&lt;p&gt;I'm always interested to hear how others have resolved this balancing act in practice. I’m particularly curious about strategies for updating machine learning models on distributed edge devices without requiring a full redeploy cycle.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cloud</category>
      <category>infrastructure</category>
      <category>iot</category>
    </item>
    <item>
      <title>A Pragmatic Stack for Industrial AIoT - and what I’d use in 2026</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Mon, 03 Aug 2026 17:35:46 +0000</pubDate>
      <link>https://dev.to/smrati_verma/a-pragmatic-stack-for-industrial-aiot-and-what-id-use-in-2026-2fc4</link>
      <guid>https://dev.to/smrati_verma/a-pragmatic-stack-for-industrial-aiot-and-what-id-use-in-2026-2fc4</guid>
      <description>&lt;p&gt;When I chat with folks building their first Industrial IoT+AI pipeline, the question almost always comes up in some form of “so what should our stack really be?” There’s never a single correct answer, of course, but there’s a pretty well-vetted set of tools that keep popping up again and again in production deployments, and for good reasons. Here’s the breakdown layer by layer:&lt;/p&gt;

&lt;h2&gt;
  
  
  Device Connectivity
&lt;/h2&gt;

&lt;p&gt;MQTT remains the default by a mile, and for good reasons - it’s lightweight, uses pub/sub, and is designed to work across noisy, unreliable networks. If your deployment involves hardware from multiple vendors, I’d specifically consider Sparkplug B on top of MQTT for payload standardisation. This addresses the pain point where everyone “does it a little differently” and dev time is sucked into wrangling data formats. For deeply constrained devices where even MQTT is too much, CoAP could be a good option, though it’s far less ubiquitous in reality than I’d imagined.&lt;/p&gt;

&lt;h1&gt;
  
  
  Edge Processing
&lt;/h1&gt;

&lt;p&gt;Beyond basic filtering, the default choices for running inference on resource-constrained hardware usually come down to TensorFlow Lite Micro or Edge Impulse. If your devices are more powerful (think Raspberry Pi or a mini-ITX box), you’ll get a lot more flexibility out of an ONNX Runtime deployment. The choice largely depends on your budget per-device, so very cheap microcontrollers tilt you toward TFLite Micro; Anything with a real brain gives you other options.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ingestion and Buffering
&lt;/h1&gt;

&lt;p&gt;Kafka or a managed cloud service that does Kafka (e.g. Confluent, AWS MSK) is your bread-and-butter when you reach a certain scale where durable, replayable ingestion is paramount, pulling from a high number of disparate device streams. For simpler scenarios, a standard message queue (RabbitMQ, or simply relying on the buffering built into your MQTT broker) often adds far less operational overhead for an equally effective outcome. Don’t over-engineer and reach for Kafka unless you have actual scale and replay requirements-it’s overkill before then.&lt;/p&gt;

&lt;h1&gt;
  
  
  Time-Series Storage
&lt;/h1&gt;

&lt;p&gt;If your time-series storage needs align with the familiar landscape of relational databases and you’re already embedded in a Postgres ecosystem, TimescaleDB is an excellent option. Otherwise, if a specialized time-series query language and robust out-of-the-box dashboard integrations are appealing, InfluxDB is a solid, mature choice. Most of the decision will come down to existing team expertise and tooling rather than a significant capability disparity between the two.&lt;/p&gt;

&lt;h1&gt;
  
  
  Drift and Data Quality Monitoring
&lt;/h1&gt;

&lt;p&gt;I see this layer often glossed over or deprioritized, and it really shouldn’t be. Evidently and Great Expectations are starting to show up more in industrial pipelines (not just typical ML workflows) for the specific reason of catching data drifts at the sensor layer before they invisibly corrupt your downstream model predictions. Even in a minimal MVP pipeline, this is the one layer I’d consider getting right upfront - retrofitting it after a drift-induced incident is far more painful.&lt;/p&gt;

&lt;h1&gt;
  
  
  Model Training and Serving
&lt;/h1&gt;

&lt;p&gt;At the model training layer, the specific framework ( PyTorch or TensorFlow) matters far less than many people assume. The choice of specific network architecture, for example, is rarely the bottleneck in industrial IoT use cases. What is far more important is establishing a consistent system for experiment tracking and model versioning ( MLflow , for instance, is great here) because industrial models typically need to be re-trained far more frequently than initial predictions would suggest, as the operating conditions shift over time. For serving models in production, either BentoML or just shipping inference within a standard container works effectively, depending on your existing infrastructure.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dashboarding and Operational Integration
&lt;/h1&gt;

&lt;p&gt;Most organizations leverage Grafana for their overall operational visibility, and given its tight integration with both TimescaleDB and InfluxDB, that’s often the best choice. However, visibility is different from operational integration. My strong preference is to bridge predictions back into the systems your operational team already uses on a daily basis-whether that be a ticketing system or a consolidated alerts manager-rather than building yet another standalone dashboard that few proactively monitor.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Honest Truth
&lt;/h1&gt;

&lt;p&gt;None of this stack is bleeding-edge or remotely revolutionary. That’s the point. The real differentiating factor in Industrial AIoT is rarely the tools, but the depth of engineering discipline gained by actually running this stack against real, often messy, data until you know precisely where and how it breaks. Teams that have iterated on a version of this stack in several real deployments (a group like &lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studio&lt;/a&gt; comes to mind) have a significant advantage over new teams simply picking their first flavor of this toolset - the models may differ, but the underlying mechanisms for getting value from data, and how to recover when it fails, are surprisingly similar.&lt;/p&gt;

&lt;p&gt;I’m always curious what stacks other folks have landed on, especially in that challenging drift monitoring space - it seems to be an area where opinions truly diverge the most based on my experience.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>System-First, Venture-Second: a New Approach to Building Companies</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Sat, 01 Aug 2026 12:23:45 +0000</pubDate>
      <link>https://dev.to/smrati_verma/system-first-venture-second-a-new-approach-to-building-companies-1e9m</link>
      <guid>https://dev.to/smrati_verma/system-first-venture-second-a-new-approach-to-building-companies-1e9m</guid>
      <description>&lt;p&gt;The typical approach to founding a startup follows a certain pattern: A founder conceives of a product, constructs a minimum viable product (MVP), procures customers, secures investment, and finally scales operations. This model has given rise to some of the most successful businesses in history. &lt;/p&gt;

&lt;p&gt;Nonetheless, it is associated with a high rate of failure, particularly in deep-tech ventures, due to the significant gap-often considerable in both scope and financial investment-and the inherent technical risks involved in transforming an idea into a viable product.&lt;/p&gt;

&lt;p&gt;A new paradigm is gaining traction, which reverses this sequence: it's known as the 'system-first, venture-second' model, and it's reshaping how the most experienced creators of companies in AI and IoT operate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Precisely Does 'System-First' Entail?
&lt;/h2&gt;

&lt;p&gt;In the system-first framework, the initial focus is not a business concept but a real-world issue. Creators begin by thoroughly investigating a particular industrial challenge, then develop and implement an AIoT (Artificial Intelligence of Things) system designed to resolve it. This system is constructed using actual data, validated in practical environments, and confirmed by real customers before a formal business entity is established.&lt;br&gt;
The venture itself-the startup, legal structure, and investment rounds-comes later.&lt;br&gt;
Only when the system demonstrates tangible value in the real world is it separated into an independent enterprise. &lt;/p&gt;

&lt;p&gt;At that point, the most critical uncertainties have already been addressed: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Does the technology function?&lt;br&gt;
Do consumers want it?&lt;br&gt;
Can it be deployed on a large scale?&lt;br&gt;
How Does This Model Significantly Reduce&amp;nbsp;Risk?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of the early funding of traditional startups is dedicated to addressing the fundamental questions of product functionality and consumer desire.&lt;/p&gt;

&lt;p&gt;In deep-tech industries, this process is exceptionally challenging; hardware can be costly, industrial deployment is time-consuming, and businesses are hesitant to adopt unproven technology.&lt;/p&gt;

&lt;p&gt;The system-first model preempts a substantial portion of these uncertainties before the formal startup lifecycle even begins. When a company is launched via this approach, it already possesses a functional system, concrete deployment data, and proven customer demand. Investors aren't just investing in a pitch; they're investing in evidence. Faster, Leaner, Stronger: The system-first method offers practical benefits, such as shorter development timelines since creators start with existing infrastructure, data streams, and customer relationships, rather than beginning from scratch.&lt;/p&gt;

&lt;p&gt;Capital efficiency is significantly improved, with less investment required for exploratory development and failed experiments.&lt;br&gt;
The resultant ventures are inherently more robust due to their reliance on proven foundations rather than speculative assumptions. &lt;/p&gt;

&lt;h2&gt;
  
  
  A Model Tailored for the AIoT Era
&lt;/h2&gt;

&lt;p&gt;The system-first, venture-second approach is especially suitable for the AIoT industry. Developing integrated intelligent industrial systems requires hardware, software, data, and specialised knowledge working together smoothly.&lt;/p&gt;

&lt;p&gt;Organisations already possessing these capabilities-and able to deploy functional systems in real-world settings prior to spinning out ventures-hold a considerable structural advantage over conventional startups attempting to assemble all these components from scratch. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Company Building
&lt;/h2&gt;

&lt;p&gt;The system-first model won't entirely replace traditional methods of starting companies. However, in deep tech, industrial AI, and IoT -where complexity is high, validation is costly, and customers expect reliable solutions-it offers a smarter way to build companies.&lt;br&gt;
The ventures created this way are better prepared, validated, and positioned to scale than nearly anything the traditional approach can generate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studio&lt;/a&gt; employs this very model, identifying real industrial challenges, developing and validating AIoT systems, and launching ventures based on proven deployments and genuine customer need.&lt;br&gt;
Learn more at Aperture Venture Studios&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dealing with Offline Tags: Store-and-Forward Patterns for Asset Tracking Systems</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Sat, 01 Aug 2026 12:07:56 +0000</pubDate>
      <link>https://dev.to/smrati_verma/dealing-with-offline-tags-store-and-forward-patterns-for-asset-tracking-systems-48ng</link>
      <guid>https://dev.to/smrati_verma/dealing-with-offline-tags-store-and-forward-patterns-for-asset-tracking-systems-48ng</guid>
      <description>&lt;p&gt;Most of the asset tracking guides online assume you can trust connectivity. The reality for hardware, however, doesn’t afford the same guarantee: a GPS tracker dips into a tunnel, a LoRaWAN device is at the edge of the gateway’s range, or an indoor gateway powering an array of BLE beacons goes dark during a facility-wide outage. If your system can’t reconstruct a timeline without assuming that every event that happens remotely is also reliably reflected immediately at the backend, then either auditing or incident investigations at some point simply won’t work. In this post we walk through store-and-forward patterns that won’t crack under inconsistent connectivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just “Retry” isn’t a Strategy
&lt;/h2&gt;

&lt;p&gt;The most obvious first step is to simply have the device or gateway retry until the data gets there. This is a necessary component, but it’s not sufficient on its own because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Battery-powered IoT devices can’t be retried indefinitely before exhausting power meant to last months or years.&lt;/li&gt;
&lt;li&gt;If a device doesn’t have a local buffer then any data it generated while offline is simply lost lost lost after its re-send window expires&lt;/li&gt;
&lt;li&gt;Uncoordinated retries often result in double counts without explicit deduplication logic at the backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need buffering of some sort on the device or gateway side of the system, and idempotent ingestion on the backend. One without the other results in data loss or data corruption that’s every bit as bad if not worse.&lt;/p&gt;

&lt;p&gt;Local buffering: What, and How Much, To Save?&lt;/p&gt;

&lt;p&gt;Not every event that occurs remotely merits the same priority or occupies the same space in local storage. A useful approach in this context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-priority, low-frequency data (e.g., geofence exits, threshold breaches, RFID reads). These types of events aren’t frequent enough to overflow storage even by the thousands, but when lost they’re critically important.&lt;/li&gt;
&lt;li&gt;Low-priority, high-frequency data (e.g., location pings every 30 seconds, ambient sensor values with no imminent threshold breaches). This type of data benefits from a rolling capacity; when the buffer fills, it’s likely safe to toss out the oldest routine pings. A missed- but unremarkable- 30-second location pin is often less of a concern than a missed geofence entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why do we differentiate? Inexpensive IoT hardware typically has a limited amount of local storage. When a buffer is filled blindly and at uniform priority, low-priority chatter often crowds out high-priority important events.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;on_connectivity_lost&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;switch_to_local_buffer_mode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;on_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;evict_policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NEVER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;evict_policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OLDEST_FIRST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ROUTINE_CAP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;on_connectivity_restored&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PRIORITY_THEN_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;send_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Idempotent Ingestion: Preventing Duplicates
&lt;/h2&gt;

&lt;p&gt;As you start to send out the buffer contents upon reconnections, what do you do if the ack gets lost and the device sends the same data packet again, after connectivity is already back? Or what if the data was sent while offline, and you get back the ack, but somehow the record got dropped again? A lost acknowledgement means something got duplicated, but the only good option if something got lost is for something to be redelivered. It's the backend's problem to de-duplicate.&lt;/p&gt;

&lt;p&gt;Fortunately, this is solvable: Every event includes a client-side unique identifier, typically made up of device ID, a sequence number, and a timestamp. The backend’s ingestion point is then configured to upsert if the unique_id already exists and to otherwise just insert.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;on_ingest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unique_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ACK&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t reprocess
    event_store.insert(event)
    process_event(event)
    return ACK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't upsert then a network interruption midway through buffer playback will silently double-order many events for that asset - double-ringing alerts for a threshold violation, double recording of the same location points in your history, and corrupting analytical use of the asset history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sequence Numbers are Better than Timestamps
&lt;/h2&gt;

&lt;p&gt;Most hardware doesn’t maintain its clocks meticulously when disconnected. Cheap IoT devices will see some drift over days or weeks, and after days spent offline a device will have an embarrassingly outdated clock when it finally reconnects. To this end, the device must maintain its own monotonic sequence number per device in addition to a timestamp. &lt;/p&gt;

&lt;p&gt;This ensures that you're always able to reconstruct the exact same playback for messages replayed even though clocks might have shifted and become wildly inconsistent. &lt;/p&gt;

&lt;p&gt;Be prepared to alert and investigate when the timestamp and sequence number differ significantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan for the Inevitable Gap
&lt;/h2&gt;

&lt;p&gt;The one pitfall in testing and development, to this day, is happy path stories. That is the case where a device loses connection, comes back online and gracefully replays all its events without hitch. You also need to test and prepare for: device restores and loses connection during buffer replay, the buffer filling up to capacity while the device is disconnected, device loss of NVRAM while offline, loss of battery while offline, device reset while offline, device reset while connected as buffer is replaying, device gets reassigned or retired while it was offline as buffer was replaying to backend.&lt;/p&gt;

&lt;p&gt;Ultimately, designing and executing a resilient data ingestion strategy applies equally to other kinds of remotely collected data, but it’s particularly critical for tracking and historical event-data scenarios, as the entire value proposition hinges on the integrity of this history data. For those seeking hardware, &lt;a href="https://assettrackpro.com/" rel="noopener noreferrer"&gt;AssetTrackPro&lt;/a&gt; has a comprehensive list that includes how their identification-based asset tags and gateways handle these kinds of local buffering issues out-of-the-box.&lt;/p&gt;

&lt;p&gt;What problems did you encounter while managing buffer replays, particularly relating to geofencing and state machines? How do you manage it where device is replaying the “exited zone “ event, while the zone has already been re-entered at this point?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>LoRaWAN vs BLE vs Cellular: Choosing a Transport Protocol for IoT Asset Tags</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Thu, 30 Jul 2026 17:38:00 +0000</pubDate>
      <link>https://dev.to/smrati_verma/lorawan-vs-ble-vs-cellular-choosing-a-transport-protocol-for-iot-asset-tags-66g</link>
      <guid>https://dev.to/smrati_verma/lorawan-vs-ble-vs-cellular-choosing-a-transport-protocol-for-iot-asset-tags-66g</guid>
      <description>&lt;p&gt;Most asset tracking projects eventually run into the question of what radio protocol to base their hardware around. This is not an "easy choice" nor a "there's only one better" piece, but a rundown based on actual trade-offs by deployment. Choosing based on hype tends to cost companies six-figure-plus deployments one year down the line, when those low per-device radio choices become glaringly expensive operationally.&lt;/p&gt;

&lt;p&gt;The Fundamental Trade-off is one of the big three, which don’t improve simultaneously: range, power and bandwidth. I’ll dive into the relative differences along the key trade-offs by use-case below. The fundamental trade-off for all of these technologies revolves around maximising range, minimising power consumption and providing enough bandwidth to transmit the desired level of data within each system. There are no technologies that excel simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  BLE (Bluetooth Low Energy)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Range: up to around 50m in the open and 10- 30 m indoors, easily extended via Mesh networks.

&lt;ul&gt;
&lt;li&gt;Power: can be as low as LoRaWAN; can operate with 2- to 3-year coin cell power for asset tags with minimal transmit.&lt;/li&gt;
&lt;li&gt;Bandwidth: limited, suitable for infrequent pings and small amounts of location data but cannot send high rates of high-speed data.&lt;/li&gt;
&lt;li&gt;Location, proximity, indoors where fixed gateway infrastructure can be installed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BLE is the obvious leader for indoor RTLS use-cases as it integrates seamlessly with positioning system and can function efficiently with the 2-3 year lifespan that people often seek in a coin cell asset tag. Where most companies get snagged on BLE usage, it would be having gateway infrastructure installed in their property, the equipment, etc. The expense for getting a BLE tag onto the market are not just tied to the tag, but also to their infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  LoRaWAN
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Range: Up to several miles in the open space and upwards of 1 mile (1.6km) in Urban environments.

&lt;ul&gt;
&lt;li&gt;Power: Excellent, very low and very capable for data transmitted over longer periods of time.&lt;/li&gt;
&lt;li&gt;Bandwidth: Very low - minimal transmit capacity of 51 Bytes/day over standard data plan – This means they can only transmit extremely small payloads less than once an hour.&lt;/li&gt;
&lt;li&gt;Used best where long-range tracking is necessary on low-cost assets where very minimal data per tag needs to be transmitted periodically, over a wide area of the United States. Best for when data is not of paramount need but for periodic readings on low cost hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LoRaWAN is ideally suited for any number of applications where battery life and long range is essential and where updates are needed less than once per 10 minutes. They are a poor option for tracking rapidly changing physical assets, and should not be considered when you need to send substantial data across short distances frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cellular (LTE-M / NB-IoT / standard LTE)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Range: Vast – as large as your cellular service will allow within your boundaries and abroad.&lt;/li&gt;
&lt;li&gt;Power: moderate to Poor compared to other methods. Cellular technologies will offer lower battery life relative to other choices on low data throughput. Data rates may not be very cost-effective even for smaller data packages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cellular connection gives you greater bandwidth at potentially the highest price per month per device if not done properly or given the right service plan through a telco carrier service. Cellular should be your choice when tracking assets that regularly transit large distances, such as through multiple states and potentially even internationally.&lt;/p&gt;

&lt;p&gt;Track it before it's a problem. &lt;a href="https://assettrackpro.com/" rel="noopener noreferrer"&gt;Asset Track Pro&lt;/a&gt; unifies identification, location, and sensor-based tracking into one system — so you know where it is, what condition it's in, and find out the moment that changes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>iot</category>
    </item>
    <item>
      <title>Build or Partner? A Framework for Whether to Build Your Industrial AIoT Stack.</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Thu, 30 Jul 2026 17:19:54 +0000</pubDate>
      <link>https://dev.to/smrati_verma/build-or-partner-a-framework-for-whether-to-build-your-industrial-aiot-stack-4jo2</link>
      <guid>https://dev.to/smrati_verma/build-or-partner-a-framework-for-whether-to-build-your-industrial-aiot-stack-4jo2</guid>
      <description>&lt;p&gt;If you are an Engineering Lead who is wondering whether to build your own industrial AIoT pipeline, versus partnering with a company that has already built one, the decision often boils down to cost. It’s more about timeline, and the tradeoffs are much greater than may seem at first pass to engineers who see only the pieces of the puzzle. Let’s define what “build the pipeline” actually is.&lt;/p&gt;

&lt;h1&gt;
  
  
  What “Building it yourself” Really Means
&lt;/h1&gt;

&lt;p&gt;I believe that to accurately weigh Build versus Partner we should be specific about all of the moving parts beneath “just build the pipeline”:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Device connectivity, spanning the range of your end device vendors and associated protocols.&lt;/li&gt;
&lt;li&gt;Normalization, version management of the data schemas so as to abstract out differing formats between vendors.&lt;/li&gt;
&lt;li&gt;Reliability, meaning buffering between your endpoints and backend such that if connectivity drops intermittently, you don’t quietly lose data.&lt;/li&gt;
&lt;li&gt;Scalable time-series storage tailored to support time window-based queries beyond relational databases.&lt;/li&gt;
&lt;li&gt;Drift detection not only at the model level, but at the sensor level.&lt;/li&gt;
&lt;li&gt;Edge vs Cloud inference, defined for the objectives and constraints rather than just location.&lt;/li&gt;
&lt;li&gt;And Finally: enough actual deployment time and exposure to catch the failure modes – that don’t normally show themselves beyond thedemo phase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these, in themselves, pose a huge challenge for engineers. Taken together, though, these constitute a fairly involved undertaking spanning multiple quarters until you are production-ready- before even beginning the model work.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Simple Framework to make decision easier
&lt;/h1&gt;

&lt;p&gt;Here’s an overly simple approach that ought to guide the conversation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build in house if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your core competitive differentiator depends on unique infrastructure and is not adequately served by existing providers.&lt;/li&gt;
&lt;li&gt;you have the team and capacity to let engineering support infra development without impact on your product’s time-to-market.&lt;/li&gt;
&lt;li&gt;you have a timeline that accounts for at least 12-18+ months of production infrastructure until the stack becomes resilient, exclusive of the time required for your model work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Partner/ leverage existing infrastructure if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your innovation centers on models, domain expertise or market approach as opposed to building a reinvented sensor normalization solution.&lt;/li&gt;
&lt;li&gt;time to reliable product deployment is more critical to your success than “ owning” all components of your technology stack.&lt;/li&gt;
&lt;li&gt;you’d prefer your team’s expertise to be spent on application-specific issues rather than foundational infrastructure work that is consistent across the board for your use case.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is NOT just an apples-to-apples “buy vs bill” comparison like with SaaS solutions that are often less custom and offer less flexibility at points. Instead, when thinking about the industrial AIoT market space, “partner” more often involves leveraging infrastructure that’s already battle-tested, or that at a minimum has “ solved” the basic plumbing problem, letting your team build on top of it and innovate on top of it; specifically on its use cases’ differentiating application and operational requirements.&lt;/p&gt;

&lt;h1&gt;
  
  
  How This Plays Out in Practice
&lt;/h1&gt;

&lt;p&gt;The Aperture Venture Studio model is a good example for a similar decision that’s taken place internally within a startup “factory.” The group leverages a common industrial AIoT infrastructure layer called ApertureAIoT; its functions as described earlier include connectivity, sensor normalization, storage and drift detection, etc. - while individual portfolio companies are each free to specialize in the domain models and operational integration. It is the partner dimension of this framework taken up internally – the logical core remains the same: not duplicating efforts.&lt;/p&gt;

&lt;h1&gt;
  
  
  The candid trade off
&lt;/h1&gt;

&lt;p&gt;This, in turn comes with costs; those who leverage shared infrastructure have to adopt the constraints that it may entail, with less customization than they might want for some edge cases. When those constraints run up against deeply unconventional operational requirements or technical innovations, the partner strategy can become a bottleneck. However, for the large majority of use cases of industrial AIoT, the non-application-specific “ hard problems” – such as device integration, normalizing vendor-neutral data schemes, etc – is best left to those who have already dedicated team hours toward the problem and can avoid having their competitors also spend team hours on it “ from scratch.”&lt;/p&gt;

&lt;p&gt;If you find yourself facing a “ build vs partner” decision for an industrial AIoT project, I’d strongly consider what &lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studio&lt;/a&gt; is doing in its internal, multi-venture industrial AIoT infrastructure decision for context.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>iot</category>
    </item>
    <item>
      <title>Building A Simple Station Congestion Predictor From Location Event Data</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:46:11 +0000</pubDate>
      <link>https://dev.to/smrati_verma/building-a-simple-station-congestion-predictor-from-location-event-data-42e1</link>
      <guid>https://dev.to/smrati_verma/building-a-simple-station-congestion-predictor-from-location-event-data-42e1</guid>
      <description>&lt;p&gt;Once you have access to clean location/presence data from a manufacturing shop floor then what? Though displays that depict the current number of attendees are convenient. A step further, by predicting impending congestion, allows the supervisor adequate time to effectively manage the situation and take necessary steps.&lt;/p&gt;

&lt;p&gt;Here’s a step-by-step, honest breakdown of such an example - although it isn’t cutting edge, it’s effective, easily understandable (which matters on a production floor more than complexity) and a robust starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s assume that you already possess normalised presence information as demonstrated below based on your raw sensor data (you can look at my previous blog post on the Normalisation Layer to have an idea of how this normalisation works) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;one&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;per&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;presence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interval&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"zone_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"station_7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entity_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wip_cart"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entry_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-29T09:14:02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exit_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-29T09:22:41"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.91&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Goal&lt;/strong&gt; - Given the recent input data, we want to establish if a particular station (for example, station_7) is likely to go above its regular capacity in the next thirty minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create a Regular Time Series of the Zone’s Occupancy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This step takes your existing range (interval) data and generates a standardized time series for occupancy that regularly samples data over specified periods (1-minute here). This is crucial, and the accuracy of all subsequent data depends on this step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_occupancy_series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zone_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1min&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;events_df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zone_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;zone_id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entry_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entry_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entry_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;occupancy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Series&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timeline&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events_df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterrows&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entry_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exit_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;occupancy&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;occupancy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please note, though this code gets the job done, for very large datasets, you’ll want to consider more efficient data structures and algorithms (e.g., interval trees or sweep-line algorithms). However, this straightforward approach is perfectly adequate for getting a baseline model working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Calculate Per-Zone Normal Operating Ranges (Baselines)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One key advantage of modelling congestion is recognising that “normal” operating conditions vary dramatically from zone to zone. A kitting station might typically accommodate only a few units, whereas a staging area before a production Bottleneck might regularly handle fifteen or more. This approach uses each zone’s historical data to establish its own realistic normal operating boundaries, a far more effective strategy than relying on plant-wide, fixed thresholds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quantile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.90&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# baseline = the occupancy level this zone rarely exceeds under normal conditions
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When working with such a system, the most significant improvements in predictive accuracy are usually achieved by considering unique station baselines rather than global ones, often superseding the impact of algorithm complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Develop a Simple Flow-Rate Predictor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of instantly attempting a highly sophisticated time series forecasting model, begin with a more intuitive approach: projecting the current occupancy level and flow rate forward linearly. Although not highly advanced, this method offers a strong baseline and is easily traceable and debuggable within a factory environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict_congestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lookback_minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lookback_minutes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;min&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;will_exceed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;inflow_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;lookback_minutes&lt;/span&gt;  &lt;span class="c1"&gt;# per minute
&lt;/span&gt;    &lt;span class="n"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inflow_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;will_exceed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;projected&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;projected_occupancy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;baseline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;lookback_minutes&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember the importance of assigning a confidence metric based on the volume of data. The prediction must indicate low certainty in situations with significant gaps in readings (network disruption or sensor malfunction) as falsely asserting high confidence under such circumstances could be far more problematic than saying the model lacks information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Backtest Your Predictions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you can trust a model near operational systems, test its historical performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;backtest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;correct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;prediction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;predict_congestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;actual_future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;occupancy_series&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;horizon_minutes&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;actually_exceeded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actual_future&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prediction&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;will_exceed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;actually_exceeded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;correct&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;correct&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When applied to steady manufacturing environments, this linear-inflow approach typically yields around 70-80% accuracy for 30-minute forecasts, making it sufficiently reliable for decisions about staffing and material sequencing, even when dealing with rapid, non-linear events like unexpected machine downtime or production interruptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next Steps…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For even better predictive accuracy, especially with abundant historical data, you could incorporate: scheduled production throughput, real-time occupancy at upstream stages (as congestion can cascade), and cyclical shift pattern information using approaches like Gradient-Boosting Models or even a basic ARIMA.&lt;/p&gt;

&lt;p&gt;For further reference on production-grade implementations dealing with complex cascading effects between zones and ERP integrations for schedules, &lt;a href="https://plantlogai.com/" rel="noopener noreferrer"&gt;PlantLog AI&lt;/a&gt; has detailed descriptions of its in-plant logistics prediction system here. It’s my belief there’s room for creating a smarter, yet fundamentally simpler baseline prediction method; if so, share!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>techtalks</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Here is the article written in natural and human-like language without changing meaning.</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Wed, 29 Jul 2026 13:03:45 +0000</pubDate>
      <link>https://dev.to/smrati_verma/here-is-the-article-written-in-natural-and-human-like-language-without-changing-meaning-3cai</link>
      <guid>https://dev.to/smrati_verma/here-is-the-article-written-in-natural-and-human-like-language-without-changing-meaning-3cai</guid>
      <description>&lt;p&gt;Making The Case For A Shared Infrastructure Layer For Multiple IoT Products (And Aperture Venture Studio’s Version Of The Play)&lt;/p&gt;

&lt;p&gt;As a pattern, what’s genuinely intriguing to an engineer is how some organisations take what’s normally done by providing stacks-one-per-product, isolate them into separate code bases with redundant infra, and then instead, build a single, overarching data/AI layer supporting these products. Let’s take a closer look at how Aperture Venture Studio are doing this. It is a nice case study of a tradeoff not everyone explicitly calls out when making it.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Path Of Least Resistance, One Stack Per Product
&lt;/h1&gt;

&lt;p&gt;If we are in the business of building an asset-tracking product, then separately building a workforce-safety product, for example, the natural thing to do from an engineering perspective is just make them two separate stacks. This entails separate ingestion pipelines. And separate normalisation and model training infrastructures. &lt;/p&gt;

&lt;p&gt;Early on, it seems obvious that the latter has a different set of issues, so why couple it? &lt;/p&gt;

&lt;p&gt;Let alone premature optimisation.&lt;/p&gt;

&lt;p&gt;This decision will invariably come back to bite you, though, as both products need to address, fundamentally, two equally difficult, if not harder, problems to solve: ensuring inconsistent sensor payloads among different hardware vendors are normalised and properly represented, avoiding data loss in case of connectivity gaps, how best to detect sensor data drift prior to model corruption, and finally supporting edge or cloud inference based on need. Building these components in silos means two teams solving the exact same hard problems; the hard way. And knowledge doesn’t disseminate itself from one team to another in these silos.&lt;/p&gt;

&lt;h1&gt;
  
  
  An Alternatively Structured Shared Layer
&lt;/h1&gt;

&lt;p&gt;The approach adopted at Aperture Venture Studio (using ApertureAIoT which serves as the shared underlying infrastructure layer supporting its portfolio companies (ranging from asset tracking to inventory optimisation to workforce safety)) is the exact antithesis, i.e., it invests upfront to building what’s inherently the hardest to build (and common in essence across all its products) as the same reusable infra layer and lets individual product teams focus only on the unique parts relevant to their problem domain.&lt;/p&gt;

&lt;p&gt;To illustrate, from an architecture perspective, it usually would involve separating your infrastructure into two layers:&lt;/p&gt;

&lt;p&gt;Shared (build once; reusable):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;device connectors/ protocols&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ingestion, normalization, versioning across multiple hardware manufacturers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;time-series databases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sensor drift and metadata versioning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;edge/ cloud inferencing infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Product Specific (build for individual ventures):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the predictive model for the specific product (e.g., fall prediction, anomaly detection in industrial machines, access pattern analysis, etc)&lt;/li&gt;
&lt;li&gt;business logic for the product including alerts, etc&lt;/li&gt;
&lt;li&gt;The product's workflow and orchestration integration to ensure the results make it to the relevant human or business entity in the required format.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Trade-off that is worth making in this Case
&lt;/h1&gt;

&lt;p&gt;While in general, the choice is more often debated based on the inherent difficulty of implementing shared infra versus product infra itself, it’s my opinion that it's especially true for the Industrial IoT domain – not because some of this infra won't be harder to implement than some product-specific components, but because the fundamental hardest problems, say with sensor normalisation across hardware, detection of data drift, connectivity are actually similar for different Industrial IoT products. Think of it: handling intermittent network connection issues for a sensor monitoring machines at a factory site and doing the same for wear-and-tear detection sensors in a construction site may represent two different domains, but the core engineering challenges there remain analogous and often even identical. This becomes clear when the number of products increases over time. &lt;/p&gt;

&lt;p&gt;An improvement to your drift detection feature, developed for your workforce safety product, will also be immediately available for your asset tracking product as long as it's built on top of the same, reusable core infrastructure component. &lt;/p&gt;

&lt;p&gt;The same logic applies for connecting a new type of sensor or device on the hardware side.&lt;/p&gt;

&lt;h1&gt;
  
  
  Challenges Associated With This Strategy
&lt;/h1&gt;

&lt;p&gt;However, the flip side to this is also worth exploring. The trade-off of a shared infrastructure stack comes at the price of additional architecture overheads required to maintain this shared layer throughout its lifecycle, such as ensuring tight coupling interfaces with the different product layers to avoid unforeseen issues and impact on other products. Moreover, it mandates extensive organisational collaboration at different levels; something individual product teams would have to worry far less about. Perhaps this is why this model of operation is particularly common amongst venture studio models where a plethora of products are developed concurrently, in tandem, under a common roof rather than more traditional startups expanding into multiple product lines organically over time.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Recommended Case Study For aspiring IoT companies
&lt;/h1&gt;

&lt;p&gt;If you’re building (or thinking of building) multiple IoT product lines in parallel, I highly recommend you examine &lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studio's&lt;/a&gt; approach with Aperture Venture Studio, their underlying infrastructure that supports its myriad IoT ventures. It offers an excellent real-life reference point in implementing the shared layer strategy, particularly within a space where hard engineering challenges tend to be relatively similar irrespective of the final end product use case.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Debugging Ghost Reads: The Untold Story of RFID Noise on a Factory Floor</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Tue, 28 Jul 2026 17:17:36 +0000</pubDate>
      <link>https://dev.to/smrati_verma/debugging-ghost-reads-the-untold-story-of-rfid-noise-on-a-factory-floor-55me</link>
      <guid>https://dev.to/smrati_verma/debugging-ghost-reads-the-untold-story-of-rfid-noise-on-a-factory-floor-55me</guid>
      <description>&lt;p&gt;A field-note style breakdown of the problem that will eat more engineering time than almost anything else in industrial IoT deployments.&lt;/p&gt;

&lt;p&gt;If you've ever deployed RFID anywhere near production machinery, you've probably run into this: a single tag gets read two times in less than a second, or even "read" while it is nowhere in the range. Teams that are new to an industrial context often assume it is a hardware failure. In the vast majority of cases, that is anything but simple, and understanding why is very important if you are building something that makes the assumption that those reads are true and fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The issue is not the reader, but the environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the primary causes of this issue is the environment, specifically metal. Stamping presses, assembly lines, and metallic racks cause radio frequency signals to bounce. This reflection means a single tag can be read several times, as a transmission reaches the antenna at slightly different intervals. So, the reader assumes it is reading the same tag a dozen or so times rather than one; add the dozen or so tags which are being read every day on the factory floor and you will start developing some serious problems in count-based logic, without even realizing it.&lt;/p&gt;

&lt;p&gt;Another, less obvious issue is antenna overlapping; when a facility is using more than one reader, they overlap at the edges. A tag in the overlap would be read at the same time by two or more readers, looking exactly like two separate reads unless the user is already storing or logging which specific tag, antenna or reader ID it was.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it mess up more than you can imagine
&lt;/h2&gt;

&lt;p&gt;The common response is that this issue can be considered a minor data-corruption nuisance. This statement is only true until that data finds its way to anything that uses a count-based logic, such as a WIP or workforce/zone occupancy tracker, which will both become miscalculated as each additional read will appear as additional activity. Traceability systems, if they use each read as a separate genealogy event, will eventually generate an extremely cluttered log, full of non-original entries under a great many valid reads.&lt;/p&gt;

&lt;p&gt;This is where a significant percentage of early-phase industrial IoT projects go undetected. The hardware is perfectly fine, the network is good, and all connections are active. But because a deduplication layer wasn't built into the system, the application that used the read data was not designed for that specific problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually resolves
&lt;/h2&gt;

&lt;p&gt;Dedup at the edge, not in the cloud – The most effective solution for dedup would be to eliminate the reads when the signal is nearest the tag antenna. Either set it in the reader's hardware (there usually is a "read window setting" where it simply doesn't read the same tag a second time for a specified amount of time) or use lightweight edge processes. This will dramatically remove the additional data overhead and eliminate the need for the upstream system to try to deal with something it wasn’t built for.&lt;/p&gt;

&lt;p&gt;Consider tagid+timestamp bucket instead of just tagid – If a tag is genuinely reappearing after five or ten minutes, it is a legitimate re-entry and not a duplicated reading. A time bucket in the range of 2-3 seconds ensures valid reads are not caught for this.&lt;/p&gt;

&lt;p&gt;Log reader/antenna ID when recording the read - The simplest method to correct overlapping zones is to log the reader or antenna ID for each read. If two readings for the same tag arrive within microseconds and there are two antennas on either side, both reading the same tag, you know it is a read zone overflow. This should eliminate the problem using whichever method you prefer: proximity to the antenna, strength of the read signal, or business-relevant factors.&lt;/p&gt;

&lt;p&gt;Check a state machine rather than just a simple count - Instead of using a simple count for WIP/workforce systems, make it state-aware. Any read triggering a change that should not be allowed (i.e., an entry into a zone the employee is already signed into) indicates an overflowed read which needs to be filtered out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The take-away message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is nothing exotic here, and it mostly comes down to disciplined data hygiene at the right layer of your stack. The problem is that none of this is obvious until it is too late to easily fix, which in this case typically means a critical system that is not producing accurate results. If you are just starting out with a new project involving RFID on a factory floor, you must account for this issue before your data pipeline takes centre stage.&lt;/p&gt;

&lt;p&gt;If you need further information on RFID, BLE and UWB data structuring for industrial tracking or workforce applications, check out the general overview at &lt;a href="https://compentraai.com/" rel="noopener noreferrer"&gt;Compentra AI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>rfid</category>
      <category>iot</category>
      <category>ai</category>
    </item>
    <item>
      <title>Interview Questions to Confirm a Candidate has actually built Industrial IoT Systems</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:21:44 +0000</pubDate>
      <link>https://dev.to/smrati_verma/interview-questions-to-confirm-a-candidate-has-actually-built-industrial-iot-systems-3fla</link>
      <guid>https://dev.to/smrati_verma/interview-questions-to-confirm-a-candidate-has-actually-built-industrial-iot-systems-3fla</guid>
      <description>&lt;p&gt;It’s particularly hard to hire for industrial AIoT positions, as it is a domain with lots of talented software and ML engineers, none of whom may have worked in a physical-world data domain before. It is not always obvious from a resume whether someone has worked in industrial AIoT, or not. Below are a few of my favorite questions that tend to make this gap obvious-and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  "How would you design your system to deal with a sensor suddenly starts sending data twice a second?"
&lt;/h2&gt;

&lt;p&gt;While this looks like a tiny edge-case, it’s a surprisingly common one. Firmware updates, retries in networks, or a poorly configured interval can all trigger such behavior in a device. Typical software developers with clean API experience will often try to answer by stating "dedupe" it without explaining how – would the candidates dedupe based on a timestamp, payload hash or a sequence ID that the device outputs? Each dedupe strategy is susceptible to different edge cases, and anyone who has ever debugging this in production tends to have well-formed opinions on their strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  "I have a model that works in testing with 95% accuracy. What questions do you ask before believing it?"
&lt;/h2&gt;

&lt;p&gt;The critical thing I listen for is whether the candidate thinks about the training and testing data relative to production conditions-is this training and testing data representative of the actual conditions the model will experience in production? (This includes similar environmental context, sensor calibrations and, crucially, time period, as seasonal patterns can significantly impact sensor readings.) Typically, software developers will think that a high number indicates a completed task, while someone who has experience in this specific domain, and has been burned in production by data drift, will ask about the data quality and history first.&lt;/p&gt;

&lt;h2&gt;
  
  
  "How would you design a schema to support 5 different sensor vendors right now, and a 6th next quarter?"
&lt;/h2&gt;

&lt;p&gt;I am actually seeing if the candidate thinks about schema definition and updating as a task that requires normalisation and the ongoing management of data semantics, as opposed to a one-off job. A more naive software engineer would write specific parsers per device, or hardcode every specific sensor device in their system, whilst an engineer with industrial experience would design an adaptation/translation layer to separate and contain all the quirks and specificities of each vendor, without affecting the integrity of the remainder of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Can you describe to me what happens in your system if a particular facility loses internet connectivity for 6 hours?"
&lt;/h2&gt;

&lt;p&gt;This question typically helps to filter candidates that are used to dealing with always-on connectivity, versus those who have experience designing for intermittent/lossy network conditions, which involve a completely different set of assumptions. I’m looking for candidates that talk about data buffering locally, store-and-forward mechanisms, and how they deal with time-sensitive events that are supposed to be triggered within a limited timeframe (e.g., safety issues). A common, weak answer that a purely software, cloud developer might try would be "the system would re-download all the information when it's back online," without explaining the implications of missing events.&lt;/p&gt;

&lt;h2&gt;
  
  
  "How can you tell if it’s truly an anomalous event or if the sensor simply has reading issues?"
&lt;/h2&gt;

&lt;p&gt;This question sounds so simple, and it's very difficult; it gets at data quality reasoning. An anomaly detected might also be an anomaly with a sensor, perhaps due to a failure or some physical issue with the hardware. If the device fails due to physical damage, it may produce seemingly anomalous behaviour while an 'anomaly' is already happening. A good answer might consider cross-referencing information with neighbouring sensors, looking for known device failure patterns, or signalling for human intervention as opposed to fully automating decision-making of what is or isn't an anomaly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these specific questions
&lt;/h2&gt;

&lt;p&gt;All these questions do not have much to do with algorithms or how to design a system architecture. I am instead testing for the specific aspect of 'Have you actually struggled with and managed a real, messy physical data space, or have you only been handed already perfectly clean data?'. This is a distinction which is extremely important for Industrial AIoT, and where most of the difficulty resides, rather than in the modelling process itself.&lt;/p&gt;

&lt;p&gt;Do you have different questions that may test for specific relevant experience for this domain? I would love to hear from you.&lt;/p&gt;

&lt;p&gt;Some of the most useful progress in industrial AI isn't happening in a pitch deck — it's happening quietly, in warehouses and factories, at places like &lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studio&lt;/a&gt; that started with the infrastructure already in place.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>iot</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Build Rock-Solid Real-Time Data Pipelines from the Factory Floor IoT</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:45:50 +0000</pubDate>
      <link>https://dev.to/smrati_verma/how-to-build-rock-solid-real-time-data-pipelines-from-the-factory-floor-iot-23d6</link>
      <guid>https://dev.to/smrati_verma/how-to-build-rock-solid-real-time-data-pipelines-from-the-factory-floor-iot-23d6</guid>
      <description>&lt;p&gt;Lessons from hooking up stamping presses, welding cells, and MES without dropping a single byte of data.&lt;/p&gt;

&lt;p&gt;If you’ve ever been tasked with trying to feed live sensor data from industrial gear into a modern app architecture, you’ve no doubt learned quickly that the shop floor is not exactly a cloud-native paradise. Automotive component manufacturing, in particular, is where we often get our toughest, most revealing stress tests. Think about it: there’s metal in abundance, wreaking havoc on our wireless signals; machinery hums 24/7, brooking zero downtime; and just one slipped event (like a WIP scan, a worker’s badge swipe, or a machine fault) can break the entire traceability chain, and only get noticed too late.&lt;/p&gt;

&lt;p&gt;Here’s what truly matters in architecting a factory data layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  MQTT for the Noisy Middle Layer
&lt;/h2&gt;

&lt;p&gt;MQTT isn’t the default for industrial IoT for nothing - it's light, robust against shaky connections, and its pub-sub architecture aligns naturally with the many independent units spewing events on a floor (think stampers completing cycles, RFID readers snagging racks, BLE beacons logging worker badgetoes). Where teams often falter is with their QoS configurations. While QoS 0 is perfectly adequate for high-frequency stuff like vibration measurements where a dropped packet can be considered an unfortunate rounding error, you need QoS 1 or 2 for tracing operations - anything part of a genealogy record you can't afford to be incomplete. &lt;/p&gt;

&lt;p&gt;Make sure you’re backing it all up with robust broker persistence. &lt;/p&gt;

&lt;p&gt;A lost WIP status can wreck the history for an entire lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  OPC UA for Structured Machine Data
&lt;/h2&gt;

&lt;p&gt;If MQTT serves as the plumbing, then OPC UA is generally the language spoken by devices interacting directly with PLCs, CNCs, and SCADA systems. Instead of a jumbled byte stream, you get a structured information model, which is absolutely critical when you're stitching together machines from different manufacturers on the same production line. Of course, OPC UA isn’t without its own complexities - setting up OPC UA servers and address spaces takes time and effort, and it can easily be overkill for simple data streams. A pragmatic approach involves using OPC UA for machine-level communication, and then normalizing things through MQTT or a message queue from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge Processing Isn't an Option
&lt;/h2&gt;

&lt;p&gt;A vast majority of factory floor architectures flounder simply because they assume a constant, near-instantaneous connection to a cloud data lake. This fantasy evaporates quickly in a facility filled with metal barriers, welding interference, and segmented networks implemented for security. Pushing inference and filtering to the edge - from simple debouncing of duplicated RF ID scans to threshold alerts on sensor readings-can drastically slash the required bandwidth while minimizing network noise. Crucially, it ensures the plant floor can keep chugging along even if the internet connection flakes out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design for Genealogy, Not Just Telemetry
&lt;/h2&gt;

&lt;p&gt;This one is crucial to understand if you’re coming into manufacturing IoT from a general data background; telemetry and genealogy are distinctly different animals. Telemetry can afford some sampling and occasional loss; but genealogy, detailing the lineage of a product from its lot to specific shift and machine, needs to be treated more like a transactional journal entry. This typically requires the synchronous write of these events to a reliable datastore, even if your overall telemetry stream is designed with eventual consistency.&lt;/p&gt;

&lt;p&gt;If you're plumbing this sort of pipeline for the first time, &lt;a href="https://compentraai.com/" rel="noopener noreferrer"&gt;Compentra AI&lt;/a&gt; has a handy overview outlining how RFID/BLE/UWB ingestion, MQTT/OPC UA connectivity, and MES/SCADA system integrations interoperate specifically within the Automotive space. Check it out if you’d prefer a reference architecture rather than figuring it all out in your head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The True Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;None of these underlying technologies is inherently magical. The trick to getting it right lies in ordering their operations - edge filtering before transmission, rich semantic models at the machine interface, durable storage for critical trace records, and eventually consistent processing where you can afford to lose a bit of fidelity. Mess up the sequence, and you can end up with a system that appears to offer real-time information on a screen, but fails to provide a concrete answer to “what lot does this component come from?” when the heat is on.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>iot</category>
      <category>database</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Postmortem on a Predictive Maintenance Model That Looked Great in Testing and Fell Apart in Production</title>
      <dc:creator>Smrati</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:21:45 +0000</pubDate>
      <link>https://dev.to/smrati_verma/a-postmortem-on-a-predictive-maintenance-model-that-looked-great-in-testing-and-fell-apart-in-4e5c</link>
      <guid>https://dev.to/smrati_verma/a-postmortem-on-a-predictive-maintenance-model-that-looked-great-in-testing-and-fell-apart-in-4e5c</guid>
      <description>&lt;p&gt;I want to walk through a specific failure mode that's common enough in industrial ML that it's worth documenting properly, instead of the usual "here's a clean success story" content. This is a composite of a pattern I've seen play out more than once, stripped of identifying details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal was straightforward: predict compressor failures before they happened, using vibration and temperature sensor data. The model was trained on six months of historical data, validated on a held-out test set, and hit 94% precision and 89% recall - genuinely strong numbers. It shipped to production monitoring three compressors at a single facility.&lt;/p&gt;

&lt;p&gt;Two months in, it flagged a false positive that triggered an unnecessary maintenance shutdown. Three weeks after that, it missed a real failure entirely. The team's first instinct was "the model needs retraining." That wasn't actually the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Was Actually Happening
&lt;/h2&gt;

&lt;p&gt;When we dug into it, two separate issues surfaced, and neither was about model architecture.&lt;br&gt;
&lt;strong&gt;Issue one&lt;/strong&gt;: sensor recalibration wasn't reflected in the pipeline. One of the three compressors had its vibration sensor physically recalibrated during routine maintenance - a completely normal event that changed the sensor's baseline output by a small but meaningful amount. The pipeline had no way of knowing this had happened. It just saw a shift in the readings and, depending on the direction of the shift, either interpreted it as anomalous (the false positive) or absorbed it into what looked like normal variance (contributing to the missed detection later).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue two&lt;/strong&gt;: the training data had an unintentional bias. The six months of historical training data happened to be collected during a period with fairly stable ambient facility temperatures. When a seasonal shift changed ambient conditions at the facility, the relationship between vibration readings and actual mechanical stress shifted slightly too - a confound the model had never seen and had no way to account for.&lt;/p&gt;

&lt;p&gt;Neither of these would show up in a standard train/test split, because the test set was drawn from the same time period and the same sensor calibration state as the training data. The model wasn't wrong. The assumptions baked into how the pipeline fed it data were incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed After
&lt;/h2&gt;

&lt;p&gt;A few concrete fixes came out of this, and they're the kind of thing that's worth building in from the start rather than retrofitting after an incident:&lt;/p&gt;

&lt;p&gt;Sensor metadata (calibration date, physical location, firmware version) got versioned separately from the sensor readings, so a recalibration event is now a visible, queryable fact rather than invisible context.&lt;br&gt;
A drift-monitoring layer was added that tracks statistical properties of raw sensor input independent of model output - so a shift gets flagged even if it hasn't yet caused a wrong prediction.&lt;br&gt;
Training data collection was extended to deliberately span multiple seasons before any model was considered production-ready for a new site, rather than shipping as soon as accuracy looked good on whatever data happened to be available.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Lesson
&lt;/h2&gt;

&lt;p&gt;None of this was a modeling problem. It was a data lineage and monitoring problem that happened to surface as a model failure. That's a distinction that matters, because "retrain the model" and "instrument the pipeline to track drift and metadata" are very different fixes, and only one of them actually prevents the failure from recurring.&lt;/p&gt;

&lt;p&gt;If you're building predictive maintenance systems and haven't hit this yet, you probably will - it's less an edge case than a near-guarantee once a model's been in production long enough. Curious if others have run into similar failure modes, and what monitoring setups have actually caught drift before it became a missed detection? Check out &lt;a href="https://apertureventurestudio.com/" rel="noopener noreferrer"&gt;Aperture Venture Studios&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>iot</category>
      <category>techtalks</category>
    </item>
  </channel>
</rss>
