[ { "id": "'Jarvis: Voice Timer Cancel'", "automation": "- alias: 'Jarvis: Voice Timer Cancel'\n description: Cancel the current Jarvis timer via voice\n triggers:\n - command:\n - cancel timers\n - stop timers\n - delete timers\n - cancel all timers\n - stop all timers\n - delete all timers\n trigger: conversation\n actions:\n - action: input_text.set_value\n alias: Clear timer data\n data:\n value: ''\n target:\n entity_id:\n - input_text.jarvis_timer_data\n - input_text.jarvis_timer_data_2\n mode: single", "config": [ { "name": "jarvis timer data", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data", "device_id": null } }, { "name": "jarvis timer data 2", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data_2", "device_id": null } } ] }, { "id": "'Jarvis: Voice Timer Cancel Specific'", "automation": "- alias: 'Jarvis: Voice Timer Cancel Specific'\n description: Cancel a specific Jarvis timer by number or by label\n triggers:\n - command:\n - cancel the timer\n - cancel the first timer\n - cancel first timer\n - cancel the second timer\n - cancel second timer\n - cancel the {label} timer\n - cancel {label} timer\n - stop the timer\n - stop first timer\n - stop second timer\n - stop the {label} timer\n - stop {label} timer\n trigger: conversation\n actions:\n - alias: Call Gemini to parse cancel intent\n data:\n prompt: \"The user wants to cancel a timer. Return ONLY this JSON:\\n{\\n \\\"index\\\"\\\n : 1,\\n \\\"label\\\": \\\"chicken\\\"\\n}\\n• \\\"index\\\" can be 1, 2, etc.; omit it\\\n \\ if not said\\n• Omit \\\"label\\\" if not said\\nInput: \\\"{{ trigger.sentence\\\n \\ }}\\\"\\n\"\n response_variable: jarvis_cancel_response\n action: google_generative_ai_conversation.generate_content\n - variables:\n parsed: \"{% set raw = jarvis_cancel_response %} {% if raw is mapping and raw.text\\\n \\ is defined %}\\n {{ raw.text | replace('```json','') | replace('```','')\\\n \\ | trim | from_json }}\\n{% elif raw is string %}\\n {{ raw | from_json\\\n \\ }}\\n{% else %}\\n {{ raw }}\\n{% endif %}\"\n timer1_pairs: \"{% set raw = state_attr('sensor.jarvis_timer', 'sorted_all')\\\n \\ %} {% if raw is string %}\\n {{ raw | from_json }}\\n{% elif raw is none\\\n \\ %}\\n []\\n{% else %}\\n {{ raw }}\\n{% endif %}\"\n timer2_pairs: \"{% set raw = state_attr('sensor.jarvis_timer_2', 'sorted_all')\\\n \\ %} {% if raw is string %}\\n {{ raw | from_json }}\\n{% elif raw is none\\\n \\ %}\\n []\\n{% else %}\\n {{ raw }}\\n{% endif %}\"\n timer1_labels: '{{ timer1_pairs | map(attribute=1) | map(attribute=''timerLabel'')\n | list }}'\n timer2_labels: '{{ timer2_pairs | map(attribute=1) | map(attribute=''timerLabel'')\n | list }}'\n timer1_has_label: \"{{ parsed.label is defined and\\n (parsed.label | lower)\\\n \\ in (timer1_labels | map('lower') | list) }}\"\n timer2_has_label: \"{{ parsed.label is defined and\\n (parsed.label | lower)\\\n \\ in (timer2_labels | map('lower') | list) }}\"\n - choose:\n - conditions:\n - condition: template\n value_template: '{{ parsed.index | default(0) | int == 1 }}'\n sequence:\n - action: script.jarvis_cancel_timer_1\n data: {}\n - conditions:\n - condition: template\n value_template: '{{ parsed.index | default(0) | int == 2 }}'\n sequence:\n - action: script.jarvis_cancel_timer_2\n data: {}\n - conditions:\n - condition: template\n value_template: '{{ timer1_has_label }}'\n sequence:\n - action: script.jarvis_cancel_timer_1\n data: {}\n - conditions:\n - condition: template\n value_template: '{{ timer2_has_label }}'\n sequence:\n - action: script.jarvis_cancel_timer_2\n data: {}\n mode: single", "config": [ { "name": "jarvis timer", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer", "device_id": null } }, { "name": "jarvis timer 2", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer_2", "device_id": null } }, { "name": "jarvis cancel timer 1 script", "room": null, "type": "script", "id": { "entity_id": "script.jarvis_cancel_timer_1", "device_id": null } }, { "name": "jarvis cancel timer 2 script", "room": null, "type": "script", "id": { "entity_id": "script.jarvis_cancel_timer_2", "device_id": null } } ] }, { "id": "'Jarvis: Voice Timer Request'", "automation": "- alias: 'Jarvis: Voice Timer Request'\n description: Trigger a timer via voice using Gemini + Assist\n triggers:\n - command:\n - set a timer\n - set a timer for {duration}\n - start a {duration} timer\n - set a {duration} timer\n - start a {label} timer for {duration}\n - set a {label} timer for {duration}\n - start a timer for {duration}\n - start a timer for {duration} for {label}\n - set a timer for {duration} for {label}\n - create a {label} timer for {duration}\n - create a {duration} timer\n - timer for {duration}\n trigger: conversation\n actions:\n - alias: Call Gemini to extract timer info\n action: google_generative_ai_conversation.generate_content\n response_variable: jarvis_timer_response\n data:\n prompt: \"The user wants to set a timer. Return ONLY this JSON:\\n{\\n \\\"minutes\\\"\\\n : 10,\\n \\\"label\\\": \\\"pizza\\\"\\n}\\n\\nRules:\\n• \\\"an hour\\\" → 60\\n• \\\"half an\\\n \\ hour\\\" → 30\\n• \\\"90 seconds\\\" → 2\\n• Round up to the nearest whole minute\\n\\\n • Omit \\\"label\\\" if none is said\\n\\nInput: \\\"{{ trigger.sentence }}\\\"\\n\"\n - alias: Parse JSON\n variables:\n parsed: \"{{\\n (\\n jarvis_timer_response.text\\n | replace('```json', '')\\n\\\n \\ | replace('```', '')\\n | trim\\n ) | from_json\\n}}\\n\"\n - alias: Build timer object\n variables:\n minutes: '{{ (parsed.minutes | float(0)) | round(0, ''ceil'') | int }}'\n label: \"{% if parsed.label is defined and parsed.label | trim != '' %}\\n {{\\\n \\ parsed.label }}\\n{% else %}\\n {{ minutes }} Minute Timer\\n{% endif %}\\n\"\n now_ts: '{{ now().timestamp() | int }}'\n trigger_time: '{{ (now_ts * 1000) + (minutes * 60 * 1000) }}'\n timer_id: '{{ ''jarvis-'' ~ now_ts }}'\n timer_obj: \"{{\\n {\\n \\\"id\\\": timer_id,\\n \\\"status\\\": \\\"ON\\\",\\n \\\"\\\n createdDate\\\": now_ts * 1000,\\n \\\"originalDurationInMillis\\\": minutes *\\\n \\ 60000,\\n \\\"triggerTime\\\": trigger_time,\\n \\\"remainingTime\\\": minutes\\\n \\ * 60000,\\n \\\"timerLabel\\\": label\\n } | tojson\\n}}\\n\"\n - alias: Save timer to the appropriate slot\n choose:\n - conditions:\n - condition: template\n value_template: '{{ states(''sensor.jarvis_timer'') in [''unknown'', ''unavailable'']\n }}'\n sequence:\n - action: input_text.set_value\n target:\n entity_id: input_text.jarvis_timer_data\n data:\n value: '{{ timer_obj }}'\n - conditions:\n - condition: template\n value_template: '{{ states(''sensor.jarvis_timer_2'') in [''unknown'', ''unavailable'']\n }}'\n sequence:\n - action: input_text.set_value\n target:\n entity_id: input_text.jarvis_timer_data_2\n data:\n value: '{{ timer_obj }}'\n mode: single", "config": [ { "name": "jarvis timer data", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data", "device_id": null } }, { "name": "jarvis timer data 2", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data_2", "device_id": null } }, { "name": "jarvis timer", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer", "device_id": null } }, { "name": "jarvis timer 2", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer_2", "device_id": null } } ] }, { "id": "'Notification: Jarvis Timer Done'", "automation": "- alias: 'Notification: Jarvis Timer Done'\n description: Sends a notification when the Jarvis timer ends, including the label\n triggers:\n - entity_id:\n - sensor.jarvis_timer\n id: timer1\n to: unknown\n trigger: state\n for:\n hours: 0\n minutes: 0\n seconds: 2\n - entity_id:\n - sensor.jarvis_timer_2\n id: timer2\n to: unknown\n trigger: state\n for:\n hours: 0\n minutes: 0\n seconds: 2\n conditions:\n - condition: not\n conditions:\n - condition: state\n entity_id: input_select.mode\n state: Night\n - condition: or\n conditions:\n - condition: template\n value_template: '{{ states(''input_text.jarvis_timer_data'') not in ['''', ''unknown'']\n }}'\n alias: Jarvis Data is not blank\n - condition: template\n value_template: '{{ states(''input_text.jarvis_timer_data_2'') not in ['''',\n ''unknown''] }}'\n alias: Jarvis Data 2 is not blank\n actions:\n - choose:\n - conditions:\n - condition: trigger\n id:\n - timer1\n sequence:\n - variables:\n label: \"{{\\n (states('input_text.jarvis_timer_data') | from_json).timerLabel\\n\\\n \\ if states('input_text.jarvis_timer_data') not in ['', 'unknown']\\n\\\n \\ else 'Your timer'\\n}}\"\n - parallel:\n - action: chime_tts.say\n metadata: {}\n target:\n entity_id: media_player.kitchen_homepod\n data:\n chime_path: /config/www/sounds/timer_end.wav\n language: en-GB\n message: '{{ label }} is done.'\n tts_platform: cloud\n voice: EthanNeural\n volume_level: 0.75\n - action: notify.mobile_app_your_iphone\n data:\n data:\n push:\n sound:\n critical: 1\n name: wheels_of_time.caf\n volume: 0\n tag: timer_notification\n message: '{{ label }} has ended.'\n title: Timer Done\n - action: notify.mobile_app_someoneelses_iphone\n data:\n data:\n push:\n sound:\n critical: 1\n name: wheels_of_time.caf\n volume: 0\n tag: timer_notification\n message: '{{ label }} has ended.'\n title: Timer Done\n - action: input_text.set_value\n metadata: {}\n target:\n entity_id: input_text.jarvis_timer_data\n data:\n value: ''\n - conditions:\n - condition: trigger\n id:\n - timer2\n sequence:\n - variables:\n label: \"{{\\n (states('input_text.jarvis_timer_data_2') | from_json).timerLabel\\n\\\n \\ if states('input_text.jarvis_timer_data_2') not in ['', 'unknown']\\n\\\n \\ else 'Your timer'\\n}}\"\n - parallel:\n - action: chime_tts.say\n metadata: {}\n target:\n entity_id: media_player.kitchen_homepod\n data:\n chime_path: /config/www/sounds/timer_end.wav\n language: en-GB\n message: '{{ label }} is done.'\n tts_platform: cloud\n voice: EthanNeural\n volume_level: 0.75\n - action: notify.mobile_app_your_iphone\n data:\n data:\n push:\n sound:\n critical: 1\n name: wheels_of_time.caf\n volume: 0\n tag: timer_notification\n message: '{{ label }} has ended.'\n title: Timer Done\n - action: notify.mobile_app_someoneelses_iphone\n data:\n data:\n push:\n sound:\n critical: 1\n name: wheels_of_time.caf\n volume: 0\n tag: timer_notification\n message: '{{ label }} has ended.'\n title: Timer Done\n - action: input_text.set_value\n metadata: {}\n target:\n entity_id: input_text.jarvis_timer_data_2\n data:\n value: ''\n - delay:\n hours: 0\n minutes: 5\n seconds: 0\n - parallel:\n - action: notify.mobile_app_your_iphone\n data:\n message: clear_notification\n data:\n tag: timer_notification\n - action: notify.mobile_app_someoneelses_iphone\n data:\n message: clear_notification\n data:\n tag: timer_notification\n mode: single", "config": [ { "name": "jarvis timer data", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data", "device_id": null } }, { "name": "jarvis timer data 2", "room": null, "type": "input_text", "id": { "entity_id": "input_text.jarvis_timer_data_2", "device_id": null } }, { "name": "jarvis timer", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer", "device_id": null } }, { "name": "jarvis timer 2", "room": null, "type": "sensor", "id": { "entity_id": "sensor.jarvis_timer_2", "device_id": null } }, { "name": "kitchen homepod", "room": "kitchen", "type": "media_player", "id": { "entity_id": "media_player.kitchen_homepod", "device_id": null } }, { "name": "mode", "room": null, "type": "input_select", "id": { "entity_id": "input_select.mode", "device_id": null } }, { "name": "your iphone notification", "room": null, "type": "notify", "id": { "entity_id": "notify.mobile_app_your_iphone", "device_id": null } }, { "name": "someoneelses iphone notification", "room": null, "type": "notify", "id": { "entity_id": "notify.mobile_app_someoneelses_iphone", "device_id": null } } ] } ]