Skip to main content
Version: 4.2 (beta)

4.2.0

Manager​

  • Manager:
    • Added AI assistant. Add the Manager assistant panel, Code Editor and Project Editor integrations, and realtime keyboard/voice controls.
    • The assistant can now help write code that works with PDF, Excel and Word files, and looks up Java classes and methods after a compile error.
    • Added MCP support. Allow MCP clients to connect to HSYCO through Manager, with a Manager approval popup before access is granted, toolbar status while the session is active, notices for MCP updates and errors, and a disconnect action.
    • Add downloadable issue reports. Bundle selected projects, images, event files, and assistant sessions into an automatically downloaded ZIP. Open a prefilled support email afterward and reset or abort cleanly when the report popup closes.
    • New popup stack system. Sessions now retain each app’s popup stack, when switching apps. Nested popups appear on top of the stack.
    • File Manager, Status Browser, Log Viewer, and Docs now offer resizable centered workspace layouts through Tools → Layout. Each app remembers its layout mode and preferred width; Status Browser also retains column proportions and hidden Session Data columns.
    • Refreshed System Monitor with resource meters, colored health states and boot/start footers.
  • Status Browser:
    • Added timeline history support. New timeline history tab and specific popups for IO, command, and variable records, with viewing and copy support.
  • Code Editor:
    • New editor with mobile support and a collapsible file explorer.
    • Validation and Java compilation:
      • EVENTS errors now reflect unsaved edits.
      • Java validation reports errors with line and column positions before saving.
      • Compile saved Java files from the toolbar or Tools menu. Successful compilation offers a server restart; “Don’t show again” suppresses future restart prompts.
    • Find and replace:
      • Search and replace multi-line text.
      • Limit searches and replacements to the selected text or current line.
      • Added Any word, Select all matches and Reset options.
    • Themes:
      • Added TextMate, Monokai, Tomorrow Night and Cobalt2, with hover previews.
      • The selected theme is shared across Manager editors and comparison views. Editor objects retain their own theme settings.
    • Comparisons:
      • Comparison toolbar with live added and removed line counts, split/unified layout, collapse unchanged sections, and next/previous change navigation.
      • Clearer highlighting of changed lines and characters in inline and split views.
      • Horizontal scrollbars stay at the bottom of short comparison panes.
  • File Manager:
    • Improved preview and filename display. Show image dimensions in previews and improve long filename middle-ellipsis fitting during resize.
    • Added resizable details panel
    • Updated file row rendering and selection state. Refactor rendering and selection to support shift + click range.
    • Files can now be sorted by column.
    • New tree view
    • Added row shading
    • The new secrets folder has PIN confirmation. Access, downloads, uploads, backups, and changes within the folder require the current user's PIN again; searches started outside the folder hide its contents.
    • Chunked uploads, to support large files and slow connections. Reduces server memory usage.
    • Drag and drop directory uploads by zipping the directory and uploading the zip file.
  • Project Editor:
    • New AI image generation workflow Add image, icon and floor plan generation.
    • Value binding editor:
      • Preview values using live I/O and UI values, datasource data and the first table or form row. Values requiring unavailable page context show “Not available”.
      • Identify refresh calls and result lines, and report all syntax errors with line and column positions. Bindings without refresh calls are calculated when the page opens.
    • Plugin projects can now be opened from File Manager.
    • New edit popup for project defaults with type, attribute, and value entries. Defaults now apply to item attributes as well (e.g. table column attributes).
    • Added filter on Open Project popup
    • Default attribute values have a dedicated popup with type and attribute suggestions.
    • The empty add panel now includes an explanation.
  • Settings:
    • Added support for AI Profiles and Timeline rules definition
    • Cameras page:
      • Added the RTSP indicator, showing if the server supports H.264/H.265 hardware decoding
      • Added the ONVIF PTZ driver with its optional ONVIF Port field, only shown when the ONVIF driver is selected
      • Added the JPEG Quality field, only shown for RTSP cameras. The Motion Buffer field is disabled for them, as it does not apply to RTSP streams
      • Added the Static flag
    • Added the optional description of I/O Servers, Comm Ports, Cameras and Data Loggers
    • Fixed the validation of several I/O Server options, that rejected documented values or accepted values the driver could not use: inputs and outputs of ARTECOIO, apduretries and directpeers of BACNET, apduretries of BACNETSERVER, language of DOMINO, csvseparator of ESSER, nodes of KILSEN, tcpgatewaytimeout and tcpmodbuseventunitid of MODBUSRTU, pollinterval of NETIO, the list options of PROTEGE, timestampdelayoffset and timestampadvanceoffset of SIASERVER, stdout of SSH, fan_on_temp of STRATOPIMAX, pollinterval of WXONLINE and altitude of WXT520. Added the missing groupsnumber option of INIMPREVIDIA, and removed the pollinterval option of BOSCHMAP and the gui option of MYHOME and TECNOFIRE, which the drivers never read
    • Clock page:
      • Added the NTP indicator, naming the client the server keeps its clock with, chrony or ntpdate, and turning red when neither is installed
    • Web Access page: added the AuthenticationStrengthCheck, OTPAuthenticationTrustedNet and OTPAuthenticationNotTrustedNet settings, and arranged the fields in two columns, like the Web Server page
    • Users page:
      • Added the New PUK at Login flag and the OTP Key column, showing whether the user has an OTP key
      • Added the OTP button, which issues a new OTP key at once to a saved user, the current one included, and shows it
      • The current user can now be edited, except for its ID, and with the limits described in Authentication
      • Fixed the change of only the PIN or only the PUK of a saved user, which was refused with "PIN and PUK are required"
      • Errors in saving users are now reported after the Save; they used to be ignored
  • Docs: Added indexed full-text search with ranked results and highlighting
  • Assistant:
    • Assistant: Page captures list and frame objects from the overlay shown on the page.
    • Captures the requested page orientation and checks created or changed overlays on a page that shows them.
    • Reserves space for closed drawer rails so page controls remain clear.
    • Plans panels on an 8 px grid with grouped device sections, consistent control sizes and layouts scaled for different screen widths.

Server​

