Skip to content
GitHub

HotLoop core 4.16.0 release notes

The first published release since 4.3.1 in August. Everything from 4.4.0 to 4.15.3 was merged and never published, so if you’re on 4.3.1 you get all of it at once, under a new name, a new image, a new chart and a new license. Coming from 4.3.1, it is not a plain helm upgrade. Read “Upgrading from 4.3.1” below before you touch a running plant.

The full notes are in the README: What changed in 4.16.0, and below it every version back to 4.4.0.

  • HotLoop Core: entities. Every tag is an entity with a stable id, placed on an ISA-95 equipment tree. Motors, valves, PID loops and the rest are composites built from their tags, every alarm is an entity, and every entity command goes through the same write gate as a tag write. Agents (MCP), automations and the new Entities and Plant screens all use them. A service call can be asked first with ?dry_run=true, and the command prompt tells you “Would be refused: …” before you confirm.
  • Notifications that reach a phone: ntfy and the Discord bot with an Acknowledge button, Gotify, and a Discord webhook, on rate limits that fold a flood into one summary.
  • Fixes that matter on a running plant: unshelve could wipe an unacknowledged alarm; an OPC UA subscription could go silent forever while the session said connected; a silent Modbus device took up to 15 minutes to go down; a failed webhook logged its URL, which for Discord and ntfy is the password; restore loaded columns by position; every redeploy replaced the OPC UA server’s certificate, so Ignition stopped trusting it; Discover tags imported every OPC UA node as a float; the Settings screen named poll variables that nothing reads.
  • Ignition 8.3.9 reads our OPC UA server, verified end to end, and the server reports HotLoop as its manufacturer now.
  • The Edge Relay ships as its own image and chart, in lockstep with the Gateway. TimescaleDB 2.30.1, and the extension updates itself now.
  • Empty lists are [], never null, everywhere, streams included.
  • /api/history buckets with no good reading are null (a gap), and bad readings stay out of averages.
  • An error the API can’t place is a 500 with a log ref, not a 400. A device that errors on a write or a browse is a 502.
  • A service an alarm entity doesn’t take (alarm.turn_on) is a 400. It used to answer success and do nothing.
  • Unshelving an alarm that isn’t shelved is a 409.
  • Tag JSON always carries minValue, maxValue and hasRange.
  • New: ?dry_run=true on POST /api/services/{domain}/{service}. Only true or false; anything else is a 400.
  • Image ghcr.io/hotloop-io/hotloop (was ghcr.io/embernet-ai/industrial-iot), chart repository https://hotloop.io/hotloop, chart hotloop (was industrial-iot), every IIOT_ variable is HOTLOOP_.
  • The chart name is in the workload selectors, which Kubernetes won’t change in place. Keep the release name and namespace, then: pg_dump the database; delete the old Deployment (<release>) and StatefulSet (<release>-postgresql), which leaves the database volume where it is; helm upgrade <release> hotloop/hotloop -f your-4.3.1-values.yaml. Not --reuse-values. Rename any IIOT_ in extraEnv and drop an image.repository override. The new database pod mounts the old volume and the Gateway migrates it forward on start.
  • License: HotLoop’s own license terms, not the ones 4.3.1 shipped with. Free for home and lab use; businesses sign up free through EmberNET. The current terms are in LICENSE.
  • There is a login, writes default to off, and a timezone that won’t load stops startup instead of running on UTC.