The JSON file format for SharKNX visualization dashboards: spaces, pages, widgets and the group addresses they use.
A dashboard can be exported from SharKNX as a JSON file and imported again, on the same device or another one. You can also write one in any text editor: the app exports every field, but an import needs only what it cannot work out for itself, so a hand-written design stays short.
The quickest start is the empty dashboard or the example house. Or build a small dashboard in the app, export it, and edit the file.
On this page
- Structure
- Dashboard
- Spaces and pages
- IDs and links
- Widgets
- Group addresses
- Colors and icons
- Widget types
- Connection
- Complete example
- Validation
- Versions
Structure
A dashboard holds one space, Home. Every other space sits inside Home or inside another space. A space has one or more pages that you swipe through, and each page holds widgets in a grid.
{
"format": 1,
"name": "Villa",
"home": {
"name": "Home",
"tiles": [
{ "type": "switch", "name": "Hall light", "command": "1/0/1", "status": "1/0/2" }
],
"rooms": [
{
"name": "Kitchen",
"tiles": [
{ "type": "switch", "name": "Counter light", "command": "1/4/1" }
]
}
]
}
}
In the file, spaces are called rooms, pages panels and widgets tiles. The file is UTF-8 JSON; a byte-order mark at the start is accepted.
Dashboard
The top level of the file.
| Field | Required | Default | Description |
|---|---|---|---|
format |
No | 1 |
The file format version. See Versions |
name |
Yes | (none) | The dashboard's name, at most 50 characters. Names are unique on a device: importing a name that exists offers a copy or replacing it |
home |
Yes | (none) | The Home space. See Spaces and pages |
theme |
No | auto |
auto (follows the device's light or dark mode), light, dark, night, wave, sahara, aurora or neon |
buttons |
No | filled |
How buttons on widgets look: filled or plain |
keepScreenOn |
No | false |
true keeps the screen on while the dashboard is open |
muteBanners |
No | false |
true lists notifications in Activity only, without banners |
favorites |
No | [] |
Widget IDs shown on the Favourites page, in this order, e.g. ["t1", "t4"] |
connection |
No | automatic | How the dashboard connects to the bus. See Connection |
A project field in an imported file is ignored: the link to a project in the Archive belongs to the device that made it.
Spaces and pages
| Field | Required | Default | Description |
|---|---|---|---|
id |
No | assigned | r and a number, e.g. r3. Home is always r0. Only a space that a link opens needs one. See IDs and links |
name |
Yes | (none) | The space's name, at most 50 characters |
icon |
No | default | An icon name, e.g. kitchen. See Colors and icons |
tiles |
One of these | (none) | The widgets of a space with a single page |
panels |
One of these | (none) | The pages of a space with several pages, at most 10 |
rooms |
No | [] |
The spaces inside this one |
Use either tiles or panels, not both. Each page in panels is:
| Field | Required | Default | Description |
|---|---|---|---|
id |
No | assigned | p and a number, e.g. p2 |
tiles |
No | [] |
The page's widgets, in order, at most 100 |
{
"format": 1,
"name": "Two pages",
"home": {
"name": "Home",
"panels": [
{ "tiles": [{ "type": "switch", "name": "Hall light", "command": "1/0/1" }] },
{ "tiles": [{ "type": "switch", "name": "Porch light", "command": "1/0/5" }] }
]
}
}
IDs and links
Every space, page and widget has an ID: r for spaces, p for pages, t for widgets, followed by a number up to 999999. IDs are unique within a dashboard, not across dashboards.
- Leave IDs out and the import assigns them, continuing above the highest ID in the file.
- Write an ID where something refers to it: a space that a navigation widget opens, and a widget listed in
favorites. - A link or favourite must name an ID written in the file. One that names an ID the file never declares is an error, even if the import would have assigned that ID to something else.
- An exported file always carries every ID.
Widgets
Fields every widget has:
| Field | Required | Default | Description |
|---|---|---|---|
type |
Yes | (none) | The widget type. See Widget types |
name |
Yes | (none) | Shown on the widget, at most 50 characters |
id |
No | assigned | t and a number, e.g. t12 |
icon |
No | the type's | An icon name. See Colors and icons |
size |
No | the type's | Grid cells, width × height: 1x1, 2x1, 3x1, 2x2, 3x2 or 3x3. Each type allows some sizes |
| Type | What it is | Sizes | Default size |
|---|---|---|---|
navigation |
Opens a space | 2x1, 3x1, 2x2 | 2x1 |
switch |
Turns something on and off | 1x1, 2x1, 2x2 | 2x1 |
statusIndicator |
Shows an on/off state | 1x1, 2x1 | 1x1 |
valueDisplay |
Shows a number | 1x1, 2x1, 3x1, 2x2, by view | 2x1 |
valueControl |
Sends a number | 1x1, 2x1, 3x1, 2x2 | 3x1 (2x1 without a control) |
modeStatus |
Shows a byte as named states | 1x1, 2x1, 3x1 | 2x1 |
dimmer |
A dimmable light | 1x1, 2x1, 3x1, 2x2 | 2x2 |
blind |
A blind or shutter | 1x1, 2x1, 3x1, 2x2, 3x2 | 2x2 |
scene |
Recalls one scene, or toggles two | 1x1, 2x1, 2x2 | 2x1 |
scenes |
A row of scene buttons | 2x1, 2x2, 3x2, 3x3 | 2x2 |
tunableWhite |
A light with color temperature | 1x1, 2x1, 3x1, 2x2, 3x2 | 2x2 |
colorLight |
An RGB, RGBW or RGB + white light | 1x1, 2x1, 3x1, 2x2, 3x2 | 2x1 |
thermostat |
A room temperature setpoint | 1x1, 2x1, 3x1, 2x2 | 2x2 |
fanCoil |
A fan coil unit | 1x1, 2x1, 3x1, 2x2, 3x2 (3x3 with inline functions) | 2x1 |
airConditioner |
A split unit or VRV through its KNX gateway | 1x1, 2x1, 3x1, 2x2, 3x3 | 2x2 |
A file with a type this version of SharKNX does not know is not imported.
Group addresses
A widget sends to some addresses (a command) and shows others (a status). Group addresses are written in three levels, e.g. "1/2/3". A DPT is written as main and subtype, e.g. "1.001" or "9.001".
Short form. Write the address alone and it takes its role's DPT: a switch command 1.001, a dimmer's brightness 5.001, a Value status the DPT of its valueType. Each widget type below lists its defaults.
{ "type": "switch", "name": "Hall light", "command": "1/0/1", "status": "1/0/2" }
Full form. To use another DPT of the same main type (a window contact's 1.019, a lux value's 9.004), to send one command to several addresses, or to stop a status being read when the dashboard opens:
{
"type": "switch",
"name": "All lights",
"command": { "targets": ["1/0/1", "1/1/1", "1/4/1"], "dpt": "1.001" },
"status": { "address": "1/0/2", "dpt": "1.001", "readOnOpen": false }
}
| Field | Used for | Required | Default | Description |
|---|---|---|---|---|
address |
Sends and statuses | One of these | (none) | One group address |
targets |
Sends | One of these | (none) | Several group addresses that all receive the same value |
dpt |
Sends and statuses | No | the role's | The DPT the value is encoded with |
readOnOpen |
Statuses | No | true |
false: never read the status when the dashboard opens; wait for the bus |
A DPT must fit the role: a switch takes any DPT 1 (1.001 Switch, 1.008 Up/Down, …), a dimmer's brightness DPT 5.001.
Colors and icons
Colors are names: red, orange, yellow, green, blue, purple or grey. Each has a light and a dark shade, chosen by the theme.
Icons are names from the app's icon catalog, e.g. light_group, floor_lamp, table_lamp, wall_lamp, socket, shutter, curtains, heating, cooling, window, door, temperature, humidity, relax, dinner, all_off. Space icons include home, living, kitchen, dining, bedroom, bathroom, office, hallway, garage, garden and terrace. The icon picker in the app shows every name.
An unknown color or icon name is kept and drawn as the default, so a file from a newer SharKNX still imports.
Widget types
Navigation
Opens another space.
| Field | Required | Default | Description |
|---|---|---|---|
target |
Yes | (none) | The ID of the space it opens, e.g. r1. That space must have this ID written in the file |
{
"format": 1,
"name": "Links",
"home": {
"name": "Home",
"tiles": [{ "type": "navigation", "name": "Kitchen", "icon": "kitchen", "target": "r1" }],
"rooms": [{ "id": "r1", "name": "Kitchen", "tiles": [] }]
}
}
Switch
A tap toggles between On and Off, or always sends the same value.
| Field | Required | Default | Description |
|---|---|---|---|
command |
Yes | (none) | Send, DPT 1 (1.001 if left out) |
status |
No | (none) | Status, DPT 1 (1.001 if left out). Without one, the widget shows what was last sent or heard on command |
fixed |
No | (none) | 1 or 0: every tap sends this value instead of toggling |
invertCommand |
No | false |
true sends 0 for On and 1 for Off. Not with fixed |
invertStatus |
No | false |
true reads 0 as On |
zeroLabel, oneLabel |
No | Off, On | The state names shown for 0 and 1 |
offIcon |
No | the icon | The icon shown while off |
onColor, offColor |
No | the theme's | The icon's color while on and off |
{ "type": "switch", "name": "Garden pump", "icon": "valve", "command": "1/5/1", "status": "1/5/2", "zeroLabel": "Stopped", "oneLabel": "Running" }
Status indicator
Shows an on/off state; a tap does nothing.
| Field | Required | Default | Description |
|---|---|---|---|
status |
Yes | (none) | Status, any DPT 1 (1.001 if left out) |
invertStatus, zeroLabel, oneLabel, offIcon, onColor, offColor |
No | As for Switch |
{ "type": "statusIndicator", "name": "Window", "icon": "window", "status": { "address": "6/1/1", "dpt": "1.019" }, "zeroLabel": "Closed", "oneLabel": "Open" }
Value status
Shows a number (or raw bytes) as it arrives. Its type is valueDisplay.
| Field | Required | Default | Description |
|---|---|---|---|
status |
Yes | (none) | Status. Its DPT must fit valueType; left out, it is the type's own (none for hex) |
valueType |
No | f16 |
How the value is decoded, with the DPT used when none is written: percent (5.001), u8 (5.010), s8 (6.010), u16 (7.001), s16 (8.001), f16 (9.001), u32 (12.001), s32 (13.001), f32 (14.056), s64 (29.010), or hex (raw bytes). A written DPT may be any subtype of the same main type (for u8, not 5.001 or 5.003) |
view |
No | number |
number, bar or gauge. Bar: 2x1 or 3x1. Gauge: 1x1 or 2x2. Not for hex |
unit |
No | (none) | Shown after the value, e.g. °C |
decimals |
No | as received | 0 to 2 |
displayMin, displayMax |
No | the type's range | The range of a bar or gauge |
scaleColors |
No | the theme's | A bar or gauge's colors: coolWarm, greenRed, redGreen or neutral |
displayScale |
No | 1 |
The received value is divided by this before it is shown, e.g. 1000 to show Wh as kWh |
A 1x1 fits values of 1 or 2 bytes only.
{ "type": "valueDisplay", "name": "Power", "icon": "electricity", "valueType": "s32", "unit": "kW", "decimals": 2, "displayScale": 1000, "status": { "address": "9/1/1", "dpt": "13.010" } }
Value control
Sends a number: with − and +, a slider, or buttons for set values.
| Field | Required | Default | Description |
|---|---|---|---|
command |
Yes | (none) | Send. Its DPT must fit valueType; left out, it is the type's own |
status |
No | (none) | Status, as command |
valueType |
No | f16 |
As for Value status, except hex |
control |
No | stepper |
What the widget shows: stepper (− and +), slider, buttons, or none |
min, max |
No | the type's range | The range the control moves in |
step |
No | 0.5 for floats, 10 for percent, else 1 | How far − and + move |
unit |
No | (none) | Shown after the value |
decimals |
No | as received | 0 to 2 |
choices |
With buttons |
[] |
Up to 8 buttons: {"value": 21, "name": "Comfort"}, each value inside the range and used once |
color |
No | the theme's | The icon's color |
{
"type": "valueControl",
"name": "Hood fan",
"valueType": "percent",
"control": "buttons",
"command": { "address": "6/2/1", "dpt": "5.001" },
"status": { "address": "6/2/2", "dpt": "5.001" },
"choices": [{ "value": 0, "name": "Off" }, { "value": 50, "name": "Half" }, { "value": 100, "name": "Full" }]
}
Mode status
Shows a byte as named states, e.g. an HVAC mode.
| Field | Required | Default | Description |
|---|---|---|---|
status |
Yes | (none) | Status, DPT 5, 17 or 20 (5.010 if left out) |
states |
Yes | (none) | 1 to 8 states: {"value": 1, "name": "Comfort", "icon": "…"}, values 0–255, each once |
color |
No | the theme's | The icon's color |
{
"type": "modeStatus",
"name": "Heating mode",
"status": { "address": "3/1/9", "dpt": "20.102" },
"states": [{ "value": 1, "name": "Comfort" }, { "value": 2, "name": "Standby" }, { "value": 3, "name": "Economy" }]
}
Dimmer
A dimmable light: the icon toggles it, a slider sets the brightness or − and + dim it.
| Field | Required | Default | Description |
|---|---|---|---|
switch |
No | (none) | Send On/Off, DPT 1.001 |
switchStatus |
No | (none) | Status On/Off, DPT 1.001 |
brightness |
With slider |
(none) | Send brightness, DPT 5.001 |
brightnessStatus |
No | (none) | Status brightness, DPT 5.001 |
dimming |
With stepper |
(none) | Send relative dimming, DPT 3.007 |
control |
No | slider with brightness, else stepper |
The 2x2 control. Only the send object of the chosen control may be given |
stepCode |
No | 5 |
Dimming step, 1–7: 1 = 100 %, 2 = 50 %, … 5 = 6.25 %, … 7 = 1.56 % |
repeatMs |
No | 500 |
Repeat while − or + is held: 500, 1000 or 1250 ms |
offIcon, onColor, offColor |
No | As for Switch |
{ "type": "dimmer", "name": "Sofa lamp", "icon": "floor_lamp", "switch": "1/1/10", "switchStatus": "1/1/11", "brightness": "1/1/12", "brightnessStatus": "1/1/13" }
Blind
A blind or shutter: up, stop and down, or a position.
| Field | Required | Default | Description |
|---|---|---|---|
control |
No | step |
step (up, stop, down) or position (a slider) |
move |
With step |
(none) | Send up/down, any DPT 1 (1.008 if left out) |
stop |
With step |
(none) | Send stop or slat step, any DPT 1 (1.008 if left out) |
position |
With position |
(none) | Send position, DPT 5.001 |
slatAdjustment |
No | false |
true for blinds with slats |
slatPosition |
With position and slats |
(none) | Send slat position, DPT 5.001 |
positionStatus, slatStatus |
No | (none) | Status position and slat position, DPT 5.001 |
upperEndStatus, lowerEndStatus |
No | (none) | Status of the end positions, DPT 1 (1.002 if left out) |
windAlarm |
No | (none) | Status wind alarm, DPT 1 (1.005 if left out). Shown as a warning; it never blocks a command |
invert |
No | false |
true for actuators that count 0 % as closed |
offIcon |
No | the icon | The icon shown while open |
onColor, offColor |
No | the theme's | The icon's color while closed and while open |
0 % is open and 100 % closed. Only the send objects of the chosen control may be given, and slat objects only with slatAdjustment.
{ "type": "blind", "name": "Terrace blind", "move": "2/1/1", "stop": "2/1/2", "positionStatus": "2/1/3" }
Scene
Recalls a scene. In toggle mode it alternates between two scenes; in threshold mode it picks one by a value, e.g. scene A at or above 20 lux.
| Field | Required | Default | Description |
|---|---|---|---|
command |
Yes | (none) | Send, DPT 18.001 |
mode |
No | single |
single, toggle or threshold |
scene |
No | 0 |
Scene A, as sent: 0–63. KNX scene 1 is 0, scene 64 is 63 |
sceneB |
With toggle and threshold |
(none) | Scene B, 0–63 |
commandB |
No | command |
Send scene B to its own address, DPT 18.001 |
nameA, nameB |
No | (none) | The two scenes' names, toggle only |
iconB |
No | the icon | Scene B's icon |
activation |
No | tap |
tap, or hold to recall only after a hold |
holdMilliseconds |
No | 500 |
How long a hold lasts: 200, 300, 400, 500, 1000, 2000 or 3000 |
saveOnLongPress |
No | false |
true: a long hold saves the current state as the scene |
value |
With threshold |
(none) | Status the scene is picked by. Its DPT must fit valueType; left out, it is the type's own |
valueType |
No | f16 |
How value is decoded, as for Value status, except hex |
threshold |
No | 0 |
Scene A at or above this value, scene B below |
defaultScene |
No | a |
a or b: the scene recalled before any value arrives |
flagAbove, flagBelow |
No | (none) | Icons marking which side is active |
color |
No | the theme's | The icon's color |
{ "type": "scene", "name": "Cinema", "icon": "relax", "mode": "toggle", "command": "4/2/1", "scene": 4, "sceneB": 5, "nameA": "Movie", "nameB": "Lights up" }
Scenes
A set of scene buttons on one address.
| Field | Required | Default | Description |
|---|---|---|---|
command |
Yes | (none) | Send, DPT 18.001 |
scenes |
Yes | (none) | 1 to 9 buttons: {"name": "Relax", "scene": 0, "icon": "relax"}. scene is the number as sent, 0–63, each once |
color |
No | the theme's | The icons' color |
{
"type": "scenes",
"name": "Moods",
"command": "4/1/1",
"scenes": [{ "name": "Relax", "scene": 0, "icon": "relax" }, { "name": "Dinner", "scene": 1, "icon": "dinner" }]
}
Tunable white
A light with brightness and color temperature, in one of three arrangements of objects.
| Field | Required | Default | Description |
|---|---|---|---|
objects |
No | brightnessTemperature |
brightnessTemperature, combined (one DPT 249.600 object) or warmCold (two levels) |
switch, switchStatus |
No | (none) | On/Off, DPT 1.001 |
brightness, brightnessStatus |
brightnessTemperature with slider |
(none) | Brightness, DPT 5.001 |
dimming |
brightnessTemperature with stepper |
(none) | Relative dimming, DPT 3.007 |
temperature, temperatureStatus |
brightnessTemperature |
(none) | Color temperature: DPT 7.600 (Kelvin) or 5.001 (percent of the range), as temperatureAs says |
temperatureAs |
No | kelvin |
kelvin or percent |
combined, combinedStatus |
combined |
(none) | Brightness and temperature together, DPT 249.600 |
warm, warmStatus, cold, coldStatus |
warmCold |
(none) | The two white levels, DPT 5.001 |
warmestK, coolestK |
No | 2700, 6500 |
The temperature range, 1000–20000 K. Not with warmCold |
control, stepCode, repeatMs |
No | As for Dimmer | |
offIcon, onColor, offColor |
No | As for Switch |
The required send objects (and their statuses, when given) depend on objects; objects of another arrangement are an error.
{ "type": "tunableWhite", "name": "Reading light", "switch": "1/2/1", "brightness": "1/2/2", "temperature": "1/2/3", "temperatureStatus": "1/2/4" }
Color light
An RGB, RGBW or RGB + tunable white light.
| Field | Required | Default | Description |
|---|---|---|---|
light |
No | rgb |
rgb, rgbw or rgbTunableWhite |
control |
No | the light's first | How the color is sent: oneObject, rgbAndWhite or separate, as the table below allows |
white |
No | temperature |
rgbTunableWhite with rgbAndWhite: temperature or warmCold |
switch, switchStatus |
No | (none) | On/Off, DPT 1.001 |
brightness, brightnessStatus |
No | (none) | The whole light's brightness, DPT 5.001 |
onFrom |
No | switchStatus |
What tells the light is on: switchStatus, or switchOrLevels |
temperatureAs, warmestK, coolestK |
No | With a temperature object, as for Tunable white | |
offIcon, onColor, offColor |
No | As for Switch |
light |
control |
Send objects |
|---|---|---|
rgb |
oneObject |
rgb (DPT 232.600) |
rgb |
separate |
red, green, blue (DPT 5.001) |
rgbw |
oneObject |
rgbw (DPT 251.600) |
rgbw |
rgbAndWhite |
rgb, whiteLevel (5.001) |
rgbw |
separate |
red, green, blue, whiteLevel |
rgbTunableWhite |
rgbAndWhite |
rgb, then temperature, or warm and cold (as white says) |
rgbTunableWhite |
separate |
red, green, blue, warm, cold |
Each send object has a status named after it with Status added (rgbStatus, redStatus, …; the white level's is whiteStatus). Color statuses are all given or none.
{ "type": "colorLight", "name": "Accent strip", "light": "rgb", "switch": "1/3/1", "rgb": "1/3/2", "rgbStatus": "1/3/3" }
Thermostat
Shows the setpoint or the room temperature and changes the setpoint.
| Field | Required | Default | Description |
|---|---|---|---|
shows |
No | setpoint |
What the widget shows large: setpoint or roomTemperature |
unit |
No | celsius |
celsius (DPT 9.001) or fahrenheit (9.027). Values are never converted |
control |
No | absolute |
absolute (sends a temperature) or increaseDecrease (sends 1-bit steps) |
setpoint |
With absolute |
(none) | Send setpoint, in unit's DPT |
increase, decrease |
With increaseDecrease |
(none) | Send steps, DPT 1. May be the same address |
increaseValue, decreaseValue |
No | true, false |
The bit increase and decrease send |
setpointStatus |
With increaseDecrease showing the setpoint |
(none) | Status setpoint |
roomTemperature |
When shown | (none) | Status room temperature |
step |
No | 0.5 |
With absolute: 0.1, 0.2, 0.5 or 1 |
min, max |
No | 7–35 °C, 45–95 °F | The setpoint's limits |
color |
No | the theme's | The icon's color |
{ "type": "thermostat", "name": "Living room", "setpoint": "3/1/1", "setpointStatus": "3/1/2", "roomTemperature": "3/1/3" }
Fan coil
The fan stages of a fan coil unit, with optional On/Off, Auto/Manual, Heat/Cool, HVAC modes and a thermostat. The settings decide which objects the widget has; every send object it has is required, statuses are optional.
| Field | Required | Default | Description |
|---|---|---|---|
fanSpeed, fanSpeedStatus |
fanSpeed |
(none) | The fan stage: DPT 5.001 for percent, 5.010 otherwise |
stages |
No | 3 |
Fan stages, 1–5 |
controlAs |
No | percent |
How a stage is sent: percent (its percent value), value (its byte) or stageNumber (1, 2, 3 …) |
statusAs |
No | controlAs |
How the status is read, as controlAs |
percentStages, valueStages |
No | evenly spread | Each stage's value, e.g. [33, 67, 100] or [85, 170, 255] |
speedZero |
No | nothing |
What fan speed 0 means: nothing, auto or manual |
onOff |
No | false |
true adds switchCommand and switchStatus (DPT 1.001) |
autoManualObjects |
No | (off) | one: autoManual (+ autoManualStatus). two: auto and manual (+ statuses). DPT 1 |
autoManualInvert |
No | false |
With one: true when 1 means Manual |
heatCoolObjects |
No | (off) | one: heatCool (+ heatCoolStatus), DPT 1.100. two: heat and cool (+ statuses), DPT 1 |
heatCoolInvert |
No | false |
With one: true when 1 means Cool |
hvacObjects |
No | (off) | byte: hvacMode (+ hvacModeStatus), DPT 20.102. bits: one object per offered mode, hvacAuto, hvacComfort, hvacStandby, hvacEconomy, hvacProtection (+ statuses), DPT 1 |
hvacModes |
No | all but auto |
Offered modes: auto, comfort, standby, economy, buildingProtection |
thermostat |
No | (off) | An object with the Thermostat's shows, unit, control, step, min, max, increaseValue and decreaseValue. Adds setpoint or increase and decrease, setpointStatus and roomTemperature |
offIcon, onColor, offColor |
No | As for Switch |
{ "type": "fanCoil", "name": "Office fan coil", "fanSpeed": "7/1/1", "fanSpeedStatus": "7/1/2", "onOff": true, "switchCommand": "7/1/3", "switchStatus": "7/1/4" }
Air conditioner
A split unit or VRV through its KNX gateway. Its type is airConditioner.
| Field | Required | Default | Description |
|---|---|---|---|
kind |
No | split |
split or vrv |
switchCommand, switchStatus |
Yes | (none) | On/Off, DPT 1.001 |
setpoint, setpointStatus |
setpoint |
(none) | Setpoint, in unit's DPT |
roomTemperature |
When shown | (none) | Status room temperature |
mode, modeStatus |
mode |
(none) | Operating mode, DPT 20.105 |
fanSpeed, fanSpeedStatus |
fanSpeed |
(none) | Fan stage, DPT 5.010 |
shows, unit, step |
No | setpoint, celsius, 1 |
As for Thermostat |
min, max |
No | 16–30 °C, 61–86 °F | The setpoint's limits |
modes |
No | all for split; heat, cool, fan, dry for vrv |
Offered modes: auto, heat, cool, fan, dry |
modeValues |
No | auto 0, heat 1, cool 3, fan 9, dry 14 | The byte each mode sends, e.g. {"dry": 4} |
fanStages |
No | 3 |
Fan stages |
fanValues |
No | [1, 2, 3] |
The byte each stage sends |
fanAutoValue |
No | (none) | Given, the fan offers Auto and sends this byte for it |
faultAs |
No | (none) | Given, fault is required: bit (DPT 1.005), code (a byte, DPT 5.010) or text (DPT 16.000) |
fault |
With faultAs |
(none) | Status fault |
faultInvert |
No | false |
With bit: true when 0 means a fault |
faultCodes |
No | [] |
With code: {"value": 3, "text": "Filter"}, texts shown for known codes |
offIcon, onColor, offColor |
No | As for Switch |
{ "type": "airConditioner", "name": "Bedroom AC", "switchCommand": "8/1/1", "switchStatus": "8/1/2", "setpoint": "8/1/3", "mode": "8/1/4", "fanSpeed": "8/1/5" }
Connection
How the dashboard connects when it opens. Left out, it is automatic: it keeps any connection the app has, else uses the app's selected gateway, else searches.
| Field | Required | Default | Description |
|---|---|---|---|
mode |
Yes | (none) | automatic, gateway or multicast |
gateway |
No | (none) | With gateway: the gateway it connects to. Left out, the dashboard cannot run until one is chosen in its settings |
secure |
No | false |
With multicast: true for KNX IP Secure routing |
The gateway object:
| Field | Required | Default | Description |
|---|---|---|---|
host |
Yes | (none) | IP address or host name |
port |
No | 3671 |
UDP or TCP port |
name |
No | (none) | A name to show |
transport |
No | udp |
udp, tcp, or auto (TCP first, then UDP) |
nat |
No | false |
true for a gateway behind NAT |
knxAddress |
No | (none) | The gateway's individual address, e.g. 1.1.250. Secure tunnelling finds its credentials by it |
secure |
No | false |
true for KNX IP Secure tunnelling |
serial, mac |
No | (none) | The gateway's serial number and MAC address, as discovered |
{
"format": 1,
"name": "Office",
"connection": { "mode": "gateway", "gateway": { "name": "Office router", "host": "10.0.0.5", "transport": "tcp" } },
"home": { "name": "Home", "tiles": [] }
}
Plain JSON exports contain no keys or credentials. Both Plain JSON and With keys use the .json extension; Import detects protection from the file contents.
Password-protected JSON
With keys encrypts the entire payload. Its JSON container can be opened in a text editor, but the dashboard definition and keys must be decrypted before they can be read or changed. The export password is required to import it and is never saved.
| Container field | Version 1 value or purpose |
|---|---|
format |
1 |
protected.version |
1 |
protected.cipher |
AES-256-GCM |
protected.kdf |
PBKDF2-HMAC-SHA256 |
protected.iterations |
600000; fixed in this protection version |
protected.salt |
Base64 of 16 random bytes |
protected.nonce |
Base64 of the 12-byte encryption nonce |
protected.ciphertext |
Base64 of the encrypted payload |
protected.tag |
Base64 of the 16-byte authentication tag |
Authentication also binds the content to SharKNX dashboard protected JSON v1. Incorrect passwords and tampered ciphertext cannot produce an imported dashboard. The selected file is limited to 32 MiB; the decrypted payload is limited to 16 MiB.
The decrypted payload has dashboard (the definition described in this reference) and, only for an owned key source, keys. An absent keys keeps Project automatic: the receiving app supplies its own security. An owned packet, even empty, becomes Imported keys, saved encrypted with this dashboard under a fresh local identity. Its source-project reference and export password never travel into app storage.
keys.groupKeys maps decimal KNX group-address numbers (0–65535, written as strings) to 32-digit hexadecimal keys. Only addresses used by the dashboard are kept. Optional keys.credentials contains devices for a configured secure gateway, with address, optional deviceAuthCode, and interfaces (userId, individualAddress, password); secure multicast instead carries backboneKeyHex and backboneSecurityEnabled. Tool Keys, unrelated addresses and gateways, and project names are excluded.
Automatic connection and Automatic project use the receiving app’s configuration. They never carry a snapshot of the exporting app’s connection or project. An owned-key dashboard with Automatic connection can carry its used group keys, but carries no gateway login. Project settings show Imported keys until Automatic or another project is saved; selecting a project also enables its address list and key refresh. Imported keys can be exported again.
Import is available under + → Add → Import dashboard. Success stays on Dashboards; a name match offers Import as copy or Replace. Import errors appear in a popup with a scrollable code section and Copy details.
Complete example
The example house: a Home with links to two spaces, a living room with two pages and a kitchen, a Moods scenes widget, two favourites and a configured gateway.
{
"format": 1,
"name": "Villa",
"theme": "night",
"keepScreenOn": true,
"favorites": ["t1", "t4"],
"connection": { "mode": "gateway", "gateway": { "name": "Main gateway", "host": "192.168.1.20" } },
"home": {
"name": "Home",
"icon": "home",
"tiles": [
{ "type": "navigation", "name": "Living room", "icon": "living", "target": "r1" },
{ "type": "navigation", "name": "Kitchen", "icon": "kitchen", "target": "r2" },
{ "type": "valueDisplay", "name": "Outdoor", "icon": "temperature", "valueType": "f16", "unit": "°C", "decimals": 1, "status": { "address": "5/1/1", "dpt": "9.001" } }
],
"rooms": [
{
"id": "r1",
"name": "Living room",
"icon": "living",
"panels": [
{
"tiles": [
{ "id": "t1", "type": "switch", "name": "Ceiling light", "icon": "light_group", "command": "1/1/1", "status": "1/1/2" },
{ "type": "dimmer", "name": "Sofa lamp", "icon": "floor_lamp", "switch": "1/1/10", "brightness": "1/1/12", "brightnessStatus": "1/1/13" },
{ "type": "blind", "name": "Terrace blind", "move": "2/1/1", "stop": "2/1/2", "positionStatus": "2/1/3" },
{ "id": "t4", "type": "thermostat", "name": "Living room", "setpoint": "3/1/1", "setpointStatus": "3/1/2", "roomTemperature": "3/1/3" }
]
},
{
"tiles": [
{ "type": "tunableWhite", "name": "Reading light", "switch": "1/2/1", "brightness": "1/2/2", "temperature": "1/2/3" }
]
}
]
},
{
"id": "r2",
"name": "Kitchen",
"icon": "kitchen",
"tiles": [
{ "type": "switch", "name": "Counter light", "command": "1/4/1", "status": "1/4/2" },
{ "type": "statusIndicator", "name": "Window", "icon": "window", "status": { "address": "6/1/1", "dpt": "1.019" }, "zeroLabel": "Closed", "oneLabel": "Open" }
]
}
]
}
}
Validation
An import checks the whole file and lists every problem with its place in the file, e.g. $.home.rooms[1].tiles[3].status.address. A file with any problem is not imported; nothing is stored.
| Problem | Example |
|---|---|
| Not JSON | A missing comma or quote |
| A required field is missing | A widget without name |
| A field has the wrong kind of value | "size": 2 instead of "2x1" |
| An unknown value | "control": "slide" |
| A widget type the app does not know | A file from a newer SharKNX |
| A widget is missing an address it needs | A dimmer with control slider but no brightness |
| A widget breaks its own rules | A DPT that does not fit the role, a size the type does not allow, a scene number above 63 |
| A link or favourite points at nothing | "target": "r9" with no space r9 |
| An ID is used twice | Two widgets t4 |
| A full form and its short form together | tiles and panels in one space; address and targets in one send |
| A newer file format | "format": 2 |
Limits
| What | Limit |
|---|---|
| Names (dashboard, spaces, widgets, states, buttons) | 50 characters |
| Spaces in a dashboard, Home included | 500 |
| Space nesting below Home | 8 levels |
| Pages in a space | 10 |
| Widgets on a page | 100 |
| Widgets in a dashboard | 5000 |
| Numbers in IDs | 0–999999 |
Versions
Every exported file starts with "format": 1. A file without it is read as the current format. A file with a higher number was made by a newer SharKNX and is not imported; update the app.
Files keep importing as SharKNX grows: new fields are added with defaults, so an older file simply lacks them, and a field never changes its meaning under the same name. A newer file in an older app loses only the fields that app does not know.