Configuration Files​

  • BREAKING CHANGE. The configuration files have moved from the HSYCO main directory into three sub-directories: config for the settings, state for the files that HSYCO writes on its own, and secrets for the TLS key stores and certificates. The files that belong to an I/O Server are now kept in a directory for each I/O Server, config/drivers/<type>/<io_server_id> or state/drivers/<type>/<io_server_id>, with the I/O Server type and id in lower case. See Main Folder for the full layout:
    • hsyco.ini, access.ini, acl.ini, catalog.json, dataloggers.ini, timeline.ini, digitalsign.ini, modbus-scheduler.ini and tunnel.ini are now in config. aigen/profiles.ini is now config/aigen_profiles.ini, the NLP dictionaries nlpdictionary_<language>.txt and nlpdictionary-<language>.txt are now config/nlp/dictionary_<language>.txt, hsyco.slavediff.ini is now config/ha/slavediff.ini, the Wiring Editor whitelist and blacklist files are now in config/wiringeditor, and the ir directory, with the CCF Hex remote control files of the IRTRANS I/O Servers, is now config/ir
    • keys.data, timers.data, scheduler.ini and wol.data are now in state, together with the sessions, image previews and model catalog of the AI assistant, in state/aigen, and the Wiring Editor backups, in state/wiringeditor/backups
    • hsyco.keys and clients.keys are now in secrets, and the hsyco.cert and hsyco.cert.save directories are now secrets/cert and secrets/cert.save
    • the files shared by several I/O Servers are split into one file for each I/O Server, and their lines no longer start with the I/O Server id: knxtopo.txt becomes the topology.txt file of each KNX and BAOS I/O Server; ats.ini, bentel.ini, boschfpa.ini, boschmap.ini, csx75.ini, detnov.ini, galaxy.ini, gkbus.ini, guardall.ini, hephais.ini, hesa.ini, inim.ini, inimprevidia.ini, inimprime.ini, lorawan.ini, myhome.ini, networx.ini, notifieresibm.ini, paradox.ini, tecnoalarm.ini, teledata.ini and wyrestorm.ini become config.ini; bacnet-poll.txt becomes poll.txt; bacnetservertopo.txt and bacnetserverdatapoints.txt become objects.txt and datapoints.txt
    • shellydevices.txt and mqttbroker.ini are copied to the directory of every SHELLY and MQTTBROKER I/O Server, as devices.txt and broker.ini
    • mqttsubscriptions-<id>.ini, sigfox-devices_<id>.ini, telegram-<id>.ini, wolf8access-config_<id>.ini, esser/<id>.csv and protege/csv/<id>.csv become subscriptions.ini, devices.ini, users.ini, config.ini and points.csv in the directory of their I/O Server, and the GSM <id>.puk file becomes config/drivers/gsm/<id>/sim.puk
    • the persistent data of the BACnet/SC, HUE, DIRIGERA, NETATMO, GOOGLECAL and AIGEN I/O Servers is now in state/drivers/<type>/<io_server_id>: bacnetsc-identities.ini becomes identity.ini, hue.ini becomes bridge.ini, dirigera.ini and <id>Token.ini become tokens.ini, the files of the google-calendar/<id> directory are moved as they are, and aigen/driver-sessions/<id> becomes sessions
  • existing installations are migrated automatically when HSYCO starts, and when a backup made with a previous version is restored. The original files are kept in state/.migration/<date>-<time>: to go back to a previous version, copy them back to the main directory before starting it. The lines of the shared files whose I/O Server id doesn't match any configured I/O Server, and the lines without an I/O Server id (like language in bentel.ini, read only by older versions), are not migrated: they are reported in the log and only kept in state/.migration
  • I/O Server options are not rewritten. An option that names a moved file, like a BACnet keystore option set to hsyco.keys, is reported in the log with a warning, and has to be updated by hand, for example to secrets/hsyco.keys
  • the migration also updates the AutoKillFiles setting: an entry that names a moved file, like hsyco.ini, now names its new path, like config/hsyco.ini, so HSYCO keeps restarting automatically when the configuration is saved
  • to upgrade a High Availability pair, set haDisableFilesSync = true in the hsyco.ini file of the slave before upgrading either server, because a master and a slave running different versions keep the same files at different paths, and the slave would delete the files that it doesn't find on the master. Remove the setting from config/hsyco.ini of the slave once both servers have been upgraded

