quickapp-types
Skill1 starsChanged 15 days agoMITView on GitHub
All Fibaro device types (40+ types: switches, sensors, climate, covers, controllers), flua file headers (--%%name, --%%type, --%%var, --%%u:, --%%debug, etc.), UI element syntax (label, button, slider, switch, select, multi), and minimal starter templates for each device category. USE FOR: creating a new QuickApp, choosing the right device type (e.g. "what type for a temperature sensor?"), defining UI elements, understanding required actions per device type.
In this repository18 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- code-tourSkill
- flua-setupSkill
- flua-troubleshootingSkill
- hc3-lua-scenesSkill
- hc3-rest-apiSkill
- hc3-write-safetySkill
- lua-basicsSkill
- network-device-testSkill
- plua-migrationSkill
- quickapp-apiSkill
- quickapp-patternsSkill
- quickapp-testSkill
- quickapp-troubleshootingSkill
- quickapp-uiSkill
- qwikchildSkill
- skill-creatorSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 171
All update value (boolean).
- Very specific: line 192
All update value as number or {value=n, unit="C"}.
- Very specific: line 209
All thermostat setpoint/temperature values use {value=n, unit="C"} format.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
QuickApp Device Types and Headers
Reference for all flua QuickApp file headers and the complete set of Fibaro device types.
Starter Lua templates are in the templates/ directory — the complete set (30 device types), one file per type, each with the type's canonical actions and property conventions (e.g. multilevelSwitch.lua handles turnOn/turnOff/setValue with value 0-99; temperatureSensor.lua asserts {value=, unit=}). Reference them when the user needs a working skeleton for a specific device type, and scaffold one with flua --tool newQA <type> [name] (lists all types with no argument).
flua Header Syntax
--%%key:valueHeaders are Lua comments processed by flua before execution. All headers must appear before any Lua code.
Device Configuration Headers
--%%name:My QuickApp -- display name (required)
--%%type:com.fibaro.binarySwitch -- device type (required)
--%%manufacturer:ACME Corp
--%%model:SmartDevice v1.0
--%%description:What this device does
--%%uid:unique-id-stringVariable Headers
--%%var:apiKey="abc123" -- string value: must be a Lua string literal
--%%var:location="Stockholm" -- strings need quotes
--%%var:updateInterval=30 -- numbers are Lua literals, no quotes neededGotcha: The value is evaluated as a Lua expression.
--%%var:X=Londonevaluates the globalLondon(likelynil). Use--%%var:X="London"for strings.
Interface Headers
--%%interfaces:{"battery","energy"}Multi-file Headers
--%%file:./lib/utils.lua,utils -- include external Lua file (path, module name)To include a library file, use --%%file:$fibaro.lib.libraryName,alias (e.g. --%%file:$fibaro.lib.qwikchild,qwikchild)
Development & Debug Headers
--%%debug:refreshState=true,api=true,http=true -- debug logging channels
--%%offline:true -- legacy alias for --%%mode:offline
--%%mode:online|offline|proxy -- runtime mode; proxy needs online + HC3 credentials
--%%warn:true -- extra runtime warnings (e.g. api error statuses)
--%%db:file.json -- seed data; --%%db:+file.json also persists state across restarts
--%%location:latitude=N,longitude=N -- pin the sim's location (sun times)
--%%keep-alive:true -- online: keep the run alive past idle
--%%scene:true -- run this QA as an HC3 Lua scene
--%%uid:x / --%%description:x / --%%model:x / --%%build:x / --%%manufacturer:x
-- device properties
--%%clobber:name=value -- plua's --%%conceal: the PACKAGE value, taken RAW
-- (no Lua evaluation — don't quote it)--%%save, --%%desktop, --%%breakonload, --%%project and --%%qacolor
are plua directives flua does not implement (ignored/unknown) — remove
them when migrating. --%%proxy:true is the legacy alias for
--%%mode:proxy, not a casual flag.
UI Element Headers
Each --%%u: line defines one row. Use {{...},{...}} for multiple elements on the same row.
Label
--%%u:{label="statusLbl",text="Status: Ready"}Button
--%%u:{button="myBtn",text="Click Me",onReleased="handleClick"}
-- callback: function QuickApp:handleClick(event) endSwitch (toggle)
--%%u:{switch="autoSwitch",text="Auto Mode",value="false",onToggleOn="handleOn",onToggleOff="handleOff"}
-- 5.221 split events (also onReleased); event.values[1] == "true"/"false" (string)Slider
--%%u:{slider="brightSlider",text="Brightness",min="0",max="100",value="50",onChanged="handleSlider"}
-- use tonumber(event.values[1]) to get numeric valueSelect (single-choice)
--%%u:{select="modeSelect",text="Mode",value="1",onToggled="handleSelect",
-- options={{type='option',text='Economy',value='1'},{type='option',text='Comfort',value='2'}}}Multi (multi-select)
--%%u:{multi="tagMulti",text="Tags",values={"1","3"},onToggled="handleMulti",
-- options={{type='option',text='Tag A',value='1'},{type='option',text='Tag B',value='2'}}}Multiple elements on one row
--%%u:{{button="onBtn",text="On",onReleased="turnOn"},{button="offBtn",text="Off",onReleased="turnOff"}}Updating dropdowns at runtime
Single-select (select) — use "selectedItem" to set the current selection:
self:updateView("modeSelect", "options", {{type='option',text='Economy',value='1'},{type='option',text='Comfort',value='2'}})
self:updateView("modeSelect", "selectedItem", "1") -- value string of the selected optionMulti-select (multi) — use "selectedItems" to set selected values, "options" to update the list:
self:updateView("tagMulti", "options", {{type='option',text='Tag A',value='1'},{type='option',text='Tag B',value='2'}})
self:updateView("tagMulti", "selectedItems", {"1","3"}) -- table of selected value stringsGotcha: Using
"values"instead of"selectedItems"(or"selectedItem"for single-select) will silently fail or have no effect on the HC3.
UI event callback pattern
function QuickApp:handleClick(event)
-- event.deviceId, event.elementName, event.eventType, event.values
self:debug("clicked:", event.elementName)
end
function QuickApp:handleSlider(event)
local value = tonumber(event.values[1])
self:updateView("brightSlider", "value", tostring(value))
endDevice Type Quick Reference
Switches
| Type | Required Actions | Value / Notes |
com.fibaro.binarySwitch | turnOn, turnOff | value = boolean |
com.fibaro.multilevelSwitch | turnOn, turnOff, setValue | value = 0–99 |
com.fibaro.colorController | turnOn, turnOff, setValue, setColor | value = 0–99, color = "r,g,b,w" string e.g. "200,10,100,255" |
Templates: binary-switch.lua · multilevel-switch.lua · color-controller.lua
Binary Sensors
All update value (boolean). No required actions.
| Type | Typical use |
com.fibaro.binarySensor | Generic open/closed |
com.fibaro.doorSensor | Door/window |
com.fibaro.windowSensor | Window |
com.fibaro.motionSensor | PIR motion |
com.fibaro.smokeSensor | Smoke detector |
com.fibaro.fireDetector | Fire detector |
com.fibaro.floodSensor | Water/flood |
com.fibaro.waterLeakSensor | Water leak |
com.fibaro.gasDetector | Gas leak |
com.fibaro.coDetector | Carbon monoxide |
com.fibaro.rainDetector | Rain |
com.fibaro.heatDetector | Heat detector |
Template: binary-sensor.lua
Numeric Sensors
All update value as number or {value=n, unit="C"}. No required actions.
| Type | Value format |
com.fibaro.temperatureSensor | {value=21.5, unit="C"} |
com.fibaro.humiditySensor | number 0–100 |
com.fibaro.lightSensor | number (lux) |
com.fibaro.multilevelSensor | number |
com.fibaro.energyMeter | number (kWh) |
com.fibaro.powerMeter | number (W) |
com.fibaro.rainSensor | number (mm/h) |
com.fibaro.windSensor | number (m/s) |
Template: templates/numeric-sensor.lua
Climate / Thermostat
All thermostat setpoint/temperature values use {value=n, unit="C"} format.
Full thermostat types — handle setThermostatMode, update thermostatMode, supportedThermostatModes, temperature:
| Type | Extra Actions | Extra Properties |
com.fibaro.thermostat | setThermostatMode, setHeatingThermostatSetpoint, setCoolingThermostatSetpoint | heatingThermostatSetpoint, coolingThermostatSetpoint |
com.fibaro.thermostatHeat | setThermostatMode, setHeatingThermostatSetpoint | heatingThermostatSetpoint |
com.fibaro.thermostatCool | setThermostatMode, setCoolingThermostatSetpoint | coolingThermostatSetpoint |
com.fibaro.thermostatHeatCool | setThermostatMode, setHeatingThermostatSetpoint, setCoolingThermostatSetpoint | heatingThermostatSetpoint, coolingThermostatSetpoint |
Setpoint-only types — no mode, just setpoints + temperature:
| Type | Required Actions |
com.fibaro.thermostatSetpoint | setHeatingThermostatSetpoint, setCoolingThermostatSetpoint |
com.fibaro.thermostatSetpointHeat | setHeatingThermostatSetpoint |
com.fibaro.thermostatSetpointCool | setCoolingThermostatSetpoint |
com.fibaro.thermostatSetpointHeatCool | setHeatingThermostatSetpoint, setCoolingThermostatSetpoint |
HVAC System types — same interface as full thermostat counterparts:
| Type | Actions |
com.fibaro.hvacSystemHeat | setThermostatMode, setHeatingThermostatSetpoint |
com.fibaro.hvacSystemCool | setThermostatMode, setCoolingThermostatSetpoint |
com.fibaro.hvacSystemHeatCool | setThermostatMode, setHeatingThermostatSetpoint, setCoolingThermostatSetpoint |
com.fibaro.hvacSystemAuto | setThermostatMode, setHeatingThermostatSetpoint, setCoolingThermostatSetpoint |
Templates: thermostat.lua (full) · thermostat-heat.lua · thermostat-cool.lua · thermostat-heatcool.lua · thermostat-setpoint-heat.lua · thermostat-setpoint-cool.lua · thermostat-setpoint-heatcool.lua
Covers and Controllers
| Type | Required Actions | Notes |
com.fibaro.windowCovering | open, close, stop, setValue | value = 0–99 (% open) |
com.fibaro.deviceController | (none — generic) | define your own methods |
com.fibaro.remoteController | (none) | call self:emitCentralSceneEvent(keyId, keyAttribute) to emit button events; keyAttribute defaults to "Pressed" |
com.fibaro.alarmPartition | arm, disarm | armed = boolean, alarm = boolean |
Templates: controller.lua · window-covering.lua · alarm-partition.lua · remote-controller.lua
Special
| Type | Required Actions | Properties |
com.fibaro.player | play, pause, stop, next, prev, setVolume, setMute | volume (0–100), mute (boolean), power (boolean) |
com.fibaro.weather | (none) | Temperature {value=n,unit="C"}, Humidity (number), Wind (number) — note capital property names |
com.fibaro.genericDevice | (none) | No specific interface contract |
Templates: player.lua · weather.lua · generic-device.lua
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

