From 4fbe4135b145c04d7898b9e84b5cfd6953893234 Mon Sep 17 00:00:00 2001 From: Joseph Abbey Date: Sun, 19 Oct 2025 21:23:34 +0100 Subject: [PATCH] Update schema to support numeric items --- config.schema.json | 557 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 525 insertions(+), 32 deletions(-) diff --git a/config.schema.json b/config.schema.json index b69b00a..8313d7c 100644 --- a/config.schema.json +++ b/config.schema.json @@ -17,11 +17,21 @@ "$ref": "#/$defs/items" } }, - "required": ["title", "items"], + "required": [ + "title", + "items" + ], "additionalProperties": false, "$defs": { "toggle": { "type": "object", + "examples": [ + { + "type": "toggle", + "name": "Example", + "entity": "switch.example" + } + ], "properties": { "entity": { "$ref": "#/$defs/entity" @@ -37,15 +47,7 @@ "$ref": "#/$defs/content" }, "tap_action": { - "type": "object", - "properties": { - "confirm": { - "$ref": "#/$defs/confirm" - }, - "pin": { - "$ref": "#/$defs/pin" - } - }, + "$ref": "#/$defs/tap_action", "additionalProperties": false }, "enabled": { @@ -55,7 +57,11 @@ "$ref": "#/$defs/exit" } }, - "required": ["entity", "name", "type"], + "required": [ + "entity", + "name", + "type" + ], "additionalProperties": false }, "template": { @@ -86,7 +92,11 @@ "$ref": "#/$defs/enabled" } }, - "required": ["name", "content", "type"], + "required": [ + "name", + "content", + "type" + ], "additionalProperties": false }, { @@ -109,7 +119,20 @@ "description": "Use 'info' or 'tap' instead." }, "tap_action": { - "$ref": "#/$defs/tap_action" + "$ref": "#/$defs/tap_action", + "properties": { + "service": { + "$ref": "#/$defs/service" + }, + "data": { + "type": "object", + "title": "Your services's parameters", + "description": "The object containing the parameters and their values to be passed to the entity. No schema checking can be done here, you are on your own! On application crash, remove the parameters." + } + }, + "required": [ + "service" + ] }, "enabled": { "$ref": "#/$defs/enabled" @@ -118,7 +141,12 @@ "$ref": "#/$defs/exit" } }, - "required": ["name", "content", "type", "tap_action"], + "required": [ + "name", + "content", + "type", + "tap_action" + ], "additionalProperties": false } ] @@ -140,11 +168,27 @@ "$ref": "#/$defs/enabled" } }, - "required": ["name", "content", "type"], + "required": [ + "name", + "content", + "type" + ], "additionalProperties": false }, "tap": { "type": "object", + "examples": [ + { + "type": "tap", + "name": "Example", + "tap_action": { + "service": "notify.notify", + "data": { + "message": "Example" + } + } + } + ], "properties": { "entity": { "$ref": "#/$defs/entity" @@ -160,13 +204,26 @@ "$ref": "#/$defs/content" }, "service": { - "$ref": "#/$defs/entity", + "$ref": "#/$defs/service", "deprecated": true, "title": "Schema change:", "description": "Use 'tap_action' instead to mirror Home Assistant." }, "tap_action": { - "$ref": "#/$defs/tap_action" + "$ref": "#/$defs/tap_action", + "properties": { + "service": { + "$ref": "#/$defs/service" + }, + "data": { + "type": "object", + "title": "Your services's parameters", + "description": "The object containing the parameters and their values to be passed to the entity. No schema checking can be done here, you are on your own! On application crash, remove the parameters." + } + }, + "required": [ + "service" + ] }, "enabled": { "$ref": "#/$defs/enabled" @@ -175,11 +232,22 @@ "$ref": "#/$defs/exit" } }, - "required": ["name", "type"], + "required": [ + "name", + "type" + ], "additionalProperties": false }, "group": { "type": "object", + "examples": [ + { + "type": "group", + "name": "Example", + "title": "Example", + "items": [] + } + ], "properties": { "entity": { "$ref": "#/$defs/entity", @@ -210,9 +278,435 @@ "$ref": "#/$defs/enabled" } }, - "required": ["name", "title", "type", "items"], + "required": [ + "name", + "title", + "type", + "items" + ], "additionalProperties": false }, + "numeric": { + "type": "object", + "examples": [ + { + "type": "numeric", + "name": "Example", + "entity": "light.example", + "attribute": "brightness", + "service": "light.turn_on", + "service_attribute": "brightness", + "min": 0, + "max": 255, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "input_number.example", + "service": "input_number.set_value", + "service_attribute": "value", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "number.example", + "service": "number.set_value", + "service_attribute": "value", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "fan.example", + "attribute": "percentage", + "service": "fan.set_percentage", + "service_attribute": "percentage", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "valve.example", + "attribute": "position", + "service": "valve.set_valve_position", + "service_attribute": "position", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "cover.example", + "attribute": "position", + "service": "cover.set_position", + "service_attribute": "position", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "cover.example", + "attribute": "tilt_position", + "service": "cover.set_tilt_position", + "service_attribute": "tilt_position", + "min": 0, + "max": 100, + "step": 1 + }, + { + "type": "numeric", + "name": "Example", + "entity": "media_player.example", + "attribute": "volume_level", + "service": "media_player.volume_set", + "service_attribute": "volume_level", + "min": 0, + "max": 1, + "step": 0.01 + }, + { + "type": "numeric", + "name": "Example", + "entity": "climate.example", + "attribute": "temperature", + "service": "climate.set_temperature", + "service_attribute": "temperature", + "min": 0, + "max": 100, + "step": 1 + } + ], + "allOf": [ + { + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "type": { + "$ref": "#/$defs/type", + "const": "numeric" + }, + "content": { + "$ref": "#/$defs/content" + }, + "tap_action": { + "$ref": "#/$defs/tap_action" + }, + "enabled": { + "$ref": "#/$defs/enabled" + }, + "exit": { + "$ref": "#/$defs/exit" + }, + "min": { + "type": "number", + "title": "Minimum value" + }, + "max": { + "type": "number", + "title": "Maximum value" + }, + "step": { + "type": "number", + "title": "Step size" + }, + "decimals": { + "type": "number", + "title": "Number of decimals to display", + "minimum": 0, + "maximum": 10, + "default": 1 + }, + "entity": { + "$ref": "#/$defs/entity" + }, + "attribute": { + "type": "string", + "title": "Attribute on the entity with the current numeric value. To use the state of the entity, do not specify." + }, + "service": { + "$ref": "#/$defs/service" + }, + "service_attribute": { + "type": "string", + "title": "Attribute on the service data for the value to set." + } + }, + "required": [ + "name", + "type", + "min", + "max", + "step", + "entity", + "service", + "service_attribute" + ], + "additionalProperties": false + }, + { + "properties": { + "entity": { + "pattern": "^(light|input_number|number|fan|valve|cover|media_player|climate)\\.[^.]+$" + } + }, + "if": { + "properties": { + "entity": { + "pattern": "^light\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "brightness" + }, + "service": { + "const": "light.turn_on" + }, + "service_attribute": { + "const": "brightness" + }, + "min": { + "const": 0 + }, + "max": { + "const": 255, + "description": "Lights are not a percentage." + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^input_number\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "value" + }, + "service": { + "const": "input_number.set_value" + }, + "service_attribute": { + "const": "value" + } + }, + "not": { + "required": [ + "attribute" + ] + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^number\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "value" + }, + "service": { + "const": "number.set_value" + }, + "service_attribute": { + "const": "value" + } + }, + "not": { + "required": [ + "attribute" + ] + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^fan\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "percentage" + }, + "service": { + "const": "fan.set_percentage" + }, + "service_attribute": { + "const": "percentage" + }, + "min": { + "const": 0 + }, + "max": { + "const": 100 + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^valve\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "position" + }, + "service": { + "const": "valve.set_valve_position" + }, + "service_attribute": { + "const": "position" + }, + "min": { + "const": 0 + }, + "max": { + "const": 100 + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^cover\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "position" + }, + "service": { + "const": "cover.set_position" + }, + "service_attribute": { + "const": "position" + }, + "min": { + "const": 0 + }, + "max": { + "const": 100 + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^cover\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "tilt_position" + }, + "service": { + "const": "cover.set_tilt_position" + }, + "service_attribute": { + "const": "tilt_position" + }, + "min": { + "const": 0 + }, + "max": { + "const": 100 + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^media_player\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "volume_level" + }, + "service": { + "const": "media_player.volume_set" + }, + "service_attribute": { + "const": "volume_level" + }, + "min": { + "const": 0 + }, + "max": { + "const": 1 + } + } + }, + "else": { + "if": { + "properties": { + "entity": { + "pattern": "^climate\\.[^.]+$" + } + } + }, + "then": { + "properties": { + "attribute": { + "const": "temperature" + }, + "service": { + "const": "climate.set_temperature" + }, + "service_attribute": { + "const": "temperature" + } + } + } + } + } + } + } + } + } + } + } + } + ] + }, "type": { "title": "Menu item type", "description": "One of 'info', 'tap', 'toggle' or 'group'." @@ -235,6 +729,9 @@ }, { "$ref": "#/$defs/group" + }, + { + "$ref": "#/$defs/numeric" } ] } @@ -258,22 +755,13 @@ "title": "Action", "description": "'confirm' field is optional.", "properties": { - "service": { - "$ref": "#/$defs/service" - }, "confirm": { "$ref": "#/$defs/confirm" }, "pin": { "$ref": "#/$defs/pin" - }, - "data": { - "type": "object", - "title": "Your services's parameters", - "description": "The object containing the parameters and their values to be passed to the entity. No schema checking can be done here, you are on your own! On application crash, remove the parameters." } - }, - "required": ["service"] + } }, "content": { "title": "Home Assistant Template", @@ -307,7 +795,10 @@ "$ref": "#/$defs/content" } }, - "required": ["type", "content"] + "required": [ + "type", + "content" + ] }, { "properties": { @@ -317,7 +808,9 @@ "const": "status" } }, - "required": ["type"] + "required": [ + "type" + ] } ] }, @@ -334,4 +827,4 @@ "description": "Choose to exit the application after this item has been selected. Disabled (false) by default. N.B. Only actionable menu items can have this field added." } } -} +} \ No newline at end of file