Removed Features​

  • Squeezebox / SlimServer support has been removed. The product has been discontinued for many years and the user interface objects were already dropped in HSYCO 4.0. This release removes the remaining server-side implementation:
    • the slimPlayers, slimPlayerId.*, slimServerName and slimServerPort settings in hsyco.ini are no longer read, and are removed from the file the next time Settings saves it
    • the MUSIC EVENTS callback and action keyword is no longer recognized: EVENTS files still containing MUSIC statements will report a syntax error
    • the Java callbacks SlimPowerEvent(), SlimStatusEvent() and SlimVolumeEvent() and the Java methods slimButton() and slimCommand() have been removed, together with the PAUSE and PLAY constants
    • the JavaScript functions slimButton() and slimCommand() have been removed
    • the /x/slimbutton web API endpoint has been removed
    • the SQU license limit is no longer enforced. Existing license.txt files, including those listing SQU among their limits, remain valid and keep working unchanged.
  • The AXISDEC (Axis video decoder), ISMG (Carlo Gavazzi ISMG inverters), NUVO (NuVo multi-room audio) and TLAB (T-LAB security panels) I/O Servers have been removed. They were legacy built-in drivers for products that have been discontinued for many years; TLABQ remains the supported T-LAB driver:
  • The built-in IRTrans support has been replaced by the new IRTRANS I/O Server. IRTrans devices are no longer declared in hsyco.ini and are configured as standard I/O Servers instead:
    • the IRTrans, IRTransIP.* and IRTransPort settings in hsyco.ini are no longer read, and are removed from the file the next time Settings saves it
    • Comm Ports of type irtrans, used to reach the IRTrans RS232 gateway, are no longer supported
    • the IR EVENTS callback and action keyword is no longer recognized: EVENTS files still containing IR statements will report a syntax error
    • the Java callback IREvent() and the Java method irtransCommand() have been removed
    • the JavaScript function irtransCommand() has been removed
    • the /x/irtrans web API endpoint has been removed
    • the IRT license limit is no longer enforced. Existing license.txt files, including those listing IRT among their limits, remain valid and keep working unchanged. The IRTRANS I/O Server does not count against the IOS limit either
    • the format of the .ccfhex remote control files is unchanged, and existing files keep working with no modification. The ir directory is now config/ir, and is moved automatically with the other configuration files
    • the ir, irmini and irmicro objects of the HSYCO 3 user interface are automatically converted into button objects with the datapoint action when a HSYCO 3 project is migrated
  • The built-in DMX-512 support has been replaced by the new KISSBOX and ENTTEC I/O Servers. DMX gateways are no longer declared in hsyco.ini and are configured as standard I/O Servers instead, one for each DMX universe:
    • the dmxServers, dmxServersIP.*, dmxServersPort, dmxServersPort.*, dmxServersComm.* and dmxServersId.* settings in hsyco.ini are no longer read
    • the DMX and DMXSTART EVENTS callback and action keywords are no longer recognized: EVENTS files still containing DMX or DMXSTART statements will report a syntax error
    • the Java callbacks DmxEvent(), DmxStartupEvent() and DmxFilter() and the Java methods dmxSet(), dmxOn(), dmxOff(), dmxMerge() and dmxGet() have been removed, together with the MERGED constant
    • the JavaScript functions dmxSet(), dmxOn(), dmxOff(), dmxMerge() and dmxGet() have been removed
    • the /x/dmxcommand web API endpoint has been removed. Note that an existing deny; *; *; *; dmx* rule in acl.ini, written to block that endpoint, now matches writes to the data points of any I/O Server whose id starts with dmx, and should be removed or narrowed
    • DMX channel merging, and the filtering of channel values through the DmxFilter() callback, have been removed and have no replacement
    • the global DMX address, where 1000 was added to the channel number for the second gateway, 2000 for the third and so on, no longer exists: each universe is a separate I/O Server with its own id, and channels are always numbered from 1 to 512
    • the dmx action of the slider, knob and colorpicker objects, and the dmx slider action of the button, image and nav objects, no longer do anything and are deprecated. Use the datapoint action against a KISSBOX or ENTTEC data point instead
    • the dmx and dmxrgb objects of the HSYCO 3 user interface are converted into slider and colorpicker objects with the datapoint action when a HSYCO 3 project is migrated. The channel number is carried over as the data point name, and has to be re-pointed at the data point of a DMX I/O Server
    • DFDMX and MODDMX modules of the DOMINO and CONTATTO systems are no longer mirrored to a DMX gateway. Their own o<address>.<channel> data points are unchanged, and are now the only interface
    • the DMX license limit is no longer enforced. Existing license.txt files, including those listing DMX among their limits, remain valid and keep working unchanged. The KISSBOX and ENTTEC I/O Servers count against the IOS limit like any other I/O Server
  • The Samsung SNV-3120, SNP-3120, SNP-3120V and SNP-3120H camera models are no longer supported. The Panasonic, Panasonic WV and Rovio PTZ drivers have been removed as well:
    • the Camera.<id>.Type and Camera.<id>.IO settings in hsyco.ini are no longer read. The file is migrated automatically at start-up: Camera.<id>.Type = static is converted into the new Camera.<id>.Static = true, and all the other Camera.<id>.Type and Camera.<id>.IO lines are removed and reported in the log. A copy of the original file is saved as hsyco.ini.bak before it is rewritten, and the file is left untouched when there is nothing to migrate
  • I/O Servers can no longer be used as Comm Ports. The io Comm Port type, and the io:<TYPE> binding that let an I/O Server stand in for a serial port, have been removed:
    • Comm Ports, and the comm target of an I/O Server, now resolve to serial ports and server ports only
    • the MODBUSTCP I/O Server can no longer be used as a Comm Port
    • the HEPHAIS, ELSNERP03M, NOTIFIER and RAYCONTROL I/O Servers, which used it to reach a Modbus/TCP gateway, now connect to the gateway themselves: the gateway's IP address and port are set directly on the I/O Server, and the Comm ID is only used for a direct serial connection to the RS-485/RS-422 bus. Existing I/O Servers that selected a MODBUSTCP I/O Server as their Comm ID have to be reconfigured with the address and port of the gateway, port 502 by default
  • BREAKING CHANGE. Java callbacks declared in com/hsyco/user.java are no longer called. Plugins, supported for many years, are now the only way to write Java code for HSYCO. Existing code in user.java has to be moved to a plugin: see Plugins Development:
    • the callback methods are called only in plugins, EVENTS and JavaScript. Callbacks that return a value, like userCommand(), userSubmit(), PowerEvent() or httpCallEvent(), no longer give priority to the value returned by user.java
    • the userCommand(String name, String param) and userCommand(String userid, String name, String param) callbacks and the legacy virtualRemote() callback have been removed. Plugins use userCommand(String session, String userid, String name, String param), the only version they have ever supported
    • the empty callback methods and getUserVersion() have been removed from the userBase class. The command and utility methods of userBase are unchanged
    • the user class is still available, so code calling the userBase methods through it, as in user.ioSet(), keeps working
    • com/hsyco/user.class is no longer in the default AutoKillFiles list
  • The userSubmit() call named userdatalogger:<id>, generated when a (datalogger) object shows a Data Logger id not defined in hsyco.ini, and the IOStartupEvent() callback of the Galaxy, Weather Online and ESC/VP I/O Servers, are now passed to plugins and JavaScript callbacks. They were only passed to user.java before

EVENTS​

  • BREAKING CHANGE. JavaScript code always runs in global mode, and the eventsJavaScriptGlobalScope setting has been removed: all the JavaScript code in an EVENTS file shares a single global scope, so assigning a global variable inside a function or JavaScript action changes it for all the code in the file. Before, this was the case only with eventsJavaScriptGlobalScope = true; with the default, false, these assignments had no effect outside the function or action. The setting is no longer read, and is removed from hsyco.ini the next time Settings saves it. See The INIT JavaScript scope
  • the parameters of JavaScript callback functions, and triggerKey, triggerValue and sessionId, are now local to each execution. With eventsJavaScriptGlobalScope = true, assigning a parameter, as in value = "100", used to change it for all the following executions of every function in the file, and concurrent events could occasionally run each other's code
  • +, -, * and / between two unquoted words in an action value are now computed, where they used to be appended as plain text: LOG = a - b used to log a-b, and now tries to subtract b from a, skipping the action as they are not numbers. Next to a quoted string an operator is still plain text, so "a" + $n keeps producing a+10. EVENTS files that used unquoted operators as text should quote them
  • the IO word inside an action value now reads the data point that follows it, where it used to be appended as plain text. IO followed by a variable, as in IO $name, is now reported as an error
  • round brackets that group a computation in an action value are now evaluated, and removed from the text: LOG = (a - b) no longer logs (a-b). Brackets that don't take part in a computation are unchanged, so LOG = Temperature (C) still logs Temperature(C)
  • action values are now handled the same way by all actions: constants, quoted strings, variables and data points (IO name) can be freely combined and concatenated, with IO name accepted anywhere in the value. It used to be accepted only at the start of the value, ignoring anything after it, and only by some actions. Values are accepted by the $variable, IO, LOG, FILELOG, UISET, UISESSIONSET, USER, COMM, NLP, DATESET, POWER, HAACTIVE, DATALOGGER, LEAK and AUDIO voice actions, and as the last parameter of WAIT, CAMERA, CAMERAREC, CAMERARECFULL, PROGRAMTIMER and USERTIMERSET. The MAIL action accepts a single constant, variable or data point as sender and subject, and a single term or computation for each body part
  • added arithmetic to action values, with the +, -, * and / operators and round brackets, as in INIT : $var1 = ($var2 + 3) * $var3:
    • operators must be separated by spaces from their operands, so that names like knx.1/2/3 are never mistaken for a computation
    • multiplication and division are executed before addition and subtraction, from left to right, and round brackets change the order
    • on counts as 1, off as 0, and percentages as fractions, so 50% is 0.5
    • results are written without trailing zeros or rounding noise: 5 rather than 5.0, 0.3 for 0.1 + 0.2
    • % is not an operator, to avoid any confusion with percentages; the % modulo compound operator of variables, as in $count % 4, is unchanged, as are all the other compound operators, ROUND and FORMAT
    • syntax errors, like an operator with no operand, are reported when the EVENTS file is loaded. An operand that is not a number, or a division by zero, skips the action when it is executed, while the following actions are executed normally
  • added arithmetic to event conditions: the value on the right of the comparison operator of the IO, $variable, POWER, SUNAZIMUTH and SUNELEVATION events can be a variable, a data point or a computation, as in IO tempmeter.indoor > ($setpoint + 0.5) * 2 or IO tempmeter.indoor > IO tempmeter.outdoor + 5:
    • a round bracket opened after a comparison or arithmetic operator groups the computation, while a bracket where a condition starts still groups conditions
    • the computation is repeated every time the rule is evaluated; if an operand is not a number, or on a division by zero, the comparison is false
    • constant computations are checked when the EVENTS file is loaded, so SUNELEVATION > 100 - 5 is reported as out of range
    • data points and variables on the right side of the comparison don't trigger the rule evaluation, as before
    • all other events, like TIME, still accept only constant values
  • errors in events and actions are now reported with their cause, like Unbalanced brackets, Arithmetic operator '+' requires a right operand or WAIT requires a number of seconds, found 'abc'
  • errors are now reported with the line and column where the failing event or action starts, so an error in a line with several actions, or in an action continued on the following lines, points to the action that caused it
  • new SAVELOG action, which writes the most recent log messages, kept in memory, to the daily log files when persistentLog is false, for example when an error occurs. Messages already in the file are not written again, so it can be executed repeatedly. With persistentLog false, the most recent log messages are also written automatically before HSYCO restarts because of an error, like the Exception Watchdog, a database corruption or an EVENTS file load timeout. See SAVELOG

