Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Indigo MCP Lite.indigoPlugin/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<plist version="1.0">
<dict>
<key>PluginVersion</key>
<string>2026.7.0</string>
<string>2026.7.1</string>
<key>ServerApiVersion</key>
<string>3.6</string>
<key>IwsApiVersion</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
description, matching the IOM's own guidance.
"""

from tools.control import _optional_delay_duration
from tools.lookup import (
_lookup_or_raise,
_normalize_pagination,
Expand Down Expand Up @@ -79,6 +80,18 @@ def register(handler, *, indigo_module, **_):
"properties": {
"id": {"type": "integer"},
"enabled": {"type": "boolean"},
"delay": {
"type": "integer", "minimum": 0,
"description": "Seconds to wait before applying.",
},
"duration": {
"type": "integer", "minimum": 0,
"description": (
"Seconds until the entity flips BACK to its prior "
"state — e.g. disable with duration=1209600 disarms "
"for two weeks then self-rearms."
),
},
},
}

Expand All @@ -99,7 +112,10 @@ def register(handler, *, indigo_module, **_):
)
handler.register_tool(
name="trigger_enable",
description="Enable or disable an Indigo trigger by id.",
description=(
"Enable or disable an Indigo trigger by id. Optional "
"duration auto-reverts after N seconds (holiday mode)."
),
input_schema=enable_schema,
handler=lambda **args: _trigger_enable_handler(args, indigo_module),
)
Expand Down Expand Up @@ -137,7 +153,11 @@ def register(handler, *, indigo_module, **_):
)
handler.register_tool(
name="schedule_enable",
description="Enable or disable an Indigo schedule by id.",
description=(
"Enable or disable an Indigo schedule by id. Optional "
"duration auto-reverts after N seconds — e.g. disable "
"with duration for a self-rearming holiday mode."
),
input_schema=enable_schema,
handler=lambda **args: _schedule_enable_handler(args, indigo_module),
)
Expand Down Expand Up @@ -174,19 +194,25 @@ def _get_schedule_handler(args, indigo_module):


def _trigger_enable_handler(args, indigo_module):
_reject_unknown_args(args, ("id", "enabled"))
_lookup_or_raise(indigo_module.triggers, _require_int_id(args), "trigger")
_reject_unknown_args(args, ("id", "enabled", "delay", "duration"))
entity_id = _require_int_id(args)
_lookup_or_raise(indigo_module.triggers, entity_id, "trigger")
indigo_module.trigger.enable(
_require_int_id(args), value=_optional_bool(args, "enabled", None)
entity_id,
value=_optional_bool(args, "enabled", None),
**_optional_delay_duration(args),
)
return {"status": "ok"}


def _schedule_enable_handler(args, indigo_module):
_reject_unknown_args(args, ("id", "enabled"))
_lookup_or_raise(indigo_module.schedules, _require_int_id(args), "schedule")
_reject_unknown_args(args, ("id", "enabled", "delay", "duration"))
entity_id = _require_int_id(args)
_lookup_or_raise(indigo_module.schedules, entity_id, "schedule")
indigo_module.schedule.enable(
_require_int_id(args), value=_optional_bool(args, "enabled", None)
entity_id,
value=_optional_bool(args, "enabled", None),
**_optional_delay_duration(args),
)
return {"status": "ok"}

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "indigo-mcp-lite"
version = "2026.7.0"
version = "2026.7.1"
description = "Stdlib-only Indigo MCP server plugin (Intel Mac / Python 3.13 replacement for indigo-mcp-server)"
requires-python = ">=3.10"

Expand Down
19 changes: 19 additions & 0 deletions tests/test_automations.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,22 @@ def _missing(i):
def test_unknown_arg_rejected(mock_indigo):
with pytest.raises(ValueError, match="unknown argument"):
_trigger_execute_handler({"id": 5, "force": True}, mock_indigo)


def test_enable_with_duration_self_rearm(mock_indigo):
mock_indigo.schedules.__getitem__.side_effect = lambda i: _fake_schedule(6, "S")
_schedule_enable_handler(
{"id": 6, "enabled": False, "duration": 1209600}, mock_indigo)
mock_indigo.schedule.enable.assert_called_once_with(
6, value=False, duration=1209600)
mock_indigo.triggers.__getitem__.side_effect = lambda i: _fake_trigger(5, "T")
_trigger_enable_handler(
{"id": 5, "enabled": True, "delay": 60}, mock_indigo)
mock_indigo.trigger.enable.assert_called_once_with(5, value=True, delay=60)


def test_enable_rejects_negative_duration(mock_indigo):
mock_indigo.schedules.__getitem__.side_effect = lambda i: _fake_schedule(6, "S")
with pytest.raises(ValueError, match="duration"):
_schedule_enable_handler(
{"id": 6, "enabled": False, "duration": -5}, mock_indigo)
Loading