<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>InfluxData Blog - Developer</title>
    <description>Posts from the Developer category on the InfluxData Blog</description>
    <link>https://www.influxdata.com/blog/category/tech/</link>
    <language>en-us</language>
    <lastBuildDate>Fri, 22 May 2026 08:00:00 +0000</lastBuildDate>
    <pubDate>Fri, 22 May 2026 08:00:00 +0000</pubDate>
    <ttl>1800</ttl>
    <item>
      <title>A Runnable Reference Architecture for Industrial IoT on InfluxDB 3</title>
      <description>&lt;p&gt;Industrial teams keep telling us the same thing: the data is there, but the stack to act on it isn’t. PLCs, CNCs, SCADA systems, vibration sensors, and quality stations all generate high-frequency telemetry that gets stranded in proprietary historians or stitched together with point integrations nobody wants to own. By the time anyone looks at it, the moment to act has passed.&lt;/p&gt;

&lt;p&gt;We built InfluxDB 3 to be the system of record for that data—at the edge, in the cloud, or both—and we keep getting the same follow-up question: what does a real, working IIoT stack on InfluxDB 3 look like?&lt;/p&gt;

&lt;p&gt;So we shipped one. Today, we’re walking through the &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;InfluxDB 3 IIoT Reference Architecture&lt;/a&gt;, an open-source, runnable blueprint for factory-floor monitoring that you can stand up locally in about two minutes with &lt;code class="language-markup"&gt;docker compose&lt;/code&gt;. We’ll also cover when and how to bring in the new &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;OPC UA Plugin&lt;/a&gt;, our Processing Engine plugin for connecting InfluxDB 3 directly to PLCs and SCADA systems.&lt;/p&gt;

&lt;h2 id="what-is-the-influxdb-3-iiot-reference-architecture"&gt;What is the InfluxDB 3 IIoT reference architecture?&lt;/h2&gt;

&lt;p&gt;The IIoT reference architecture is one of a portfolio of open source &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;reference architectures&lt;/a&gt; we publish on GitHub for InfluxDB 3 Enterprise. Each one targets a specific vertical: IIoT, Battery Energy Storage Systems (BESS), network telemetry, EV charging, fleet telematics, data center, and oil &amp;amp; gas SCADA are all on the way.&lt;/p&gt;