Exception Watchdog​

  • when the Exception Watchdog restarts HSYCO after ExceptionWatchdog uncaught Java exceptions, it now first moves the plugin that raised them out of the plugins directory, so that a faulty plugin can't keep HSYCO in a restart loop. This protects installations where Java plugins are written and compiled on the running system, by users or with the AI assistant. See ExceptionWatchdog:
    • every uncaught exception is attributed to the plugin of the first plugins.<name> class in its stack trace, or in the stack trace of its causes. Exceptions without a plugin class still count toward the threshold, as before
    • when the threshold is reached, the plugin with the most exceptions, the first in alphabetical order on a tie, is moved from plugins/<name> to plugins_unsafe/<name>, or to plugins_unsafe/<name>_<yyyyMMdd-HHmmss> if that directory already exists. The move is written to the log, as in EXCEPTION WATCHDOG: plugin <name> moved to plugins_unsafe/<name> after 5 uncaught exceptions. At most one plugin is moved at each restart
    • the whole plugin directory is moved, including its EVENTS files and its www directory. This is similar to how EVENTS files that take longer than EventsLoadTimeout to load are renamed with the _unsafe.txt suffix
    • if the move fails, the failure is written to the log and HSYCO restarts anyway
    • to re-enable a plugin, fix it and move its directory back to plugins
    • with High Availability, the move reaches the slave with the next file synchronization. Until it restarts, the slave keeps running the plugin, and its own watchdog moves it if the exceptions occur there too

Timeline​

  • new Timeline engine, which records I/O data point changes, I/O Server commands and variable changes, as selected by configurable rules. See Timeline

Clock​

  • added support for chrony as the NTP client. The client installed on the server is detected at start-up and reported in the log: chrony is preferred whenever it is installed, ntpdate is the fallback, and when neither is installed time synchronization is not available
  • with chrony, the clock is disciplined continuously instead of being stepped once an hour, and HSYCO only keeps chrony configured with the NTP servers it is set to use, running while Time Auto Update is on and stopped while it is off. Clearing the NTP server list gives chrony back its own default time sources
  • the TimeNTPServerName setting now takes a list of time servers, separated by commas, semicolons or spaces

Cameras​

  • added support for RTSP cameras, with H.264 and H.265 streams decoded through the ffmpeg service:
    • an RTSP source is configured by setting Camera.<id>.URL to an rtsp:// or rtsps:// address; Camera.<id>.URL.Small accepts RTSP addresses as well, so that a camera can use the main stream for the full size view, and a lower resolution substream for the thumbnails
    • credentials are taken from the Camera.<id>.User and Camera.<id>.Password settings, or can be embedded in the URL
    • the stream is opened over RTSP/TCP only while the camera is actually in use, for live view or recording, and closed as soon as the camera goes back to standby
    • frames are generated at the rate set by the CamerasRefreshMillis setting, so the acquisition rate doesn't depend on the frame rate of the source stream
    • the new Camera.<id>.JPEGQualityFactor setting configures the quality of the JPEG frames encoded from the stream, on the ffmpeg -q:v scale from 2, the best quality, to 31, with a default of 12. It only applies to RTSP cameras
    • RTSP requires a server with H.264/H.265 hardware decoding support. The ffmpeg installation is probed at start-up to detect what the server can really decode, testing each method with an actual decode. Software decoding is not used as a fallback: a camera whose codec has no hardware support on that server is stopped, and the reason is reported in the log
    • the motion buffer does not apply to RTSP cameras, as it would require keeping the stream and the hardware decoder open at all times
  • added the ONVIF PTZ driver, Camera.<id>.PTZ = onvif, supporting pan, tilt, zoom and the home position of any camera that implements the ONVIF PTZ service. This is the recommended driver for RTSP cameras, and for any camera that doesn't have a specific PTZ driver:
    • the new Camera.<id>.ONVIFPort setting configures the ONVIF device service port. When not set, the port is discovered with WS-Discovery, which only reaches cameras that answer a probe on the local network: if nothing answers, PTZ control is disabled for that camera and the log reports what to do. Setting the port explicitly always works, and is the recommended configuration for cameras that are not on the same network as the server
    • the device service is contacted over HTTP first, then over HTTPS on the same port, accepting the self-signed certificates typically installed on cameras
    • the camera user and password, either configured with the Camera.<id>.User and Camera.<id>.Password settings or embedded in the camera URL, are used for the ONVIF authentication
  • added the Camera.<id>.Static setting, replacing the Camera.<id>.Type = static attribute of previous versions
  • added the Camera.<id>.Description setting

I/O Servers​

AIGen I/O Server​

  • new I/O Server for AI models integration

Arteco I/O Server​

  • the outputdiscovery option now defaults to false, as documented. It used to default to true

BACnet I/O Server​

  • added support for the BACnet/SC (Secure Connect) datalink, with hub and failover hub connections, direct node-to-node connections, and TLS credentials from either a key store or PEM files
  • added foreign device registration with a BBMD, to communicate with BACnet/IP devices on remote routed subnets
  • added support for segmented messages on all confirmed services, both received and transmitted
  • added support for the SubscribeCOVProperty service
  • added support for several BACnet I/O Servers with the same UDP port number on different networks
  • extended the set of writable properties, and added the device object
  • added the polling engine and the Polling page of the BACnet Utility, with per-row statistics, per-device request batching, variable-gated rows, enabled/disabled rows, guided device/object/property selection, and the Poll shortcut buttons of the objects and properties tables

