Hallo miteinander
Vor wenigen Minuten haben wir den Open Bridge Server Release 2026.8.0 freigegeben, welcher wie üblich als Docker-Image oder LXC-Template zur Verfügung steht. Es haben sich wieder eine ganze Reihe Changes angesammelt, daher hier die Releasenotes in voller Schönheit:
Breaking changes 🚨
Sobald der nächtliche Sync gelaufen ist, steht das Docker-Image nicht nur in der Github Container Registry sondern auch auf Dockerhub zur Verfügung.
Wir wünschen viel Spass mit dem neuen Release und freuen uns über jegliches Feedback. Es dürfen natürlich auch direkt entsprechende Feature-Requests oder Bug-Reports auf Github eröffnet werden.
Vor wenigen Minuten haben wir den Open Bridge Server Release 2026.8.0 freigegeben, welcher wie üblich als Docker-Image oder LXC-Template zur Verfügung steht. Es haben sich wieder eine ganze Reihe Changes angesammelt, daher hier die Releasenotes in voller Schönheit:

Breaking changes 🚨
- Monitor/RingBuffer: Storage is now automatically segmented instead of a single ever-growing SQLite file. On upgrade the existing ring-buffer database is attached read-only and new events are written to time-based segments (~6 h each). Retention is now segment-granular and enforced against the hard max_file_size_bytes budget: to protect disk space, whole old segments — including the pre-upgrade data — may be dropped earlier than the configured age target once the size budget is exceeded, so monitor history can be lost sooner than before. Operators who need to keep more history should raise the size/retention limits in the Monitor configuration promptly after upgrading, at the cost of higher disk usage. The fresh-install default for max_file_size_bytes has been raised from 10 MiB to 100 MiB (existing installations are unchanged — only new-install defaults are affected). #919
- Monitor/RingBuffer: New legacy migration assistant for upgraded installations. When a pre-segmentation ring-buffer database is detected, the old history is now protected from FIFO retention until an admin makes an informed decision. A one-time wizard (Monitor view, dashboard card, and segment-status dialog) explains the options and their consequences: migrate the newest old events into segments (budget-bounded offline copy that runs alongside live recording; the write pause is limited to a sub-second atomic commit), keep the old database read-only until the size budget reclaims it as a whole, or discard it immediately. The assistant previews sizes, time spans, disk-space checks, and a data-driven forecast of when the budget would force reclamation. Breaking/limitation: the migration copy is bounded by max_file_size_bytes – if the budget is smaller than the converted history, the oldest events are dropped during migration (the wizard shows how many). Segmented storage needs roughly 2 × the size of the old ring-buffer database (typed value columns and metadata indexes; measured ~1.4× for metadata-rich events up to ~4× for very small ones). To migrate without loss, raise the budget to at least 2 × old database size first; afterwards prefer reducing retention via an age limit instead of shrinking the budget, which would immediately trim the oldest segments again. Until a decision is made the old history is protected from retention, but live recording remains bound by the configured budget – with a small budget, adjust it promptly – and migrate promptly after raising the budget, since live recording grows into the new budget and displaces old events from the migration copy one-for-one. #964 #965 #966
- Adapter: 1-Wire adapter rewritten as an owserver/OWFS client via pyownet, so USB busmasters (including the ElabNET PBM) and native kernel buses all work through one code path. Adds sensor/property browsing with inline ROM-ID → label aliasing from the binding form, and writable 1-Wire properties (e.g. DS2408 switches) now actually write instead of being a no-op. #6
- Adapter/Modbus TCP: New shared_bus option serialises I/O across all Modbus-TCP adapter instances that poll the same host: port, so multiple devices behind one RS485/Modbus-TCP gateway (different unit ids) no longer issue overlapping requests on the shared serial bus. #1045
- Admin GUI/Visu: The configuration column in the Logic editor and the Visu page editor is now dragable in width via a handle on its left edge, so long object names stay readable on widescreen monitors; the chosen width is remembered per browser. #1034
- Backend/Admin GUI/Logic Engine: Date and time display formats can now be configured independently of language and timezone. MESSAGE templates support ###DATE### and ###TIME### alongside the backward-compatible ISO ###TS###, and a new Date/Time logic block outputs the configured formats or a documented custom token format. #1011
- Logic Engine/Admin GUI: Added a Comment node — a freely placeable, purely visual note with multi-line text for documenting non-obvious graph logic directly on the canvas, with no effect on execution. Text renders inline in the node body and the node is resizable. #1043
- Logic Engine/Admin GUI: Added a generic Notification node that sends dynamic or fallback messages through one configured MESSAGE adapter to one or more Pushover, seven.io, Telegram, or other registered provider targets. Provider credentials and recipients remain centrally configured in the adapter; the legacy Pushover and seven.io nodes remain executable and editable for existing logic sheets but are hidden from the palette for new nodes. #916
- Logic Engine/Admin GUI: Added a Sequence node for state-triggered, non-blocking value-write and pause sequences. Sequences are configured with a visual step editor (including object picker, reordering, duplication, pauses and a blink preset), configurable repeat/restart policies, and normal object values such as colours, switches or dimmer levels. #1021
- Logic Engine/Admin GUI: Debug mode now opens a dedicated block inspector with complete scrollable/copyable inputs and outputs, structured JSON formatting, value type/size and execution metadata. Individual inputs can be overridden for one-off test executions without changing upstream blocks or saved logic; all debug data and overrides are discarded when debug mode is disabled, and live payloads are only prepared for subscribed debug sessions. #1032
- Logic Engine/Admin GUI: Function blocks can now optionally snap their upper-left corner to the visible points of a configurable 5–100 px grid in the logic editor; the enabled state and grid size are remembered per browser. #1003
- Logic Engine/Admin GUI: The maximum iCalendar download size is now configurable per function block from 1–50 MiB. The default has been raised from 1 MiB to 2 MiB, allowing larger long-running calendars while retaining the streamed download-size guard. #1005
- Logic Engine/Admin GUI: Selected function blocks in the logic editor can now be copied and pasted, including onto a different logic sheet, preserving their configuration and the connections between them; pasted blocks land pre-selected and slightly offset so they can be dragged into place immediately. #1084
- Visu: The page editor now supports selecting multiple widgets at once — Shift/Ctrl+click toggles individual widgets, dragging on empty canvas draws a selection box, and dragging any selected widget moves the whole selection together; Delete/Backspace removes all selected widgets. #1036
- Monitor/RingBuffer: Recording no longer rescans the entire active SQLite segment after every event to recompute row count and timestamp bounds. Active segment statistics now advance incrementally after each committed append and are still rebuilt from disk during startup recovery, eliminating the resulting sustained CPU and page-cache read amplification on large or high-rate installations. #1097
- Backend/KNX: BOTH-direction bindings now recognize and individually consume their own short-lived command and state-address confirmations by binding and raw payload, including confirmations from rapid consecutive writes and XKNX automatic reconnect retries. Repeated or coalesced state-address feedback for identical encoded payloads restores the newest logical command, while command-address callbacks remain ordered. Queued-write context is retained until XKNX reports successful transmission and across unchanged binding reloads; failed queue submissions and context for changed or removed bindings are cleaned automatically. Command and state-address confirmations bypass further binding propagation across every binding sharing the address. Confirmations restore the pre-transformation logical value to persisted/UI state, while commands that already emitted an event avoid retriggering logic, notification, and presence actions; direct commands without an initial event make exactly one confirmation actionable. Locally generated responses to KNX read requests are ignored by the inbound value path. This prevents non-idempotent value_formula transformations from creating runaway feedback loops while leaving unrelated bindings and later genuine value changes unaffected. #910
- Monitor/RingBuffer: Pinned but switched-off filter sets no longer produce an empty initial or refreshed table while live events follow different filtering rules. Only pinned and enabled sets participate consistently in loading, refresh, CSV/TSV export, and live updates; switching off the last participating set restores the unfiltered monitor view. #1062
- Backend/KNX: ETS hierarchy imports in groups, mid, and flat mode now automatically link uniquely matching KNX data points, including feedback/state group addresses. Missing or ambiguous matches remain unlinked. #1060
- Monitor/RingBuffer: Adapter-only filter sets now match the telegram source consistently across historical and live entries even when adapter type identifiers use registry-style uppercase or legacy/internal lowercase casing. #1077
- Monitor/RingBuffer: After a partial legacy migration started from “keep”, remaining legacy sources stay protected across process restarts even when the post-commit application-database update temporarily fails. The migration commit now records a durable repair marker before startup retention can reclaim the remaining source, while later explicit “keep” decisions remain unchanged. #1013
- Monitor/RingBuffer: Restored or copied installations no longer treat an attached legacy ring-buffer database as already migrated merely because the application database contains a stale terminal migration marker. The server reopens the decision, protects the legacy source from retention, keeps it visible and actionable in the dashboard and migration assistant without requiring a restart, and reports a valid empty legacy database as exactly zero rows instead of hiding it behind a completed state. #1050
- Monitor/RingBuffer: Empty hierarchy filters now match no entries instead of widening the query to unrelated events. The legacy migration assistant now anticipates stale copy-phase cleanup only when the next migration can actually reach it, preserves all chunks while a migration, interrupted-commit recovery, or quarantined source blocks cleanup, and credits free disk only for existing main segment files. #1009 #1061
- Monitor/RingBuffer: Segment rotation no longer falls back to an unexplained fixed 256 MiB size cap. Each segment threshold is now either explicit, derived as one third of its matching total retention limit, or disabled; configurations without any effective rotation trigger are rejected. The Admin UI shows the effective source per dimension, warns and asks for confirmation when total retention is unbounded, and forecasts disk growth for that case. A 30-day retention with explicit 24-hour segments and no disk budget therefore rotates by age without an implicit size cap. #919
- Logic/History: Consumption counters now reset daily, weekly, monthly, and yearly values in the configured application timezone. SQLite history aggregate buckets now carry explicit UTC (Z) timestamps, and the Chart widget continues to interpret legacy timezone-less buckets as UTC. #975 #909
- Logic Engine/Admin GUI: Delay and Pulse function blocks no longer accept negative time values. #1002
- Logic Engine: Event-driven logic executions now trigger notification blocks only on the branch downstream of the changed object. Cached values on unrelated branches no longer resend previous messages to other MESSAGE targets or providers; manual whole-sheet execution remains unchanged. #1090
- Logic Engine: Read Object blocks now load the current object value when a logic sheet is saved, activated, imported (single sheet or configuration restore), or duplicated, so downstream logic starts with the latest known state immediately instead of waiting for the next object update. The initialization pass is side-effect-free: it only writes objects on paths carrying a seeded value and does not fire notifications, HTTP requests, or other trigger-driven actions. #1031
- Logic engine: JSON Extractor path selection now assigns the chosen path to the selected output instead of incorrectly overwriting the last output. #980
- KNX: Added the reactive-energy datapoint types DPT 13.012 (VARh) and DPT 13.015 (kVARh) to the DPT registry. Bindings configured with these DPTs previously fell back to the UNKNOWN definition and produced no decoded value. #1030
- Visu: Chart widget — the primary series (bound via the widget's own top-level datapoint) always reused the widget's own title as its legend label, with no way to give it a distinct name independent of the title. This was easy to miss with only one extra series, but became visibly confusing with two or more — e.g. a 3-phase grid-voltage history chart where the extra series correctly showed "L2"/"L3" while the primary series showed the full chart title instead of "L1". A new optional primary_label config field lets it be set independently; existing Chart widgets keep their current behavior unchanged when left unset. #1114
- none
Sobald der nächtliche Sync gelaufen ist, steht das Docker-Image nicht nur in der Github Container Registry sondern auch auf Dockerhub zur Verfügung.
Wir wünschen viel Spass mit dem neuen Release und freuen uns über jegliches Feedback. Es dürfen natürlich auch direkt entsprechende Feature-Requests oder Bug-Reports auf Github eröffnet werden.


Kommentar