Hi Michel, if I have 4 text “cards” which have each different background colors, depending on their value, do I need 4 different variables to set the color, or can I send the color to “an” ID?
You can send data directly to a Dashboard Studio topic. If you check the “Tips and tricks” section in the help file, there is a topic “Dynamic Colors: Thermostat Heating Status” that specifically explains how to change colors dynamically without the need for Homey Variables.
Every color setting in Dashboard Studio can also be color corrected. This means that if you send a specific color to a topic, you can still tweak and refine it. It is a great way to create gradients or easily tint elements like highlights while still keeping the original base color intact.
I will investigate this problem ![]()
@Amersfoort I will investigate the issues also, and overthink your requests.
Ah, I missed this. Sorry. Looking into it!
@Amersfoort
My version is 1.8.9
The automatic update is on, but it is still 1.8.9
How can I update it manualy?
Use the normal app url and extend this with /test. So the full url of a test version is https://homey.app/nl-nl/app/com.satoer.dashboardstudio/Dashboard-Studio/test/.
Push install button to get the latest test version. Even the test versions of Dashboard Studio are stable.
@Amersfoort
Thanks for the hints. All problems are solved now with version 1.9.3
There are some issues left when making a new label.
I cannot change upper/lower case, it always goes back to uppercase.
The Bold checkbox does not work
The Color wil not listen to a homey link
This is possible using the text widget (once I get it working on iOS 12 again
)
You can add the toping between {{ and }} Like: {{sim/temperature}}°C
Or you can use a gauge widget and disable the icon, bar etc.
Ah, so this was about version 1.8.9? ![]()
@Cor_Brink : Still it is a test version
But the risk is low since DS has a build in versioning system to revert back to an old version if something is not migrated correctly (but you should also backup dashboards on your home PC). I will try to solve the bugs as soon as possible. Once the bugs of the test version are fixed I publish it as the stable version.
Yes, I noticed this myself also. Colors and dynamic topics tied to to text and icons did not migrate properly. I will fix this, but you probably need to load a pre 1.9.0 dashboard again to fix it. (so changes made in 1.9.3 might get lost, or you need to re-link the color topic’s again.
Can you explain what you mean with this. Close the app? You mean the dashboard? So a button / or other option that closes the website tab or something?
But you can insert an SVG icon in a Markdown table? (like:
| Col 1 | Col 2 | Col 3 | Col 4 |
| --- | --- | --- | --- |
| | |  | |
Or do you mean RAW svg code?
It’s complicated. DS is communicating with Homey using websockets. And it is keeping a heartbeat to check if there is still a connection. But I think it might be unreliable to use this to check if a dashboard is still running. Maybe I could create a card like “Dashboard name has become unresponsive for X minutes” so I user can determine it’s own unresponsive time (and limit false triggers like a short wifi disruption of something)
I have not experienced this behaviour. So apparently you send an image url to an image widget, but the image is not available yet. But why is that image not available yet? What image are you using from the knmi app? (So I can check the behaviour)
The dashboard does not know beforehand you are going to send data. But you could send a message before you are going to send data? Like I did with my calendar test dashboard:
Loading iCal data (especially from a large data set) can take a longer time. So I first send a message to a text widget that it is loading data (it just shows “Please wait” ) and when it had parsed the iCal data I see the actual data.
You could also completely design your own hourglass, and set the visibility to on before the data parsing, and to off after the data parsing?
After a reboot the DS cache memory is empty. If that is the case, it already tries to load the last known values from each device. But data directly send from flow-cards is lost. Can’t you resend these flows with this card:

(I would put a wait of a couple of minutes after this to be sure DS is also started)
Or use:
with DS as App?
Noted. I think this should not be a widget setting, but more an overall setting inside the “Dashboard Environment”?
I can not seem to recreate your problem. I added lots of text inside a Markdown table just like yours and it seems to handle it fine ![]()
Does this always happen? If you have a problematic text, can you open up the “Data Stream Explorer” And copy the RAW value and paste it in a code block over here, so I can better investigate the problem?
Yes, I use Fully Kiosk (free version) without buttons, so all screen space can be used by the dash.
In my dash menu I would like to define a button to close the dash and the Fully Kiosk app to return to Android.
Everywhere in the app I can define an external image as an icon. When I do the same in a Markdown table, like
| Col 1 | Col 2 | Col 3 | Col 4 |
| --- | --- | --- | --- |
| | | :ph-user: | |
| | |  | |
this is the result (goal: dynamic icons related to the weather forecast):
Size, color (no “tint with icon color” option) and position differ from the default Phosphor icons. I have to define the complete SVG myself, including format and color, which is challenging with dynamic icons.
Sounds like a good solution when the dashboard is getting active or inactive. Please use x seconds, x minutes (and x hours) like cards in other apps do.
I think the script takes some time to get the dynamic urls of the 8 images.
These are data derived from device capabilities, such as sunrise and sunset and the car battery. These values have not changed since the nightly reboot of Homey.
If I manually restart the DS app again (the app itself, not the dashboard), these values do become visible.
Raw value, preview raw value and actual result:
### Toelichting en waarschuwingen
| | |
| :--- | :--- |
| Samenvatting: | In het zuiden kans op een onweersbui, verder vanaag veel zon. |
| Weeralarm: | Code groen: In het uiterste zuiden van Limburg komen vanochtend enkele onweersbuien voor, mogelijk met veel regen in korte tijd en hagel. Er is kans op plaatselijke wateroverlast. De onweersbuien trekken later vanochtend weg. Bij de buien is kans op plaatselijk 20-30 mm regen in een uur tijd en hagel. Uitgifte: 30/05/2026 06:02 uur LT |
I think it is offset related. In screen above the Table text offset Y is 60. Setting this value to 0, I can see all the text:
Note: I realize that these are first world “problems”.
Using the following code: click on the button and show the selected button value 1, 2 or 3.
in a lot of times the button click is not giving any response. I can’t figure out why (no difference using global or local variable).
{
"snippetHeader": "Dashboard Studio Snippet",
"snippetType": "widget-snippet",
"snippetFormatVersion": 1,
"version": "1.9.3",
"source": {
"dashboardName": "DemoKnop",
"page": 1,
"createdAt": "2026-05-30T08:51:30.752Z"
},
"master": {
"currentPage": 1
},
"widgets": {
"switch_845774038": {
"type": "switch",
"overrides": {
"x": 10,
"y": 90,
"width": 365,
"height": 260,
"zIndex": 20,
"page": "1",
"buttonLabel": "1",
"outputTopic": "DemoKnop",
"onPayload": "1",
"icons": {
"on": {
"source": "custom",
"builtin": "ph-check-fat",
"weight": "fill",
"customUrl": "",
"tintImage": false,
"size": 180
},
"off": {
"color": "#60A5FA"
}
},
"metaName": "Knop1",
"style": "image-only",
"labelPos": "bottom",
"bgVisible": true,
"glowEnabled": true,
"bgOpacityStart": 0,
"bgOpacityEnd": 0,
"glowColor": "@backgroundAccent",
"glowOpacity": 100,
"glowRadius": 40,
"contentAlign": "center",
"btnRadius": 40,
"buttonContentInset": 0,
"scale": 1,
"borderColor": "@accentSoft",
"borderOpacity": 100,
"borderWidth": 1,
"bevel": true,
"mode": "push",
"cornerRadius": 20,
"typography": {
"buttonLabelInside": {
"offsetY": 0,
"color": "#E2E8F0",
"colorOff": "#E2E8F0"
},
"buttonLabelOutside": {
"textTransform": "none",
"offsetY": 55,
"fontSize": 30
}
},
"showIcon": false
},
"bindings": {}
},
"switch_949322008": {
"type": "switch",
"overrides": {
"x": 400,
"y": 90,
"width": 365,
"height": 260,
"zIndex": 20,
"page": "1",
"buttonLabel": "2",
"outputTopic": "DemoKnop",
"onPayload": "2",
"icons": {
"on": {
"source": "custom",
"builtin": "ph-check-fat",
"weight": "fill",
"customUrl": "",
"tintImage": false,
"size": 180
},
"off": {
"color": "#60A5FA"
}
},
"metaName": "Knop2",
"style": "image-only",
"labelPos": "bottom",
"bgVisible": true,
"glowEnabled": true,
"bgOpacityStart": 0,
"bgOpacityEnd": 0,
"glowColor": "@backgroundAccent",
"glowOpacity": 100,
"glowRadius": 40,
"contentAlign": "center",
"btnRadius": 40,
"buttonContentInset": 0,
"scale": 1,
"borderColor": "@accentSoft",
"borderOpacity": 100,
"borderWidth": 1,
"bevel": true,
"mode": "push",
"cornerRadius": 20,
"typography": {
"buttonLabelInside": {
"offsetY": 0,
"color": "#E2E8F0",
"colorOff": "#E2E8F0"
},
"buttonLabelOutside": {
"textTransform": "none",
"offsetY": 55,
"fontSize": 30
}
},
"showIcon": false
},
"bindings": {}
},
"switch_987771281": {
"type": "switch",
"overrides": {
"x": 790,
"y": 90,
"width": 365,
"height": 260,
"zIndex": 20,
"page": "1",
"buttonLabel": "3",
"outputTopic": "DemoKnop",
"onPayload": "3",
"icons": {
"on": {
"source": "custom",
"builtin": "ph-check-fat",
"weight": "fill",
"customUrl": "",
"tintImage": false,
"size": 180
},
"off": {
"color": "#60A5FA"
}
},
"metaName": "Knop3",
"style": "image-only",
"labelPos": "bottom",
"bgVisible": true,
"glowEnabled": true,
"bgOpacityStart": 0,
"bgOpacityEnd": 0,
"glowColor": "@backgroundAccent",
"glowOpacity": 100,
"glowRadius": 40,
"contentAlign": "center",
"btnRadius": 40,
"buttonContentInset": 0,
"scale": 1,
"borderColor": "@accentSoft",
"borderOpacity": 100,
"borderWidth": 1,
"bevel": true,
"mode": "push",
"cornerRadius": 20,
"typography": {
"buttonLabelInside": {
"offsetY": 0,
"color": "#E2E8F0",
"colorOff": "#E2E8F0"
},
"buttonLabelOutside": {
"textTransform": "none",
"offsetY": 55,
"fontSize": 30
}
},
"showIcon": false
},
"bindings": {}
},
"text_3673": {
"type": "text",
"overrides": {
"x": 470,
"y": 440,
"width": 260,
"height": 70,
"page": 1,
"text": "Knop: {{DemoKnop}}",
"metaName": "New Text"
},
"bindings": {}
}
}
}
NEW TEST Version Dashboard Studio 1.9.4
- New: Text widget — Wrap Text option in Text Settings lets you turn line wrapping on or off.
- Fixed: Text widget shows again on iOS 12 and other older iPhones and iPads where it was missing.
- Fixed: Dashboards upgraded from version 1.9.0 keep icon colors, text colors, and live MQTT color bindings.
- Fixed: Label widget — Bold, Italic, and Case settings apply correctly and are kept after saving.
I have implemented a “Wrap Text” option:
If you disable this feature (default on) it does not wrap the text to the next line if it does not fit the container. I also notice the word “Ongeveer” is masked off to the top. My guess it is not using the “Auto-Fit Text to Frame” feature? (Otherwise it should fit the container). You could also play with the padding setting in the “Layout & Dimension” settings
I received the iOS 12 test device (iPad Air 2 still on iOS 12) and I could fix the problem. Everyting in the demo seems to work fine. The performance is a bit slow though, so I do not advise to build large (demo size) dashboards with it.
Can you check if this problem is also fixed? I did not specifically changed code to fix this problem on iOS 12, but I did changed code that might be related to it. In my testing (the demo file) I did not see any problems with the png’s in the image widget.
Can you test if it works now? In my testing old dashboards with dynamic color settings now migrate properly to 1.9.X. You need to load a pre- 1.9.0 dashboard to migrate it. (You can use the versioning system in the load dashboard from homey dialog). If you already changed a lot to your dashboard and saved it in a 1.9.X version, you need to restore the dynamic colors manually.
This is fixed ![]()
The word wrap off looks great (installed the latest version), thank you!
Thanks for the test snippet (that really helps a lot). It is not really a bug. You have set it to image only, and when using an image the button area is just the image. If you add an image you see:
And only the image itself acts as the clickable “button” area. You can expand this area by adjusting the “Overall Scale Multiplier” or by setting the “Button Label Position” to “Inside bottom,” which makes the entire container (minus the padding) function as a button. Looking back, I really don’t like the “Overall Scale Multiplier” approach. I would much prefer a fixed width and height setting in pixels. However, I can’t easily remove or transform this setting now because it would probably mess up a lot of dashboards. ![]()
You are probably want to use it as an invisible button? Would a new “Visual Style” “Invisible” help? That makes the whole button container a button? And in edit mode still show the outlines show you can see them
. Just thinking out loud. Ideas?
Thanks for the explanation, now I understand what is happening.
If I set the “Visual style” to the value “Button (Rect)”, it is clearly visible where the button can be activated. My cursor changes to a “clickable hand” as soon as it comes within the line of a button, even when the text is “Outside bottom”. It is too confusing (for me at least).
The “Button label position” in the example below is set to “Inside bottom”, but it looks like the middle.
It seems to me that there is a relationship between the multiplier and the icon. Icon 50 with a multiplier of 2 is just as large as Icon 25 with a multiplier of 4. Perhaps that can be converted to pixel.
I would say that everything within the button coordinates should be clickable (mouse arrow becomes “clickable hand”), so independent of padding, icon size, border thickness, corner radius, bottom label position, multipliers, etc.
Yes, an invisible button. Preferably no special options for this, unless it is otherwise technically impossible.


