BACnet Server I/O Server​

  • added support for the BACnet/SC (Secure Connect) datalink, with HSYCO acting as an SC hub
  • added foreign device registration with a BBMD, so that clients on remote routed subnets can discover and reach the server
  • added support for segmented messages, both for the requests received and for the responses sent
  • added support for the AtomicReadFile service, to read the BACnet/SC certificate File objects
  • added the built-in Device and Network Port objects, and the built-in File objects in BACnet/SC mode
  • added support for the priority array and the Relinquish_Default property of commandable objects
  • extended the set of writable properties of the supported object types
  • removed the command object type

Bosch FPA I/O Server​

  • the language option now accepts en for English. It used to be reported as a format error and fall back to the system language

Dummy I/O Server​

  • added RGB and RGBW colour devices, with the rgb.<n> and rgbw.<n> data points, their .on, .brightness, .fault and .white companions, and the new rgbs and rgbws options. A colour device keeps its colour when it is off, so the user interface can show the colour it will come back to, and its colour, brightness and state can all be set independently on its own data point, while its .brightness and .white data points behave as dimmers, for sliders and knobs
  • the rgb.<n>.fault and rgbw.<n>.fault data points simulate an unreachable device, so a project can be designed and tested against the fault flag of the user interface without unplugging anything
  • the DUMMY I/O Server is now a standard driver. Configuration, data points and options are unchanged, and existing installations, including their persistent state, are not affected. The only difference is in the EVENTS start-up trigger: a DUMMY I/O Server now fires IOSTART <id> only, using the I/O Server's name, and no longer the IOSTART <index> form based on its position in the ioServers list
  • the lights, dimmers, automations, rgbs and rgbws options now accept 10000, as documented. It used to be ignored, creating no devices

Elsner I/O Server​

  • a Modbus/TCP gateway is now reached by setting its IP address and port directly on the I/O Server, and the Comm ID is only used for a direct serial connection. A MODBUSTCP I/O Server can no longer be selected as the Comm ID: see the Removed Features section
  • fixed the light UISET value, that was showing "lkux" instead of "klux"
  • the light.lux data point is documented as 10th of lux, matching the value the driver has always been publishing

Enttec I/O Server​

  • new I/O Server, replacing the built-in DMX gateway support of previous versions. It drives one DMX-512 universe through an ENTTEC DMX USB PRO adapter
  • DMX channels are exposed as data points, created the first time they are written or refreshed: <channel> for a single channel, rgb.<channel> for three consecutive channels and range.<low>.<high> for a block, plus the usual connection data point
  • data points accept a level between 0 and 255, the <n>/<m> and <n>% formats, a per-channel list, and the on, off, flip and refresh keywords. Data points that overlap on the same channel are always kept in sync
  • the adapter now requires an explicit Comm Port definition, where the serial device name used to be entered directly in the DMX section of the Settings
  • the adapter has no read-back: all channels are preset to zero when HSYCO starts, and channel levels are retained if the I/O Server is restarted while HSYCO keeps running

Hephais I/O Server​

  • a Modbus/TCP gateway is now reached by setting its IP address and port directly on the I/O Server, and the Comm ID is only used for a direct serial connection. A MODBUSTCP I/O Server can no longer be selected as the Comm ID: see the Removed Features section

HID Edge Solo I/O Server​

  • minor fixes

Hue I/O Server​

  • Writing a colour to the light.<n>.rgb datapoint no longer turns the light on, and writing 0,0,0 no longer turns it off: colour and state are now independent, as they already are for the hue, saturation and xy datapoints. EVENTS and user code that relied on a colour write to switch a light must add the state explicitly, as IO hue.light.1.rgb = 255,67,31,on, or write the on datapoint
  • support for the first generation Hue bridge (v1, round) has been removed, as it does not implement the CLIP v2 API and cannot be updated to a firmware that does
  • the driver has been rewritten on the Philips Hue CLIP v2 API, replacing the discontinued Philips Java SDK. Existing installations are upgraded in place: the bridge does not have to be paired again, and lights keep their numbering
  • added support for the Hue Bridge Pro
  • state is now received as push events over the bridge's event stream instead of being polled, so changes are reported in about a second instead of at the polling interval
  • added support for rooms and zones, scenes, Hue Dimmer Switches, Tap Dials and Smart Buttons, and Hue Secure contact sensors, cameras and sirens
  • added the resources option, to select which families of devices are exposed
  • added the ipaddress option and extended the mac option, which now also locates a bridge whose address is assigned by DHCP and follows it when the address changes
  • added the discovery option: the driver operates entirely on the local network by default, and only queries the Philips cloud discovery service if explicitly configured to
  • added the idmode and colorloopmode options. Lights keep the numbers they had in the CLIP v1 API, so projects migrated from HSYCO 4.1 keep working; every other kind of resource is numbered from 1 within its own kind
  • the pollinterval option is now the interval of a background safety resynchronization, and its default has changed from 10 to 300 seconds
  • the light.<n>.rgb and light.<n>.xy datapoints now separate their components with commas instead of semicolons, consistently with the other I/O Servers that publish a combined colour value; a write accepts commas, semicolons, asterisks or spaces
  • the rgb, hue, saturation and xy datapoints now report the colour of a light that is off, instead of reporting black, so the user interface can show the colour the light will come back to. A light is published to the user interface as <r>*<g>*<b>*<on|off>, with *fault appended while it is unreachable
  • while the connection to the bridge is offline, every device now reports reachable as 0 and carries the fault flag in the user interface, returning to its own state as soon as the bridge answers again
  • light.<n>.on = flip now works. It was documented by the previous driver but had no effect
  • the light.<n>.dimmer datapoint reports 99% correctly. The previous driver reported it as 100%
  • replaced the master option with the new powerup option and light.<n>.powerup datapoint, which configure the lamp's own power-on behaviour so that a light restores its state after a power loss by itself, instead of being polled and corrected. Lights that do not support the feature are listed in the log at start-up
  • a newly configured I/O Server with no ipaddress or mac now selects the bridge that no other I/O Server has paired with, instead of the first one to answer, so a second bridge can be added without configuring anything; when the choice is ambiguous the driver reports which bridges it found and which I/O Server owns each
  • persistent state, including the bridge application key and the resource numbering, is now kept in the hue.ini configuration file instead of persistent variables
  • the connection to the bridge is now HTTPS only, with full certificate validation against the Philips Hue root certificate authorities

HWGIO I/O Server​

  • added the connection datapoint
  • removed support for the I/O Controller's serial port gateway, and the io comm port type that was used to access it

