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:
inputsandoutputsof ARTECOIO,apduretriesanddirectpeersof BACNET,apduretriesof BACNETSERVER,languageof DOMINO,csvseparatorof ESSER,nodesof KILSEN,tcpgatewaytimeoutandtcpmodbuseventunitidof MODBUSRTU,pollintervalof NETIO, the list options of PROTEGE,timestampdelayoffsetandtimestampadvanceoffsetof SIASERVER,stdoutof SSH,fan_on_tempof STRATOPIMAX,pollintervalof WXONLINE andaltitudeof WXT520. Added the missinggroupsnumberoption of INIMPREVIDIA, and removed thepollintervaloption of BOSCHMAP and theguioption 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:
configfor the settings,statefor the files that HSYCO writes on its own, andsecretsfor 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>orstate/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.iniandtunnel.iniare now inconfig.aigen/profiles.iniis nowconfig/aigen_profiles.ini, the NLP dictionariesnlpdictionary_<language>.txtandnlpdictionary-<language>.txtare nowconfig/nlp/dictionary_<language>.txt,hsyco.slavediff.iniis nowconfig/ha/slavediff.ini, the Wiring Editor whitelist and blacklist files are now inconfig/wiringeditor, and theirdirectory, with the CCF Hex remote control files of the IRTRANS I/O Servers, is nowconfig/irkeys.data,timers.data,scheduler.iniandwol.dataare now instate, together with the sessions, image previews and model catalog of the AI assistant, instate/aigen, and the Wiring Editor backups, instate/wiringeditor/backupshsyco.keysandclients.keysare now insecrets, and thehsyco.certandhsyco.cert.savedirectories are nowsecrets/certandsecrets/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.txtbecomes thetopology.txtfile 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.iniandwyrestorm.inibecomeconfig.ini;bacnet-poll.txtbecomespoll.txt;bacnetservertopo.txtandbacnetserverdatapoints.txtbecomeobjects.txtanddatapoints.txt shellydevices.txtandmqttbroker.iniare copied to the directory of every SHELLY and MQTTBROKER I/O Server, asdevices.txtandbroker.inimqttsubscriptions-<id>.ini,sigfox-devices_<id>.ini,telegram-<id>.ini,wolf8access-config_<id>.ini,esser/<id>.csvandprotege/csv/<id>.csvbecomesubscriptions.ini,devices.ini,users.ini,config.iniandpoints.csvin the directory of their I/O Server, and the GSM<id>.pukfile becomesconfig/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.inibecomesidentity.ini,hue.inibecomesbridge.ini,dirigera.iniand<id>Token.inibecometokens.ini, the files of thegoogle-calendar/<id>directory are moved as they are, andaigen/driver-sessions/<id>becomessessions
- 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 (likelanguageinbentel.ini, read only by older versions), are not migrated: they are reported in the log and only kept instate/.migration - I/O Server options are not rewritten. An option that names a moved file, like a BACnet
keystoreoption set tohsyco.keys, is reported in the log with a warning, and has to be updated by hand, for example tosecrets/hsyco.keys - the migration also updates the
AutoKillFilessetting: an entry that names a moved file, likehsyco.ini, now names its new path, likeconfig/hsyco.ini, so HSYCO keeps restarting automatically when the configuration is saved - to upgrade a High Availability pair, set
haDisableFilesSync = truein thehsyco.inifile 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 fromconfig/hsyco.iniof 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.*,slimServerNameandslimServerPortsettings inhsyco.iniare no longer read, and are removed from the file the next time Settings saves it - the
MUSICEVENTS callback and action keyword is no longer recognized: EVENTS files still containingMUSICstatements will report a syntax error - the Java callbacks
SlimPowerEvent(),SlimStatusEvent()andSlimVolumeEvent()and the Java methodsslimButton()andslimCommand()have been removed, together with thePAUSEandPLAYconstants - the JavaScript functions
slimButton()andslimCommand()have been removed - the
/x/slimbuttonweb API endpoint has been removed - the
SQUlicense limit is no longer enforced. Existinglicense.txtfiles, including those listingSQUamong their limits, remain valid and keep working unchanged.
- the
- The
AXISDEC(Axis video decoder),ISMG(Carlo Gavazzi ISMG inverters),NUVO(NuVo multi-room audio) andTLAB(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.iniand are configured as standard I/O Servers instead:- the
IRTrans,IRTransIP.*andIRTransPortsettings inhsyco.iniare 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
IREVENTS callback and action keyword is no longer recognized: EVENTS files still containingIRstatements will report a syntax error - the Java callback
IREvent()and the Java methodirtransCommand()have been removed - the JavaScript function
irtransCommand()has been removed - the
/x/irtransweb API endpoint has been removed - the
IRTlicense limit is no longer enforced. Existinglicense.txtfiles, including those listingIRTamong their limits, remain valid and keep working unchanged. The IRTRANS I/O Server does not count against theIOSlimit either - the format of the
.ccfhexremote control files is unchanged, and existing files keep working with no modification. Theirdirectory is nowconfig/ir, and is moved automatically with the other configuration files - the
ir,irminiandirmicroobjects of the HSYCO 3 user interface are automatically converted intobuttonobjects with thedatapointaction when a HSYCO 3 project is migrated
- the
- 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.iniand are configured as standard I/O Servers instead, one for each DMX universe:- the
dmxServers,dmxServersIP.*,dmxServersPort,dmxServersPort.*,dmxServersComm.*anddmxServersId.*settings inhsyco.iniare no longer read - the
DMXandDMXSTARTEVENTS callback and action keywords are no longer recognized: EVENTS files still containingDMXorDMXSTARTstatements will report a syntax error - the Java callbacks
DmxEvent(),DmxStartupEvent()andDmxFilter()and the Java methodsdmxSet(),dmxOn(),dmxOff(),dmxMerge()anddmxGet()have been removed, together with theMERGEDconstant - the JavaScript functions
dmxSet(),dmxOn(),dmxOff(),dmxMerge()anddmxGet()have been removed - the
/x/dmxcommandweb API endpoint has been removed. Note that an existingdeny; *; *; *; dmx*rule inacl.ini, written to block that endpoint, now matches writes to the data points of any I/O Server whose id starts withdmx, 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
dmxaction of theslider,knobandcolorpickerobjects, and thedmxslider action of thebutton,imageandnavobjects, no longer do anything and are deprecated. Use thedatapointaction against a KISSBOX or ENTTEC data point instead - the
dmxanddmxrgbobjects of the HSYCO 3 user interface are converted intosliderandcolorpickerobjects with thedatapointaction 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
DMXlicense limit is no longer enforced. Existinglicense.txtfiles, including those listingDMXamong their limits, remain valid and keep working unchanged. The KISSBOX and ENTTEC I/O Servers count against theIOSlimit like any other I/O Server
- the
- The
Samsung SNV-3120,SNP-3120,SNP-3120VandSNP-3120Hcamera models are no longer supported. ThePanasonic,Panasonic WVandRovioPTZ drivers have been removed as well:- the
Camera.<id>.TypeandCamera.<id>.IOsettings inhsyco.iniare no longer read. The file is migrated automatically at start-up:Camera.<id>.Type = staticis converted into the newCamera.<id>.Static = true, and all the otherCamera.<id>.TypeandCamera.<id>.IOlines are removed and reported in the log. A copy of the original file is saved ashsyco.ini.bakbefore it is rewritten, and the file is left untouched when there is nothing to migrate
- the
- I/O Servers can no longer be used as Comm Ports. The
ioComm Port type, and theio:<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
MODBUSTCPI/O Server can no longer be used as a Comm Port - the
HEPHAIS,ELSNERP03M,NOTIFIERandRAYCONTROLI/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 aMODBUSTCPI/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.javaare no longer called. Plugins, supported for many years, are now the only way to write Java code for HSYCO. Existing code inuser.javahas 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()orhttpCallEvent(), no longer give priority to the value returned byuser.java - the
userCommand(String name, String param)anduserCommand(String userid, String name, String param)callbacks and the legacyvirtualRemote()callback have been removed. Plugins useuserCommand(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
userclass is still available, so code calling the userBase methods through it, as inuser.ioSet(), keeps working com/hsyco/user.classis no longer in the defaultAutoKillFileslist
- the callback methods are called only in plugins, EVENTS and JavaScript. Callbacks that return a value, like
- The
userSubmit()call nameduserdatalogger:<id>, generated when a (datalogger) object shows a Data Logger id not defined inhsyco.ini, and theIOStartupEvent()callback of the Galaxy, Weather Online and ESC/VP I/O Servers, are now passed to plugins and JavaScript callbacks. They were only passed touser.javabefore
EVENTS
- BREAKING CHANGE. JavaScript code always runs in global mode, and the
eventsJavaScriptGlobalScopesetting 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 witheventsJavaScriptGlobalScope = true; with the default,false, these assignments had no effect outside the function or action. The setting is no longer read, and is removed fromhsyco.inithe next time Settings saves it. See The INIT JavaScript scope - the parameters of JavaScript callback functions, and
triggerKey,triggerValueandsessionId, are now local to each execution. WitheventsJavaScriptGlobalScope = true, assigning a parameter, as invalue = "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 - bused to loga-b, and now tries to subtractbfroma, skipping the action as they are not numbers. Next to a quoted string an operator is still plain text, so"a" + $nkeeps producinga+10. EVENTS files that used unquoted operators as text should quote them- the
IOword inside an action value now reads the data point that follows it, where it used to be appended as plain text.IOfollowed by a variable, as inIO $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, soLOG = Temperature (C)still logsTemperature(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, withIO nameaccepted 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 inINIT : $var1 = ($var2 + 3) * $var3:- operators must be separated by spaces from their operands, so that names like
knx.1/2/3are never mistaken for a computation - multiplication and division are executed before addition and subtraction, from left to right, and round brackets change the order
oncounts as 1,offas 0, and percentages as fractions, so50%is 0.5- results are written without trailing zeros or rounding noise:
5rather than5.0,0.3for0.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
- operators must be separated by spaces from their operands, so that names like
- 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) * 2orIO 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 - 5is 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 operandorWAIT 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
ExceptionWatchdoguncaught Java exceptions, it now first moves the plugin that raised them out of thepluginsdirectory, 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>toplugins_unsafe/<name>, or toplugins_unsafe/<name>_<yyyyMMdd-HHmmss>if that directory already exists. The move is written to the log, as inEXCEPTION 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
wwwdirectory. This is similar to how EVENTS files that take longer thanEventsLoadTimeoutto load are renamed with the_unsafe.txtsuffix - 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
- every uncaught exception is attributed to the plugin of the first
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
TimeNTPServerNamesetting 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
ffmpegservice:- an RTSP source is configured by setting
Camera.<id>.URLto anrtsp://orrtsps://address;Camera.<id>.URL.Smallaccepts 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>.UserandCamera.<id>.Passwordsettings, 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
CamerasRefreshMillissetting, so the acquisition rate doesn't depend on the frame rate of the source stream - the new
Camera.<id>.JPEGQualityFactorsetting configures the quality of the JPEG frames encoded from the stream, on theffmpeg -q:vscale 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
ffmpeginstallation 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
- an RTSP source is configured by setting
- 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>.ONVIFPortsetting 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>.UserandCamera.<id>.Passwordsettings or embedded in the camera URL, are used for the ONVIF authentication
- the new
- added the
Camera.<id>.Staticsetting, replacing theCamera.<id>.Type = staticattribute of previous versions - added the
Camera.<id>.Descriptionsetting
I/O Servers
AIGen I/O Server
- new I/O Server for AI models integration
Arteco I/O Server
- the
outputdiscoveryoption 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
languageoption now acceptsenfor 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>andrgbw.<n>data points, their.on,.brightness,.faultand.whitecompanions, and the newrgbsandrgbwsoptions. 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.brightnessand.whitedata points behave as dimmers, for sliders and knobs - the
rgb.<n>.faultandrgbw.<n>.faultdata 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 theIOSTART <index>form based on its position in the ioServers list - the
lights,dimmers,automations,rgbsandrgbwsoptions 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
MODBUSTCPI/O Server can no longer be selected as the Comm ID: see the Removed Features section - fixed the
lightUISET value, that was showing "lkux" instead of "klux" - the
light.luxdata 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 andrange.<low>.<high>for a block, plus the usualconnectiondata point - data points accept a level between 0 and 255, the
<n>/<m>and<n>%formats, a per-channel list, and theon,off,flipandrefreshkeywords. 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
MODBUSTCPI/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>.rgbdatapoint no longer turns the light on, and writing0,0,0no longer turns it off: colour and state are now independent, as they already are for thehue,saturationandxydatapoints. EVENTS and user code that relied on a colour write to switch a light must add the state explicitly, asIO hue.light.1.rgb = 255,67,31,on, or write theondatapoint - 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
resourcesoption, to select which families of devices are exposed - added the
ipaddressoption and extended themacoption, which now also locates a bridge whose address is assigned by DHCP and follows it when the address changes - added the
discoveryoption: the driver operates entirely on the local network by default, and only queries the Philips cloud discovery service if explicitly configured to - added the
idmodeandcolorloopmodeoptions. 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
pollintervaloption is now the interval of a background safety resynchronization, and its default has changed from 10 to 300 seconds - the
light.<n>.rgbandlight.<n>.xydatapoints 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,saturationandxydatapoints 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*faultappended while it is unreachable - while the connection to the bridge is offline, every device now reports
reachableas0and carries the fault flag in the user interface, returning to its own state as soon as the bridge answers again light.<n>.on = flipnow works. It was documented by the previous driver but had no effect- the
light.<n>.dimmerdatapoint reports 99% correctly. The previous driver reported it as 100% - replaced the
masteroption with the newpowerupoption andlight.<n>.powerupdatapoint, 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
ipaddressormacnow 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
connectiondatapoint - removed support for the I/O Controller's serial port gateway, and the
iocomm port type that was used to access it
HWGMONITOR I/O Server
- added the
connectiondatapoint
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 andrange.<low>.<high>for a block, plus the usualconnectiondata point - data points accept a level between 0 and 255, the
<n>/<m>and<n>%formats, a per-channel list, and theon,off,flipandrefreshkeywords. 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 newrgb.<n>.ondatapoint 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
onoroffas a last field - added the
rgb.<n>.onandrgb.<n>.faultdatapoints..faultis 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>.whitedatapoint, a level of its own that a slider or a knob can be bound to, andrgb.<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,multicastandindividualaddressI/O Server options - added support for the KNXnet/IP Secure protocol, both for secure tunneling and secure routing, with the
securemode,keyringfileandkeyringpasswordI/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
discoverdatapoint lists all the gateways available on the network - added the import of password-protected ETS6 project files
- added the
localhostI/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
MODBUSTCPI/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
MODBUSTCPI/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
.brightnessor.whitenow turns the channel on, as a dimmer does, and0turns 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
.rgbdata 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
.brightnessdata point now reports a percentage, and both.brightnessand.whitereportoffwhile 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
.rgbdata 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
.stateand.rgbdata points now acceptflip - a level written to
.brightnessor.whitenow turns the channel on, as a dimmer does, and0turns it off keeping the level, so a slider can bring a channel that is off back up. The.whitedata point is published in the<w>/255fractional format in the catalog, so a slider shows the correct position - added the
.faultdata 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
httprequestwaitoption, that was ignored: the wait between HTTP requests was taken from thepollintervaloption 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
HTTPSSLServerPortandSysLogServerPortvalues. IfHTTPSSLServerPortis 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
HTTPServerPortcan be left unset - a master and a slave running different versions cannot synchronize: upgrade both servers (see also the Configuration Files upgrade procedure)
- High Availability now requires the HTTPS server, as well as the SYSLOG server, on both the master and the slave, with the same
- 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 (likeloginEvent(),logoutEvent(),pageEvent(),userCommand()and the data source callbacks) and to the JavaScript API used to start with the key stored in the browser'skeycookie, 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, like3f9a0c1e7b24d58e6a10/<web view id>;loginEvent()andlogoutEvent()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.iniandstate/keys.dataused to store unsalted SHA-1 hashes of the PINs (or usernames) and PUKs (or passwords): with a copy ofaccess.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 newsecrets/access.keyfile, 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.inirestored 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.keytogether withaccess.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 includessecrets/access.keyandsecrets/otp.data, which are restored together withaccess.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 receivessecrets/access.keyandsecrets/otp.datafrom the master, and never creates its own key: until it has received the master's key, logins on the slave are refused. WithhaDisableFilesSync = true(see the Configuration Files upgrade procedure), copysecrets/access.keyfrom the master to the slave by hand, or remove the setting once both servers have been upgraded
- 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
- 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()andaccessModifyUserPukPwd()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. SetAuthenticationStrengthCheck = falseto disable it. See AuthenticationStrengthCheck - New PUK or password at the next login: besides the users pages, the flag can be set by adding
,resetat the end of the user's line inaccess.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
OTPAuthenticationTrustedNetandOTPAuthenticationNotTrustedNet, 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.datafile - 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
- 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
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()andaccessUpdateUser()return the new value -5 when the PUK or password is too easy to guess, and have new overloads with aresetCredentialsargument, 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()andaccessOTPKeyURI()methods accessGetAllUsers()returns two more values for each user: the reset flag and whether the user has an OTP keyaccessIsPinUsed()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 withand/or/not/mod/xorare reported as errors showing the replacement. - Support
if/else,switch,breakandreturn. Switch cases compare by type and value. Unsupported JavaScript syntax receives specific diagnostics. &&and||return an operand and short-circuit;!,xor,and()andor()return booleans.device(),ui(),value(),attr()andds()accept computed arguments. Dynamic reads determine what refreshes the binding;attr()also refreshes on changes to attributes of its own object.
- New expression engine, smaller and significantly faster on large projects. Value bindings now use
- 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.
- OTP login:
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.iniwas reloaded; they are now updated after every login, successful or not
Java API
accessUpdateUser()with theenabledargument 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.