{"id":30574,"plugin_id":"plugin_asdk_app_69b0786ff14081918e976447c90edeac","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-09T12:06:34.910Z","digest":"5fecdefe847a08e0e17f45e6df9bcf3afad9152bcfc54d2a8cdf91ee09ed28a3","against":null,"payload":{"description":"Diagnose why an Apilio automation did not fire, fired at the wrong time, or produced the wrong result. Use when the user reports that a logicblock is misbehaving, or asks what a logicblock actually does.","included_files":[],"name":"troubleshoot-automation","skill_md_contents":"---\nname: troubleshoot-automation\ndescription: Diagnose why an Apilio automation did not fire, fired at the wrong time, or produced the wrong result. Use when the user reports that a logicblock is misbehaving, or asks what a logicblock actually does.\n---\n\n# Troubleshooting an Apilio automation\n\nRead the configuration before theorising. `list_logicblocks` gives names and UUIDs;\n`get_logicblock` gives the whole thing — conditions with their comparison details, whether\nthey trigger re-evaluation, and the current value of the variable each one reads, plus the\ncondition logic and the actions for both branches.\n\n## Workflow\n\n1. `list_logicblocks` → find the logicblock the user means, take its UUID.\n2. `get_logicblock` → the full configuration. Work through the checks below.\n3. `list_log_entries` with `parent_type: \"logicblock\"` and `parent_uuid` → what actually\n   happened, including the linked actions.\n4. `get_variable` on a condition's `variable_uuid` when you need more than its current value\n   — in particular when it last changed.\n5. Report the cause and propose a fix. Make changes only after the user agrees.\n\n## What to check, in order\n\n**Is it active?** `active: false` does not stop the logicblock from evaluating — it stops it\nfrom running any actions. So the symptom is \"the logs show it evaluated but nothing\nhappened\". The most common cause by far.\n\n**Which condition is false?** Each condition carries `variable_value` — the current value of\nthe variable it reads — plus its `comparison`. Work the comparison out yourself: a numeric\ncondition with `variable_value: \"18\"` and `comparison: {operator: \"greaterthan\", constant:\n\"25\"}` is false. With `condition_logic: \"and\"` a single false condition blocks everything;\nwith `condition_logic: \"complex\"`, read `condition_expression` — the names in it are the\ncondition names — and evaluate it against what you worked out.\n\nApilio does not persist a per-condition result, so there is no stored true/false to read\nback. A `variable_value` of `null` means that variable has never received a value, which is\nitself usually the answer.\n\nTime conditions have no variable. Read `cron_expression`, `duration_seconds` and `timezone` and\nreason about the schedule directly.\n\n**Is anything triggering it?** There are two automatic paths, and a condition may use\neither:\n\n- `triggering: true` — re-evaluate when this condition's **result** flips.\n- `trigger_on_content_update: true` — re-evaluate on every **value update**, even when the\n  result is unchanged and even when `triggering` is false.\n\nSo check both fields on every condition before concluding nothing drives the automation. If\nthe event the user describes belongs to a condition with both set to false, that event never\nstarts it. If no condition sets either, it only ever runs when something\nelse evaluates it explicitly — an `apilio` action of type `logicblock_evaluate` in another\nlogicblock, a webhook, or a manual run. \"It only works when I press the button\" is this.\n\n**Is a timing guard suppressing it?** Each condition's `timing` holds `modified_within`\n(the value must have been updated within N seconds — a stale sensor makes this false) and\n`unmodified_since` (the value must have been stable for N seconds — a flapping sensor makes\nthis false).\n\n**Did the right branch run?** Actions are split into `positive` and `negative`. An\nautomation that \"does nothing\" often has its action on the branch that isn't being reached.\n\n**Was the action delayed?** Each action has a `delay` of `{type: \"fixed\", seconds: N}` or\n`{type: \"random\", min_seconds:, max_seconds:}`. A long delay looks like a failure.\n\n**Did the action itself fail?** The log entries carry the failure reason. `api_error` and\n`connection_error` on a Tado or eWeLink action usually mean the account connection is\nbroken and needs reconnecting in the Apilio web app.\n\n## Evaluating on purpose\n\n`evaluate_logicblock` runs the logicblock **and fires its actions** — it will switch real\ndevices (unless the logicblock is inactive, in which case it evaluates but runs nothing).\nAsk the user before calling it, and prefer working from `variable_value`,\n`last_evaluation_result` and the log entries first.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}