HWGMONITOR I/O Server​

  • added the connection datapoint

IRTrans I/O Server​

  • new I/O Server, replacing the built-in IRTrans support of previous versions

Kissbox I/O Server​

  • new I/O Server, replacing the built-in DMX gateway support of previous versions. It drives one DMX-512 universe through a KissBox DMX-512 transceiver
  • DMX channels are exposed as data points, created the first time they are written or refreshed: <channel> for a single channel, rgb.<channel> for three consecutive channels and range.<low>.<high> for a block, plus the usual connection data point
  • data points accept a level between 0 and 255, the <n>/<m> and <n>% formats, a per-channel list, and the on, off, flip and refresh keywords. Data points that overlap on the same channel are always kept in sync
  • the IP Port is the transceiver's TCP control port, and is required, as the KissBox has no factory default. The UDP channel output always uses the next port number
  • the driver reads all the channels of the universe when it starts, and on every refresh, so HSYCO reports the levels the bus is actually holding
  • the connection is re-established automatically after a network failure, keeping the data points and the channel levels

KNX I/O Server​

  • Colours are now reported comma separated, as "255,0,0" rather than "255*0*0", consistently with every other I/O Server that publishes a colour, so a colour read from one can be written straight to a device on another. This applies to the rgb.<n> virtual datapoint and to DPT 232 and DPT 251 datapoints alike. EVENTS and user code that parsed any of them on the asterisk must be updated. Writing is unaffected: the asterisk is still accepted, along with commas, semicolons and spaces
  • rgb.<n> no longer reports "0*0*0" when the light is off: it reports the colour the light is holding, whether it is on or off. EVENTS and user code that tested the colour datapoint for "0*0*0" to detect an off light must read the new rgb.<n>.on datapoint instead. Writing "0*0*0" to turn a light off still works, and is unchanged
  • RGB virtual datapoints now follow the same colour device behaviour as the DUMMY, HUE and SHELLY I/O Servers: the colour and the state are independent, so setting a colour never turns a light on, a colour of all zeros is ignored, and a colour and a state can be set in one write by adding on or off as a last field
  • added the rgb.<n>.on and rgb.<n>.fault datapoints. .fault is set while the I/O Server cannot reach the bus
  • added support for RGBW lights: the colour datapoints of an RGB virtual datapoint can be DPT 251, carrying the white channel in the colour telegram, or DPT 232 with the white channel on a DPT 5 datapoint of its own, declared with the new fb.white and cmd.white attributes in knxtopo.txt and configurable in the KNX Utility. The white is published as the rgb.<n>.white datapoint, a level of its own that a slider or a knob can be bound to, and rgb.<n> reports it as a fourth channel
  • switching on an RGB light that has no cmd.onoff command datapoint now writes the colour the light was last showing, instead of a fixed white
  • added support for the KNXnet/IP Routing service, with the routing, multicast and individualaddress I/O Server options
  • added support for the KNXnet/IP Secure protocol, both for secure tunneling and secure routing, with the securemode, keyringfile and keyringpassword I/O Server options and the import of the ETS keyring (.knxkeys) file
  • added support for KNX Data Secure: group addresses that have a key in the keyring are automatically sent and received encrypted, over any connection mode
  • added KNXnet/IP gateway discovery: the gateway's capabilities are detected when connecting, to automatically select plain or secure tunneling, and the new discover datapoint lists all the gateways available on the network
  • added the import of password-protected ETS6 project files
  • added the localhost I/O Server option to bind the driver to a specific local network interface and port
  • added the "setpoint.mode.values" and "setpoint.mode.labels" thermostat attributes, to redefine the setpoint modes in knxtopo.txt
  • the knxtopo.txt file is now automatically reloaded when it changes, with no need to restart HSYCO

Notifier I/O Server​

  • a Modbus/TCP gateway is now reached by setting its IP address and port directly on the I/O Server, and the Comm ID is only used for a direct serial connection. A MODBUSTCP I/O Server can no longer be selected as the Comm ID: see the Removed Features section

RayCONTROL I/O Server​

  • a Modbus/TCP gateway is now reached by setting its IP address and port directly on the I/O Server, and the Comm ID is only used for a direct serial connection. A MODBUSTCP I/O Server can no longer be selected as the Comm ID: see the Removed Features section
  • fixed the decoding of negative temperatures, that were reported as large positive values

Shelly I/O Server​

  • A level written to .brightness or .white now turns the channel on, as a dimmer does, and 0 turns the channel off instead of being sent to the device as a zero level. User code that set a level without meaning to switch the channel on must write the level and the state separately
  • The .rgb data point now reports <r>,<g>,<b>. It was documented as write only, but the driver was publishing the raw JSON array reported by the device, such as [255,67,31]: user code that read and parsed that value must be updated
  • The .brightness data point now reports a percentage, and both .brightness and .white report off while the channel is off, where they used to report the plain level the device reports. User code that read either of them as a number must be updated
  • RGB, RGBW and RGBCCT channels now follow the shared colour device behaviour, and can be controlled with the colorpicker object, which the Shelly I/O Server did not offer before
  • the .rgb data point of a colour channel is now readable, and reports the colour as <r>,<g>,<b>, with the white channel as a fourth field on an RGBW channel. It used to be write only, and the value published internally was the raw JSON array the device reports, such as [255,67,31]
  • the .state and .rgb data points now accept flip
  • a level written to .brightness or .white now turns the channel on, as a dimmer does, and 0 turns it off keeping the level, so a slider can bring a channel that is off back up. The .white data point is published in the <w>/255 fractional format in the catalog, so a slider shows the correct position
  • added the .fault data point of colour channels, set while the device is unreachable
  • fixed the RGBCCT channel of the Shelly RGBCCT Bulb, whose status was not published at all and whose colour could not be set
  • added support for the Shelly Pro 3 EM (SPEM-003CEBEU), and for the model codes of the Shelly Dimmer 0/1-10V PM (Gen4) (S4DM-0010WW), of the UL versions of the Shelly Pro 1, Pro 1 PM, Pro 2, Pro 2 PM, Pro 3 and Pro 4 PM, and of the V1 versions of the Shelly Plus Plug S (SNPL-00110EU, SNPL-0112EU)

TLABQ I/O Server​

  • fixed the httprequestwait option, that was ignored: the wait between HTTP requests was taken from the pollinterval option instead. The option is now documented

High Availability​

  • BREAKING CHANGE. The synchronization between the master and the slave now uses HTTPS only. The slave retrieves the files and variables lists, and the files, from the master over HTTPS, and the master asks the slave to release the active state over HTTPS. Both servers reject these requests when they are received over plain HTTP, writing an error to the log:
    • High Availability now requires the HTTPS server, as well as the SYSLOG server, on both the master and the slave, with the same HTTPSSLServerPort and SysLogServerPort values. If HTTPSSLServerPort is not set, High Availability is disabled and an error is written to the log. See High Availability
    • the HTTP server is no longer used by High Availability, and HTTPServerPort can be left unset
    • a master and a slave running different versions cannot synchronize: upgrade both servers (see also the Configuration Files upgrade procedure)
  • the master now becomes active as soon as the slave acknowledges its release request. Because of a bug, the acknowledgement was never recognized, and the master became active only after haTimeoutSeconds, once the slave beacons had stopped

