{"results":[{"id":"d2e50a29-ddb4-414a-b9e5-bad6b37fe092","title":"Secure UNS Access Control for Factory MQTT","short_description":"Coreflux LoT template for factory MQTT access control and probes.","content":"## How it works\n\nThis Coreflux LoT notebook implements a small factory Unified Namespace (UNS) security design. A reusable Model builds clean readings from `raw/factory/...` telemetry, an Action publishes a probe guide, and Rules enforce role-based access for `dashboard`, `device_x`, `engineer`, and `root`.\n\n## Key features\n\n- **Reusable model:** Defines `FactoryDeviceReading` for clean factory telemetry.\n- **Wildcard raw-to-clean Action:** Converts `raw/factory/+/+/temperature` into `factory/<line>/<device>/reading`.\n- **Security probe guide:** Retained topics summarize expected allow/deny behavior.\n- **Role-based Rules:** Separates raw publish, clean-tree publish, `$SYS`, and user management access.\n\n## What this template does\n\n- Maps raw temperature topics into structured clean readings.\n- Uses topic positions and retained engineering-unit metadata.\n- Publishes a retained probe tree for quick client testing.\n- Applies deny-by-default Rules with explicit role exceptions.\n\n## Prerequisites\n\n- Coreflux HUB access as `root`.\n- MQTT broker access for creating users and deploying Rules.\n- Role users: `dashboard`, `device_x`, `engineer`, and `root`.\n- Anonymous login should be disabled for production.\n\n## Setup\n\n1. Create the role users in Coreflux HUB.\n2. Deploy the Model and Actions.\n3. Deploy the Rules after confirming broker defaults.\n\n## Who is this for?\n\nFactory and OT teams who need a clear MQTT security pattern for a small UNS. It is useful for testing read/write separation, raw-device isolation, and clean-tree protection in Coreflux LoT.","difficulty":"advanced","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8","status":"published","is_visible":true,"is_featured":true,"view_count":117,"download_count":0,"published_at":"2026-08-28T16:47:04.444+00:00","created_at":"2026-08-28T16:44:05.373288+00:00","updated_at":"2026-08-28T16:47:03.585291+00:00","slug":"secure-uns-access-control-for-factory-mqtt","broker_version_id":"db7c468f-1f4e-4ba5-ab82-2fac63ecf379","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"db7c468f-1f4e-4ba5-ab82-2fac63ecf379","name":"2.14.3","slug":"2-14-3","sort_order":0},"author":{"id":"27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8/fb513a70-b437-4732-9758-34a2494e41ad.jpg","display_name":"Gonçalo Silva","profile_slug":"27cf729ce6e44c81abcfcdd4e15a1fa8"},"tags":[{"id":"0083942f-aea5-4ca1-b853-31087cbc62bd","name":"rules","slug":"rules"},{"id":"08b8d7ee-bb55-48a1-808a-44ed9e87a8e6","name":"RBAC","slug":"rbac"},{"id":"1fdbbf03-3676-4914-8756-ff7ef4fc7476","name":"factory","slug":"factory"},{"id":"490e8d98-ca25-467d-bc61-52a3dfb6c3a8","name":"security","slug":"security"},{"id":"797899fc-ba1f-47bc-8085-9ff3891884bb","name":"retained","slug":"retained"},{"id":"ccc96708-0cca-4164-8663-42b2b20ed35c","name":"telemetry","slug":"telemetry"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"df08f548-60b4-4c82-8b58-b2edaadaa03e","name":"uns","slug":"uns"}],"routes":[]},{"id":"1fa92194-49ad-4393-ae69-6c925c5b6c84","title":"How to bridge Coreflux MQTT to Kafka","short_description":"Bridge MQTT telemetry and commands to Apache Kafka for plant data pipelines.","content":"## **What this template does**\n\nBridges the Coreflux MQTT broker and an Apache Kafka cluster in both directions from a single route. Telemetry published on `plant/sensors/+/reading` is produced to the Kafka topic `plant.sensors.raw` keyed by device id, so every reading from one machine stays on one partition and keeps its order, while records arriving on `plant.commands` are consumed back onto MQTT `plant/commands/in` for the field. Credentials never appear in the LoT: the bootstrap address and consumer group are read from runtime ENV values and the SASL password from the secret store, with a PLAINTEXT profile for local clusters and a SASL_SSL profile for Confluent Cloud, Amazon MSK and Aiven. A two machine simulator publishes readings on a five second timer, so the whole path can be exercised with no hardware and no real Kafka producer.\n\n## **When to use it**\n\nUse it when MQTT edge telemetry has to reach a Kafka based analytics or data pipeline while commands, setpoints and alarms travel back to the field, and when the project needs the durable, replayable stream Kafka gives rather than the fire and forget delivery of MQTT alone.","difficulty":"intermediate","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":true,"view_count":216,"download_count":1,"published_at":"2026-07-29T16:20:32.458+00:00","created_at":"2026-07-29T16:16:06.193751+00:00","updated_at":"2026-07-29T16:20:31.752978+00:00","slug":"coreflux-mqtt-to-kafka-bridge","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"094275a0-dd85-4aa1-9165-607ca7a23fab","name":"Apache Kafka","slug":"apache-kafka"},{"id":"4d7e94f5-2cc5-43bf-89b2-5462dc4218b7","name":"Kafka","slug":"kafka"},{"id":"92b6a63d-ce15-464f-a75b-bee54ec2dda8","name":"AWS MSK","slug":"aws-msk"},{"id":"aed19d72-ddd6-464a-aa52-c375daaedcf7","name":"Confluent Cloud","slug":"confluent-cloud"},{"id":"c0b4777a-f141-4b25-b635-b187b475e5c5","name":"SASL_SSL","slug":"saslssl"},{"id":"ccc96708-0cca-4164-8663-42b2b20ed35c","name":"telemetry","slug":"telemetry"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f9f25c91-0edf-46de-a01c-bc31ae116193","name":"Redpanda","slug":"redpanda"}],"routes":[{"id":"c490ad65-9152-4478-9b3d-f046b845aaf7","type":"KAFKA","category":"Data Pipeline","icon_path":"59d61b95-7f5c-4e2f-a11b-56b60e744b90.png","display_name":"Kafka"}]},{"id":"e736971d-5f63-4c50-bdc1-903759f876b0","title":"Modbus RTU Energy Meter Monitoring","short_description":"Connect to a Modbus RTU Capable energy meter and alert on active power.","content":"## How it works\nThis Coreflux LoT template reads an industrial energy meter over a Modbus Serial Route, scales the registers into engineering values, and publishes them to MQTT topics. A separate LoT Action watches active power events and publishes an alarm when the configured threshold is exceeded.\n\n## Key features\n- **Modbus RTU polling:** Reads holding registers from a serial energy meter.\n- **MQTT publishing:** Maps voltage, current, power, frequency, PF, and energy counters to topics.\n- **Threshold alarm:** Raises an alert when active power goes above 3000 W.\n- **Wildcard monitoring:** Uses `energy/+/+/active_power` for multi-meter fleets.\n\n## What this template does\n- Polls `MeterReading` every 1 second.\n- Decodes and scales Modbus values into V, A, W, VA, var, Hz, PF, and kWh.\n- Publishes meter data under `energy/meter/01/...` topics.\n- Publishes `alerts/active_power` status per meter and zone.\n\n## Prerequisites\n- A Modbus RTU energy meter with documented register map.\n- Serial access to the RS485 device path.\n- Correct slave ID, baud rate, parity, data bits, and stop bits.\n\n## Setup\n1. Set the serial port and slave ID for your meter.\n2. Update register addresses, scaling, and data types to match the device manual.\n3. Confirm the MQTT topic structure for each meter.\n4. Adjust the active power threshold if needed.\n\n## Use case\nIdeal for energy monitoring in industrial sites, utility cabinets, and multi-meter deployments that need live meter telemetry plus automatic threshold alarms.","difficulty":"intermediate","category_id":"9b6b6273-bc3c-440f-b1a0-b948752bfd93","author_id":"b266f416-0a6b-42ea-927d-24d25bb1b301","status":"published","is_visible":true,"is_featured":false,"view_count":89,"download_count":0,"published_at":"2026-09-10T10:49:37.777+00:00","created_at":"2026-09-09T11:57:47.789768+00:00","updated_at":"2026-09-09T11:59:59.38328+00:00","slug":"modbus-rtu-energy-meter-monitoring","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"9b6b6273-bc3c-440f-b1a0-b948752bfd93","name":"Energy & Utilities","slug":"energy--utilities"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"b266f416-0a6b-42ea-927d-24d25bb1b301","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/b266f416-0a6b-42ea-927d-24d25bb1b301/9054147a-ab0f-4723-b238-efd235f10b71.jpeg","display_name":"Melvin","profile_slug":"melvin"},"tags":[{"id":"077bac4d-ef9e-453e-8864-f62baf6d69ea","name":"alarms","slug":"alarms"},{"id":"18c48f44-b5bb-470c-a4ac-407571861d5d","name":"Serial","slug":"serial"},{"id":"45f048e2-129f-43b1-9319-d11a701bf9e4","name":"Energy monitoring","slug":"energy-monitoring"},{"id":"90d627dc-7b9c-4c50-acc6-77866e399806","name":"modbus","slug":"modbus"},{"id":"d14578ba-991b-4155-bf10-4cf40d10dd32","name":"RS485","slug":"rs485"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"ec78fb08-f861-4d3e-be30-89f68ae002b3","type":"MODBUS_SERIAL","category":"Industrial","icon_path":"ec78fb08-f861-4d3e-be30-89f68ae002b3.webp","display_name":"Modbus Serial"}]},{"id":"2202d47e-bc90-4474-9e27-ae35f6545822","title":"Helsinki Tram Live Feed Geofence","short_description":"Stream tram positions from HSL MQTT into Coreflux and fire downtown enter/leave geofence events.","content":"## How it works\n\nThis Coreflux LoT notebook bridges HSL’s public MQTT feed for Helsinki trams into local topics, then validates, digests, and geofences each vehicle position. It turns a live transport stream into per-tram state plus one-off downtown enter/leave events.\n\n## Key features\n\n- **MQTT bridge:** Subscribes to `mqtt.hsl.fi` and lands tram messages under `demo/trams/feed/raw/#`.\n- **Payload gate:** Checks `VP.lat` before parsing and routes bad messages to `feed/fetch_error`.\n- **Per-vehicle digest:** Writes line, latitude, longitude, speed, speed_kmh, and heading under `demo/trams/vehicle/<veh>/`.\n- **Collapsed position model:** Publishes `TramPosition` as a single position document for map consumers.\n- **Downtown geofence:** Detects rectangular enter/leave transitions for each tram.\n\n## What this template does\n\n- Consumes the HFP v2 tram subset from HSL over MQTT.\n- Normalizes valid vehicle positions into stable vehicle topics.\n- Keeps geofence memory per vehicle with `KEEP` state.\n- Emits edge-triggered events only when a tram crosses the downtown box.\n\n## Prerequisites\n\n- Internet access to `mqtt.hsl.fi:1883`\n- Coreflux LoT support for `MQTT_BRIDGE`, actions, models, routes\n- No account required for the public broker\n\n## Setup\n\n1. Deploy `HelsinkiTramBridge` to pull `/hfp/v2/journey/ongoing/vp/tram/#` into `demo/trams/feed/raw/#`.\n2. Deploy `TramFeedGate` to filter malformed payloads.\n3. Deploy `TramDigest` to fan out vehicle topics and publish `TramPosition`.\n4. Deploy `TramGeofenceWatch` to emit `enter` and `leave` events.\n\n## Who is this for?\n\nTransit, GIS, and IoT teams that need a live Helsinki tram demo, MQTT bridge example, or a ready-made geofence pattern in Coreflux LoT.\n\n## How to customize\n\n- Change the source topic filter to widen the feed beyond trams.\n- Adjust the downtown latitude and longitude bounds for another zone.\n- Reuse the vehicle subtree pattern for additional vehicle telemetry.\n\n&nbsp;","difficulty":"intermediate","category_id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","author_id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","status":"published","is_visible":true,"is_featured":false,"view_count":100,"download_count":0,"published_at":"2026-08-11T18:42:09.663+00:00","created_at":"2026-08-11T18:31:07.936658+00:00","updated_at":"2026-08-11T18:31:33.828045+00:00","slug":"helsinki-tram-live-feed-geofence","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","name":"Smart Cities","slug":"smart-cities"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2/32fd8311-1ffc-4b91-9457-8f850f7a32ed.jpg","display_name":"Dylan DuFresne","profile_slug":"dylan-dufresne"},"tags":[{"id":"07558bf0-66d5-40c9-a30f-1e4e98911590","name":"live data","slug":"live-data"},{"id":"177ba4bc-3d4b-461c-b8dd-3e04f1a35b6b","name":"HSL","slug":"hsl"},{"id":"5887f4b0-de15-4653-add1-fa27eae79ccb","name":"transit","slug":"transit"},{"id":"9e87c034-8564-41b2-93de-a1087983d59d","name":"MQTT bridge","slug":"mqtt-bridge"},{"id":"a33b7e16-c9df-4c35-8f6e-2268e5f67759","name":"GIS","slug":"gis"},{"id":"ac854ea7-5302-4fc9-bb6c-1a5faca8eec1","name":"geofence","slug":"geofence"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"177d41b6-4860-4b00-bd53-1b0b63f19781","type":"MQTT_BRIDGE","category":"Data Pipeline","icon_path":"177d41b6-4860-4b00-bd53-1b0b63f19781.png","display_name":"MQTT Bridge"}]},{"id":"73ea5fef-f8a0-4512-9531-9bf6f2c38843","title":"REST API to PostgreSQL Task Board","short_description":"Coreflux LoT tutorial app for CRUD tasks, MQTT events, and PostgreSQL KPIs.","content":"## How it works\nThis LoT Notebook turns a task tracker into a broker-first flow on Coreflux LoT. A REST_API route accepts create, complete, remove, and refresh requests, while a POSTGRESQL route writes and reads task data and publishes results to MQTT topics.\n\n## Key features\n- **HTTP ingress:** `/tasks` and mutation endpoints accept REST requests in server mode.\n- **PostgreSQL persistence:** inserts, updates, deletes, and SELECT views run through a database route.\n- **MQTT egress:** task lists, due-today views, KPIs, and domain events land on `demo/tasks/#` topics.\n- **Daily reporting:** weekday triggers compose into a midnight report on `demo/tasks/reports/daily`.\n- **Topic-backed metrics:** created, completed, removed, and error counters are kept on domain topics.\n\n## Prerequisites\n- PostgreSQL reachable from the broker\n- `TASKS_DB_HOST`, `TASKS_DB_NAME`, `TASKS_DB_USER`\n- `TASKS_DB_PASSWORD` stored as a secret\n- A free server port for the REST_API route\n\n## Setup\n1. Create the `tasks` table shown in the notebook.\n2. Set the broker environment variables and secret.\n3. Deploy the `TaskBoardAPI` and `TaskBoardDB` routes, then the models and actions.\n4. Watch `demo/tasks/#` to verify CRUD results, events, metrics, and daily rollups.\n\n## What this template does\n- Publishes `TaskCreated`, `TaskCompleted`, and `TaskRemoved` models as domain events.\n- Republishes `intake/refresh` after each mutation so SELECT views update without polling.\n- Uses `PUBLISH` plus `KEEP` for state topics so both live subscribers and later `GET TOPIC` reads work.\n- Mirrors PostgreSQL status errors into `demo/tasks/metrics/errors_total`.\n\n## Who is this for?\nTeams building an internal task tracker, a CRUD demo, or a Coreflux LoT reference app for REST-to-MQTT data flow with PostgreSQL-backed reporting.","difficulty":"intermediate","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","status":"published","is_visible":true,"is_featured":false,"view_count":159,"download_count":0,"published_at":"2026-08-12T13:15:37.94+00:00","created_at":"2026-08-11T18:42:54.91828+00:00","updated_at":"2026-08-13T15:21:56.502516+00:00","slug":"rest-api-to-postgresql-task-board","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2/32fd8311-1ffc-4b91-9457-8f850f7a32ed.jpg","display_name":"Dylan DuFresne","profile_slug":"dylan-dufresne"},"tags":[{"id":"3089e499-23cc-4a09-8e3f-e2c38b129497","name":"topics","slug":"topics"},{"id":"3be6d89d-82eb-45ac-8c66-eda89ba6918d","name":"rest-api","slug":"rest-api"},{"id":"44813810-41e2-440a-a477-4ea86a127ac1","name":"metrics","slug":"metrics"},{"id":"5bfc34e4-8bdb-4291-9056-d371861b0198","name":"CRUD","slug":"crud"},{"id":"d72621cb-eff9-439a-9fa3-3ba4b853d441","name":"Database","slug":"database"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"e0901467-0c8c-424d-9340-9553518caf0b","name":"scheduled report","slug":"scheduled-report"},{"id":"f6c3c2a2-25ff-494a-9b56-12b95fa01631","name":"postgresql","slug":"postgresql"}],"routes":[{"id":"3fb2e0db-878f-45b8-99d4-bfb066077854","type":"POSTGRESQL","category":"Data Storage","icon_path":"3fb2e0db-878f-45b8-99d4-bfb066077854.svg","display_name":"PostgreSQL"},{"id":"e51b46bf-ebde-4f62-ba30-e561b37eed33","type":"REST_API","category":"REST API","icon_path":"e51b46bf-ebde-4f62-ba30-e561b37eed33.svg","display_name":"REST API"}]},{"id":"0e72e1d3-c71b-49d8-9322-d40c104f5e6a","title":"Edge to Cloud Broker Bridge","short_description":"Federate an edge Coreflux broker to a cloud broker with an MQTT Bridge Route.","content":"This template shows you how to connect an edge broker to a cloud broker, so data from local devices can flow securely up to the cloud. It comes with three ready-to-use notebooks: one sets up the core solution (turning raw machine data into clean, organized topics, adding a high-temperature alert, and bridging everything to the cloud with proper access rules), one lets you simulate machine data for testing without any real hardware, and one provides a secure, TLS-encrypted version for production use.\n\nIt's built to be safe and easy to follow, with a clear step-by-step order so nothing breaks or gets misconfigured along the way. You can test the whole setup risk-free using the simulator, then switch to the production version when you're ready to go live with real devices and a real cloud connection. It's a great fit for anyone managing multi-site IoT setups who wants a secure, well-organized way to link edge and cloud systems.","difficulty":"intermediate","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8","status":"published","is_visible":true,"is_featured":false,"view_count":252,"download_count":0,"published_at":"2026-07-29T13:53:39.842+00:00","created_at":"2026-07-29T13:53:13.135538+00:00","updated_at":"2026-08-14T09:23:57.212539+00:00","slug":"edge-to-cloud-broker-bridge","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/27cf729c-e6e4-4c81-abcf-cdd4e15a1fa8/fb513a70-b437-4732-9758-34a2494e41ad.jpg","display_name":"Gonçalo Silva","profile_slug":"27cf729ce6e44c81abcfcdd4e15a1fa8"},"tags":[{"id":"416c8216-2d24-4716-a2d4-fae6179af499","name":"cloud","slug":"cloud"},{"id":"7f4e66d9-c31e-4764-b3ea-4cda37b2e29f","name":"bridge","slug":"bridge"},{"id":"d77e98e6-2fab-4e37-829f-9bb79c3893cc","name":"edge","slug":"edge"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"177d41b6-4860-4b00-bd53-1b0b63f19781","type":"MQTT_BRIDGE","category":"Data Pipeline","icon_path":"177d41b6-4860-4b00-bd53-1b0b63f19781.png","display_name":"MQTT Bridge"}]},{"id":"55570283-1bd0-451d-a838-bfcaa015681e","title":"How to connect to Siemens S7 PLC","short_description":"Poll Siemens S7 PLC tags and publish them to MQTT topics, with an optional value simulator.","content":"## What this template does\n\nEnables MQTT integration for Siemens S7 PLCs using the native S7 protocol. By periodically polling selected DB, marker, or I/O addresses, it extracts equipment data and publishes each value to a dedicated MQTT topic. It operates flexibly, handling multiple data types (like `REAL`, `INT`, and `BOOL`), and includes a built-in simulation mode for hardware-free testing.\n\n## **When to use it**\n\nIdeal for setups requiring direct, automated data extraction from Siemens PLCs to feed dashboards, logic rules, or downstream actions within an MQTT-based ecosystem.","difficulty":"intermediate","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":375,"download_count":1,"published_at":"2026-05-16T19:44:18.676+00:00","created_at":"2026-05-16T19:43:58.065564+00:00","updated_at":"2026-05-21T21:42:22.353102+00:00","slug":"siemens-s7-plc-to-mqtt-template","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"2e33c5a1-fe0d-4840-9a16-645b3e63450c","name":"tags","slug":"tags"},{"id":"302f809b-e64b-4139-a7a9-c4a476a768c7","name":"siemens-s7","slug":"siemens-s7"},{"id":"4851c3ef-4668-412a-ad23-ae79be99dba9","name":"polling","slug":"polling"},{"id":"84c0f563-b75e-417b-a3e4-f8f4d4260b17","name":"dashboard","slug":"dashboard"},{"id":"a0750586-469e-492b-a762-764aea3d15d6","name":"PLC","slug":"plc"},{"id":"b2fa0172-677b-4aa4-b2e6-eb675efb7d84","name":"ISO-on-TCP","slug":"iso-on-tcp"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f170a03a-dbe3-4c66-93e5-0766bf9b448c","name":"simulation","slug":"simulation"}],"routes":[{"id":"785ac3c7-55de-4ef6-ba88-04665f66562d","type":"SIEMENS_S7","category":"Industrial","icon_path":"785ac3c7-55de-4ef6-ba88-04665f66562d.svg","display_name":"Siemens S7"}]},{"id":"72c36026-c941-4e73-a635-ba746b5a5b5e","title":"How to connect Modbus TCP","short_description":"Poll Modbus TCP registers and publish tag values to MQTT topics for apps and dashboards.","content":"## **What this template does**\n\nEnables MQTT integration for Modbus TCP devices. By periodically polling selected registers, it extracts equipment data and publishes each mapped value to a dedicated MQTT topic. It operates flexibly, handling multiple data types (like `FLOAT`, `UINT16`), adjusting for custom endianness, and includes a built-in simulation mode for hardware-free testing.\n\n## **When to use it**\n\nIdeal for setups requiring reliable, automated data extraction from PLCs, RTUs, drives, or sensors, translating industrial Modbus data into an MQTT ecosystem.","difficulty":"intermediate","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":402,"download_count":1,"published_at":"2026-05-16T19:44:58.687+00:00","created_at":"2026-05-16T19:44:37.462359+00:00","updated_at":"2026-05-21T21:39:55.207943+00:00","slug":"modbus-tcp-device-polling-template","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"00d1a016-71e9-428d-a835-c3f35f884d63","name":"Modbus TCP","slug":"modbus-tcp"},{"id":"4851c3ef-4668-412a-ad23-ae79be99dba9","name":"polling","slug":"polling"},{"id":"8aea2b85-76eb-45e4-806f-733d65e36b47","name":"industrial","slug":"industrial"},{"id":"a0750586-469e-492b-a762-764aea3d15d6","name":"PLC","slug":"plc"},{"id":"a15e60aa-a198-4148-b878-3cfb92ab57ac","name":"register mapping","slug":"register-mapping"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f170a03a-dbe3-4c66-93e5-0766bf9b448c","name":"simulation","slug":"simulation"}],"routes":[{"id":"0c2413e6-5db8-4aff-8678-bff862b2e86e","type":"MODBUS_TCP","category":"Industrial","icon_path":"0c2413e6-5db8-4aff-8678-bff862b2e86e.webp","display_name":"Modbus TCP"}]},{"id":"9519423b-0065-4c86-8dcd-475c5af00736","title":"How to connect to OPC UA","short_description":"Poll OPC UA nodes and publish tag values to MQTT topics.","content":"## What this template does\n\nThis template connects to OPC UA server and polls selected node IDs on a fixed interval. Each tag value is published to its own MQTT topic, making it easy to feed dashboards, alerts, and downstream automations.\n\n## **When to use it**\n\nUse this template when you need to ingest OPC UA data to MQTT.","difficulty":"intermediate","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":384,"download_count":1,"published_at":"2026-05-16T19:25:45.441+00:00","created_at":"2026-05-16T19:24:31.621852+00:00","updated_at":"2026-05-21T21:43:11.774781+00:00","slug":"opc-ua-to-mqtt-route-template","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"4851c3ef-4668-412a-ad23-ae79be99dba9","name":"polling","slug":"polling"},{"id":"4e597b57-b71c-48a3-8022-df6e5c38f487","name":"opc-ua","slug":"opc-ua"},{"id":"8bef6530-d8d3-42ae-ad10-2ff9ad0c888c","name":"routing","slug":"routing"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"dd16ab7d-3fae-45c8-97b5-f4b9e2a774b0","name":"sensors","slug":"sensors"},{"id":"f01dc0fe-b968-4b26-a036-a9c2eef6a754","name":"authentication","slug":"authentication"},{"id":"f170a03a-dbe3-4c66-93e5-0766bf9b448c","name":"simulation","slug":"simulation"}],"routes":[{"id":"3ae971fc-20fe-41e1-9355-a00a38197385","type":"OPCUA","category":"Industrial","icon_path":"3ae971fc-20fe-41e1-9355-a00a38197385.png","display_name":"OPC UA"}]},{"id":"10457569-8320-41ca-a40e-d691c4856c95","title":"How to Hook Telegram Alerts via REST","short_description":"Send MQTT text to Telegram chats via the Bot API for alerts and status messages","content":"## What this template does\n\nEnables seamless MQTT to Telegram alerting. By translating plain text published on a trigger topic, it automatically formats and delivers messages to the Telegram Bot API via REST POST requests. It operates securely by utilizing runtime secrets for bot credentials, locking down internal delivery topics, and includes an optional heartbeat timer for easy, trigger-free simulation and testing.\n\n### When to use it\n\nIdeal for setups requiring real-time, automated notifications, seamlessly bridging local MQTT system events, alarms, or status updates directly into human readable Telegram chats and groups.\n\n&nbsp;","difficulty":"beginner","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":true,"view_count":384,"download_count":5,"published_at":"2026-05-22T14:05:22.42+00:00","created_at":"2026-05-22T14:05:09.743819+00:00","updated_at":"2026-05-22T14:13:11.782473+00:00","slug":"telegram-bot-alerts-via-rest-api-2","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"006dc0eb-6782-4de1-a69b-ed76caae7479","name":"telegram","slug":"telegram"},{"id":"253ec7f2-a19e-4ec2-839d-9d6c2f6cebee","name":"botfather","slug":"botfather"},{"id":"29c99d31-b9fa-49d4-a798-e732d0a89e23","name":"alerts","slug":"alerts"},{"id":"3089e499-23cc-4a09-8e3f-e2c38b129497","name":"topics","slug":"topics"},{"id":"3be6d89d-82eb-45ac-8c66-eda89ba6918d","name":"rest-api","slug":"rest-api"},{"id":"a93e6d01-dcc3-4072-b690-a3829d0773f8","name":"Secrets","slug":"secrets"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"e51b46bf-ebde-4f62-ba30-e561b37eed33","type":"REST_API","category":"REST API","icon_path":"e51b46bf-ebde-4f62-ba30-e561b37eed33.svg","display_name":"REST API"}]},{"id":"60e32ab4-3a2b-47c1-98b4-fe1a756edaa3","title":"Brewery line simulator with own UNS","short_description":"Modbus TCP + OPC UA to MQTT Unified Namespace. PostgreSQL brewery batch historian.","content":"## What this template does\n\nA Python tick on the broker drives mixer, filler, and capper. MODBUS_SERVER and OPCUA_SERVER expose those tags on localhost. Client routes poll them onto Plant/#. PostgreSQL stores completed batches. An AGENT reads the namespace.  \n\n\n##   \nWhen to use it\n\n  \nA self-contained bottling lab — no extra simulator process. Point the client hosts at real PLCs when you have them.\n\nBrewerySim.tick → **sim**/devices/{mixer,filler,capper}/*\n\n     ├── MODBUS_SERVER MixerDevice   127.0.0.1:1501\n\n     ├── OPCUA_SERVER  FillerDevice  opc.tcp://127.0.0.1:4840\n\n     └── MODBUS_SERVER CapperDevice  127.0.0.1:1502\n\n              ↓\n\n     MixerM01 / FillerF01 / CapperC01  → Plant/#\n\n     **sim**/brewery/batch             → PostgreSQL → Plant/Historian/*/Batches\n\n##      Plant/#      \n  \n  \n  \nWhat's inside\n\n- BrewerySim — Python plant clock (jams, spoiled lots, batch close)\n- MixerDevice — MODBUS_SERVER on 127.0.0.1:1501\n- FillerDevice — OPCUA_SERVER on opc.tcp://127.0.0.1:4840\n- CapperDevice — MODBUS_SERVER on 127.0.0.1:1502\n- MixerM01 / FillerF01 / CapperC01 — clients that write Plant/#\n- BreweryTraceDb — PostgreSQL INSERT + SELECT last 20\n- BreweryAssistant — answers on brewery/assistant/reply/id  \n  \n\n\n## Steps\n\n1. Run the Python cell first (`# Script Name: BrewerySim` on line 1).\n2. Deploy SeedBreweryState, then RunBrewerySim.\n3. Deploy the three server routes, then the three client routes.\n4. Create the PostgreSQL tables, replace YOUR_DB_PASSWORD, deploy BreweryTraceDb.\n5. KEEP SECRET OPENAI_KEY once, then deploy BreweryAssistant.\n\n&nbsp;\n\n&nbsp;\n\n## Tips\n\n- Mixer listens on 1501, not 502 — the broker user cannot bind privileged ports.\n- Servers bind localhost. Change HOST / ENDPOINT_URL when a real PLC is on the wire.\n- Consumers subscribe to Plant/#. They never parse **sim**/brewery/snapshot.\n\n&nbsp;\n\n&nbsp;\n\nDocs: [Python](https://docs.coreflux.org/latest/lot-language/actions/python-integration), [Modbus server](https://docs.coreflux.org/latest/lot-language/routes/industrial/modbus-tcp-server), [OPC UA server](https://docs.coreflux.org/latest/lot-language/routes/industrial/opcua-server), [Modbus client](https://docs.coreflux.org/latest/lot-language/routes/industrial/modbus-tcp-client), [OPC UA client](https://docs.coreflux.org/latest/lot-language/routes/industrial/opcua-client), [PostgreSQL](https://docs.coreflux.org/latest/lot-language/routes/data-storage/postgresql), [AI routes](https://docs.coreflux.org/latest/lot-language/routes/ai-routes).","difficulty":"advanced","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"72c1f666-e2e6-4bc8-9cf2-9408f3402e7e","status":"published","is_visible":true,"is_featured":false,"view_count":207,"download_count":3,"published_at":"2026-08-23T19:25:43.472+00:00","created_at":"2026-08-22T18:23:51.032577+00:00","updated_at":"2026-08-22T18:23:51.304131+00:00","slug":"brewery-line-simulator-with-own-uns-2","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"72c1f666-e2e6-4bc8-9cf2-9408f3402e7e","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/72c1f666-e2e6-4bc8-9cf2-9408f3402e7e/8339ae55-616e-463e-b75b-134041d2ee2b.png","display_name":"Hugo Vaz","profile_slug":"hugo-vaz"},"tags":[{"id":"00d1a016-71e9-428d-a835-c3f35f884d63","name":"Modbus TCP","slug":"modbus-tcp"},{"id":"2e87a769-c38b-4336-8259-740ca2812b95","name":"Python","slug":"python"},{"id":"4e597b57-b71c-48a3-8022-df6e5c38f487","name":"opc-ua","slug":"opc-ua"},{"id":"77e6abe8-cf80-41e5-9c46-f2a253f84aa9","name":"manufacturing","slug":"manufacturing"},{"id":"ab388864-bcc7-43a1-86a6-1da8a459f190","name":"AI agent","slug":"ai-agent"},{"id":"d8e523f0-cb3d-4af9-bd2f-056c2048be56","name":"historian","slug":"historian"},{"id":"df08f548-60b4-4c82-8b58-b2edaadaa03e","name":"uns","slug":"uns"},{"id":"f6c3c2a2-25ff-494a-9b56-12b95fa01631","name":"postgresql","slug":"postgresql"}],"routes":[{"id":"0c2413e6-5db8-4aff-8678-bff862b2e86e","type":"MODBUS_TCP","category":"Industrial","icon_path":"0c2413e6-5db8-4aff-8678-bff862b2e86e.webp","display_name":"Modbus TCP"},{"id":"1f8b882a-80e4-47a1-aa3a-2335b41f83ed","type":"OPCUA_SERVER","category":"Industrial","icon_path":"3ae971fc-20fe-41e1-9355-a00a38197385.png","display_name":"OPC UA Server"},{"id":"3280e7e3-2777-4bc3-9d73-c975b46c04f6","type":"AGENT","category":"Other","icon_path":"dd2b95db-133f-4ea8-b66e-14713e8be605.png","display_name":"Agent"},{"id":"3ae971fc-20fe-41e1-9355-a00a38197385","type":"OPCUA","category":"Industrial","icon_path":"3ae971fc-20fe-41e1-9355-a00a38197385.png","display_name":"OPC UA"},{"id":"3fb2e0db-878f-45b8-99d4-bfb066077854","type":"POSTGRESQL","category":"Data Storage","icon_path":"3fb2e0db-878f-45b8-99d4-bfb066077854.svg","display_name":"PostgreSQL"},{"id":"b818ed77-3898-41e2-9fbd-05e619432837","type":"MODBUS_SERVER","category":"Industrial","icon_path":"75ea6290-81eb-4cd8-bb49-922fbe957add.png","display_name":"Modbus Server"}]},{"id":"e5457328-d5a3-487a-8aa7-786bae0375dc","title":"How to control Tapo Smart Bulb","short_description":"Control Tapo bulbs over MQTT with dynamic IP commands and optional color control.","content":"## What this template does\n\nEnables MQTT control for Tapo Smart Bulbs. By listening to a single MQTT topic, it accepts JSON commands containing a bulb's IP, action (`on`, `off`, `color`), and an optional color. It operates dynamically without a static registry, allowing control over any bulb on the local network.\n\n## When to use it\n\nIdeal for setups requiring flexible, dynamic control of Tapo bulbs via MQTT, without the need to pre-register individual device IPs.","difficulty":"advanced","category_id":"656ec8c6-6c8d-4e84-b943-3056f7b041d5","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":570,"download_count":2,"published_at":"2026-05-16T20:07:24.841+00:00","created_at":"2026-05-16T20:06:39.082088+00:00","updated_at":"2026-05-21T21:33:54.888626+00:00","slug":"tapo-smart-bulb-home-control","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"656ec8c6-6c8d-4e84-b943-3056f7b041d5","name":"IoT & Connected Devices","slug":"iot--connected-devices"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"038007d1-b806-4f9b-93cb-b1a79097c5c1","name":"home automation","slug":"home-automation"},{"id":"2e87a769-c38b-4336-8259-740ca2812b95","name":"Python","slug":"python"},{"id":"6a10d21f-b3d4-43dd-875a-5c54de5d2fad","name":"color control","slug":"color-control"},{"id":"a5a272d6-bf43-48b0-a262-6cea245e60a5","name":"smart bulb","slug":"smart-bulb"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"eb96c592-93d4-40e7-82c5-84c5825175bb","name":"Tapo","slug":"tapo"}],"routes":[]},{"id":"ef485a51-78e9-4115-8658-710fe5d5f378","title":"How to Monitor Machine Health with a Vibration Sensor","short_description":"Monitor machine health with Modbus RTU and a 3-axis vibration sensor.","content":"## **What this template does**\n\n  \nEnables continuous machine health monitoring for industrial equipment fitted with 3-axis vibration sensors. By computing real-time RMS vibration and comparing it against a self-learned baseline, it extracts a 0–100 health score that reflects the current condition of rotating machinery, without requiring manual threshold configuration. It operates autonomously, adapting the baseline to normal operating conditions, detecting sudden increases in vibration, and publishing a structured health status ready to consume in dashboards.\n\n&nbsp;\n\n## **When to use it**\n\n  \nIdeal for predictive maintenance setups where early detection of mechanical degradation, bearing wear, imbalance, or looseness, is needed before it becomes a failure.","difficulty":"advanced","category_id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":true,"view_count":360,"download_count":5,"published_at":"2026-06-09T19:29:25.059+00:00","created_at":"2026-06-09T19:22:34.925885+00:00","updated_at":"2026-06-09T19:29:24.462782+00:00","slug":"modbus-vibration-sensor-health-monitor","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"c65536f1-6004-44a2-bc21-3c8f78fe5299","name":"Manufacturing","slug":"manufacturing"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"065f2efe-5b01-4e39-a1e0-f328549bf5ae","name":"health monitoring","slug":"health-monitoring"},{"id":"13172a65-526a-4aee-a74d-9fe14fb390c8","name":"vibration","slug":"vibration"},{"id":"2e87a769-c38b-4336-8259-740ca2812b95","name":"Python","slug":"python"},{"id":"4cb3844c-1712-42dd-b16b-aaf63439afe3","name":"retained state","slug":"retained-state"},{"id":"5273abc1-734d-4497-b428-8d6ec9c35de1","name":"sensor monitoring","slug":"sensor-monitoring"},{"id":"7d38e1c9-bf94-42a7-b2a9-90bf0ada5008","name":"RMS","slug":"rms"},{"id":"83560dc9-f2db-4f30-bc9d-7bb6a82fb38a","name":"Modbus RTU","slug":"modbus-rtu"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"ec78fb08-f861-4d3e-be30-89f68ae002b3","type":"MODBUS_SERIAL","category":"Industrial","icon_path":"ec78fb08-f861-4d3e-be30-89f68ae002b3.webp","display_name":"Modbus Serial"}]},{"id":"a8e87cf2-0d8f-4ac9-a91a-bb6933f38710","title":"Talk with an AI Expert for your Smart City Telemetry and Transit data","short_description":"Query live MQTT data with an AI agent for smart city ops teams.","content":"### How it works\n\nSimulates a live smart city environment by publishing realistic telemetry, including traffic, air quality, parking, pedestrian, and transit metrics for downtown, harbor, university, and suburban districts, to retained MQTT topics every 10 seconds. A broker-native AI agent continuously monitors for natural language queries on the `smartcity/ai/ask` topic, actively utilizing `BROKER_TOOLS` at query time to inspect and read the latest retained state across the `smartcity/#` hierarchy. The agent grounds its response in this real-time snapshot and publishes the formatted markdown answer directly to `smartcity/ai/reply` in a seamless Ask/Reply flow. The system pipeline includes built-in multi-provider support, allowing rapid swapping between OpenAI, Anthropic Claude, or a locally hosted Ollama instance, while customizable simulator ranges allow operators to validate the AI pipeline before connecting physical urban sensors.\n\n### When to use it\n\nIdeal for municipal operators, smart city architects, and urban control centers that need conversational, natural language insights alongside real-time telemetry visibility. Adjust the simulator baseline ranges for each district, and toggle the TRACE flag to false to match your production environment requirements.","difficulty":"intermediate","category_id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":true,"view_count":239,"download_count":0,"published_at":"2026-06-30T20:50:16.842+00:00","created_at":"2026-06-30T20:43:03.021874+00:00","updated_at":"2026-07-02T17:14:16.241141+00:00","slug":"smart-city-mqtt-ai-monitor","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","name":"Smart Cities","slug":"smart-cities"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"505b531c-16f1-454c-a6e7-b45ab5a0b7f6","name":"natural language","slug":"natural-language"},{"id":"525e8b81-b697-417a-9567-69e0056d7188","name":"openai","slug":"openai"},{"id":"c3c21608-5bca-4b5a-afb2-8d2af304396a","name":"mcp","slug":"mcp"},{"id":"f325c33d-4f49-4a01-9c6d-91cd7273e09d","name":"ollama","slug":"ollama"},{"id":"f51920f0-de6d-4e58-a0a0-11cce236123b","name":"anthropic-claude","slug":"anthropic-claude"},{"id":"faa10a3a-f9cb-4be3-b8bf-b25ee5faf405","name":"AI","slug":"ai"},{"id":"ff5ad183-755c-416d-866d-f071992a5f67","name":"SmartCity","slug":"smartcity"}],"routes":[{"id":"3280e7e3-2777-4bc3-9d73-c975b46c04f6","type":"AGENT","category":"Other","icon_path":"dd2b95db-133f-4ea8-b66e-14713e8be605.png","display_name":"Agent"}]},{"id":"18a9ad0e-25a6-433d-b90e-0ea55d2c7e20","title":"How to Sync FTP CSV Files to a PostgreSQL Database","short_description":"Poll an FTP CSV file with Python to MQTT and store typed rows in PostgreSQL.","content":"## What this template does\n\nBuild a zero-middleware historian for legacy devices that drop CSV files on FTP. A Python reads the latest non-empty row from the file, detects changes, and new readings are published to MQTT and stored in PostgreSQL with a typed model.\n\n## When to use it\n\nUse this template when you need to ingest file-based telemetry from older systems.","difficulty":"advanced","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":364,"download_count":5,"published_at":"2026-05-12T19:58:22.924+00:00","created_at":"2026-05-12T19:58:09.400827+00:00","updated_at":"2026-05-15T20:11:05.812214+00:00","slug":"ftp-csv-historian-to-postgresql","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"001a63f5-73a9-4f30-aaf9-a1a99bb2b493","name":"CSV","slug":"csv"},{"id":"29f27581-22c0-463d-a670-6f539d85958c","name":"data ingestion","slug":"data-ingestion"},{"id":"2e87a769-c38b-4336-8259-740ca2812b95","name":"Python","slug":"python"},{"id":"55e45f0b-f698-4b1a-ba89-34ff43e432c1","name":"FTP","slug":"ftp"},{"id":"d8e523f0-cb3d-4af9-bd2f-056c2048be56","name":"historian","slug":"historian"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f6c3c2a2-25ff-494a-9b56-12b95fa01631","name":"postgresql","slug":"postgresql"}],"routes":[{"id":"3fb2e0db-878f-45b8-99d4-bfb066077854","type":"POSTGRESQL","category":"Data Storage","icon_path":"3fb2e0db-878f-45b8-99d4-bfb066077854.svg","display_name":"PostgreSQL"}]},{"id":"9602f66b-4196-432b-8095-35efc7d72b06","title":"MongoDB Journal API with Live Summaries","short_description":"Append-only journal ingest for MongoDB with live MQTT summaries and daily rollups on Coreflux LoT.","content":"## How it works\nThis Coreflux LoT Notebook implements an append-only journal backed by MongoDB. A REST API writes new entries once, while MQTT topics carry live counters, window summaries, events, and scheduled reports for consumers.\n\n## Key features\n- **REST ingest:** POST `/entries` creates a journal entry on `demo/journal/intake/create`.\n- **MongoDB persistence:** `JournalDB` inserts documents into the `entries` collection and serves recent history.\n- **Live broker state:** today, this_week, metrics, and KPI values are maintained on topics with PUBLISH and KEEP.\n- **Domain events:** `EntryAdded` publishes each new note to `demo/journal/events/entry_added`.\n- **Scheduled reporting:** midnight actions publish a daily report and reset daily state; Monday resets the weekly window.\n- **Error mirror:** DB route error totals are mirrored from `$SYS/Coreflux/Routes/JournalDB/status`.\n\n## Prerequisites\n- MongoDB connection string and database name in `JOURNAL_DB_URI` and `JOURNAL_DB_NAME`\n- Coreflux broker access with HTTP enabled on port 9091\n- A broker clock aligned to the desired report timezone\n\n## Setup\n1. Set the MongoDB environment variables before deploying the routes.\n2. Confirm port `9091` is free for `JournalAPI`.\n3. Deploy `JournalAPI`, `JournalDB`, and the journal actions/models.\n4. POST a sample entry to verify writes and watch `demo/journal/#` for live updates.\n\n## What this template does\n- Writes `title`, `note`, and `created_at` into MongoDB.\n- Publishes `entries_total`, `entries_today`, and `entries_this_week` counters.\n- Maintains `today` and `this_week` summaries with first, last, and count fields.\n- Emits a daily report at `demo/journal/reports/daily` and stores `kpi/entries_yesterday`.\n\n## Who is this for?\nTeams building an auditable journal, activity log, or append-only event record with MongoDB persistence and broker-side read models on Coreflux LoT.","difficulty":"intermediate","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","status":"published","is_visible":true,"is_featured":false,"view_count":131,"download_count":0,"published_at":"2026-08-12T16:58:49.952+00:00","created_at":"2026-08-11T18:35:36.976162+00:00","updated_at":"2026-08-11T18:35:52.298578+00:00","slug":"mongodb-journal-api-with-live-summaries","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2/32fd8311-1ffc-4b91-9457-8f850f7a32ed.jpg","display_name":"Dylan DuFresne","profile_slug":"dylan-dufresne"},"tags":[{"id":"389b8483-7550-4c63-9323-0488a9f2580f","name":"journal","slug":"journal"},{"id":"71086a59-0fb5-4d4b-b227-32833ba50ce3","name":"events","slug":"events"},{"id":"8b42af31-d6c6-40e6-9770-e23581aae580","name":"scheduling","slug":"scheduling"},{"id":"8d17a8ab-f5af-4897-958e-a9f81f7832bd","name":"append-only","slug":"append-only"},{"id":"9191bc3a-da2a-4d4f-b839-7fafd5b4a1cf","name":"mongodb","slug":"mongodb"},{"id":"9345d3ca-2e23-4d24-9cf7-f465304d2488","name":"reporting","slug":"reporting"},{"id":"c9deeb16-8f0e-4255-b104-6d3088687b8b","name":"rest","slug":"rest"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"1bc200a2-e167-4918-a51b-4a768f091c9b","type":"MONGODB","category":"Data Storage","icon_path":"1bc200a2-e167-4918-a51b-4a768f091c9b.svg","display_name":"MongoDB"},{"id":"e51b46bf-ebde-4f62-ba30-e561b37eed33","type":"REST_API","category":"REST API","icon_path":"e51b46bf-ebde-4f62-ba30-e561b37eed33.svg","display_name":"REST API"}]},{"id":"24588713-1fa9-4d82-a1aa-73c3389e6b36","title":"How to monitor Water Pump Stations with Coreflux","short_description":"Monitor pump station levels, pressure, flow, and alarms.","content":"## **How it works**\n\nPolls a Modbus TCP pump station controller every 5 seconds for inlet well level, outlet pressure, flow rate, and two pump drive signals, then assembles the full station state into a `PumpStationModel` snapshot on every level reading. The snapshot is immediately stored to PostgreSQL through a topic-triggered route, building a continuous historian with no polling overhead. A dedicated alarm action monitors level and pressure against configurable thresholds, publishing structured `AlarmModel` fault and recovery events with deduplication flags so each condition logs exactly once on onset and once on recovery. An optional simulator cycles through high-level, low-level, and overpressure fault scenarios to validate the full pipeline before hardware is connected.\n\n## **When to use it**\n\nIdeal for water utilities, municipal pump stations, and lift stations that need real-time sensor visibility alongside a reliable audit trail. Works with any Modbus TCP-compatible pump controller adapt the host, slave ID, and register addresses to your device datasheet.","difficulty":"advanced","category_id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":false,"view_count":221,"download_count":0,"published_at":"2026-06-30T16:18:15.016+00:00","created_at":"2026-06-30T16:10:52.795597+00:00","updated_at":"2026-07-02T17:15:18.326787+00:00","slug":"water-pump-station-modbus-monitor","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"8e1c6bcd-cc4f-4ec2-a328-fcf7e97c530a","name":"Smart Cities","slug":"smart-cities"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"00d1a016-71e9-428d-a835-c3f35f884d63","name":"Modbus TCP","slug":"modbus-tcp"},{"id":"077bac4d-ef9e-453e-8864-f62baf6d69ea","name":"alarms","slug":"alarms"},{"id":"82b67c18-32d8-472e-ad9d-811dbccd17e7","name":"pump station","slug":"pump-station"},{"id":"bccb1e84-ad12-46b4-bb0f-f35649f3a0b0","name":"water","slug":"water"},{"id":"ccc96708-0cca-4164-8663-42b2b20ed35c","name":"telemetry","slug":"telemetry"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f170a03a-dbe3-4c66-93e5-0766bf9b448c","name":"simulation","slug":"simulation"},{"id":"f6c3c2a2-25ff-494a-9b56-12b95fa01631","name":"postgresql","slug":"postgresql"}],"routes":[{"id":"0c2413e6-5db8-4aff-8678-bff862b2e86e","type":"MODBUS_TCP","category":"Industrial","icon_path":"0c2413e6-5db8-4aff-8678-bff862b2e86e.webp","display_name":"Modbus TCP"},{"id":"3fb2e0db-878f-45b8-99d4-bfb066077854","type":"POSTGRESQL","category":"Data Storage","icon_path":"3fb2e0db-878f-45b8-99d4-bfb066077854.svg","display_name":"PostgreSQL"}]},{"id":"c703859e-1678-4601-9a57-3a2fafcbc654","title":"ADS-B Flight Feed to Coreflux Topics","short_description":"Poll and fan out nearby aircraft data into Coreflux LoT topics for live aviation activity.","content":"## How it works\nThis Coreflux LoT template polls the free adsb.lol v2 REST API every minute for aircraft within 25 nm of Minneapolis. It validates each response, fans up to three aircraft into per-hex topics, and publishes a count plus a summary report.\n\n## Key features\n- **Minute polling:** A self-starting heartbeat triggers the feed once per minute.\n- **REST API ingest:** Pulls JSON from `api.adsb.lol` with no API key.\n- **Aircraft fan-out:** Publishes callsign, type, position, altitude, and speed under `demo/flights/aircraft/<hex>/...`.\n- **Metric and aviation twins:** Stores canonical SI values plus `altitude_ft` and `velocity_kt`.\n- **Summary model:** Publishes a collapsed `FlightsSummary` document after each poll.\n- **Safe parsing:** Checks `total` and aircraft fields as strings before numeric conversion.\n\n## Prerequisites\n- Internet egress from Coreflux\n- REST_API route support\n- Access to publish actions and models\n\n## Setup\n1. Keep `demo/flights/feed/enabled` empty or set it to `1` to start polling.\n2. Edit the route endpoint if you want a different center point or radius.\n3. Copy `FlightSlot2Digest` if you need more than three aircraft slots.\n4. Deploy the route, actions, and models to Coreflux.\n\n## What it publishes\n- `demo/flights/feed/raw_valid` for valid API responses\n- `demo/flights/feed/fetch_error` for rejected payloads\n- `demo/flights/metrics/aircraft_total` for the true count from `total`\n- `demo/flights/reports/summary` as a collapsed summary model\n\n## Who is this for?\nOperators building aviation dashboards, situational awareness views, or MQTT-style aircraft feeds on Coreflux LoT. It is a good fit when you want live ADS-B data without managing your own decoder or API key.","difficulty":"intermediate","category_id":"656ec8c6-6c8d-4e84-b943-3056f7b041d5","author_id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","status":"published","is_visible":true,"is_featured":false,"view_count":212,"download_count":0,"published_at":"2026-08-12T16:59:04.599+00:00","created_at":"2026-08-11T18:29:03.890276+00:00","updated_at":"2026-08-11T18:30:52.60158+00:00","slug":"ads-b-flight-feed-to-coreflux-topics","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"656ec8c6-6c8d-4e84-b943-3056f7b041d5","name":"IoT & Connected Devices","slug":"iot--connected-devices"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2/32fd8311-1ffc-4b91-9457-8f850f7a32ed.jpg","display_name":"Dylan DuFresne","profile_slug":"dylan-dufresne"},"tags":[{"id":"3be6d89d-82eb-45ac-8c66-eda89ba6918d","name":"rest-api","slug":"rest-api"},{"id":"4e14dd12-0212-4a70-9aca-915f8d477291","name":"aviation","slug":"aviation"},{"id":"6b377213-d280-4385-b29c-e0cfb5855d7c","name":"ADS-B","slug":"ads-b"},{"id":"76aa0c49-d8f0-4812-9341-cd8a057df3e5","name":"JSON","slug":"json"},{"id":"84c0f563-b75e-417b-a3e4-f8f4d4260b17","name":"dashboard","slug":"dashboard"},{"id":"ccc96708-0cca-4164-8663-42b2b20ed35c","name":"telemetry","slug":"telemetry"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"e51b46bf-ebde-4f62-ba30-e561b37eed33","type":"REST_API","category":"REST API","icon_path":"e51b46bf-ebde-4f62-ba30-e561b37eed33.svg","display_name":"REST API"}]},{"id":"67c20961-0023-435b-9f65-cd4bf98df247","title":"ISS Live Tracker and Look-Up Alert","short_description":"Tracks the International Space Station from and fires a home-box look-up alert.","content":"## How it works\n\nThis LoT Notebook polls the free wheretheiss.at API every 10 seconds, publishes live ISS position data, and checks whether the station enters a configurable latitude/longitude box. On Coreflux LoT, the flow stays self-starting after deploy and keeps running through restarts, with a rising-edge `look_up` alert when the ISS passes overhead.\n\n## Key features\n\n- **REST API polling:** Fetches ISS data from `https://api.wheretheiss.at` with no key.\n- **Live telemetry topics:** Publishes latitude, longitude, altitude, velocity, and visibility.\n- **Pass detection:** Compares position against configurable `lat_min`, `lat_max`, `lon_min`, and `lon_max` topics.\n- **Edge alerting:** Emits `look_up` only on the 0 → 1 overhead transition.\n- **Status rollups:** Publishes collapsed `IssPosition` and `IssStatus` model outputs.\n- **Self-starting clock:** Uses a 10-second action to bootstrap polling automatically.\n\n## Prerequisites\n\n- Coreflux broker with REST_API route support\n- Internet egress to wheretheiss.at\n- Optional: MQTT/topic access to override the home box edges\n\n## Setup\n\n1. Deploy the route, actions, and models from the LoT Notebook.\n2. Let `demo/iss/feed/enabled` initialize on first tick, or set it manually to `1`.\n3. Optionally publish custom values to `demo/iss/config/lat_min`, `lat_max`, `lon_min`, and `lon_max`.\n4. Subscribe to `demo/iss/pass/alert` for the `look_up` event or to `demo/iss/reports/status` for the rollup.\n\n## What this template does\n\n- Polls the ISS position endpoint every 10 seconds.\n- Validates API replies before numeric parsing.\n- Publishes scalar position topics and unit metadata.\n- Detects overhead passes with simple comparisons.\n- Builds a consistent status snapshot after each refresh.\n\n## Who is this for?\n\nThis template is for Coreflux users building live satellite tracking, location-based alerts, or MQTT dashboards that need a simple external API feed with dependable pass detection.\n\n## How to customize\n\n- Change the monitored box by publishing new edge values under `demo/iss/config/`.\n- Subscribe to `demo/iss/reports/position` for a compact location document.\n- Use `demo/iss/reports/status` when you want one external snapshot with units included.\n\n&nbsp;","difficulty":"intermediate","category_id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","author_id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","status":"published","is_visible":true,"is_featured":false,"view_count":190,"download_count":0,"published_at":"2026-08-12T16:58:55.71+00:00","created_at":"2026-08-11T18:33:35.135265+00:00","updated_at":"2026-08-11T18:34:14.005722+00:00","slug":"iss-live-tracker-and-look-up-alert","broker_version_id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","category":{"id":"e18d0cf5-a30f-4543-a1e0-f8fb2017198c","name":"General","slug":"general"},"broker_version":{"id":"3f2908f5-ba7a-418b-9943-9b82ffd49885","name":"v2.2","slug":"v2-2","sort_order":10},"author":{"id":"159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/159fabf7-c2b0-4ed1-89b4-ad2d2c499cf2/32fd8311-1ffc-4b91-9457-8f850f7a32ed.jpg","display_name":"Dylan DuFresne","profile_slug":"dylan-dufresne"},"tags":[{"id":"05c5f59a-2ad2-478c-bef2-23b6b5e45f2a","name":"satellite","slug":"satellite"},{"id":"29c99d31-b9fa-49d4-a798-e732d0a89e23","name":"alerts","slug":"alerts"},{"id":"3089e499-23cc-4a09-8e3f-e2c38b129497","name":"topics","slug":"topics"},{"id":"3be6d89d-82eb-45ac-8c66-eda89ba6918d","name":"rest-api","slug":"rest-api"},{"id":"76aa0c49-d8f0-4812-9341-cd8a057df3e5","name":"JSON","slug":"json"},{"id":"ccc96708-0cca-4164-8663-42b2b20ed35c","name":"telemetry","slug":"telemetry"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"}],"routes":[{"id":"e51b46bf-ebde-4f62-ba30-e561b37eed33","type":"REST_API","category":"REST API","icon_path":"e51b46bf-ebde-4f62-ba30-e561b37eed33.svg","display_name":"REST API"}]},{"id":"61c3faea-e236-4c10-a1b9-b13b526d29bd","title":"How to Proactively Monitor Your Solar Inverter Fleet via PR & Alarms","short_description":"Monitor solar park with Modbus TCP.","content":"## **What this template does**\n\nEnables comprehensive monitoring for solar inverter fleets. By continuously analyzing the Performance Ratio (PR) and aggregating alarm logs, it extracts critical operational data and highlights underperforming equipment. It operates flexibly, tracking energy generation against expected yields, prioritizing active errors, and providing a clear overview to streamline troubleshooting across multiple sites.Step-by-step\n\n## **When to use it**\n\nIdeal for O&M (Operations & Maintenance) setups requiring reliable, automated fault detection and performance tracking, translating raw inverter and weather data into actionable maintenance strategies.","difficulty":"advanced","category_id":"9b6b6273-bc3c-440f-b1a0-b948752bfd93","author_id":"507e651c-7269-4e72-bf19-30eda46bba07","status":"published","is_visible":true,"is_featured":true,"view_count":460,"download_count":4,"published_at":"2026-05-21T23:40:33.767+00:00","created_at":"2026-05-21T23:39:16.25439+00:00","updated_at":"2026-05-22T09:35:36.395584+00:00","slug":"solar-inverter-fleet-monitoring-with-pr","broker_version_id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","category":{"id":"9b6b6273-bc3c-440f-b1a0-b948752bfd93","name":"Energy & Utilities","slug":"energy--utilities"},"broker_version":{"id":"c1e30566-74f7-4aa7-8a7a-40f51265b333","name":"v2.0","slug":"v2-0","sort_order":80},"author":{"id":"507e651c-7269-4e72-bf19-30eda46bba07","avatar_url":"https://iliafehitnwryrjpfqxv.supabase.co/storage/v1/object/public/avatars/507e651c-7269-4e72-bf19-30eda46bba07/3bec3115-1a9c-4a30-9228-3f33cb80354f.jpg","display_name":"Bruno Candoso","profile_slug":"bruno-candoso"},"tags":[{"id":"00d1a016-71e9-428d-a835-c3f35f884d63","name":"Modbus TCP","slug":"modbus-tcp"},{"id":"2e87a769-c38b-4336-8259-740ca2812b95","name":"Python","slug":"python"},{"id":"778b2b49-e36f-42b8-b6fd-2f02d644d5e4","name":"Huawei","slug":"huawei"},{"id":"7bb56c9b-c815-4d68-94be-b05087fba115","name":"solar","slug":"solar"},{"id":"a0ebb99c-22a2-4831-8e55-3ad37021c494","name":"Sungrow","slug":"sungrow"},{"id":"d9914328-a64d-4b38-9000-c26750a200ee","name":"mqtt","slug":"mqtt"},{"id":"f6c3c2a2-25ff-494a-9b56-12b95fa01631","name":"postgresql","slug":"postgresql"}],"routes":[{"id":"0c2413e6-5db8-4aff-8678-bff862b2e86e","type":"MODBUS_TCP","category":"Industrial","icon_path":"0c2413e6-5db8-4aff-8678-bff862b2e86e.webp","display_name":"Modbus TCP"},{"id":"3fb2e0db-878f-45b8-99d4-bfb066077854","type":"POSTGRESQL","category":"Data Storage","icon_path":"3fb2e0db-878f-45b8-99d4-bfb066077854.svg","display_name":"PostgreSQL"}]}]}