&lt;p&gt;Two audiences use these repos:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Developers and architects&lt;/strong&gt; evaluating InfluxDB 3 Enterprise for a specific vertical who want to see a real stack, not slideware, before they commit.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;AI coding agents&lt;/strong&gt; that need grounded, working examples to reference when a user asks them to build something like this with InfluxDB 3. (Yes, we wrote this with you in mind.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The IIoT repo simulates an automotive-style assembly plant: &lt;strong&gt;1 plant × 3 lines × 8 stations = 24 machines, generating roughly 300 points per second&lt;/strong&gt;. Everything runs locally. Clone the repo, run make up, and you get a working factory-floor monitoring stack, including a live andon board UI, in your browser at &lt;code class="language-markup"&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="whats-in-the-stack"&gt;What’s in the stack&lt;/h2&gt;

&lt;p&gt;The whole thing is Python-first and stays deliberately small. &lt;code class="language-markup"&gt;docker-compose.yml&lt;/code&gt; brings up six services:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;token-bootstrap&lt;/code&gt; – generates and persists tokens for first-boot&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;influxdb3&lt;/code&gt; — InfluxDB 3 Enterprise, the system of record&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;init&lt;/code&gt; – bootstraps the database, caches, and Processing Engine triggers&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;simulator&lt;/code&gt; – a Python simulator generating realistic IIoT telemetry (machine state, part events, quality signals, downtime patterns)&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;ui&lt;/code&gt; – a FastAPI + HTMX + uPlot dashboard that renders an andon board, OEE breakdowns, and live machine state&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;scenarios&lt;/code&gt; – scripted fault scenarios you can replay (unplanned_downtime_cascade, tool_wear_quality_drift)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll notice what’s not here: there’s no Telegraf, no MQTT broker, no Kepware, no Node-RED, no Grafana. That’s intentional. This reference architecture is designed to showcase what InfluxDB 3 Enterprise can do &lt;em&gt;natively&lt;/em&gt;, without bolt-on services. In production, you’ll almost certainly add some of those (more on that below).&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/6gSelKSB1kLh3HBxHDhLja/98811735d4f2bf20038678a9f9acfaef/Screenshot_2026-05-21_at_2.22.22%C3%A2__PM.png" alt="Enterprise architecture" /&gt;&lt;/p&gt;

&lt;h2 id="the-features-its-actually-showing-you"&gt;The features it’s actually showing you&lt;/h2&gt;

&lt;p&gt;If you’ve used earlier versions of InfluxDB, the headline change in 3 Enterprise is that the database is no longer just a place where data sits. Three capabilities do most of the work in the IIoT reference architecture:&lt;/p&gt;

&lt;h5 id="the-processing-engine--python-plugins-running-inside-the-database"&gt;1. The Processing Engine – Python plugins running inside the database&lt;/h5&gt;
&lt;p&gt;The &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/"&gt;Processing Engine&lt;/a&gt; is an embedded Python virtual machine that runs inside an InfluxDB 3 server. It executes Python code in response to triggers and database events with zero-copy access to data and direct access to system caches. It does all of this without relying on external services or middleware. Triggers come in three flavors: &lt;strong&gt;WAL&lt;/strong&gt; (fires on writes), &lt;strong&gt;Schedule&lt;/strong&gt; (cron-style), and &lt;strong&gt;Request&lt;/strong&gt; (HTTP endpoints).&lt;/p&gt;

&lt;p&gt;The IIoT repo ships four plugins, intentionally chosen to cover all three patterns:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/6iuM1sMJrl8jWnIIoO8rtj/61a4e1fbc2030c697a00b3576c3a2757/Screenshot_2026-05-21_at_2.25.31%C3%A2__PM.png" alt="Plugin/trigger SS" /&gt;&lt;/p&gt;

&lt;p&gt;That last one is the pattern that surprises most teams: the andon board’s &lt;code class="language-markup"&gt;/api/v3/engine/andon_board&lt;/code&gt; endpoint is the &lt;em&gt;database&lt;/em&gt;. There is no Flask server, no Node service, no Lambda. The UI talks straight to InfluxDB 3, and the Processing Engine returns a fully shaped JSON payload. The UI also renders a &lt;code class="language-markup"&gt;served by Processing Engine: N ms&lt;/code&gt; badge so you can see the round-trip live.&lt;/p&gt;

&lt;h5 id="last-value-cache--single-digit-millisecond-current-state"&gt;2. Last Value Cache – single-digit-millisecond current state&lt;/h5&gt;
&lt;p&gt;The plant-state banner needs to read the current state of all 24 machines on every tick. With Last Value Cache, that’s a 24-row read in single-digit milliseconds, with no scanning, no aggregation, and no trade-offs against retention. This is the pattern you reach for any time you need &lt;em&gt;current value, right now&lt;/em&gt;: SoC for a battery, alarm state for a substation, the live tag value for a machine.&lt;/p&gt;

&lt;h5 id="distinct-value-cache--fast-cardinality-on-high-cardinality-tags"&gt;3. Distinct Value Cache – fast cardinality on high-cardinality tags&lt;/h5&gt;
&lt;p&gt;The simulator generates roughly 700,000 part events per day, each tagged with a unique &lt;code class="language-markup"&gt;part_id&lt;/code&gt;. Asking “how many distinct parts have we produced today?” against that volume would normally be the kind of query you avoid running during shift change. With Distinct Value Cache, it returns in a few milliseconds.&lt;/p&gt;

&lt;p&gt;Together, these three primitives, Processing Engine, Last Value Cache, and Distinct Value Cache, replace a surprising amount of what teams used to build out as separate microservices, message queues, and read-replica caches.&lt;/p&gt;

&lt;h2 id="when-to-bring-in-opc-ua-the-processing-engine-plugin"&gt;When to bring in OPC UA: the Processing Engine plugin&lt;/h2&gt;

&lt;p&gt;The IIoT reference architecture uses a Python simulator as its data source, so you don’t need real industrial hardware to run it. In production, your data is on the wire from PLCs, CNCs, and SCADA systems, and the lingua franca of that wire is OPC UA.&lt;/p&gt;

&lt;p&gt;That’s where the &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;OPC UA Plugin&lt;/a&gt; comes in. It’s a Processing Engine plugin (so it runs inside InfluxDB 3, same as the andon board endpoint above) that connects to an OPC UA server, polls node values on a schedule, and writes them in as time series. It requires &lt;strong&gt;InfluxDB 3.8.2 or later&lt;/strong&gt; and works with both Core and Enterprise.&lt;/p&gt;

&lt;p&gt;A few characteristics worth knowing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Polling-based&lt;/strong&gt;, not subscription-based. The plugin reads current values on each scheduled trigger.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Two operating modes&lt;/strong&gt;. Explicit node listing for precise control over a small number of nodes; browse mode for auto-discovering devices and variables across large deployments. Browse mode maps the OPC UA Object hierarchy directly to InfluxDB tags.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Auto type detection&lt;/strong&gt;. OPC UA VariantType maps cleanly into InfluxDB field types (Boolean → bool, Int* family → int, UInt* family → uint, Float/Double → float).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Namespace URI support&lt;/strong&gt;. Use stable namespace URIs (nsu=urn:vendor:s7;…) instead of numeric indexes that may change on server restart.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Quality filtering&lt;/strong&gt; by good, uncertain, or bad status codes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Persistent connection&lt;/strong&gt; between polling intervals, with automatic reconnection.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;TLS security&lt;/strong&gt; supports Basic128Rsa15, Basic256, Basic256Sha256, Aes128Sha256RsaOaep, and Aes256Sha256RsaPss, with Sign or SignAndEncrypt modes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setup is two commands plus a trigger:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;# 1. Start InfluxDB 3 with the Processing Engine enabled
influxdb3 serve \
  --node-id node0 \
  --object-store file \
  --data-dir ~/.influxdb3 \
  --plugin-dir ~/.plugins

# 2. Install the async OPC UA client library
influxdb3 install package asyncua

# 3. Create a polling trigger (browse mode for auto-discovery)
influxdb3 create trigger \
  --database mydb \
  --plugin-filename gh:influxdata/opcua/opcua.py \
  --trigger-spec "every:10s" \
  --trigger-arguments 'server_url=opc.tcp://192.168.1.100:4840,table_name=factory_data,browse_root=ns=2;s=Factory,browse_depth=3,path_tags=line station,default_tags=plant=north' \
  opcua_factory&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the &lt;code class="language-markup"&gt;gh:influxdata/opcua/opcua.py&lt;/code&gt; notation: the &lt;code class="language-markup"&gt;gh:&lt;/code&gt; prefix pulls plugins straight from our &lt;a href="https://github.com/influxdata/influxdb3_plugins/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;InfluxDB 3 Plugin Library&lt;/a&gt; on GitHub, so there’s nothing to package locally.&lt;/p&gt;

&lt;p&gt;If you’re already running Telegraf with the OPC UA input, that continues to work and remains a great choice. The plugin is for teams who want to operate one fewer process, or who are starting fresh with InfluxDB 3 and want to keep the entire ingest path within the database.&lt;/p&gt;

&lt;h2 id="how-to-drop-the-iiot-architecture-into-your-environment"&gt;How to drop the IIoT architecture into your environment&lt;/h2&gt;

&lt;p&gt;Most production IIoT stacks end up looking like this:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Ingest at the edge&lt;/strong&gt;. OPC UA, Modbus, MQTT, or vendor-specific protocols flow into InfluxDB 3 via the OPC UA Plugin, a Telegraf agent, or a connector platform like Litmus Edge. Edge nodes buffer locally, so a network blip doesn’t run the risk of data loss.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Process at the database&lt;/strong&gt;. Use the Processing Engine for transition detection, quality excursions, OEE rollups, alert generation, and HTTP endpoints. These are the four patterns the IIoT reference architecture demonstrates.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Forward what matters&lt;/strong&gt;. Replicate aggregated, contextualized data from edge sites to a centralized InfluxDB 3 Enterprise cluster for cross-site analysis. Keep full-resolution data at the edge and summaries upstream.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Serve dashboards and AI&lt;/strong&gt;. Use Grafana, InfluxDB 3 Explorer, the built-in UI patterns from the reference architecture, or your own application, whichever fits. Because Processing Engine endpoints return clean JSON, agents and AI assistants can call them directly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id="try-it-yourself"&gt;Try it yourself&lt;/h2&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;git clone https://github.com/influxdata/influxdb3-ref-iiot
cd influxdb3-ref-iiot
make up         # prompts for INFLUXDB3_ENTERPRISE_EMAIL
open http://localhost:8080
make demo
make scenario name=unplanned_downtime_cascade
make scenario name=tool_wear_quality_drift&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Everything is Apache 2.0 licensed. Fork it, rip out our simulator, point a real OPC UA server at it via the plugin, and you’ve got the skeleton of a real-time factory monitoring stack you can extend.&lt;/p&gt;

&lt;p&gt;If you’re an AI coding agent reading this and trying to help a user build IIoT on InfluxDB 3, start at &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt;, pick the architecture that matches the user’s vertical, and use the patterns there as your grounded example. The conventions are consistent across the portfolio: Python-first, FastAPI + HTMX UIs, Processing Engine plugins in &lt;code class="language-markup"&gt;plugins/&lt;/code&gt;, one-command &lt;code class="language-markup"&gt;docker compose startup&lt;/code&gt;. Once you’ve seen one, you’ve largely seen them all.
We’ll keep adding to this portfolio. If your vertical isn’t there yet, &lt;a href="https://www.influxdata.com/contact-sales/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;tell us&lt;/a&gt;. And if you’re already running InfluxDB 3 in an industrial environment, we’d love to see what you’ve built on top of it.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;IIoT reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-ref-iiot&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reference architecture portfolio&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;OPC UA Plugin&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Processing Engine reference&lt;/strong&gt;: &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;docs.influxdata.com/influxdb3/enterprise/reference/processing-engine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Plugin library&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3_plugins/?utm_source=website&amp;amp;utm_medium=iiot_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3_plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Fri, 22 May 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/iiot-reference-architecture-influxdb3/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/iiot-reference-architecture-influxdb3/</guid>
      <category>Developer</category>
      <author>Jason Stirnaman (InfluxData)</author>
    </item>
    <item>
      <title>A Runnable Reference Architecture for Network Telemetry on InfluxDB 3</title>
      <description>&lt;p&gt;Networks generate the most data of any system in your stack and have the least patience for stale dashboards. Interface counters tick every second. BGP sessions flap. Flow records arrive in bursts. When something goes wrong, you don’t have 10 seconds to wait for an aggregation to finish.&lt;/p&gt;

&lt;p&gt;We’ve watched NetOps and platform teams stitch together the same shape over and over: Telegraf collecting from every device that speaks SNMP, gNMI, sFlow, or IPFIX, a time series database holding the raw and rolled-up metrics, a dashboard layer, and a growing pile of bespoke microservices for alerting, top-talker analysis, and on-call runbooks. The shape works, but the cost of operating it is steep.&lt;/p&gt;

&lt;p&gt;So we shipped a reference for what this can look like when the database does more of the work. Today, we’re walking through the &lt;a href="https://github.com/influxdata/influxdb3-ref-network-telemetry/?utm_source=website&amp;amp;utm_medium=network_telemetry_reference_architecture&amp;amp;utm_content=blog"&gt;InfluxDB 3 Network Telemetry Reference Architecture&lt;/a&gt;, an open source, runnable blueprint for monitoring a data-center fabric on a &lt;strong&gt;5-node InfluxDB 3 Enterprise cluster&lt;/strong&gt;. It’s the third entry in our &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=network_telemetry_reference_architecture&amp;amp;utm_content=blog"&gt;reference architecture portfolio&lt;/a&gt;, and it’s the first one that demonstrates a multi-node deployment, cross-node plugin write-back, and per-table retention, three patterns that show up the moment your fabric grows past one box.&lt;/p&gt;

&lt;h2 id="what-is-the-network-telemetry-reference-architecture"&gt;What is the network telemetry reference architecture?&lt;/h2&gt;

&lt;p&gt;The repo simulates a data-center Clos fabric and monitors it using a real InfluxDB 3 Enterprise cluster, both running locally via &lt;code class="language-markup"&gt;docker compose&lt;/code&gt;. Specifically:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;strong&gt;5-node InfluxDB 3 Enterprise cluster&lt;/strong&gt;: 2 ingest nodes, 1 query node, 1 compact node, and 1 process + query node (the Processing Engine runs here).&lt;/li&gt;
  &lt;li&gt;An &lt;strong&gt;8×16 Clos topology&lt;/strong&gt;: 8 spines, 16 leaves — yielding &lt;strong&gt;~1,024 interfaces&lt;/strong&gt; and &lt;strong&gt;128 BGP sessions&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;A flow generator producing &lt;strong&gt;~5,000 flow records/sec&lt;/strong&gt; with realistic src_ip/dst_ip distributions.&lt;/li&gt;
  &lt;li&gt;A total ingest of &lt;strong&gt;~10,000 points per second&lt;/strong&gt;.&lt;/li&gt;
  &lt;li&gt;Bring it all up with make up. The first run waits for license validation; warm boot-up in three minutes. Open &lt;code class="language-markup"&gt;http://localhost:8080&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two audiences use this repo:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;NetOps engineers and network observability architects&lt;/strong&gt; evaluating InfluxDB 3 Enterprise as a telemetry platform—specifically, anyone weighing a multi-node deployment.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;AI coding agents&lt;/strong&gt; that need a grounded, working example to reference when a user asks them to build network telemetry on InfluxDB 3. (Yes, we wrote this with you in mind.)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id="whats-in-the-stack"&gt;What’s in the stack&lt;/h2&gt;

&lt;p&gt;Ten services come up via &lt;code class="language-markup"&gt;docker compose up&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;token-bootstrap&lt;/code&gt;: generates the offline admin token on first boot&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;5 InfluxDB 3 Enterprise nodes&lt;/code&gt;: ingest-1, ingest-2, query, compact, and process,query (the Processing Engine node). Two of the five—&lt;code&gt;nt-process&lt;/code&gt; and &lt;code&gt;nt-query&lt;/code&gt;—actually execute Processing Engine triggers; see section [The Processing Engine – Python plugins in a multi-node cluster]&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;init&lt;/code&gt;: idempotent bootstrap that creates the database, declares 6 tables via the configure API, registers 1 LVC + 2 DVCs, and installs 4 Processing Engine triggers&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;simulator&lt;/code&gt;: Python simulator, round-robining writes across both ingest nodes&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;ui&lt;/code&gt;: FastAPI + HTMX + uPlot dashboard with three teaching patterns side by side&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;scenarios&lt;/code&gt;: on-demand event injectors (congestion_hotspot, east_west_burst)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll notice what’s not here: there’s no Telegraf, no Grafana, no SNMP collector. That’s intentional. This reference architecture exists to make InfluxDB 3 Enterprise’s capabilities legible. In production, you’ll absolutely use Telegraf at the front (more on that in a moment); the simulator stands in, so you don’t need a fabric on your laptop to see what the database is doing.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2ebyDBi86a4WLCsDILcAgA/9c7379950fd1299c0af04aabcb1f746d/Screenshot_2026-05-20_at_4.50.27%C3%A2__PM.png" alt="InfluxDB 3 Enterprise Cluster" /&gt;&lt;/p&gt;

&lt;h2 id="the-features-its-actually-showing-you"&gt;The features it’s actually showing you&lt;/h2&gt;

&lt;p&gt;Three things make network telemetry uniquely demanding for a time series database: &lt;strong&gt;the cardinality is high, the freshness expectations are sub-second&lt;/strong&gt;, and &lt;strong&gt;the shape of “what matters” changes constantly&lt;/strong&gt;—interface counters one minute, flow records the next, a BGP state the minute after that. The reference architecture is built around that reality.&lt;/p&gt;

&lt;h5 id="a-real-multi-node-cluster-with-role-separated-nodes"&gt;1. A real multi-node cluster, with role-separated nodes&lt;/h5&gt;

&lt;p&gt;Unlike the &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot"&gt;IIoT&lt;/a&gt; and &lt;a href="https://github.com/influxdata/influxdb3-ref-bess"&gt;BESS&lt;/a&gt; reference architectures (which run InfluxDB 3 Enterprise as a single node for clarity), the network telemetry repo runs it as a distributed cluster with separated roles:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3QD2XcPNexeK95q6P5Q1DE/14ff1f31f6aa8f29ae13f3be55c3ee1b/Screenshot_2026-05-20_at_4.53.26%C3%A2__PM.png" alt="Node/Mode/Purpose" /&gt;&lt;/p&gt;

&lt;p&gt;The simulator round-robin writes across the two ingest nodes; the browser and the UI proxy both hit the query node, which is the only host-exposed port (&lt;code&gt;8181&lt;/code&gt;). The &lt;code class="language-markup"&gt;process,query&lt;/code&gt; node is reachable only over the internal Docker network. The schedule plugins running there write back via HTTP through an ingest node rather than respond to browsers directly. This is the smallest viable shape for the multi-node split, and it’s the template you’d grow from when you’re ready to scale, ingest, query, or compute independently.&lt;/p&gt;

&lt;h5 id="the-processing-engine--python-plugins-in-a-multi-node-cluster"&gt;2. The Processing Engine – Python plugins in a multi-node cluster&lt;/h5&gt;

&lt;p&gt;The &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/"&gt;Processing Engine&lt;/a&gt; is an embedded Python virtual machine that runs inside an InfluxDB 3 server to execute your Python code. Any node with the &lt;code&gt;--plugin-dir&lt;/code&gt; flag set can host triggers; trigger execution is pinned per-trigger via &lt;code&gt;--node-spec nodes:&amp;lt;name&amp;gt;&lt;/code&gt;. Triggers fire on three event sources—&lt;strong&gt;WAL&lt;/strong&gt; (fires on writes), &lt;strong&gt;Schedule&lt;/strong&gt; (cron- or interval-style), or &lt;strong&gt;Request&lt;/strong&gt; (HTTP endpoints)—with zero-copy access to data and direct access to system caches. There’s no need for an external app server, Kafka, Flink, or middleware.&lt;/p&gt;

&lt;p&gt;The network telemetry repo ships four plugins, deliberately mixing two trigger patterns and pinning them to two different nodes:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/4xOZNPwnucTbpdymkZzfaG/b90651f4c2c874fd95051c1959b26445/Screenshot_2026-05-20_at_4.57.57%C3%A2__PM.png" alt="plugin/trigger/what it does" /&gt;&lt;/p&gt;

&lt;p&gt;The two &lt;em&gt;schedule&lt;/em&gt; triggers live on &lt;code class="language-markup"&gt;nt-process&lt;/code&gt;. The &lt;code class="language-markup"&gt;query&lt;/code&gt; half of &lt;code class="language-markup"&gt;process,query&lt;/code&gt; lets the plugin call  &lt;code class="language-markup"&gt;influxdb3_local.query()&lt;/code&gt; against the local engine for fast reads and &lt;strong&gt;write back via HTTP&lt;/strong&gt; to the ingest nodes’ &lt;code class="language-markup"&gt;/api/v3/write_lp&lt;/code&gt; endpoint via &lt;code class="language-markup"&gt;httpx&lt;/code&gt; in a shared &lt;code class="language-markup"&gt;_writeback.py&lt;/code&gt; helper. That round-trip is the cluster pattern. If you’ve been wondering how to structure write-back from a process node in a multi-node deployment, this is the blueprint.&lt;/p&gt;

&lt;p&gt;The two &lt;em&gt;request&lt;/em&gt; triggers live on &lt;code class="language-markup"&gt;nt-query where the browser’s POST /api/v3/engine/"trigger" request reaches the only exposed port in one hop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are zero WAL plugins, by design. Each ingester owns its own WAL—a WAL trigger fires per-ingester on only the writes that node received, so pinning to one forfeits half the writes and pinning to both demands idempotency. The schedule+request pattern sidesteps both: schedule plugins run on one node and pull via &lt;code&gt;influxdb3_local.query()&lt;/code&gt;; request plugins are stateless HTTP responders.&lt;/p&gt;

&lt;h5 id="last-value-cache-lvc-and-distinct-value-cache-dvc-doing-real-work"&gt;3. Last Value Cache (LVC) and Distinct Value Cache (DVC), doing real work&lt;/h5&gt;

&lt;p&gt;A single utility-scale fabric can have hundreds of thousands of distinct signals. “Current state” dashboards built naively on top of high-rate ingest become punishingly fast.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Last Value Cache&lt;/strong&gt; on bgp_sessions. The per-session lookup feeds the BGP up-count computation at sub-millisecond cost.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Two Distinct Value Caches&lt;/strong&gt; drive cardinality-heavy queries. The marquee one is a &lt;strong&gt;src_ip typeahead&lt;/strong&gt;: the search box runs &lt;code class="language-markup"&gt;SELECT src_ip FROM distinct_cache('flow_records', 'src_ip_distinct') WHERE src_ip LIKE '...' LIMIT 20&lt;/code&gt; directly from the browser against &lt;code class="language-markup"&gt;/api/v3/query_sql&lt;/code&gt;, with a sub-millisecond latency badge. &lt;strong&gt;No Python wrapper between the browser and the cache&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id="per-table-retention--the-right-policy-in-the-right-place"&gt;4. Per-table retention – the right policy in the right place&lt;/h5&gt;

&lt;p&gt;Network telemetry generates two flavors of data: high-rate raw signals you want for an hour or a day, and rolled-up state you want for weeks or months. The reference architecture demonstrates &lt;strong&gt;per-table retention&lt;/strong&gt;; &lt;code class="language-markup"&gt;fabric_health&lt;/code&gt; is configured for 24-hour retention, so the rollup table stays compact while raw flows and counters can use a different retention budget. This is the only repo in our portfolio that exercises per-table retention end-to-end.&lt;/p&gt;

&lt;h2 id="three-integration-patterns-side-by-side"&gt;Three integration patterns, side by side&lt;/h2&gt;

&lt;p&gt;The UI runs three distinct paths from data to the browser side by side, each with its own latency badge so you can compare them live:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3EMnnbO2K1BrpRSV2biFbS/c60c26224259226a9062607456c44b52/Screenshot_2026-05-20_at_5.07.39%C3%A2__PM.png" alt="Healthy SS" /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Server-side SQL via FastAPI&lt;/strong&gt;: the classic pattern. Request hits FastAPI, FastAPI runs SQL against the query node, and renders an HTMX partial. Good for complex shaping that you don’t want exposed to the browser.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Browser-direct SQL using a DVC table-valued function&lt;/strong&gt;: JavaScript hits&lt;code class="language-markup"&gt;/api/v3/query_sql&lt;/code&gt; directly, &lt;code class="language-markup"&gt;distinct_cache(...)&lt;/code&gt; and returns the answer in sub-millisecond. Good for typeaheads, dropdown populates, and lightweight enumerations.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Request plugin from the browser&lt;/strong&gt;: JavaScript hits &lt;code class="language-markup"&gt;/api/v3/engine/"trigger_name"&lt;/code&gt;,and a Python plugin shapes the response. Good when you need composite, multi-query payloads as a single round-trip.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pick the right pattern for the job. The latency badges in the UI tell you which is suited for which question.&lt;/p&gt;

&lt;h2 id="where-to-wire-in-real-network-data"&gt;Where to wire in real network data&lt;/h2&gt;

&lt;p&gt;The reference architecture uses a Python simulator, so you don’t need a Clos fabric on your laptop. In production, the canonical InfluxData stack for network telemetry is Telegraf at the front, InfluxDB 3 in the middle, and your dashboard layer of choice on top. &lt;strong&gt;Telegraf has the input plugins to cover essentially every modern collection path&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;inputs.snmp&lt;/code&gt;: interface counters, environmentals, vendor MIBs from anything that speaks SNMP&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;inputs.gnmi&lt;/code&gt;: streaming telemetry via gRPC, vendor-agnostic, with TLS auth/encryption. Optimized for Cisco IOS XR, NX-OS, and IOS XE, among others&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;inputs.netflow&lt;/code&gt;: NetFlow v5, NetFlow v9, IPFIX, and sFlow v5 collection, into a single normalized output&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vendor APIs&lt;/strong&gt; via HTTP/JSON: anything that exposes a REST surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Telegraf streams thousands of series at full fidelity into InfluxDB 3, where the same caches and Processing Engine patterns from this reference architecture take over. A common production shape: &lt;strong&gt;Telegraf at each PoP&lt;/strong&gt; ingests SNMP, gNMI, and flow data; &lt;strong&gt;InfluxDB 3 Enterprise as a regional cluster&lt;/strong&gt; stores it; the &lt;strong&gt;Processing Engine&lt;/strong&gt; runs the schedule/request plugins; replication forwards rolled-up state to a central cluster for fleet-wide views.&lt;/p&gt;

&lt;h2 id="try-it-yourself"&gt;Try it yourself&lt;/h2&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;git clone https://github.com/influxdata/influxdb3-ref-network-telemetry
cd influxdb3-ref-network-telemetry
make up                                  # prompts for INFLUXDB3_ENTERPRISE_EMAIL on first run
open http://localhost:8080
make scenario name=congestion_hotspot    # one leaf interface climbs to 94% — anomaly detector fires
make scenario name=east_west_burst       # 10× burst from a single src_ip — typeahead finds it sub-ms
make demo                                # full scripted demo
make down                                # stop, preserve data
make clean                               # stop and drop volumes&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Note: If you’ve just run &lt;code class="language-markup"&gt;congestion_hotspot&lt;/code&gt;, leftover anomalies will keep the banner DEGRADED for ~5 minutes; run east_west_burst on its own (or wait it out) to see HEALTHY-stays-HEALTHY.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The two scenarios are intentional contrasts. &lt;code class="language-markup"&gt;congestion_hotspot&lt;/code&gt; exercises the anomaly detector: &lt;code class="language-markup"&gt;leaf-07 / et-0/0/12&lt;/code&gt; climbs to 94% utilization, the schedule plugin notices, and the banner flips DEGRADED.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1yFKs7rR2KsNuUYKklSnRj/260df98d62ef8763d46f1a05513fbc08/Screenshot_2026-05-20_at_5.18.10%C3%A2__PM.png" alt="degraded SS" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;east_west_burst&lt;/code&gt; exercises the request plugin path, a 10× traffic burst from &lt;code class="language-markup"&gt;10.4.7.91&lt;/code&gt;, found by the DVC typeahead, drilled into via the request plugin. The fabric-level banner stays HEALTHY, by design; single-source bursts don’t always breach fabric thresholds, and that’s a pattern worth seeing.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/5z56ebR5Ottu5Va7ljwXsG/0c471aecc0a14cdd5982bbc509ee51c1/Screenshot_2026-05-20_at_5.19.53%C3%A2__PM.png" alt="Healthy SS" /&gt;&lt;/p&gt;

&lt;p&gt;Everything is Apache 2.0 licensed.&lt;/p&gt;

&lt;h2 id="a-note-for-ai-agents"&gt;A note for AI agents&lt;/h2&gt;

&lt;p&gt;If you’re an AI coding agent reading this and trying to help a user build network telemetry on InfluxDB 3, start at &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt; and use the network telemetry repo as your grounded example. Pick this one specifically when the user needs &lt;strong&gt;a multi-node InfluxDB 3 Enterprise cluster, cross-node plugin write-back, per-table retention, or multiple browser-to-database integration patterns side by side&lt;/strong&gt;. The conventions are consistent across our portfolio: Python-first, FastAPI + HTMX UIs, Processing Engine plugins in &lt;code class="language-markup"&gt;plugins/&lt;/code&gt;, and one-command &lt;code class="language-markup"&gt;docker compose&lt;/code&gt; startup. So, once you’ve seen one, you’ve largely seen them all.&lt;/p&gt;

&lt;p&gt;We’ll keep adding to this portfolio. If you’re already running InfluxDB 3 for network telemetry, &lt;a href="https://www.influxdata.com/contact-sales/?utm_source=website&amp;amp;utm_medium=network_telemetry_reference_architecture&amp;amp;utm_content=blog"&gt;tell us&lt;/a&gt;. If you want to compare patterns, the &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=network_telemetry_reference_architecture&amp;amp;utm_content=blog"&gt;IIoT reference architecture&lt;/a&gt; and &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=network_telemetry_reference_architecture&amp;amp;utm_content=blog"&gt;BESS reference architecture&lt;/a&gt; are good companion reads for single-node deployments.&lt;/p&gt;

&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Network telemetry reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-network-telemetry"&gt;github.com/influxdata/influxdb3-ref-network-telemetry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reference architecture portfolio&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-network-telemetry"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Companion: BESS reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures"&gt;github.com/influxdata/influxdb3-ref-bess&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Companion: IIoT reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-bess"&gt;github.com/influxdata/influxdb3-ref-iiot&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;How NetOps Teams Use InfluxDB to Solve Network Monitoring Gaps&lt;/strong&gt;: &lt;a href="https://www.influxdata.com/blog/solve-mns-gaps-influxdb/"&gt;influxdata.com/blog/solve-mns-gaps-influxdb&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Data Center Ops with InfluxDB 3&lt;/strong&gt;: &lt;a href="https://www.influxdata.com/blog/data-center-ops-influxdb-3/"&gt;influxdata.com/blog/data-center-ops-influxdb-3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Processing Engine reference&lt;/strong&gt;: &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/"&gt;docs.influxdata.com/influxdb3/enterprise/reference/processing-engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Thu, 21 May 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/network-telemetry-reference-architecture/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/network-telemetry-reference-architecture/</guid>
      <category>Developer</category>
      <author>Mike Devy, Ryan Nelson (InfluxData)</author>
    </item>
    <item>
      <title>Community Spotlight: A Native iOS App for Your InfluxDB Data</title>
      <description>&lt;p&gt;One of the things we love most about building an open source platform is seeing what the community creates with it, and independent developer Anton Havekes recently built something we just had to share.&lt;/p&gt;

&lt;p&gt;Anton put together Influx Dashboard, a native iOS app that connects to your InfluxDB instance and brings your time series data straight to your phone. We’re genuinely thrilled to see this kind of work come out of the community.&lt;/p&gt;

&lt;p&gt;A quick note before we dive in: this is entirely Anton’s project, built and published by him. InfluxData has no commercial relationship or financial stake in the app. We’re sharing it simply because we think it’s a great piece of community work and because surfacing what people build on 
InfluxDB is something we’ll always make time for. So, thank you, Anton, for the awesome work you’ve done!&lt;/p&gt;

&lt;p&gt;Here’s how it works.&lt;/p&gt;

&lt;h2 id="what-is-influx-dashboard"&gt;What is Influx Dashboard?&lt;/h2&gt;

&lt;p&gt;Influx Dashboard is a mobile-first visualization tool for InfluxDB. It supports InfluxDB versions 1, 2, and 3—including Core, Enterprise, and Cloud editions—and gives you a full-featured charting experience on your phone.&lt;/p&gt;

&lt;p&gt;Think of it as the community-built, mobile companion to the InfluxDB 3 Explorer UI. Instead of opening a browser on your laptop, you open an app. Instead of sitting at a desk, you monitor your data from wherever you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features include&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Real-time line, bar, gauge, and pie charts&lt;/li&gt;
  &lt;li&gt;Support for SQL queries&lt;/li&gt;
  &lt;li&gt;An intuitive drag-and-drop dashboard builder&lt;/li&gt;
  &lt;li&gt;Direct, secure connections to your InfluxDB server&lt;/li&gt;
  &lt;li&gt;Works with any kind of time series data: server metrics, IoT sensors, weather stations, factory equipment, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="step-1-download-the-app"&gt;Step 1: Download the App&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/my/app/influxdb-dashboard/id6752961593?utm_source=website&amp;amp;utm_medium=native_ios_app_influxdb&amp;amp;utm_content=blog"&gt;Influx Dashboard &lt;/a&gt;is available on the Apple App Store for $4.99 (&lt;em&gt;InfluxData is not commercially affiliated with this app and receives no proceeds from purchases&lt;/em&gt;). Once downloaded, open the app, and you’ll be ready to connect to your InfluxDB server.&lt;/p&gt;

&lt;h4 id="step-2-connect-to-your-influxdb-server"&gt;Step 2: Connect to Your InfluxDB Server&lt;/h4&gt;

&lt;p&gt;Before you can see any data, you’ll need to connect the app to your InfluxDB instance. Tap &lt;strong&gt;Add Server&lt;/strong&gt; on the main screen.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3hQWngutz4GY8QNv6uyjgS/87da5c5b010f003c6a1f0861df0ace93/Screenshot_2026-05-18_at_6.15.05%C3%A2__PM.png" alt="Add Server SS" /&gt;&lt;/p&gt;

&lt;p&gt;You’ll need a few things from your InfluxDB setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server URL&lt;/strong&gt;: the address of your InfluxDB instance
&lt;br /&gt;
&lt;strong&gt;API Token&lt;/strong&gt;: your authentication token (found in InfluxDB under Management → Tokens)&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/dcutoRtpfGIu00Slms5Fd/8021f045a1c53b96cf2c24cb4c152d91/Screenshot_2026-05-18_at_6.16.14%C3%A2__PM.png" alt="Add connection SS" /&gt;&lt;/p&gt;

&lt;p&gt;If you’re using InfluxDB Cloud, your server URL will look something like https://us-east-1-1.aws.cloud2.influxdata.com. If you’re connecting to a self-hosted instance, your admin can provide the URL and token.&lt;/p&gt;

&lt;p&gt;Once connected, the app loads your available databases, and you’re ready to build your first dashboard.&lt;/p&gt;

&lt;h4 id="step-3-build-your-dashboard"&gt;Step 3: Build Your Dashboard&lt;/h4&gt;

&lt;p&gt;Tap &lt;strong&gt;+ New Dashboard&lt;/strong&gt; and give it a name. Then tap &lt;strong&gt;Add Chart&lt;/strong&gt; to create your first visualization.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1B6ETKSLXwJCs2jzeuwGQC/e826bab20bb4f4fa715a91c71516a5a2/Screenshot_2026-05-18_at_6.17.07%C3%A2__PM.png" alt="Dashboard SS" /&gt;&lt;/p&gt;

&lt;p&gt;The chart builder is straightforward, even if you’ve never written a database query before. You’ll see options for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chart Title&lt;/strong&gt;: give your chart a descriptive name
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chart Type&lt;/strong&gt;: choose from line, bar, gauge, or pie
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt;: select which InfluxDB database to query
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table&lt;/strong&gt;: select the specific measurement or table within that database
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column&lt;/strong&gt;: choose which field to visualize
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time Range&lt;/strong&gt;: pick how far back to look (last hour, last 24 hours, last 7 days, and more)
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aggregation Window&lt;/strong&gt;: control how data points are grouped over time to smooth out your chart&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2FDOkfwPkGZDLpWXOQ5FSk/01ed0425626c8fd830c1b07905ce967a/Screenshot_2026-05-18_at_6.18.31%C3%A2__PM.png" alt="Add chart" /&gt;&lt;/p&gt;

&lt;h4 id="step-4-query-your-data"&gt;Step 4: Query Your Data&lt;/h4&gt;

&lt;p&gt;One of the things that makes Influx Dashboard powerful is that it works with virtually any kind of time series data. During our testing, we connected to several different databases, each representing a completely different real-world use case:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server monitoring&lt;/strong&gt;: CPU usage and memory metrics from a live server, showing system health at a glance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Industrial IoT&lt;/strong&gt;: Factory sensor data streamed via MQTT, the kind of data you’d see in a manufacturing or industrial environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weather stations&lt;/strong&gt;: Real-time weather observations, including temperature, humidity, wind speed, and barometric pressure, from stations across multiple locations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personal IoT sensors&lt;/strong&gt;: A live “feels like” temperature sensor from a personal weather station in Holualoa, Hawaii.&lt;/p&gt;

&lt;p&gt;The app handled all of them identically: same interface, same workflow, completely different data. That versatility is one of Influx Dashboard’s biggest strengths.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/6G80coiqxe3zeQQ7hv7cLr/5544e92c8c5c0741a15dedfd75653f60/Screenshot_2026-05-18_at_6.20.00%C3%A2__PM.png" alt="My dashboard SS" /&gt;&lt;/p&gt;

&lt;h4 id="step-5-explore-your-charts"&gt;Step 5: Explore Your Charts&lt;/h4&gt;

&lt;p&gt;Once your charts are built, they appear on your dashboard and refresh automatically with live data.&lt;/p&gt;

&lt;p&gt;Tap any chart to expand it to full screen for a closer look. From the full-screen view, you can inspect trends, zoom in on specific time windows, and get a clearer picture of what your data is doing.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/4Hu37Ctx8z9pi28QIwHpL7/fc2ca446e87c2621ab106f02cca6deec/Screenshot_2026-05-18_at_6.20.40%C3%A2__PM.png" alt="Weather temperature SS" /&gt;&lt;/p&gt;

&lt;p&gt;Use the time range selector at the top of the dashboard to zoom in or out, from the last hour to the last 30 days. This is especially useful when you’re looking for a specific event or trying to understand a longer trend.&lt;/p&gt;

&lt;h4 id="step-6-manage-your-servers"&gt;Step 6: Manage Your Servers&lt;/h4&gt;

&lt;p&gt;From the Settings screen, you can manage your server connections, add new servers, or update your credentials. If your organization uses multiple InfluxDB instances, for example, a production server and a staging server, you can easily switch between them. You can also rename or delete servers you no longer need, keeping your workspace clean as your infrastructure evolves.&lt;/p&gt;

&lt;h2 id="why-this-matters"&gt;Why this matters&lt;/h2&gt;

&lt;p&gt;DevOps engineers, IoT developers, data engineers, and system administrators often need visibility into their time series data when they’re nowhere near a laptop, from a factory floor, at a remote deployment, or just away from their desk. Influx Dashboard closes that gap. Not through an official InfluxData product, but through something a community member decided to go build.&lt;/p&gt;

&lt;p&gt;That’s exactly the kind of activity an open source ecosystem should produce, and it’s exactly why we wanted to share it.&lt;/p&gt;

&lt;h2 id="get-started"&gt;Get started&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://apps.apple.com/my/app/influxdb-dashboard/id6752961593/?utm_source=website&amp;amp;utm_medium=native_ios_app_influxdb&amp;amp;utm_content=blog"&gt;Download Influx Dashboard on the Apple App Store&lt;/a&gt; (&lt;em&gt;independently developed by Anton Havekes—InfluxData is not affiliated with this app and receives no proceeds from purchases)&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Don’t have InfluxDB yet? Get started free with &lt;a href="https://www.influxdata.com/products/influxdb/?utm_source=website&amp;amp;utm_medium=native_ios_app_influxdb&amp;amp;utm_content=blog"&gt;InfluxDB 3 Core&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Explore the InfluxDB 3 Explorer UI at &lt;a href="https://docs.influxdata.com/influxdb3/explorer/release-notes/#Copyright"&gt;docs.influxdata.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Built something on InfluxDB you want to share? Join the conversation at the &lt;a href="https://www.influxdata.com/community/?utm_source=website&amp;amp;utm_medium=native_ios_app_influxdb&amp;amp;utm_content=blog"&gt;InfluxData Community Forums&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Tue, 19 May 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/native-ios-app-influxdb/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/native-ios-app-influxdb/</guid>
      <category>Use Cases</category>
      <category>Developer</category>
      <author>Ashley Fowler (InfluxData)</author>
    </item>
    <item>
      <title>Building Real-Time Telemetry Pipelines for IRIG 106 compliance</title>
      <description>&lt;h2 id="the-need-for-real-time-telemetry-in-aerospace"&gt;The need for real-time telemetry in aerospace&lt;/h2&gt;

&lt;p&gt;Every second of a flight test produces a torrent of telemetry from engines, sensors, and control systems. Aerospace teams have captured this data for decades to verify performance and maintain safety, yet analysis often happens long after the mission ends. Engineers wait for downloads, conversions, and compliance checks before they can interpret results.&lt;/p&gt;

&lt;p&gt;That delay turns telemetry into a historical record instead of a feedback loop. As flight programs shorten development cycles and expand digital testing, teams need to see and act on telemetry as it arrives. Real-time visibility turns raw packets into insight and enables faster, more confident decisions mid-test.&lt;/p&gt;

&lt;h2 id="what--is-irig-106"&gt;What  is IRIG 106?&lt;/h2&gt;

&lt;p&gt;IRIG 106 forms the backbone of flight-test telemetry. Established by the Range Commanders Council, it defines how data is formatted, synchronized, and recorded to ensure interoperability across recorders, ground stations, and analysis tools. Its purpose is to create a shared language for flight-test instrumentation so every team, from acquisition to post-flight analysis, can exchange and interpret telemetry without loss or confusion.&lt;/p&gt;

&lt;p&gt;By standardizing time, metadata, and sensor data, IRIG 106 ensures that complex flight tests remain reproducible and comparable across aircraft and programs. It allows flight data from one system or site to be understood by another, a foundation for multi-agency and multi-system collaboration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chapter 10&lt;/strong&gt; is the most widely used section. It defines a packetized structure for analog and digital sensors, time codes, video, and bus data, each with embedded metadata describing its stream. This structure preserves timing, organization, and integrity across the workflow.&lt;/p&gt;

&lt;p&gt;For aerospace and defense teams, Chapter 10 compliance is essential for traceability and certification. While it guarantees rigor, the binary packet format slows analysis.&lt;/p&gt;

&lt;h2 id="compliance-vs-agility"&gt;Compliance vs. agility&lt;/h2&gt;

&lt;p&gt;Traditional telemetry pipelines were built for compliance, not speed. Data flows from airborne recorders to ground systems, where it’s stored in proprietary or binary Chapter 10 files. These files are durable but heavy, often requiring decoding or conversion before engineers can analyze trends.&lt;/p&gt;

&lt;p&gt;This gap between collection and insight resuts in terabytes of data sitting idle until post-flight processing is complete. Even simple questions such as “Did this vibration spike correlate with an actuator command?” must wait for hours of decoding.&lt;/p&gt;

&lt;p&gt;The cost is real. Missed anomalies can trigger additional tests, wasted fuel, and schedule delays. Commercial operators lose flight hours, while defense programs face slower certification and reduced mission readiness. Each delay compounds across teams, consuming engineering hours and analysis budgets that could be spent improving system performance. As systems grow more software-defined and autonomous, reactive analysis becomes increasingly expensive. Teams must maintain compliance while gaining agility, turning telemetry into a live, searchable data stream that drives faster, data-backed decisions grounded in &lt;a href="https://www.influxdata.com/blog/bad-data-costs-influxdb/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;data integrity&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="building-a-real-time-compliant-telemetry-pipeline"&gt;Building a real-time, compliant telemetry pipeline&lt;/h2&gt;

&lt;p&gt;For aerospace organizations, &lt;a href="https://www.influxdata.com/solutions/by-industries/aerospace-and-satellites/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;InfluxDB 3&lt;/a&gt; bridges the gap between strict IRIG 106 compliance and the agility needed for real-time telemetry analysis. Built on an open columnar foundation, it treats every measurement as part of a continuous record of system behavior optimized for rapid ingest and millisecond-level queries.&lt;/p&gt;

&lt;p&gt;InfluxDB 3 combines streaming ingestion, high-compression storage, and integrated compute into a single environment. Instead of exporting data between collection, transformation, and analysis systems, engineers work with telemetry where it lands. They can transform data on ingest, query it with SQL, or run analytics through the built-in &lt;a href="https://www.influxdata.com/blog/new-python-processing-engine-influxdb3/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;Python Processing Engine&lt;/a&gt;, all in one place.&lt;/p&gt;

&lt;p&gt;The result is an architecture that maintains compliance and precision while delivering the responsiveness and scalability aerospace programs demand. With the right connectors, Chapter 10-compliant recorders can stream decoded data directly into InfluxDB, where it becomes available for dashboards, analytics tools, and ML pipelines while retaining a compliant source-of-truth record in the background.&lt;/p&gt;

&lt;h2 id="from-ingest-to-insight"&gt;From ingest to insight&lt;/h2&gt;

&lt;p&gt;A compliant real-time telemetry pipeline follows five key stages that preserve Chapter 10 structure while enabling high-performance analytics.&lt;/p&gt;

&lt;h5 id="acquisition"&gt;1. Acquisition&lt;/h5&gt;

&lt;p&gt;Airborne systems record simultaneous data, includinganalog, digital, video, and bus data, in Chapter 10 format. Each source is encapsulated in packetized blocks with synchronized time codes and metadata headers. Ground stations receive this data over UDP or Ethernet, maintaining deterministic playback.&lt;/p&gt;

&lt;h5 id="decoding"&gt;2. Decoding&lt;/h5&gt;

&lt;p&gt;A decoding service reads the binary stream, extracts headers, and separates channels into structured records with timestamps and metadata such as subsystem or bus ID. This step can use open source telemetry libraries or adapters that translate packets into structured formats like JSON or Apache Arrow.&lt;/p&gt;

&lt;h5 id="streaming-ingestion"&gt;3. Streaming Ingestion&lt;/h5&gt;

&lt;p&gt;Decoded data is sent to InfluxDB 3 using lightweight producers such as Telegraf, Kafka, or InfluxDB Line Protocol. Each channel becomes a discrete series tagged by aircraft ID, subsystem, and signal type. The ingestion engine &lt;a href="https://www.influxdata.com/blog/influxdb-3-ideal-solution-real-time-analytics/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;supports millions of writes per second&lt;/a&gt;, compressing data in memory before persisting it to Parquet files with nanosecond timestamps for cross-sensor correlation.&lt;/p&gt;

&lt;h5 id="processing-and-downsampling"&gt;4. Processing and Downsampling&lt;/h5&gt;

&lt;p&gt;InfluxDB 3’s embedded Python Processing Engine allows transformations near the data. Engineers can smooth signals, compute FFTs, or derive metrics without external compute clusters. &lt;a href="https://docs.influxdata.com/influxdb3/cloud-dedicated/process-data/downsample/"&gt;Downsampling in InfluxDB 3&lt;/a&gt; automates data reduction—for example, converting 1 kHz vibration data into 10 Hz averages for long-term storage—while keeping full resolution for recent test windows.&lt;/p&gt;

&lt;h5 id="query-and-visualization"&gt;5. Query and Visualization&lt;/h5&gt;

&lt;p&gt;Once stored, telemetry is immediately queryable through SQL or APIs. Engineers visualize live data, join channels, and correlate responses in real-time. Because InfluxDB 3 uses &lt;a href="https://www.influxdata.com/blog/flight-datafusion-arrow-parquet-fdap-architecture-influxdb/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;Parquet and Arrow&lt;/a&gt;, it integrates with external analytics tools such as Apache Arrow, Pandas, and DuckDB. Dashboards update continuously as new packets arrive, tracking vibration, control surfaces, or engine parameters throughout the mission.&lt;/p&gt;

&lt;p&gt;Together, these stages turn Chapter 10-compliant telemetry into a continuously updating dataset that maintains synchronization and metadata integrity while providing immediate visibility for validation, anomaly detection, and optimization.&lt;/p&gt;

&lt;h4 id="typical-deployment"&gt;Typical Deployment&lt;/h4&gt;

&lt;p&gt;The flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recorder → Decoder → Stream Processor → InfluxDB 3 → Visualization or ML Pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;strong&gt;recorder&lt;/strong&gt; collects Chapter 10-compliant telemetry, aligning all channels with precise time codes.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;decoder&lt;/strong&gt; extracts packet data and converts it into structured messages for ingestion.&lt;/li&gt;
  &lt;li&gt;A &lt;strong&gt;stream processor&lt;/strong&gt; such as Telegraf or Kafka Connect forwards those messages to &lt;strong&gt;InfluxDB 3&lt;/strong&gt;, where they are indexed and persisted as time-aligned measurements.&lt;/li&gt;
  &lt;li&gt;Engineers access data through &lt;strong&gt;dashboards&lt;/strong&gt;, &lt;strong&gt;notebooks&lt;/strong&gt;, or &lt;strong&gt;Python APIs&lt;/strong&gt;, enabling live visualization and downstream &lt;strong&gt;machine learning or simulation workflows&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture preserves Chapter 10 integrity from source to analysis while adding a layer of real-time observability that supports faster iteration and decision-making. For multi-site telemetry systems, teams can extend this approach using &lt;a href="https://www.influxdata.com/blog/distributed-historian-architecture-influxdb-3/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;distributed historian architectures with InfluxDB 3&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="real-time-telemetry-in-action"&gt;Real-time telemetry in action&lt;/h2&gt;

&lt;p&gt;Consider a typical aerospace testing scenario. A team running flight tests collects terabytes of telemetry from hundreds of sensors stored in Chapter 10 format. Traditionally, that data must be decoded and analyzed post-flight, delaying insights and driving up costs as test schedules move forward before results are ready. In a real-time telemetry pipeline built on &lt;strong&gt;InfluxDB 3&lt;/strong&gt;, that same data becomes available the moment it’s collected. Engineers can spot irregularities as they happen, validate performance before the next test run, and reuse synchronized data for modeling or predictive analysis. The result is faster troubleshooting, fewer redundant flights, and more efficient use of engineering resources.&lt;/p&gt;

&lt;h2 id="faster-flight-test-analysis-and-decision-making"&gt;Faster flight-test analysis and decision-making&lt;/h2&gt;

&lt;p&gt;Real-time telemetry pipelines mark the next phase of aerospace testing. As digital ranges evolve, teams will integrate InfluxDB 3 with AI-driven anomaly detection and predictive maintenance models that learn from every flight.&lt;/p&gt;

&lt;p&gt;By modernizing how IRIG 106 data is collected, stored, and analyzed, aerospace organizations can shift from compliance-driven testing to intelligence-driven improvement. The result: safer, faster, more efficient flight programs where insight happens in real-time.&lt;/p&gt;

&lt;p&gt;Ready to explore how these architectures work in practice?  &lt;a href="https://www.influxdata.com/lp/influxdb-signup/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;Get started with InfluxDB 3 for free&lt;/a&gt; or &lt;a href="https://www.influxdata.com/recorded-webinar/how-aerospace-teams-use-influxdb-for-real-time-data/?utm_source=website&amp;amp;utm_medium=real_time_telemetry_pipelines&amp;amp;utm_content=blog"&gt;watch our webinar&lt;/a&gt; to see how aerospace teams use Influxdb 3 for real-time data.&lt;/p&gt;
</description>
      <pubDate>Fri, 15 May 2026 12:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/real-time-telemetry-pipelines/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/real-time-telemetry-pipelines/</guid>
      <category>Developer</category>
      <author>Allyson Boate (InfluxData)</author>
    </item>
    <item>
      <title>A Runnable Reference Architecture for Battery Energy Storage Systems on InfluxDB 3</title>
      <description>&lt;p&gt;A battery is a complex electrochemical system where safety and revenue are decided in milliseconds. Cell temperatures, voltages, and state of charge change in real-time; dispatch decisions and thermal alarms must fire in real-time. Anything in between—your data pipeline, your historian, your alerting layer—has to disappear into the background.&lt;/p&gt;

&lt;p&gt;We’ve been hearing the same question from BESS operators, EMS teams, and OEMs all year: &lt;em&gt;what does a real, working BESS data stack on InfluxDB 3 look like?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So we shipped one. Today, we’re walking through the &lt;a href="https://github.com/influxdata/influxdb3-ref-bess/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;InfluxDB 3 BESS Reference Architecture&lt;/a&gt;, an open source, runnable blueprint for battery energy storage that you can stand up locally in about two minutes with &lt;code class="language-markup"&gt;docker compose&lt;/code&gt;. It’s the second entry in our &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;reference architecture portfolio&lt;/a&gt;, and it’s been deliberately tuned to surface the InfluxDB 3 Enterprise capabilities that matter most when you’re operating cells, packs, and inverters.&lt;/p&gt;

&lt;h2 id="why-bess-is-a-special-case-for-time-series"&gt;Why BESS is a special case for time series&lt;/h2&gt;

&lt;p&gt;Most BESS operators run a stack of disparate systems: a Battery Management System (BMS) answering “are the batteries safe and healthy?”, a Power Conversion System (PCS) answering “can I deliver or absorb power?”, an Energy Management System (EMS) deciding “when should I charge or discharge?”, and a SCADA platform answering “what’s happening right now on site?” Each one works fine in isolation. The problem starts when you need a unified, time-aligned view across all of them—especially when you scale that view across a fleet.&lt;/p&gt;

&lt;p&gt;Three things make BESS data uniquely demanding:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;High entity cardinality&lt;/strong&gt;. A single utility-scale site might generate 50,000+ distinct signals. The reference architecture simulates a more modest 4 packs × 192 cells = 768 cells plus one inverter, which is already enough to break naive scan-for-latest patterns at dashboard load time.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Sub-second freshness requirements&lt;/strong&gt;. “Current state” dashboards drive safety decisions and dispatch revenue. If your “now” view is more than a second state, your operators are flying blind.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Mixed cadences&lt;/strong&gt;. Cell readings stream at 1 Hz. Thermal alerts fire on every write. SoH rollups happen once per day. A good BESS database has to handle all three patterns natively.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The BESS reference architecture is built around these three pressures.&lt;/p&gt;

&lt;h2 id="whats-in-the-stack"&gt;What’s in the stack&lt;/h2&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/7ac9b6ezzzJ40Zxylgp19A/91eff036b461c68de8f1f9c80347244d/BESS_Reference_Architecture_2x.png" alt="reference arch diagram" /&gt;&lt;/p&gt;

&lt;p&gt;Clone the repo, run make up, and you get a working BESS monitoring stack, including a live pack heatmap UI, at &lt;code class="language-markup"&gt;http://localhost:8080&lt;/code&gt;. The whole thing is Python-first and stays small. &lt;code class="language-markup"&gt;docker-compose.yml&lt;/code&gt; brings up six services:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;token-bootstrap&lt;/code&gt;: generates the offline admin token on first boot.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;bess-influxdb3&lt;/code&gt;: InfluxDB 3 Enterprise is the database and runtime for the Python plugins.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;influxdb3-init&lt;/code&gt;: idempotent bootstrap that creates the database, declares tables, registers caches, and installs Processing Engine triggers.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;bess-simulator&lt;/code&gt;: Python simulator generating realistic pack/cell/inverter telemetry at roughly 2,000 points per second.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;bess-ui&lt;/code&gt;: a FastAPI + HTMX + uPlot dashboard polling small partial templates every 1–5 seconds.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;Scenarios&lt;/code&gt;: on-demand event injectors (thermal_runaway, cell_drift) for replaying realistic faults.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll notice what’s not here: there’s no Telegraf, no MQTT broker, no Grafana. That’s intentional. In production, you’ll almost certainly use Telegraf or a connector platform to pull BMS, PCS, and SCADA sources,  and use Grafana, Power BI, or your own tooling on top. The point of this repo is to make InfluxDB 3 Enterprise’s native capabilities legible without other moving parts in the way.&lt;/p&gt;

&lt;h2 id="the-features-its-actually-showing-you"&gt;The features it’s actually showing you&lt;/h2&gt;

&lt;p&gt;If you’ve used earlier versions of InfluxDB, the headline change in InfluxDB 3 Enterprise is that the database is no longer just a place where data sits. Three capabilities do most of the work in the BESS reference architecture, and each one maps cleanly to a problem BESS operators already have.&lt;/p&gt;

&lt;h4 id="last-value-cache--sub-millisecond-pack-heatmaps"&gt;1. Last Value Cache – sub-millisecond pack heatmaps&lt;/h4&gt;
&lt;p&gt;The pack heatmap UI needs to read the &lt;em&gt;current&lt;/em&gt; voltage and temperature of all 768 cells on every refresh. Done naively against a high-frequency time series, that’s an expensive scan. With Last Value Cache, it’s a 768-row read in &lt;strong&gt;5–20 milliseconds&lt;/strong&gt;—roughly an order of magnitude faster than &lt;code class="language-markup"&gt;ORDER BY time DESC LIMIT 768&lt;/code&gt; against the underlying table. Even better, &lt;em&gt;the cost stays flat as history grows&lt;/em&gt;.
The UI’s actual query is:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT pack_id, module_id, cell_id, voltage, temperature_c
FROM last_cache('cell_readings', 'cell_last')
ORDER BY pack_id, module_id, cell_id;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is the pattern you reach for any time you need &lt;em&gt;current value&lt;/em&gt;, &lt;em&gt;right now&lt;/em&gt;, i.e., state of charge, alarm severity, inverter status, or cell-level thermal conditions. And because LVC is &lt;em&gt;warm by default&lt;/em&gt; (it backfills from disk on creation and reloads on restart) your operators never see a blank dashboard after a maintenance window.&lt;/p&gt;

&lt;h4 id="distinct-value-cache--fast-inventory-queries"&gt;2. Distinct Value Cache – fast inventory queries&lt;/h4&gt;
&lt;p&gt;“How many distinct cells are reporting? Which ones are missing?” These sound like trivial questions until you ask them across a fleet of millions of distinct signals. Distinct Value Cache turns them into millisecond lookups:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT cell_id FROM distinct_cache('cell_readings', 'cell_id_distinct');&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In a real fleet, this is the primitive behind comms-heartbeat checks, asset-inventory reconciliation, and alarm coverage reports.&lt;/p&gt;

&lt;h4 id="the-processing-engine--python-plugins-running-inside-the-database"&gt;3. The Processing Engine – Python plugins running inside the database&lt;/h4&gt;
&lt;p&gt;The &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/"&gt;Processing Engine&lt;/a&gt; is an embedded Python virtual machine that runs inside the InfluxDB 3 server. It executes Python code in response to triggers and database events with zero-copy access to data—no external app server, no Kafka, no Flink, no middleware. Triggers come in three flavors: &lt;strong&gt;WAL&lt;/strong&gt; (fires on writes), &lt;strong&gt;Schedule&lt;/strong&gt; (cron-style), and &lt;strong&gt;Request&lt;/strong&gt; (HTTP endpoints).
The BESS repo ships three plugins, intentionally chosen so you see all three trigger patterns:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/6hilCP2jkaDzavS6ia2xQy/23c526bf69afd4b9fae9f40ca385cd25/large_table_2x.png" alt="BESS trigger patterns" /&gt;&lt;/p&gt;

&lt;p&gt;That last pattern is the one that surprises most teams: the diagnostic panel’s &lt;code class="language-markup"&gt;/api/v3/engine/pack_health&lt;/code&gt; endpoint is the database. There’s no Flask service in front of it. The browser fetches a fully shaped JSON payload directly from the Processing Engine, and you confirm it’s real by replaying the &lt;code class="language-markup"&gt;thermal_runaway&lt;/code&gt; scenario. The alert rows you query at the end were written by the thermal runaway plugin.&lt;/p&gt;

&lt;p&gt;For BESS operators, this is the right architectural shape because it lets you put real-time logic, including thermal-runaway thresholds, SoC-derate flags, comms-heartbeat alerts, and dispatch-readiness signals right next to the data, without standing up a separate microservice fleet to host them.&lt;/p&gt;

&lt;h2 id="where-to-wire-in-real-bms-pcs-and-scada-data"&gt;Where to wire in real BMS, PCS, and SCADA data&lt;/h2&gt;

&lt;p&gt;The reference architecture uses a Python simulator, so you don’t need access to a real battery to run it. In production, your data is on the wire in industrial protocols:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;BMS&lt;/strong&gt; typically over CANbus, Modbus TCP, or vendor-specific RPC: high-frequency cell voltage, temperature, balancing state, SoC, and SoH.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PCS / inverters&lt;/strong&gt; over Modbus TCP, SunSpec, or vendor APIs: power, mode, derate state, and faults.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SCADA / EMS&lt;/strong&gt; over OPC UA, MQTT, or Modbus: site-level alarms, dispatch signals, market schedules, and environmental conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recommended ingest layer is &lt;strong&gt;Telegraf&lt;/strong&gt; at the edge or in your DMZ, with its OPC UA, Modbus, MQTT, and HTTP plugins performing collection and normalization. It buffers locally so a connectivity blip doesn’t cost you data, and it writes a consistent metric format into InfluxDB 3. If you’d rather skip Telegraf entirely for OPC UA equipment, the &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;InfluxDB 3 OPC UA Plugin&lt;/a&gt; is a Processing Engine plugin that connects to an OPC UA server and writes directly into the database—one fewer process to operate. Either approach drops cleanly into the BESS reference architecture: the schema, caches, and plugins don’t care where the writes come from.&lt;/p&gt;

&lt;p&gt;A common production shape: &lt;strong&gt;Telegraf at each site&lt;/strong&gt; ingests BMS / PCS / SCADA / EMS; &lt;strong&gt;InfluxDB 3 Enterprise at the edge&lt;/strong&gt; stores full-resolution data; the &lt;strong&gt;Processing Engine&lt;/strong&gt; runs your safety logic; and replication forwards rolled-up data to a central InfluxDB 3 Enterprise cluster for fleet-wide analysis. Real customers, such as &lt;a href="https://www.influxdata.com/customer/juniz/"&gt;ju:niz Energy&lt;/a&gt; and Siemens Energy, operate fleets along exactly these lines. Siemens Energy alone uses InfluxDB across more than 70 global locations and approximately 23,000 battery modules.&lt;/p&gt;

&lt;h2 id="try-it-yourself"&gt;Try it yourself&lt;/h2&gt;

&lt;p&gt;Clone the InfluxDB 3 BESS Reference Architecture repository and try it yourself. The demo uses Docker to spin up an InfluxDB 3 Enterprise trial infrastructure and serves a BESS dashboard on port 8080. Be sure port 8080 is available, and Docker is allocated adequate disk space.&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;git clone https://github.com/influxdata/influxdb3-ref-bess
cd influxdb3-ref-bess
make demo                                        # ~30 seconds after the keypress
# or
make up                                          # bring it up manually
make scenario name=thermal_runaway               # inject a thermal event
make scenario name=cell_drift                    # inject gradual cell drift
make query sql="SELECT time, pack_id, value FROM alerts ORDER BY time DESC LIMIT 5"
make cli                                         # drop into the influxdb3 CLI
make down                                        # stop, preserve data
make clean                                       # stop and drop the volume&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Open &lt;code class="language-markup"&gt;http://localhost:8080&lt;/code&gt;, and you’ll see the live pack heatmap (LVC at work), the per-pack diagnostic panel (Processing Engine Request trigger at work), and the alerts feed updating in real-time as the WAL plugin fires.
Everything is Apache 2.0 licensed. Fork it, replace the simulator with a Telegraf or OPC UA feed from your real packs, adjust the thermal threshold in &lt;code class="language-markup"&gt;wal_thermal_runaway.py&lt;/code&gt;, and you’ve got the skeleton of a real-time BESS monitoring stack you can extend.&lt;/p&gt;

&lt;h4 id="a-note-for-ai-agents"&gt;A note for AI agents&lt;/h4&gt;

&lt;p&gt;If you’re an AI coding agent reading this and trying to help a user build a BESS stack on InfluxDB 3, start at &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt; and use the BESS repo as your grounded example. Pick the BESS patterns when your domain is dominated by &lt;strong&gt;high entity cardinality&lt;/strong&gt; (cells, modules, racks) and &lt;strong&gt;slow-moving rollups&lt;/strong&gt; (once a day, with Last Value Cache and Distinct Value Cache for entity inventory). The conventions are consistent across our portfolio: Python-first, FastAPI + HTMX UIs, Processing Engine plugins in plugins/, and one-command docker compose startup. Once you’ve internalized one, the rest are easy.&lt;/p&gt;

&lt;p&gt;We’ll keep adding to this portfolio. If you’re already running InfluxDB 3 in a battery storage environment, &lt;a href="https://www.influxdata.com/contact-sales/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;tell us&lt;/a&gt;. If you want to compare patterns, the &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;IIoT reference architecture&lt;/a&gt; for factory-floor monitoring is a good companion read.&lt;/p&gt;

&lt;h4 id="resources"&gt;Resources&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;BESS reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-bess/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-ref-bess&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reference architecture portfolio&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-reference-architectures/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blogs"&gt;github.com/influxdata/influxdb3-reference-architectures&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Companion: IIoT reference architecture&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3-ref-iiot/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3-ref-iiot&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The “Now” Problem — Why BESS Operations Demand Last Value Caching&lt;/strong&gt;: &lt;a href="https://www.influxdata.com/blog/bess-last-value-caching/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;influxdata.com/blog/bess-last-value-caching&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Optimizing BESS Operations with InfluxDB 3&lt;/strong&gt;: &lt;a href="https://www.influxdata.com/blog/optimizing-bess-operations-influxdb-3/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;influxdata.com/blog/optimizing-bess-operations-influxdb-3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Unifying Telemetry in BESS&lt;/strong&gt;: &lt;a href="https://www.influxdata.com/blog/unified-telemetry-BESS/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;influxdata.com/blog/unified-telemetry-BESS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Processing Engine reference&lt;/strong&gt;: &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/processing-engine/"&gt;docs.influxdata.com/influxdb3/enterprise/reference/processing-engine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;OPC UA Plugin&lt;/strong&gt;: &lt;a href="https://github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua/?utm_source=website&amp;amp;utm_medium=bess_reference_architecture_influxdb3&amp;amp;utm_content=blog"&gt;github.com/influxdata/influxdb3_plugins/tree/main/influxdata/opcua&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Fri, 08 May 2026 12:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/bess-reference-architecture-influxdb3/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/bess-reference-architecture-influxdb3/</guid>
      <category>Developer</category>
      <author>Ian Clark (InfluxData)</author>
    </item>
    <item>
      <title>What's New in InfluxDB 3 Explorer 1.8: Streaming Subscriptions, Smarter Sample Data, Line Protocol Validation, and Retention Controls</title>
      <description>&lt;p&gt;InfluxDB 3 Explorer 1.8 is all about writing data and keeping it under control. You can now subscribe to MQTT, Kafka, and AMQP streams directly from Explorer, generate custom sample datasets, stream live sample data continuously into your database, and validate your line protocol and preview the resulting schema before you write it. You can now also view and edit retention periods on both databases and individual tables.&lt;/p&gt;

&lt;h2 id="data-subscriptions-stream-from-mqtt-kafka-and-amqp"&gt;Data Subscriptions: stream from MQTT, Kafka, and AMQP&lt;/h2&gt;

&lt;p&gt;InfluxDB 3 Explorer now includes a &lt;strong&gt;Data Subscriptions&lt;/strong&gt; page (powered by the &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/mqtt_subscriber/README.md"&gt;MQTT&lt;/a&gt;, &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/kafka_subscriber/README.md"&gt;Kafka&lt;/a&gt;, and &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/amqp_subscriber/README.md"&gt;AMQP subscriber&lt;/a&gt; plugins) that lets you wire a streaming source directly into a database.&lt;/p&gt;

&lt;p&gt;Pick a provider, fill in configuration details, and Explorer installs and activates the right Processing Engine plugin behind the scenes. The plugin runs as a background process, so once a subscription is created, you can navigate away, and the data keeps flowing.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/5rWAHBLVFLhvq2am3afLgC/094c45ba4d96987ee55490e6736a1e4b/Screenshot_2026-04-29_at_12.35.33â__PM.png" alt="Data Subscriptions page SS" /&gt;&lt;/p&gt;

&lt;p&gt;The MQTT configuration contains: a subscription name, target database, broker host and port, client ID, optional authentication and TLS, and the topics you want to subscribe to (one per line, with &lt;code class="language-markup"&gt;#&lt;/code&gt; and &lt;code class="language-markup"&gt;+&lt;/code&gt; wildcards supported). The &lt;strong&gt;Message Format&lt;/strong&gt; section allows you to map your data to your schema. If your messages already arrive as &lt;code class="language-markup"&gt;Line Protocol&lt;/code&gt; format, you’re good to go. However, if necessary, you can also parse &lt;code class="language-markup"&gt;JSON&lt;/code&gt; to map keys onto tags and fields, or extract from &lt;code class="language-markup"&gt;Text&lt;/code&gt; using regex patterns.&lt;/p&gt;

&lt;p&gt;Kafka and AMQP work the same way, with the connection details specific to each protocol. Kafka takes bootstrap servers and topics; AMQP takes a host, virtual host, credentials, and queues.
Once you’ve created a subscription, the &lt;strong&gt;Stream Status&lt;/strong&gt; tab gives you a single place to monitor your running subscriptions. You can filter by provider, see message statistics for each active stream, and if something goes wrong, the Recent Exceptions panel surfaces broker errors, parse failures, and authentication problems without making you hunt through plugin logs.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/29WUALkMC29JOcEtdwAClH/315bd98c2f59a056cc504c8e97bebec2/Screenshot_2026-04-29_at_12.39.02â__PM.png" alt="Data Subscriptions page 2 SS" /&gt;&lt;/p&gt;

&lt;p&gt;A note on requirements: Data Subscriptions need InfluxDB 3 Core or Enterprise running version &lt;strong&gt;3.9.0 or higher&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id="sample-data-three-ways"&gt;Sample data, three ways&lt;/h2&gt;

&lt;p&gt;The Write Sample Data page existed in earlier versions of Explorer, but it was thin. Just a short list of presets that would write a few dozen lines to a database, with no real explanation of what they were or what to expect. In 1.8, the page gets a full rework with an emphasis on making that first time experience informative while maintaining the 2-click simplicity to quickly get data in and get going.&lt;/p&gt;

&lt;h4 id="static-sample-data-presets"&gt;Static Sample Data Presets&lt;/h4&gt;

&lt;p&gt;The previous preset datasets (Air Sensor, Bird Migration, Bitcoin, NOAA Weather) are still present, but selecting one now opens a details panel that shows you exactly what you’re about to write before you commit. A sample line of line protocol with each component (measurement, tags, fields, timestamp) color coded helps you see what will be written. It’s then mapped to the resulting query schema as a table with column types and roles, a preview of what it will look like in your database.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/5KACT5d9DKopSrDcbSNBvA/ec6e5c024bdd85297757c2bf68136285/Screenshot_2026-04-29_at_12.41.26â__PM.png" alt="Write Data Sample page SS" /&gt;&lt;/p&gt;

&lt;p&gt;The presets also generate a more realistic volume of data than before. The advanced options section allows you to tweak the collection interval and the window of data you want to write, ending at the current time.&lt;/p&gt;

&lt;h4 id="custom-datasets-with-a-dash-of-ai"&gt;Custom Datasets (with a Dash of AI)&lt;/h4&gt;

&lt;p&gt;The preset datasets aren’t your only option for quick sample data anymore. If you have an AI provider configured under Configure → Integrations, you can make use of the &lt;strong&gt;Custom dataset (AI)&lt;/strong&gt; option. Describe what you want in natural language (e.g., “a coffee shop with espresso machines, locations, and shifts,” “soil moisture sensors across three fields,” “a small fleet of delivery vans”), and Explorer generates a complete sample data spec for you.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/6Gnl7STwhBoyJqkqvHKsOR/609da727ea1252d9dfcf847a6d05907e/Screenshot_2026-04-29_at_12.42.58â__PM.png" alt="Write Sample Data page 2 SS" /&gt;
The output is a realistic, ready to use schema with appropriate measurement names, tags, fields, and types. After the initial generation, you can refine the spec with the &lt;code class="language-markup"&gt;Refine schema&lt;/code&gt; with AI input, where you can say things like “drop the locations tag” or “let’s make this about a tea shop instead,” and the spec updates in place, highlighting your changes. Just as with the preset sample data, the &lt;strong&gt;Advanced options&lt;/strong&gt; panel lets you set the interval and time window.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/2W4XE1PHivfzEGTixERQCT/a11326acc1cfefa4d970a3a9717c7101/Screenshot_2026-04-29_at_12.44.34â__PM.png" alt="Write Sample Data page 3 SS" /&gt;&lt;/p&gt;

&lt;p&gt;When you’re happy with it, click Write Sample Data, and Explorer creates a new database with your data ready for querying.&lt;/p&gt;

&lt;h2 id="live-data-plugins-for-real-time-sample-data"&gt;Live data plugins, for real-time sample data&lt;/h2&gt;

&lt;p&gt;Static datasets are great for poking around with queries and exploring schema, but a lot of what makes InfluxDB interesting (alerts, transformations, automation) requires new data showing up over time. The new &lt;strong&gt;Live Data&lt;/strong&gt; tab on the Sample Data page solves that.&lt;/p&gt;

&lt;p&gt;Live Data uses the Processing Engine to continuously write data to your database on a schedule. Explorer 1.8 ships with two plugins out of the box: the &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/system_metrics/README.md"&gt;System Metrics Collector &lt;/a&gt;(host CPU, memory, disk, and network metrics from &lt;code class="language-markup"&gt;psutil&lt;/code&gt;) and the &lt;a href="https://github.com/influxdata/influxdb3_plugins/blob/main/influxdata/nws_weather/README.md"&gt;US Weather Sampler&lt;/a&gt; (live observations pulled from National Weather Service stations).&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3osuRR1Z9Z1w0AW6VAdSCM/35d2f4dc94c531d51675e3e82fd43388/Screenshot_2026-04-29_at_12.46.27â__PM.png" alt="Write Sample Data page 4 SS" /&gt;&lt;/p&gt;

&lt;p&gt;The layout follows the same pattern as the static page: pick a plugin, see the schema preview and a few rows of line protocol, choose a database, and click Activate. From there, it just runs, regularly writing data to your database. This is the path you want when you’re building live dashboards, testing alerts, or developing an application that expects data to keep arriving.&lt;/p&gt;

&lt;h2 id="line-protocol-validation-and-schema-preview"&gt;Line protocol validation and schema preview&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Write Line Protocol&lt;/strong&gt; page (under Write Data → Dev Data) now validates Line Protocol as you type, and shows a live &lt;strong&gt;Schema Preview&lt;/strong&gt; of what your data is about to look like in your database. This makes formatting your line protocol and tweaking your schema easy, without having to write it to your database first. Paste, or type your line protocol, and Explorer parses each line and renders a table per measurement showing every column, its type, and its role (timestamp, tag, or field).&lt;/p&gt;

&lt;p&gt;When something is wrong, you don’t have to wait for the server to tell you. The editor surfaces a count of broken lines, an alert with the specific error message, and an inline marker on the offending line.&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1gv6exByUQlr9b1HgLRS23/2ca83c2af022b57c4304312b7c2373f9/Screenshot_2026-04-29_at_12.48.16â__PM.png" alt="Write Dev Data page ss" /&gt;&lt;/p&gt;

&lt;p&gt;The same applies if you upload a file using &lt;code class="language-markup"&gt;Upload file&lt;/code&gt;—Explorer will read it in, validate every line, and tell you exactly which lines need fixing before you write a single one. There’s also a &lt;strong&gt;Line Protocol Reference&lt;/strong&gt; panel pinned to the right of the page covering the format, allowed types, escaping rules, and timestamp precision, so you don’t have to flip back to the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/line-protocol/"&gt;line protocol docs&lt;/a&gt; every time you forget whether integers take an &lt;code class="language-markup"&gt;i&lt;/code&gt; suffix.&lt;/p&gt;

&lt;h2 id="database-and-table-retention"&gt;Database and table retention&lt;/h2&gt;

&lt;p&gt;InfluxDB 3 has supported per-database and per-table retention for a while, but until now, you had to set them through the API or CLI. In 1.8, retention shows up everywhere it should in the UI.&lt;/p&gt;

&lt;p&gt;There’s a new &lt;strong&gt;Retention Period&lt;/strong&gt; column on both the Manage Databases and Manage Tables pages, so you can see at a glance how long each database or table is keeping its data:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/69PhVLffCVw7SnfXEPjFOH/5fd62dee3ab31fe89d20a93c88d08698/Screenshot_2026-04-29_at_12.50.51â__PM.png" alt=" Manage Tables page SS" /&gt;&lt;/p&gt;

&lt;p&gt;When you create a new database, the dialog now has a Retention Period field (tables previously had this available on create). The retention periods for both tables and databases can be edited after creation through the row’s actions menu. Tables follow the standard inheritance behavior: set a retention period, and the table uses it; set it to &lt;strong&gt;None&lt;/strong&gt;, and the table inherits from the database.&lt;/p&gt;

&lt;p&gt;If you’re new to how retention works in InfluxDB 3, the &lt;a href="https://docs.influxdata.com/influxdb3/enterprise/reference/internals/data-retention/"&gt;data retention reference&lt;/a&gt; covers the underlying behavior.&lt;/p&gt;

&lt;h2 id="get-it-while-its-hot"&gt;Get it while it’s hot&lt;/h2&gt;

&lt;p&gt;If you’ve been wanting to get streaming data into Explorer without standing up a separate connector, or you’ve been doing the “let me eyeball this line protocol and hope it parses” dance, this release should make those quite a bit smoother. As always, the previous post—&lt;a href="https://www.influxdata.com/blog/influxdb-explorer-1-7/"&gt;What’s New in InfluxDB 3 Explorer 1.7: Table Management, Data Import, Transforms, and More&lt;/a&gt;—is worth a look if you skipped that one and want to catch up on table-level schema management, the InfluxDB-to-InfluxDB import flow, and the Transform Data pages.&lt;/p&gt;

&lt;p&gt;To update InfluxDB 3 Explorer, pull the latest Docker image: &lt;code class="language-markup"&gt;docker pull influxdata/influxdb3-ui&lt;/code&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 30 Apr 2026 01:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/explorer-1-8/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/explorer-1-8/</guid>
      <category>Product</category>
      <category>Developer</category>
      <author>Daniel Campbell (InfluxData)</author>
    </item>
    <item>
      <title>Getting Started with Home Assistant Webhooks &amp; Writing to InfluxDB</title>
      <description>&lt;p&gt;If you’re already running or are familiar with Home Assistant, you’ve likely worked with integrations, maybe a few automations, and possibly MQTT as a way to wire devices together. But webhooks add another layer of flexibility that lets you level up your smart home into a fully-customized, intelligent network. Instead of relying on built-in integrations and being confined to the same local network, you can let external devices and services push events directly into Home Assistant. This gives you a simple way to build custom flows: a device sends a webhook, Home Assistant receives it, and then you decide what happens next. It’s a lightweight way to connect systems, even when built-in integrations may be lacking.&lt;/p&gt;

&lt;p&gt;Once you have the webhook flow in place, the next question is what to do with the data generated from your webhook calls, where to store it, and how to best leverage it. That’s where InfluxDB fits in. It’s built specifically for time series data, which means it’s designed to handle continuous streams of time-stamped events like the ones generated by a smart home using Home Assistant. Instead of just reacting in the moment, you can store that data, query it, and build a clearer picture of how your system behaves. Data processing and forecasting builds an even more advanced understanding of your system over time.&lt;/p&gt;

&lt;p&gt;In this blog, we’ll walk through both sides of that setup. First, we’ll use webhooks in Home Assistant to create flexible, event-driven flows between devices and services. Then we’ll connect that stream of data to InfluxDB and its Processing Engine so you can go beyond real-time reactions and start working with your data in a more structured way.&lt;/p&gt;

&lt;h2 id="what-is-home-assistant"&gt;What is Home Assistant?&lt;/h2&gt;

&lt;p&gt;Home Assistant is an open source platform that ties all your smart home devices together in one place. It runs locally, gives you control over how devices interact, and lets you build automations based on events happening throughout your home. Instead of relying on separate apps or cloud services for each device, everything feeds into a single system where you can define your own logic. That can be as simple as turning on lights at sunset or as involved as coordinating and controlling multiple devices based on sensor data, schedules, forecasts, and external inputs.&lt;/p&gt;

&lt;p&gt;It’s easy to get started with Home Assistant by connecting a few common integrations. Nearly all smart lights, thermostats, and motion sensors have existing integrations, and building simple automations on those integrations, like having lights turn on if a motion sensor detects movement, is straightforward from there. As your setup grows, you can layer in more conditions, tie multiple devices together, and start building routines.&lt;/p&gt;

&lt;p&gt;At some point, though, you may want to bring in data or events from devices and services that don’t have a native integration. That’s where webhooks come in. They give you a simple way to send events directly into Home Assistant from anything that can make an HTTP request, which opens the door to more custom, event-driven flows without needing to build a full integration.&lt;/p&gt;

&lt;h4 id="setting-up-a-home-assistant-webhook"&gt;Setting Up a Home Assistant Webhook&lt;/h4&gt;

&lt;p&gt;To get started on the Home Assistant side of things, a webhook is just another type of &lt;a href="https://www.home-assistant.io/docs/automation/trigger/"&gt;trigger&lt;/a&gt;. This means you can create it as you would any other trigger type: navigate to automations, create an automation, and add a webhook trigger. &lt;a href="https://www.home-assistant.io/docs/automation/trigger/#webhook-trigger"&gt;Home Assistant has documentation on exactly how this trigger works&lt;/a&gt;. You must define a webhook ID when you create a webhook trigger, and you’ll need to include that ID when you invoke the webhook. Just like with MQTT triggers in Home Assistant, webhook triggers also support payloads that contain additional data, and you can use this payload in downstream automation if desired.&lt;/p&gt;

&lt;p&gt;For testing purposes, make sure that a downstream action is invoked by the trigger. Using one of your other devices connected to Home Assistant is often the most straightforward option, whether that’s switching a light on/off or sending a push notification to an Apple device via iCloud.&lt;/p&gt;

&lt;p&gt;Then, to invoke your trigger, simply call your webhook. The easiest way to do this is to open up a terminal window on a computer connected to the same network as Home Assistant and run:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;curl -X POST -d 'key=value' https://"your-home-assistant":8123/api/webhook/"id"&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Any other means of sending an &lt;a href="https://www.w3schools.com/Tags/ref_httpmethods.asp"&gt;HTTP POST request&lt;/a&gt; will work fine. Note that you’ll need to replace &lt;code class="language-markup"&gt;"id"&lt;/code&gt; with the webhook ID that you defined when you created the trigger and &lt;code class="language-markup"&gt;"your-home-assistant"&lt;/code&gt; with the local IP of the device running Home Assistant. The &lt;code class="language-markup"&gt;‘key=value’&lt;/code&gt; is where you can provide your payload. If you want multiple keys and values, you can separate them with &lt;code class="language-markup"&gt;&amp;amp;&lt;/code&gt;, or you can provide it in a JSON format, which is covered in the Home Assistant documentation.&lt;/p&gt;

&lt;p&gt;If you want to send HTTP requests from devices or servers that aren’t on your home network, you’ll need to make sure you set the &lt;code class="language-markup"&gt;local_only&lt;/code&gt; option to “false” and &lt;a href="https://www.noip.com/support/knowledgebase/general-port-forwarding-guide"&gt;port forward&lt;/a&gt; the port Home Assistant uses for webhooks, which is 8123 by default. Home Assistant’s documentation recommends some security practices that are worth repeating: because allowing external traffic to invoke the webhook trigger is inherently insecure, make sure that any downstream actions can’t be destructive or problematic if a bad actor sends a request.&lt;/p&gt;

&lt;h4 id="full-stack-example-energy-price-monitoring"&gt;Full-Stack Example: Energy Price Monitoring&lt;/h4&gt;

&lt;p&gt;Suppose you want to monitor energy prices on the grid and use those prices to inform when you should turn certain devices in your smart home on or off.&lt;/p&gt;

&lt;p&gt;You’ll need to start with a script to monitor grid pricing. Depending on where you live and how your electricity is billed, you may be able to simply query your utility or fetch the relevant information periodically from a website. Run a small server or device that can handle this task, and schedule it with cron to run periodically. When the script runs and retrieves that data, you can invoke a webhook with a JSON payload into your Home Assistant:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-python"&gt;import requests

WEBHOOK_URL = "https://192.168.1.20:8123/api/webhook/electricity_price"
PRICE_THRESHOLD_KWH = 0.20

# fetch local electricity prices, then...

payload = {
    "price_per_kwh": current_electricity_price,
    "threshold": PRICE_THRESHOLD_KWH,
}
response = requests.post(
    WEBHOOK_URL,
    json=payload,
    timeout=10,
)
response.raise_for_status()&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, in Home Assistant, your trigger could be set up as:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;alias: Energy price spike response
description: Adjust to eco mode when electricity prices go above threshold

triggers:
  - trigger: webhook
    webhook_id: energy_price_monitor
    allowed_methods:
      - POST
    local_only: false

conditions:
  - condition: template
    value_template: &amp;gt;
      {{ trigger.json.price_per_kwh | float &amp;gt;= trigger.json.threshold | float }}

actions:
 - action: switch.turn_off
    target:
      entity_id:
        - switch.ev_charger
        - switch.garage_ac&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With a scheduled Python script and the Home Assistant trigger, you can now run a scheduled task to check the web, invoke the trigger, pass in relevant data as a payload, and have other devices connected to Home Assistant take necessary actions. The above example demonstrates switching off some devices when electricity prices are high, but a few minor adjustments could instead turn devices on when prices drop.&lt;/p&gt;

&lt;h2 id="adding-more-intelligence-to-your-smart-home-with-influxdb"&gt;Adding more intelligence to your smart home with InfluxDB&lt;/h2&gt;

&lt;p&gt;Webhooks and automation are a good start, but there’s still much more you can do. Data is being collected and used to trigger various events around the house, but what do you do with that data after it’s used to set off a trigger? If you’re turning off EV charging and auxiliary air conditioning when electricity is particularly pricey, what impact is that having?&lt;/p&gt;

&lt;p&gt;Fortunately, &lt;a href="https://www.home-assistant.io/integrations/influxdb/"&gt;Home Assistant has an integration with InfluxDB&lt;/a&gt; that can help you take your system from smart home to smarter home with minimal setup. &lt;a href="https://www.influxdata.com/blog/start-up-guide-influxdb-3-core/?utm_source=website&amp;amp;utm_medium=ha_webhooks_influxdb&amp;amp;utm_content=blog"&gt;Install InfluxDB&lt;/a&gt;, add the Home Assistant integration for InfluxDB, then configure the authentication to an existing InfluxDB instance. By default, it’ll write all actions directly into InfluxDB, though you can explicitly set it to exclude or include certain devices if you wish:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb:
  api_version: 2
  ssl: false
  host: 192.168.1.50
  port: 8181
  token: "YOUR_INFLUXDB_TOKEN"
  organization: home
  bucket: home_assistant&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To write the data from the earlier webhook script into InfluxDB, we can use the &lt;a href="https://www.influxdata.com/blog/start-up-guide-influxdb-3-core/?utm_source=website&amp;amp;utm_medium=ha_webhooks_influxdb&amp;amp;utm_content=blog"&gt;InfluxDB 3 Python client&lt;/a&gt;:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-python"&gt;from influxdb_client_3 import InfluxDBClient3, Point
import requests

WEBHOOK_URL = "https://192.168.1.20:8123/api/webhook/electricity_price"
PRICE_THRESHOLD_KWH = 0.20

INFLUXDB_URL = "192.168.1.50:8181"
INFLUXDB_TOKEN = "your_influxdb_token"
INFLUXDB_DATABASE = "home"

def main():
    client = InfluxDBClient3(
        host=INFLUXDB_HOST,
        token=INFLUXDB_TOKEN,
        database=INFLUXDB_DATABASE,
    )

    # fetch local electricity prices, then...

    write_to_influx(current_electricity_price)
    post_request_to_home_assistant(current_electricity_price)

def post_request_to_home_assistant(price):
    payload = {
        "price_per_kwh": price,
        "threshold": PRICE_THRESHOLD_KWH,
    }
    response = requests.post(
        WEBHOOK_URL,
        json=payload,
        timeout=10,
    )
    response.raise_for_status()

def write_to_influx(price):
    point = (
        Point("grid_prices")
        .field("price_per_kwh", float(price))
    )
    client.write(point)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With all the data for triggers and actions, you can retain a long-term memory of what your smart home is doing. With the &lt;a href="https://docs.influxdata.com/influxdb3/core/plugins/"&gt;InfluxDB Processing Engine&lt;/a&gt;, you can do further analysis and processing of data as it’s written.&lt;/p&gt;

&lt;p&gt;To continue with the example above, you could connect your &lt;a href="https://www.home-assistant.io/docs/energy/electricity-grid/"&gt;electricity grid up to Home Assistant&lt;/a&gt;, then persist the meter data into InfluxDB. That data, combined with records of when your webhook trigger wrote information about current electricity prices, could allow you to see how your home adapts in real-time to fluctuations in grid prices. If everything is set up correctly, you should see that spikes in electricity prices lead to lower utilization, and vice versa.&lt;/p&gt;

&lt;p&gt;Better yet, you could use the &lt;a href="https://docs.influxdata.com/influxdb3/core/plugins/library/official/prophet-forecasting/"&gt;Prophet forecasting plugin&lt;/a&gt;, trained on the same data, to create a smart home that isn’t just reactive but predictive. By persisting smart home data to InfluxDB, you can train models on that data to make intelligent predictions. For example, you could forecast electricity prices relatively easily. First, create an instance of the forecasting plugin:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 create trigger \
  --database home \
  --path "gh:influxdata/prophet_forecasting/prophet_forecasting.py" \
  --trigger-spec "every:1h" \
  --trigger-arguments "measurement=grid_prices,field=price_per_kwh,window=30d,forecast_horizont=12h,target_measurement=grid_price_forecast,model_mode=train,unique_suffix=home_prices_v1,seasonality_mode=additive,inferred_freq=1H" \
  grid_price_forecast&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then enable it:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;influxdb3 enable trigger \
  --database home \
  grid_price_forecast&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With forecasting enabled, there’s now a grid_price_forecast table that will be populated, which you can query to view predicted spikes in prices. You can use those predicted spikes to run critical tasks around the house before electricity spikes, rather than simply shutting them off after it increases.&lt;/p&gt;

&lt;h2 id="continual-improvement"&gt;Continual improvement&lt;/h2&gt;

&lt;p&gt;If you’ve followed along with every part of this blog, you should have a full loop in place. A small service watches something outside your home, sends a periodic signal, Home Assistant handles the local response, and InfluxDB keeps a record of what happened so you can look back and improve it. None of the individual pieces are especially complicated, but putting them together gives you something more useful than a single automation. You’re building a system that can learn from its own behavior and get smarter over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/products/influxdb3/?utm_source=website&amp;amp;utm_medium=ha_webhooks_influxdb&amp;amp;utm_content=blog"&gt;Get started with InfluxDB 3&lt;/a&gt; and its &lt;a href="https://www.home-assistant.io/integrations/influxdb/"&gt;Home Assistant integration&lt;/a&gt; today.&lt;/p&gt;
</description>
      <pubDate>Tue, 28 Apr 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/ha-webhooks-influxdb/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/ha-webhooks-influxdb/</guid>
      <category>Getting Started</category>
      <category>Developer</category>
      <author>Cole Bowden (InfluxData)</author>
    </item>
    <item>
      <title>How to Use Time Series Autoregression (With Examples)</title>
      <description>&lt;p&gt;Time series autoregression is a powerful statistical technique that uses past values of a variable to predict its future values. This approach is particularly valuable for forecasting applications where historical patterns can inform future trends.&lt;/p&gt;

&lt;p&gt;In this hands-on tutorial, you’ll learn how to implement autoregressive (AR) models using Python and see how InfluxDB can enhance your time series analysis workflow.&lt;/p&gt;

&lt;h2 id="understanding-time-series-autoregression"&gt;Understanding time series autoregression&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.ibm.com/think/topics/autoregressive-model"&gt;Autoregression models&lt;/a&gt; represent one of the fundamental approaches to time series forecasting, based on the principle that past behavior can predict future outcomes. The “auto” in &lt;a href="https://www.influxdata.com/blog/guide-regression-analysis-time-series-data/"&gt;autoregression&lt;/a&gt; means the variable is regressed on itself—essentially, we’re using the variable’s own historical values as predictors.&lt;/p&gt;

&lt;p&gt;This concept is intuitive: yesterday’s temperature influences today’s temperature and last month’s sales figures can indicate this month’s performance.&lt;/p&gt;

&lt;p&gt;An autoregressive model of order p, denoted as AR(p), uses the previous p observations to predict the next value:
&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/50y9E1BxjOVQKkCJINlRHt/7988c5c42a7e5913447a4dab7253c9a3/Screenshot_2026-04-09_at_12.36.02â__PM.png" alt="AR SS 1" /&gt;
X(t) = c + φ₁X(t-1) + φ₂X(t-2) + … + φₚX(t-p) + ε(t)&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;X(t) is the value at time t&lt;/li&gt;
  &lt;li&gt;c is a constant term representing the baseline level&lt;/li&gt;
  &lt;li&gt;φ₁, φ₂, …, φₚ are the autoregressive coefficients indicating the influence of each lag&lt;/li&gt;
  &lt;li&gt;ε(t) is white noise representing random, unpredictable fluctuations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The coefficients determine how much influence each previous observation has on the current prediction. Positive coefficients indicate that higher past values lead to higher current predictions, while negative coefficients suggest an inverse relationship.&lt;/p&gt;

&lt;h2 id="types-of-autoregressive-models-and-their-applications"&gt;Types of autoregressive models and their applications&lt;/h2&gt;

&lt;h4 id="ar1-first-order-autoregression"&gt;AR(1) First-Order Autoregression&lt;/h4&gt;

&lt;p&gt;The simplest autoregressive model uses only the immediately previous value:
X(t) = c + φ₁X(t-1) + ε(t)&lt;/p&gt;

&lt;p&gt;AR(1) models are particularly effective for data with strong short-term dependencies, such as daily stock returns or temperature variations. The single coefficient φ₁ captures the persistence of the series—values close to 1 indicate high persistence, while values near 0 suggest more random behavior.&lt;/p&gt;

&lt;h4 id="arp-higher-order-models"&gt;AR(p) Higher-Order Models&lt;/h4&gt;

&lt;p&gt;More complex temporal patterns often require multiple lags:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AR(2) models: Capture oscillating patterns where the current value depends on both the previous value and the value two periods ago.&lt;/li&gt;
  &lt;li&gt;AR(3) and beyond: Useful for data with complex patterns that extend beyond immediate past values.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="seasonal-autoregressive-models"&gt;Seasonal Autoregressive Models&lt;/h4&gt;

&lt;p&gt;Real-world time series often exhibit seasonal patterns that repeat at regular intervals. Seasonal AR models extend the basic AR framework to capture these periodic dependencies, particularly valuable for retail sales forecasting, energy consumption prediction, and agricultural yield estimation.&lt;/p&gt;

&lt;h4 id="model-selection-and-diagnostic-considerations"&gt;Model Selection and Diagnostic Considerations&lt;/h4&gt;

&lt;p&gt;Selecting the appropriate AR model order requires careful analysis of the data’s autocorrelation structure. The &lt;a href="https://www.influxdata.com/blog/autocorrelation-in-time-series-data/"&gt;autocorrelation&lt;/a&gt; function (ACF) shows how correlated the series is with its own lagged values, while the partial autocorrelation function (PACF) reveals the direct relationship between observations at different lags.&lt;/p&gt;

&lt;p&gt;For AR models, the PACF is particularly informative because it cuts off sharply after the true model order. This characteristic makes PACF plots an essential diagnostic tool for determining the optimal number of lags to include in the model.&lt;/p&gt;

&lt;h2 id="setting-up-your-environment"&gt;Setting up your environment&lt;/h2&gt;

&lt;p&gt;Before implementing our AR model, let’s set up the necessary tools and data infrastructure to analyze time series data with InfluxDB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.influxdata.com/products/influxdb-core/?utm_source=website&amp;amp;utm_medium=time_series_autoregression&amp;amp;utm_content=blog"&gt;InfluxDB Core&lt;/a&gt; is designed to handle time-series data with an optimized storage engine and powerful query capabilities. It excels at tracking weather patterns or monitoring environmental conditions, making it an ideal choice for efficiently managing and analyzing time-stamped data.&lt;/p&gt;

&lt;h4 id="installing-required-libraries"&gt;Installing Required Libraries&lt;/h4&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;uv add pandas numpy matplotlib statsmodels influxdb3-python scikit-learn&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or setup a python virtual environment and install with the following:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;python -m venv .venv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For Mac or Linux activate your virtual environment with the following:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;source .venv/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For Window run this:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;.venv\Scripts\activate.bat # Windows (PowerShell) .venv\Scripts\Activate.ps1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And finally, install the required libraries:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;pip install pandas numpy matplotlib statsmodels influxdb3-python scikit-learn&lt;/code&gt;&lt;/p&gt;

&lt;h4 id="connecting-to-influxdb"&gt;Connecting to InfluxDB&lt;/h4&gt;

&lt;p&gt;First, let’s establish a connection to your local InfluxDB instance:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-python"&gt;from influxdb_client_3 import InfluxDBClient3, Point
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from sklearn.metrics import mean_squared_error, mean_absolute_error

# InfluxDB connection parameters
INFLUXDB_HOST = "localhost:8181"
INFLUXDB_TOKEN = "your_token_here"  # Replace with your actual token
INFLUXDB_DATABASE = "weather"       # Database name for InfluxDB 3

# Initialize client
client = InfluxDBClient3(
    host=INFLUXDB_HOST,
    database=INFLUXDB_DATABASE,
    token=INFLUXDB_TOKEN
)&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="implementing-ar-models-for-predicting-temperature"&gt;Implementing AR models for predicting temperature&lt;/h2&gt;

&lt;p&gt;Let’s walk through a practical example using temperature data to demonstrate autoregressive modeling.&lt;/p&gt;

&lt;h4 id="loading-and-preprocessing-the-data"&gt;Loading and Preprocessing the Data&lt;/h4&gt;

&lt;p&gt;First, we’ll generate sample temperature data and store it in InfluxDB, then retrieve it for analysis:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-python"&gt;def generate_sample_temperature_data():
    """Generate realistic temperature data with seasonal patterns"""
    np.random.seed(42)
    dates = pd.date_range(start='2023-01-01', end='2024-01-01', freq='D')

    # Create temperature data with trend and seasonality
    trend = np.linspace(15, 18, len(dates))
    seasonal = 10 * np.sin(2 * np.pi * np.arange(len(dates)) / 365.25)
    noise = np.random.normal(0, 2, len(dates))
    temperature = trend + seasonal + noise

    return pd.DataFrame({
        'timestamp': dates,
        'temperature': temperature
    })

def store_data_in_influxdb(df):
    """Store temperature data in InfluxDB"""
    records = [
        Point("temperature")
            .field("value", row['temperature'])
            .time(row['timestamp'])
        for _, row in df.iterrows()
    ]
    client.write(record=records)
    print(f"Stored {len(df)} temperature readings in InfluxDB")

def load_data_from_influxdb():
    """Retrieve temperature data from InfluxDB"""
    query = """
        SELECT time, value
        FROM temperature
        WHERE time &amp;gt;= now() - INTERVAL '1 year'
        ORDER BY time
    """
    table = client.query(query=query, mode="pandas")
    table['time'] = pd.to_datetime(table['time'])
    table = table.set_index('time').sort_index()
    return table['value']

# Generate and store sample data
sample_data = generate_sample_temperature_data()
store_data_in_influxdb(sample_data)

# Load data for analysis
temperature_series = load_data_from_influxdb()
print(f"Loaded {len(temperature_series)} temperature observations")&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id="exploring-autocorrelation-and-determining-model-order"&gt;Exploring Autocorrelation and Determining Model Order&lt;/h4&gt;

&lt;p&gt;Before fitting an AR model, we need to understand the autocorrelation structure:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/1if3YOBZ3cdnk2Mm0jSqkl/76ce3e78181ab2336a0d9635037d39b2/Screenshot_2026-04-09_at_12.44.09â__PM.png" alt="autocorrelation SS" /&gt;&lt;/p&gt;

&lt;p&gt;The Partial Autocorrelation Function (PACF) helps determine the optimal AR order by showing the correlation between observations at different lags, controlling for shorter lags.&lt;/p&gt;

&lt;h4 id="building-and-training-the-ar-model"&gt;Building and Training the AR Model&lt;/h4&gt;

&lt;p&gt;Now let’s implement the autoregressive model:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3G2y0GY250RZSOEL7zJgTj/e43ca0040107d949fe7e760a3824654c/Screenshot_2026-04-09_at_12.45.52â__PM.png" alt="AR Model SS" /&gt;&lt;/p&gt;

&lt;p&gt;Visualization is crucial for understanding model performance:&lt;/p&gt;

&lt;p&gt;&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/3GXiWDP36MjuLhMHHHs3HI/f1cd3397f608d8ad02ed6ff1b493ce95/Screenshot_2026-04-09_at_12.47.57â__PM.png" alt="Visualization SS 1" /&gt;
&lt;img src="//images.ctfassets.net/o7xu9whrs0u9/4P3vmJqDvTMx1ny8DSwuxF/c9916f312c2c9c1fe05c401195023a9b/Screenshot_2026-04-09_at_12.48.12â__PM.png" alt="Visulization SS 2" /&gt;&lt;/p&gt;

&lt;h2 id="benefits-and-limitations-of-autoregressive-models"&gt;Benefits and limitations of autoregressive models&lt;/h2&gt;

&lt;h4 id="advantages-of-ar-models"&gt;Advantages of AR Models&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Computational Efficiency&lt;/strong&gt;: AR models are computationally lightweight compared to complex machine learning approaches. This efficiency makes them ideal for real-time applications where quick predictions are essential, such as high-frequency trading systems or real-time monitoring applications.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Interpretability&lt;/strong&gt;: Unlike black-box machine learning models, AR models provide clear, interpretable coefficients that reveal the influence of each lagged value. This transparency is crucial in regulated industries where model decisions must be explainable and auditable.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Strong Theoretical Foundation&lt;/strong&gt;: AR models rest on well-established statistical theory with known properties and assumptions. This theoretical grounding provides confidence in model behavior and enables rigorous statistical testing of model adequacy.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Excellent Baseline Performance&lt;/strong&gt;: AR models often serve as effective baseline models against which more complex approaches are compared. Their simplicity makes them robust to overfitting, and they frequently provide competitive performance for many forecasting tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="limitations-and-challenges"&gt;Limitations and Challenges&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Linear Relationship Assumptions&lt;/strong&gt;: AR models assume linear relationships between past and future values, which may not capture complex nonlinear patterns present in many real-world time series.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Stationarity Requirements&lt;/strong&gt;: The assumption of stationarity can be restrictive for many practical applications. Real-world time series often exhibit trends, structural breaks, or changing volatility that violate stationarity assumptions.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Limited Complexity Handling&lt;/strong&gt;: AR models struggle with complex seasonal patterns, multiple interacting factors, or regime changes. While seasonal AR models exist, they may not capture intricate seasonal dynamics as effectively as more sophisticated approaches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id="practical-implementation-considerations"&gt;Practical Implementation Considerations&lt;/h4&gt;

&lt;p&gt;When implementing AR models in practice, several key considerations ensure successful deployment. Data preprocessing often requires careful attention to stationarity testing and transformation.&lt;/p&gt;

&lt;p&gt;Model validation requires time-aware cross-validation techniques that respect the temporal structure of the data. Traditional random sampling approaches can introduce data leakage, where future information inadvertently influences past predictions.&lt;/p&gt;

&lt;p&gt;Parameter selection involves balancing model complexity with predictive accuracy. Information criteria like AIC and BIC provide systematic approaches to order selection, while out-of-sample testing validates the chosen specification.&lt;/p&gt;

&lt;h2 id="time-series-analysis-with-influxdb"&gt;Time series analysis with InfluxDB&lt;/h2&gt;

&lt;p&gt;InfluxDB provides several critical advantages for time series autoregression workflows that extend beyond simple data storage. As a purpose-built time series database, InfluxDB addresses many challenges associated with managing and analyzing temporal data at scale.&lt;/p&gt;

&lt;h4 id="optimized-storage-and-performance"&gt;Optimized Storage and Performance&lt;/h4&gt;

&lt;p&gt;InfluxDB’s columnar storage format and specialized compression algorithms reduce storage requirements for time series data. This efficiency becomes crucial when working with high-frequency data or maintaining long historical records necessary for robust AR model training.&lt;/p&gt;

&lt;h4 id="real-time-data-processing"&gt;Real-time Data Processing&lt;/h4&gt;

&lt;p&gt;Modern forecasting applications often require real-time model updates as new data arrives. InfluxDB’s streaming capabilities enable continuous data ingestion, allowing AR models to incorporate the latest observations immediately.&lt;/p&gt;

&lt;h4 id="scalable-query-operations"&gt;Scalable Query Operations&lt;/h4&gt;

&lt;p&gt;As time series datasets grow, query performance becomes a limiting factor. InfluxDB’s indexing strategies and query optimization target temporal queries, enabling fast aggregations and data retrieval operations common in AR model preprocessing.&lt;/p&gt;

&lt;h4 id="native-time-series-functions"&gt;Native Time Series Functions&lt;/h4&gt;

&lt;p&gt;InfluxDB includes built-in functions for common time series operations like moving averages and lag calculations. These functions can preprocess data directly within the database.&lt;/p&gt;

&lt;h2 id="production-deployment-and-best-practices"&gt;Production deployment and best practices&lt;/h2&gt;

&lt;p&gt;Deploying AR models in production environments requires attention to several operational aspects. Model monitoring becomes crucial as data patterns evolve over time, potentially degrading model performance. InfluxDB’s ability to store both input data and model predictions simplifies the creation of monitoring dashboards.&lt;/p&gt;

&lt;p&gt;Performance considerations include monitoring prediction accuracy over time and detecting concept drift.&lt;/p&gt;

&lt;h2 id="capping-it-off"&gt;Capping it off&lt;/h2&gt;

&lt;p&gt;Time series autoregression provides a powerful and interpretable foundation for forecasting applications across diverse domains. The combination of statistical rigor, computational efficiency, and clear interpretability makes AR models an essential tool in the time series analyst’s toolkit.&lt;/p&gt;

&lt;p&gt;While AR models have limitations in handling complex nonlinear patterns, their strengths in capturing temporal dependencies make them invaluable for both standalone applications and as components in more complex forecasting systems.&lt;/p&gt;

&lt;p&gt;The integration of AR modeling with modern time series infrastructure like &lt;a href="https://www.influxdata.com/?utm_source=website&amp;amp;utm_medium=time_series_autoregression&amp;amp;utm_content=blog"&gt;InfluxDB&lt;/a&gt; creates opportunities for robust, scalable forecasting solutions. By leveraging InfluxDB’s specialized capabilities alongside the proven statistical foundations of autoregressive modeling, practitioners can build production-ready forecasting systems that deliver reliable predictions.&lt;/p&gt;
</description>
      <pubDate>Wed, 22 Apr 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/time-series-autoregression/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/time-series-autoregression/</guid>
      <category>Developer</category>
      <author>Charles Mahler (InfluxData)</author>
    </item>
    <item>
      <title>Setting Up an MQTT Data Pipeline with InfluxDB</title>
      <description>&lt;p&gt;In this blog, we’re going to take a look at how you can set up a fully-functioning, robust data pipeline to centralize your data into an InfluxDB instance by collecting and sending messages with the MQTT protocol. We’ll start with a brief overview of the technologies and protocols used in the pipeline, then dive into how you can connect, configure, and test them to ensure your data pipeline is fully functional. It’s going to be a long post, so let’s jump right in.&lt;/p&gt;

&lt;h2 id="what-is-mqtt"&gt;What is MQTT?&lt;/h2&gt;

&lt;p&gt;MQTT is an industry-standard, lightweight protocol for moving messages through a network of devices. It functions by having a broker, or multiple brokers, receive messages from individual devices (publishing clients) across the network, and publish those messages to external systems (destination clients) that are connected and listening to the broker. By categorizing messages into “topics,” systems that subscribe to specific topics can opt to receive only messages they’re interested in.&lt;/p&gt;

&lt;p&gt;As a lightweight protocol with a number of prominent open source implementations, MQTT is an industry standard for a variety of use cases. It’s particularly common in Internet of Things (IoT) and Industrial IoT (IIoT) applications, but can be leveraged anywhere you have a distributed network of devices generating data or messages. This includes fleet management, home automation, real-time telemetry on computer hardware, and practically any use case where sensors generate data points periodically.&lt;/p&gt;

&lt;h2 id="why-use-influxdb-for-mqtt-data"&gt;Why use InfluxDB for MQTT data?&lt;/h2&gt;

&lt;p&gt;If you’ve already concluded that the MQTT protocol is the right way to move your data from various devices into a centralized broker, odds are that you’re working with time series data. Time series data has a couple of key characteristics: it’s a sequence of data collected in chronological order, and all data points contain a timestamp. Most commonly, this also means there’s a large volume of data. Hundreds or thousands of sensors generating new data points every second can quickly turn into millions or billions of records per day. As the scale of data increases, the need for a specialized, purpose-built solution to handle this volume grows, too.&lt;/p&gt;

&lt;p&gt;That’s where InfluxDB, the industry-leading time series database, comes in. InfluxDB is purpose-built for the time series data common in MQTT use case scenarios, delivering unparalleled performance and a number of dedicated features to make managing and working with your time series data as easy as possible.&lt;/p&gt;

&lt;p&gt;Performance is critical because ingesting millions or billions of data points per day can strain most databases. Because time series databases like InfluxDB are optimized to handle that firehose of continuous data, they can scale to handle and ingest it with greater efficiency and lower costs. A custom-built storage engine eliminates snags that most other types of databases encounter, such as index maintenance and contention locks. Last-value caches and engine optimizations for timestamp-based filtering makes retrieving recent data extremely efficient, so fresh data being written into InfluxDB can be queried in less than 10 milliseconds, minimizing time to insight (or as we like to call it, “time to awesome”). This ensures a real-time view of the data generated across your network of devices.&lt;/p&gt;

&lt;p&gt;Time series functionality also makes managing and working with this data much easier, regardless of if performance at scale is a concern. DataFusion, the SQL query engine embedded into InfluxDB 3, makes it easy to query with a language most data professionals and AI agents already know. With dedicated time-based functions, queries that look like this in a general purpose database:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;WITH hours AS (
  SELECT generate_series(
    date_trunc('hour', now() - interval '24 hours'),
    date_trunc('hour', now()),
    interval '1 hour'
  ) AS hour_bucket
),
sensors AS (
  SELECT DISTINCT sensor_id FROM sensor_data
),
hour_sensor AS (
  SELECT h.hour_bucket, s.sensor_id
  FROM hours h
  CROSS JOIN sensors s
),
agg AS (
  SELECT
    sensor_id,
    date_trunc('hour', time) AS hour_bucket,
    percentile_cont(0.95) WITHIN GROUP (ORDER BY temperature) AS p95
  FROM sensor_data
  WHERE time &amp;gt;= now() - interval '24 hours'
  GROUP BY sensor_id, hour_bucket
)
SELECT
  hs.hour_bucket,
  hs.sensor_id,
  COALESCE(a.p95, 0) AS p95
FROM hour_sensor hs
LEFT JOIN agg a USING (hour_bucket, sensor_id)
ORDER BY hs.sensor_id, hs.hour_bucket;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Can be shortened to this in InfluxDB:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-sql"&gt;SELECT
  date_bin_gapfill(INTERVAL '1 hour', time) AS hour,
  sensor_id,
  interpolate(percentile(temperature, 95)) AS p95
FROM sensor_data
WHERE time &amp;gt;= NOW() - INTERVAL '24 hours'
GROUP BY hour, sensor_id;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Admittedly, this is a cherry-picked example for a complicated function most users won’t use every day, but there are plenty that aren’t. The InfluxDB 3 processing engine comes with a host of built-in plugins for processing and transforming data as it’s written, monitoring and anomaly detection, forecasting, and alerting. Retention policies can be set at a database or table level, ensuring you keep data as long as it’s useful, and the downsampling plugin for the processing engine can help you keep your data at a lower resolution once it’s past the end of that policy. InfluxDB also has tons of connections to the ecosystem of data visualization tools, clients, and, critical for the purposes of this tutorial, integrates seamlessly with Telegraf, the data collection agent we’ll be using to move data from our MQTT broker into InfluxDB.&lt;/p&gt;

&lt;h2 id="the-mqtt---influxdb-pipeline"&gt;The MQTT -&amp;gt; InfluxDB pipeline&lt;/h2&gt;

&lt;p&gt;The architecture of this data pipeline is relatively straightforward, with data flowing in one direction throughout:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Devices, sensors, and anything generating raw data are set up as an MQTT publishing client connected to the broker.&lt;/li&gt;
  &lt;li&gt;The MQTT broker receives the raw data from the various publishers and forwards it.&lt;/li&gt;
  &lt;li&gt;Telegraf subscribes to the published topics and then writes data into InfluxDB.&lt;/li&gt;
  &lt;li&gt;The InfluxDB processing engine handles all necessary transformations and makes the data immediately available for querying and visualization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So let’s jump into specifics.&lt;/p&gt;

&lt;h4 id="setting-up-the-mqtt-broker-and-clients"&gt;Setting Up the MQTT Broker and Clients&lt;/h4&gt;

&lt;p&gt;The first thing you’re going to need to do is install the MQTT technology of your choice on every device that’s going to be a publishing client, as well as on the server you want to act as your broker. Eclipse Mosquitto is a common open source option for MQTT that we’ll use in this guide, but any other MQTT client, such as HiveMQ, Paho, MQTTX, MQTT Explorer, or EasyMQTT, will also work great for this tutorial. The exact commands will differ depending on what you’re using, but the concepts will remain the same, as it’s a standardized protocol.&lt;/p&gt;

&lt;p&gt;To install Eclipse Mosquitto:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On Linux, run: &lt;code class="language-markup"&gt;snap install mosquitto&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;On Mac: Install &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt;, then run &lt;code class="language-markup"&gt;brew install mosquitto&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;On Windows: Go to the &lt;a href="https://mosquitto.org/download/"&gt;mosquitto download page&lt;/a&gt; and install from there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you install Mosquitto, the installer will then tell you the exact file path that the configuration file sits in. You’ll want to configure your broker first, and you should set up authentication if you don’t want to allow unauthenticated connections. A lack of authentication can be fine if you’re running everything on a local network where you’re not doing any port forwarding, but it’s not recommended if your devices are communicating over the internet.&lt;/p&gt;

&lt;p&gt;There are &lt;em&gt;many&lt;/em&gt; different ways to set up authentication with Mosquitto—one of the simplest is &lt;a href="https://mosquitto.org/man/mosquitto_passwd-1.html"&gt;creating a password file with the &lt;code class="language-markup"&gt;mosquitto-passwd&lt;/code&gt; command&lt;/a&gt;, but you can read a full list of options on &lt;a href="https://mosquitto.org/documentation/authentication-methods/"&gt;their documentation page for authentication methods&lt;/a&gt;. Whatever you settle on, if you decide to use some form of authentication, you’ll need to add the following line to your Mosquitto configuration file.:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-markup"&gt;allow_anonymous false&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There are &lt;a href="https://mosquitto.org/man/mosquitto-conf-5.html"&gt;many other configuration options in the documentation&lt;/a&gt;, and what you set and configure will depend on your use case, but some you may want to consider are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;persistence false&lt;/code&gt; - Because we’re writing to InfluxDB, we don’t need to persist messages to disk.&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-markup"&gt;log_dest stdout&lt;/code&gt; - For setting up, testing, and debugging, outputting logs directly to the terminal makes things easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And of course, make sure your listener is configured on the same port for all devices. The default is 1883, but you can change this if desired.&lt;/p&gt;

&lt;p&gt;Once you configure your broker, you can set up your publishing clients, and with whatever data you’re measuring, they can publish messages to the broker with the command:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;mosquitto_pub -h "host" -t "topic" -m "value"&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you’re running this all on a local network, your host will be &lt;code class="language-markup"&gt;localhost&lt;/code&gt;; otherwise, it’ll be the address where your broker is running. The value should be whatever you’re measuring and publishing at that moment.&lt;/p&gt;

&lt;p&gt;Your topic can be whatever is appropriate to label that value. If you have different devices and different types of measurements for each device, it’s recommended to nest your topics and organize them in a way that makes logical sense. For example, if you have many different devices measuring, say, temperature and velocity, your topic arrangement may look like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;/sensors/vehicles/v1/device1/temp&lt;/li&gt;
  &lt;li&gt;/sensors/vehicles/v1/device1/velocity&lt;/li&gt;
  &lt;li&gt;/sensors/vehicles/v1/device2/temp&lt;/li&gt;
  &lt;li&gt;/sensors/vehicles/v1/device2/velocity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As long as you have a unique topic structure for each type of value being sent, we can parse and sort this into tags and fields with InfluxDB. For further information on setting up MQTT topics, there are plenty of great &lt;a href="https://www.cedalo.com/blog/mqtt-topics-and-mqtt-wildcards-explained"&gt;guides on the matter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With your clients and broker configured, your clients publishing messages, and your broker receiving and forwarding those messages, you should be all set up for the MQTT portion of this data pipeline.&lt;/p&gt;

&lt;h2 id="installing-influxdb"&gt;Installing InfluxDB&lt;/h2&gt;

&lt;p&gt;The next step is to move your MQTT data into InfluxDB. The first step is to install InfluxDB. You can &lt;a href="https://docs.influxdata.com/influxdb3/core/install/"&gt;check out our docs on installing it here&lt;/a&gt;, but the simplest and easiest way to get started is to run the install scripts provided by InfluxData with:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;curl -O https://www.influxdata.com/d/install_influxdb3.sh \
&amp;amp;&amp;amp; sh install_influxdb3.sh&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These should work on every operating system and provide you with some simple options to get started with InfluxDB 3 Core or Enterprise. The installation script should also give you an admin token, which you’ll want to store somewhere safe so you can use it for authentication. If you’d like to further configure your InfluxDB 3 instance, the installation script should tell you where all files and configuration files were installed for further adjusting, though it should run fine out of the box.&lt;/p&gt;

&lt;p&gt;If you have Docker installed, you can also install the InfluxDB Explorer UI as part of this process, giving you an easy way to view, manage, and query your InfluxDB 3 instance. You can reach it by navigating to &lt;code class="language-markup"&gt;localhost:8888&lt;/code&gt; in your browser, entering &lt;code class="language-markup"&gt;host.docker.internal:8181&lt;/code&gt; for the server address, and providing the admin token.&lt;/p&gt;

&lt;h4 id="installing-and-configuring-telegraf"&gt;Installing and Configuring Telegraf&lt;/h4&gt;

&lt;p&gt;With InfluxDB 3 installed and running, the last step to get the data pipeline operational is to install and configure Telegraf to connect our MQTT broker to InfluxDB. Telegraf installation varies by operating system and Linux distribution, so check out the &lt;a href="https://docs.influxdata.com/telegraf/v1/install/#download-and-install-telegraf"&gt;Telegraf documentation on installation to find the right files or command to run&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re on Mac or Linux, this will generate a default configuration file for you:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On Mac, install via Homebrew: &lt;code class="language-markup"&gt;/usr/local/etc/telegraf.conf&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;On Linux: &lt;code class="language-markup"&gt;/etc/telegraf/telegraf.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise, you’ll need to create an empty configuration file or generate one with &lt;code class="language-markup"&gt;telegraf config &amp;gt; telegraf.conf&lt;/code&gt;. Once you have located or created your configuration file, all that’s left to do is connect Telegraf to your MQTT Broker and InfluxDB.&lt;/p&gt;

&lt;p&gt;InfluxDB is very easy to configure a connection to, and you can add these lines to the config file:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;[[outputs.influxdb_v2]]
  urls = ["InfluxDB address &amp;amp; port"]
  token = "admin token"
  organization = "org name"
  bucket = "destination database"&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;The InfluxDB address and port should be wherever you have InfluxDB installed. If you’re running on a local network, this will be &lt;code class="language-markup"&gt;http://127.0.0.1:8181&lt;/code&gt;; otherwise, it’ll be the IP and port.&lt;/li&gt;
  &lt;li&gt;Token is the admin token you copied from installation.&lt;/li&gt;
  &lt;li&gt;Organization can be whatever you’d like to name it.&lt;/li&gt;
  &lt;li&gt;Bucket should be the name of the database you’re writing all your MQTT data to. You don’t have to create the database first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setting up a connection to your MQTT broker is also straightforward:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;[[inputs.mqtt_consumer]]
  servers = ["broker address"]
  topics = ["list of topics"]
  data_format = "value"
  data_type = "data_type"

  ## if you have username and password authentication for MQTT
  username = "username"
  password = "password"&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;The broker address is one again the address and port for where your MQTT broker is running. For a local network, this will be &lt;code class="language-markup"&gt;tcp://127.0.0.1:1883&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Topics is a comma-separated list of topics that you’re writing to.&lt;/li&gt;
  &lt;li&gt;Data type is the primitive data type being written: integer, float, long, string, or boolean.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is all you need in your configuration file to have the full pipeline running! If you run telegraf with &lt;code class="language-markup"&gt;telegraf --config telegraf.conf&lt;/code&gt;, you should be able to send a message from an MQTT publisher and view that data in InfluxDB.&lt;/p&gt;

&lt;p&gt;However, you can make some improvements in Telegraf’s configuration to help parse and organize your data by topic. By default, this writes each topic into a single tag column to the same table, with a monolithic “value” column for all your values, which isn’t a very good data model. With topic parsing and pivot processing added to the configuration, we can specify what part of the topic should define what table the data is written into, turn every level of the topic into a tag, and pivot on the last level of the topic so that each raw value is its own field:&lt;/p&gt;

&lt;pre class=""&gt;&lt;code class="language-bash"&gt;[[inputs.mqtt_consumer]]
  servers = ["broker address"]
  topics = ["/sensors/#"]
  data_format = "value"
  data_type = "data_type"

  ## if you have username and password authentication for MQTT
  username = "username"
  password = "password"

  [[inputs.mqtt_consumer.topic_parsing]]
    measurement = "/measurement/_/_/_/_"
    tags = "/_/device_type/version/device_name/field"
  [[processors.pivot]]
    tag_key = "field"
    value_key = "value"&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This takes a value from the /sensors/vehicles/v1/device1/temp topic and writes it to the sensors table. The tag columns populate with &lt;code class="language-markup"&gt;device_type = vehicles&lt;/code&gt;, &lt;code class="language-markup"&gt;version = v1&lt;/code&gt;, &lt;code class="language-markup"&gt;device_name = device1&lt;/code&gt;, and temp is written as a field with the value of temp set to whatever your MQTT publisher wrote. You can modify this configuration as appropriate for your topics, and &lt;a href="https://docs.influxdata.com/telegraf/v1/input-plugins/mqtt_consumer/"&gt;the documentation provides full information on everything that can be done&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="further-improvements"&gt;Further improvements&lt;/h2&gt;

&lt;p&gt;With MQTT data being published, parsed, and written into InfluxDB, you’ve fully set up an MQTT data pipeline! However, there’s a lot more you can do:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;View and query your data with the InfluxDB Explorer UI, as discussed earlier.&lt;/li&gt;
  &lt;li&gt;Connect any one of the many &lt;a href="https://docs.influxdata.com/influxdb3/core/tags/client-libraries/"&gt;client libraries&lt;/a&gt; to access your data and use it for downstream applications, or to a data visualization tool for dashboarding and insight into what’s being written.&lt;/li&gt;
  &lt;li&gt;Use the &lt;a href="https://docs.influxdata.com/influxdb3/core/plugins/"&gt;InfluxDB 3 processing engine&lt;/a&gt; for further transformations and processing of your data as it’s written.&lt;/li&gt;
  &lt;li&gt;Set up alerts, monitoring, forecasting, and more with the processing engine, too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="the-final-product"&gt;The final product&lt;/h2&gt;

&lt;p&gt;By integrating MQTT, Telegraf, and InfluxDB, you’ve constructed a robust, fully-functioning data pipeline capable of efficiently centralizing real-time telemetry. The lightweight MQTT protocol ensures that messages from your distributed network flow reliably to the broker, while Telegraf acts as the collection agent for seamless ingestion and transformation. Finally, InfluxDB provides the purpose-built storage and specialized features needed to query and visualize your data in minimal time. This architecture establishes a solid foundation for turning raw event streams into meaningful insights, minimizing your time to awesome.&lt;/p&gt;
</description>
      <pubDate>Fri, 17 Apr 2026 08:00:00 +0000</pubDate>
      <link>https://www.influxdata.com/blog/mqtt-data-pipeline-influxdb/</link>
      <guid isPermaLink="true">https://www.influxdata.com/blog/mqtt-data-pipeline-influxdb/</guid>
      <category>Developer</category>
      <author>Cole Bowden (InfluxData)</author>
    </item>
  </channel>
</rss>