User Sessions​

  • BREAKING CHANGE. Session IDs no longer contain the authentication key of the browser. The session ID passed to EVENTS (sessionId), to the Java callbacks (like loginEvent(), logoutEvent(), pageEvent(), userCommand() and the data source callbacks) and to the JavaScript API used to start with the key stored in the browser's key cookie, which works as a password for that browser. It now starts with a random 20-character ID, followed by the web view id as before, like 3f9a0c1e7b24d58e6a10/<web view id>; loginEvent() and logoutEvent() receive the 20-character ID only. The Manager session list and the AI assistant and MCP tools show the same IDs. Session IDs still change at every login: code that stores or parses session IDs should be checked

Authentication​

  • BREAKING CHANGE. The users' credentials are now stored with a server key, and the converted files can't be read by older versions. config/access.ini and state/keys.data used to store unsalted SHA-1 hashes of the PINs (or usernames) and PUKs (or passwords): with a copy of access.ini, every PIN could be recovered at once, and the PUKs with enough computing power. They now store HMAC-SHA256 values of the PINs and usernames, and Argon2id values of the PUKs and passwords, all depending on a random server key kept in the new secrets/access.key file, which HSYCO creates at the first start. See access.ini and access.key:
    • existing files are converted automatically at the first start, and nothing changes for the users: they log in with the same PIN and PUK, and the browsers' sessions stay valid. The conversion takes up to about a second for each user on a Raspberry Pi 4. Old values found later, for example in an access.ini restored from an old backup, and users added by hand with a clear PIN, are converted the same way
    • there is no way back to an older version other than restoring a backup made before the upgrade: make a backup of the Config component before upgrading
    • keep secrets/access.key together with access.ini: without it nobody can log in, and HSYCO doesn't create a new key once the stored values depend on it. The Config component of backups now includes secrets/access.key and secrets/otp.data, which are restored together with access.ini. After restoring a backup made on another installation, users have to log in again
    • High Availability: upgrade both servers together, because an older slave can't read the converted access.ini. The slave always receives secrets/access.key and secrets/otp.data from the master, and never creates its own key: until it has received the master's key, logins on the slave are refused. With haDisableFilesSync = true (see the Configuration Files upgrade procedure), copy secrets/access.key from the master to the slave by hand, or remove the setting once both servers have been upgraded
  • Credential strength check. The server rejects new and changed PUKs and passwords that are easy to guess wherever they are set: the users pages, the setup wizard, the own PUK page, the first login of a user added with a clear PIN, the new PUK or password at login, and the accessNewUser(), accessUpdateUser() and accessModifyUserPukPwd() Java methods. Existing PUKs and passwords keep working. With the check, passwords must be at least 12 characters long. There is no list of common passwords. Set AuthenticationStrengthCheck = false to disable it. See AuthenticationStrengthCheck
  • New PUK or password at the next login: besides the users pages, the flag can be set by adding ,reset at the end of the user's line in access.ini. It is cleared when the user sets the new PUK or password
  • Administrators can now edit their own user on the users pages: PIN and PUK (or username and password), the new PUK or password at the next login and the OTP key. They still can't delete or disable their own user, remove its administrator rights, or restrict its projects when it has access to all of them, because administrators restricted to some projects can't use the Manager. A new PIN or username ends the user's sessions, the current one included
  • Two-factor authentication with one-time passwords (OTP). With OTPAuthenticationTrustedNet and OTPAuthenticationNotTrustedNet, a login can require the 6-digit time-based code (RFC 6238) of an authenticator app: never (no, the default), when a device is paired with PIN and PUK, or username and password (peering), or at every login (always), separately for the trusted network (and trustedUsers) and for the other networks. See OTPAuthenticationTrustedNet:
    • users have no OTP key until an administrator issues one with the OTP button in Manager Settings / Users, from the users management page, or with accessOTPKeyIssue(); this includes new users and users created by earlier versions. Users without a key can't log in where an OTP is required. When OTP is enabled, the users without a key are listed in the log at startup
    • the keys are stored encrypted in the new secrets/otp.data file
    • the server clock must be synchronized, for example with NTP, or every OTP is rejected
    • after 3 wrong codes the login is cancelled, and after 10 wrong codes within 15 minutes the OTP checks of the user are blocked for 15 minutes

HTTP Server​

  • Performance improvements. Serve cacheable project JSON resources. Serve project boot payload (JSONConfig, JSONState 0, JSONTopo)
  • Security improvements.

Java API​

  • Plugins and drivers can now create PDF documents with text, lists, tables, images, drawings, headers and footers. See PDF Document API.
  • Plugins and drivers can now create and read Office and PDF files with the libraries included in HSYCO. Projects that keep their own copy of these libraries in the HSYCO folder must remove it and recompile; HSYCO logs a warning at startup for a copy unpacked as class files, but not for one kept as a JAR file. See Office and PDF Libraries.
  • accessNewUser() and accessUpdateUser() return the new value -5 when the PUK or password is too easy to guess, and have new overloads with a resetCredentials argument, to require a new PUK or password at the next login. accessModifyUserPukPwd() also returns false when the new PUK or password is too easy to guess, or equals the current one, and clears the reset flag. See User Administration
  • new accessCheckPukPwdStrength(), accessOTPKeyIssue(), accessOTPKeyIsSet() and accessOTPKeyURI() methods
  • accessGetAllUsers() returns two more values for each user: the reset flag and whether the user has an OTP key
  • accessIsPinUsed() now also checks disabled users and users waiting for their first login
  • new saveLog() method, which writes the most recent log messages, kept in memory, to the daily log files when persistentLog is false. See saveLog

JavaScript API​

  • new saveLog() function, which writes the most recent log messages, kept in memory, to the daily log files when persistentLog is false. See saveLog

