@J_Reeves
Both of your points are in 4.6.0, which is uploaded and going out as a test version now. Thanks for the report and for the proposal, they were good ones.
1. Native dashboards: “Missing Scopes”
Short answer: it works, but only through a Personal Access Token, and your token needs one more scope.
The scopes are stated per operation in Homey’s own API specification:
| What |
Scope |
| List and read dashboards, list widgets |
homey.dashboard.readonly |
| Create, edit or delete a dashboard |
homey.dashboard |
Your token has homey.flow, homey.device.readonly, homey.device.control, homey.mood, homey.logic.readonly, homey.zone.readonly and homey.system.readonly, so neither of those. That is the whole cause.
The app’s own API token never carries them either, which I confirmed against a live Homey: the app session is refused with exactly the string Missing Scopes and holds no dashboard scope at all. So there is no way to reach native dashboards without a PAT, and no app permission that would change that.
Go to my.homey.app, Settings, API, edit your token and tick Dashboard. Read-only is enough to list and read; you need the full one to build.
What changed in the app is the answer you get. Missing Scopes names neither the scope nor the token, so there was nowhere to go from it. Now the refusal says which scope is needed, whether a token is set at all, and what the token that IS set currently holds. homey_dashboards_list also returns the scope as its own field, so a client that renders data rather than prose still shows the fix. And the Status tab now lists what your saved token can do and which scope it is still missing, right under the field where you paste it.
2. Control only
Built as you described it, and it is available now.
The part your definition left open was where to put the calls that change something without creating or deleting anything: devices_set_settings, logic_set, zones_update, devices_rename, notifications_send. I settled it with one rule that fits in a sentence:
Control only may switch things on and off, set them and start them. It leaves the layout of your Homey alone.
So:
In. Set device capabilities (single, per zone, batched), start an existing flow, activate a mood, set a variable, set presence, send a notification, speak, set volume, drive the LED ring. Flow-defined tools you publish yourself are in too, because starting one of those is the same act as starting any flow.
Out. Device settings, renaming, moving between zones, changing an icon, editing a zone, enabling or disabling a flow, and everything that creates, overwrites or deletes a flow, dashboard, mood, script, schedule or stored value.
Two calls to explain, since they are the interesting ones:
logic_set is in. Writing a value into a variable you already created is the same act as setting a capability. Creating or deleting the variable is not, and stays out.
devices_set_settings is out. It reconfigures the device, polling interval, calibration, what a button does. Nothing is deleted, but that is your setup, not your lights.
notifications_send and speech_say are in, as you suggested. They produce new output and overwrite nothing, and a voice assistant that cannot answer you is not much of one.
You can pick Control only in three places: per API key, as the global access mode, and as the ceiling for remote connections. The OAuth approval page offers it too, in English and Dutch, with a line saying what it will and will not do.
Existing keys are not affected. The new level sits between Read only and Control and change, and everything it allows was already allowed at Control and change, so nothing you already handed out gained anything. That is enforced as a test across the whole tool catalogue, because a permission that quietly widens is the one bug you cannot take back.
One thing to know if you set the global access mode to Control only: it caps everything, including your own full key, so your assistant can no longer change app settings either. The way back is the settings page in the Homey app. Same as Read only and Off have always behaved, but worth saying out loud.