GUI​

  • Assistant:
    • New AI assistant. Add shared assistant chat with profile and model selection, context awareness, file uploads, generated downloads, and realtime keyboard and voice modes for OpenAI.
  • Lazy load project pages and contents. Defer page and popup shell creation until lookup, then load page contents on demand with an LRU unload policy while keeping overlays eager.
  • Cache versioned static resources. Added a versioned query parameter to static resources to avoid caching issues.
  • Replace deprecated CSS zoom with transform scaling
    • Shows the latest activity beneath collapsed Working blocks.
  • Client:
    • Update Command API to return fields to popup opener. Route fields from a successful page close to the recorded opener surface.
    • Remove DMX support. HSYCO 3 DMX controls are converted to datapoint-backed sliders and color pickers with empty data point addresses; existing HSYCO 4 DMX actions must be replaced manually. Breaking change!
  • Nuvo:
    • Remove obsolete Nuvo and Nuvomini files
  • Value bindings:
    • New expression engine, smaller and significantly faster on large projects. Value bindings now use &&, ||, !, %. Existing projects are converted automatically when loaded; bindings pasted from older projects or documentation with and/or/not/mod/xor are reported as errors showing the replacement.
    • Support if/else, switch, break and return. Switch cases compare by type and value. Unsupported JavaScript syntax receives specific diagnostics.
    • && and || return an operand and short-circuit; !, xor, and() and or() return booleans.
    • device(), ui(), value(), attr() and ds() accept computed arguments. Dynamic reads determine what refreshes the binding; attr() also refreshes on changes to attributes of its own object.
  • Authentication:
    • OTP login:
      • Supports one-time-code challenges in the client, Manager, login pages and native app, with paste and code autofill.
      • Shows OTP enrollment status and issues new keys after confirmation, also the administrator's own key.
      • Provides an enrollment QR code and copyable key, keeping the popup open until saving is acknowledged and clearing its contents afterward.
    • Credential hardening:
      • Requires a new PUK or password at the next login when configured by an administrator.
      • Rejects weak PUKs and passwords with a reason when AuthenticationStrengthCheck is enabled.
      • Offers explicit sign-in with the new secret after an interrupted credential reset.
    • Authentication supports passwords up to 64 characters.

GUI Objects​

  • Field:
    • Added table selection popup. Add table as a popup-backed field type with single and multi-row selection.
  • List, Select Fields: added support for list item descriptions, allowing for a secondary line of text to be displayed in list items.
  • Table:
    • Support value bindings on Hide Field attribute
    • Stabilize virtualized scrolling backgrounds. Keep regular and frozen-column backgrounds painted beneath to limit flicker when scrolling.
    • Built-in add and edit popup fields can now be customized through Items. The current source is shown during customization, custom Items can be cleared to restore generated fields, and preview layout controls are unavailable while custom Items are active.
    • Check and checkbox columns now support three states, displaying indeterminate values as a minus. Filters include each supported state, while indeterminate values count as unchecked in footer summaries.
  • Table, Form: added a formValue value binding that returns the current value of a form field.
  • Watch:
    • Aligned action names. Rename user to command, device to datapoint
    • New Watch datalogger object
  • Scheduler:
    • Share concurrent calendar reads. Speeds up multiple schedulers.
  • Nav:
    • Offscreen mode. Added edge-pinned offscreen geometry with optional page pushing and preserve drawer behavior.
    • Navigation: Border and dot selection marks animate between items, including section tabs. Reduced motion disables the slide.
    • Refined appearance and Gap spacing. New attributes: Button Min Height and Text Align (vertical only), Padding
  • Button:
    • Submit action: lock submitted forms until completion.
  • Datalogger:
    • Add full-range navigation. Add browser controls that shift the range back/forward by the full period
  • Calendar:
    • New Display Mode attribute. Displays events as labels instead of dots. Each event can also apply a color to its dat cell.
  • Datetime:
    • Date and time fields now use a combined datetime field and a consistent calendar and time picker. Previous fielddatetime objects are automatically converted.
  • Camera:
    • Single and list modes are now named Basic and Controls.
    • Added attributes to configure PTZ and motion-list controls
  • Form, Edit Popups: new Footer Items attribute. Footers can now include bound buttons, text, icons, spacers, and dividers alongside built-in form and edit-popup actions.
  • Slider:
    • Refine state handling and add power switch layout. Show unknown/fault icons. Add button layout for power switch. Repeated On commands no longer set the maximum value.
    • Added stepped values, labels and bar sizing. Step snapping, track dots, ordered labels for selected and pending values, and small, medium, large, or custom bar thickness. Empty or absent Value settings default to the range minimum, explicit zero values are preserved, and device feedback and commands remain numeric.
  • Colorpicker:
    • New Picker, Sliders, Swatches, and Tabbed layouts are available, with optional fields and orientation-aware sizing. The power control now uses a switch. Editable JSON palettes, localized presets, and browser customization are available.
  • List, Field, Radio Group: Add the Item Data Map attribute. Replaces the previous Label Data Name, allowing to map datasource columns to all the supported item attributes.
  • Datalogger:
    • Live and Browser charts now support touch range selection with localized View and Zoom buttons, automatic dismissal after four seconds, and two-finger undo. Mouse drag selections show the same summaries, zoom on release, and can be cancelled with right-click or Escape. Stacked-bar summaries use original values.
  • Form:
    • Experimental split Multi Edit Mode repeats basic layouts for each selected key, with independent values, bindings and field modifiers. Available in standalone forms and table/list edit popups, with partial-save retries; flat submissions are unsupported.
    • New "multirequired" live attribute for fields. Removes the selection checkbox
  • Editor:
    • New attributes grouped under Field, Editing, Syntax, Appearance, and Diff. Including syntax highlighting, themes, indentation, wrapping, and folding.
    • Compare: display a read-only Original Value in split view, with optional labels and preserved text, undo history, selection, and scroll position.
    • Multi-line find and replace, including search in selection.
  • Upload:
    • Improved upload feedback with accurate batch counts, localized status messages, file-type rejection messages, and a Retry action that reopens the file picker.
    • Upload progress remains stable across responsive layouts, with readable filenames and full hover text.
    • Cancelled uploads remain idle, outdated responses do not affect later uploads, and completion is reported after the server saves the file.

Bug Fixes​

Manager​

  • Project Editor:
    • Refactored the selection and editing canvas. Flex, grid layouts and rotated objects are now displayed and selected correctly.
  • Code Editor:
    • Markdown highlighting now works.

Settings​

  • Minor fixes to Network configuration
  • Users page: Last Access, Login Errors and Last IP were updated only when access.ini was reloaded; they are now updated after every login, successful or not

Java API​

  • accessUpdateUser() with the enabled argument set to null changed the enabled state of the user, instead of leaving it unchanged

GUI Objects​

  • Datasource: Fixed partial update failures being treated as successful in forms, table edits, and CSV imports. Errors now show how many row updates failed out of the total submitted.
  • Table: copy selected text without formatting.
  • Field:
    • Secondary text in select popup rows now wraps at word boundaries.
  • Form:
    • Tab selection and visibility now stay in sync. Tab and Back/Next navigation now work in Project Editor popup previews.
    • Tab navigation now reaches select fields, and Shift+Tab can leave the field.
  • Button:
    • Fix look rounded, it displayed as a rectangle.
  • Slider:
    • Titles and labels now adapt to available space, with label and value alignment options and a shared-row preset. Off commands are preserved when newer discrete commands replace failed brightness commands.
  • Tributton:
    • Scales directional icons with available space.
    • Support vertical layout, based on aspect ratio.