simple, efficient timer widget

A timer widget for the touch bar

I made a simple timer widget for the touch bar that actually consists of just one widget. When pressed, It asks for the time via a dialog popup and starts the countdown. If pressed again, it cancels the countdown. When finished, it blinks red/black a few times. The widget only refreshes regularly while the timer is actually running, so the power usage should be really low i think.

05
46
20

feel free to leave feedback!

download link:
https://share.folivora.ai/sharedPreset/53545d61-1a3a-4f54-ae6f-e2954cec4ff9

Note that in order for the widget to work I think you have to copy the UUID of the widget by right clicking on it and replace the UUID in the script (it appears several times).

I'm not sure whether importing the widget from the download works, see the comments. Alternatively, create a widget on your own and paste the scripts below. I would suggest then setting 255,38,0 as alternative background color activating when the return value is "00:00", so the widget stays red after blinking when the time is up. Also you can set the "Execute every X seconds" value much higher than default, as the widget gets refreshed by the script when necessary. I used the "Alarm" icon from this icon pack: [v3 Update] Native Apple Touch Bar Icon Pack for BTT

Widget JSON:

{
  "BTTWidgetName" : "Timer",
  "BTTTriggerType" : 639,
  "BTTTriggerTypeDescription" : "Apple Script Widget",
  "BTTTriggerClass" : "BTTTriggerTypeTouchBar",
  "BTTPredefinedActionType" : 195,
  "BTTPredefinedActionName" : "Apple Script starten (asynchron im Hintergrund)",
  "BTTInlineAppleScript" : "tell application \"BetterTouchTool\"\r\t\r\tset remainingSeconds to get_number_variable \"remainingSeconds\"\r\t\r\tif (remainingSeconds is equal to 99999) or (remainingSeconds is equal to missing value) then --timer is not running and should be started\r\t\t\r\t\t--ask for the duration via a dialog popup\r\t\tset dialogAnswer to display dialog \"Please set timer using HH:MM:SS (max. 24 hours):\" default answer \"00:00:05\" --edit this to change the default time\r\t\tset answer to text returned of dialogAnswer\r\t\tset answerHours to text 1 thru 2 of answer as text\r\t\tset answerMinutes to text 4 thru 5 of answer as text\r\t\tset answerSeconds to text 7 thru 8 of answer as text\r\t\t\r\t\tset totalSeconds to (answerHours * 3600) + (answerMinutes * 60) + answerSeconds\r\t\t\r\t\tset_number_variable \"remainingSeconds\" to 99998\r\t\t\r\t\trepeat totalSeconds times --count\r\t\t\tif (get_number_variable \"remainingSeconds\") ≠ 99999 then -- if the variable is 99999, that means the timer was pressed again and should be stopped\r\t\t\t\tset totalSeconds to (totalSeconds - 1)\r\t\t\t\tset_number_variable \"remainingSeconds\" to totalSeconds\r\t\t\t\trefresh_widget \"2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10\"\r\t\t\t\tdelay 1\r\t\t\tend if\r\t\tend repeat\r\t\t\r\t\tif (get_number_variable \"remainingSeconds\") ≠ 99999 then\r\t\t\trepeat 10 times --blink to signal that the time is up\r\t\t\t\tupdate_touch_bar_widget \"2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10\" background_color \"0,0,0,0\"\r\t\t\t\tdelay 0.5\r\t\t\t\tupdate_touch_bar_widget \"2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10\" background_color \"255,38,0,255\"\r\t\t\t\tdelay 0.5\r\t\t\tend repeat\r\t\tend if\r\t\t\r\telse --timer is running and should be stopped\r\t\tset_number_variable \"remainingSeconds\" to 99999\r\t\trefresh_widget \"2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10\"\r\tend if\r\t\rend tell",
  "BTTEnabled2" : 1,
  "BTTUUID" : "2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10",
  "BTTEnabled" : 1,
  "BTTModifierMode" : 0,
  "BTTOrder" : 91,
  "BTTDisplayOrder" : 0,
  "BTTMergeIntoTouchBarGroups" : 0,
  "BTTIconData" : "TU0AKgAAE7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AqgDjAPkA6gC7AGcABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAZwC7AOoA+QDjAKoATQAAAAAAAAAAAAAAAAAAAAAAGADBAP8A_wD_AP8A_wD_AP8A3wA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AN8A_wD_AP8A_wD_AP8A_wDBABgAAAAAAAAAAAAAABgA4QD_AP8A_wD_AP8A_wD_AP8A_wCrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAP8A_wD_AP8A_wD_AP8A_wD_AOEAGAAAAAAAAAAAAMEA_wD_AP8A_wD_AP8A_wD_AP8AtAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGALQA_wD_AP8A_wD_AP8A_wD_AP8AwQAAAAAAAABNAP8A_wD_AP8A_wD_AP8A_wD_ALQABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAtAD_AP8A_wD_AP8A_wD_AP8A_wBNAAAAAACqAP8A_wD_AP8A_wD_AP8A_wC0AAYAAAAAAAAADABYAJoAyQDqAPkA+QDqAMkAmQBYAAwAAAAAAAAABgC0AP8A_wD_AP8A_wD_AP8A_wCqAAAAAADkAP8A_wD_AP8A_wD_AP8AtAAGAAAAAAAkAJsA9QD_AP8A_wD_AP8A_wD_AP8A_wD_APUAmwAkAAAAAAAGALQA_wD_AP8A_wD_AP8A_wDjAAAAAAD5AP8A_wD_AP8A_wD_ALQABgAAAAgAiQD6AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD6AIkACAAAAAYAtAD_AP8A_wD_AP8A_wD5AAAAAADqAP8A_wD_AP8A_wC0AAYAAAAjANEA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A0QAjAAAABgC0AP8A_wD_AP8A_wDqAAAAAAC7AP8A_wD_AP8AtAAGAAAAMADpAP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wDpADAAAAAGALQA_wD_AP8A_wC7AAAAAABnAP8A_wD_ALQABgAAACMA6QD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AOkAIwAAAAYAtAD_AP8A_wBnAAAAAAAHAN8A_wC0AAYAAAAIANEA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A0QAIAAAABgC0AP8A3wAGAAAAAAAAADUArAAGAAAAAACJAP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wCJAAAAAAAGAKwANQAAAAAAAAAAAAAAAAAAAAAAJAD6AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD6ACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmwD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA9QD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_APUADAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAJoA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AmQAAAAAAAAAAAAAAAAAAAAAAAAAAAMkA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AyQAAAAAAAAAAAAAAAAAAAAAAAAAAAOoA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A6gAAAAAAAAAAAAAAAAAAAAAAAAAAAPkA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A+QAAAAAAAAAAAAAAAAAAAAAAAAAAAPkA_wD_AP8A_wD_AP8A_wD_AAAAAAAAAAAAAAAAAAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A+QAAAAAAAAAAAAAAAAAAAAAAAAAAAOoA_wD_AP8A_wD_AP8A_wD_AAAAAAAAAAAAAAAAAAAAAAD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A6gAAAAAAAAAAAAAAAAAAAAAAAAAAAMkA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AyQAAAAAAAAAAAAAAAAAAAAAAAAAAAJoA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AmQAAAAAAAAAAAAAAAAAAAAAAAAAAAFgA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA9QD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_APUADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmwD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAD6AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD6ACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJAP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIANEA_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A0QAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMA9gD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_APYAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAJ0A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8AnQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCdAP8A_wD_AO0A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A7QD_AP8A_wCdAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnQD_AP8A_wCdAAgAiQD6AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD_AP8A_wD6AIkACACdAP8A_wD_AJ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwD_AP8AnQABAAAAAAAkAJsA9QD_AP8A_wD_AP8A_wD_AP8A_wD_APUAmwAkAAAAAAABAJ0A_wD_AH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB_AJ0AAQAAAAAAAAAAAAAADABYAJoAyQDqAPkA+QDqAMkAmgBYAAwAAAAAAAAAAAAAAAEAnQB_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAAMAAAABACoAAAEBAAMAAAABADwAAAECAAMAAAACAAgACAEDAAMAAAABAAEAAAEGAAMAAAABAAEAAAEKAAMAAAABAAEAAAERAAQAAAABAAAACAESAAMAAAABAAEAAAEVAAMAAAABAAIAAAEWAAMAAAABADwAAAEXAAQAAAABAAATsAEcAAMAAAABAAEAAAEoAAMAAAABAAIAAAFSAAMAAAABAAIAAAFTAAMAAAACAAEAAYdzAAcAABFoAAAUfgAAAAAAABFoYXBwbAIAAABtbnRyR1JBWVhZWiAH3AAIABcADwAuAA9hY3NwQVBQTAAAAABub25lAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVkZXNjAAAAwAAAAHlkc2NtAAABPAAAB+hjcHJ0AAAJJAAAACN3dHB0AAAJSAAAABRrVFJDAAAJXAAACAxkZXNjAAAAAAAAAB9HZW5lcmljIEdyYXkgR2FtbWEgMi4yIFByb2ZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAfAAAADHNrU0sAAAAuAAABhGRhREsAAAA4AAABsmNhRVMAAAA4AAAB6nZpVk4AAABAAAACInB0QlIAAABKAAACYnVrVUEAAAAsAAACrGZyRlUAAAA+AAAC2Gh1SFUAAAA0AAADFnpoVFcAAAAeAAADSm5iTk8AAAA6AAADaGNzQ1oAAAAoAAADomhlSUwAAAAkAAADyml0SVQAAABOAAAD7nJvUk8AAAAqAAAEPGRlREUAAABOAAAEZmtvS1IAAAAiAAAEtHN2U0UAAAA4AAABsnpoQ04AAAAeAAAE1mphSlAAAAAmAAAE9GVsR1IAAAAqAAAFGnB0UE8AAABSAAAFRG5sTkwAAABAAAAFlmVzRVMAAABMAAAF1nRoVEgAAAAyAAAGInRyVFIAAAAkAAAGVGZpRkkAAABGAAAGeGhySFIAAAA+AAAGvnBsUEwAAABKAAAG_HJ1UlUAAAA6AAAHRmVuVVMAAAA8AAAHgGFyRUcAAAAsAAAHvABWAWEAZQBvAGIAZQBjAG4A4QAgAHMAaQB2AOEAIABnAGEAbQBhACAAMgAsADIARwBlAG4AZQByAGkAcwBrACAAZwByAOUAIAAyACwAMgAgAGcAYQBtAG0AYQBwAHIAbwBmAGkAbABHAGEAbQBtAGEAIABkAGUAIABnAHIAaQBzAG8AcwAgAGcAZQBuAOgAcgBpAGMAYQAgADIALgAyAEMepQB1ACAAaADsAG4AaAAgAE0A4AB1ACAAeADhAG0AIABDAGgAdQBuAGcAIABHAGEAbQBtAGEAIAAyAC4AMgBQAGUAcgBmAGkAbAAgAEcAZQBuAOkAcgBpAGMAbwAgAGQAYQAgAEcAYQBtAGEAIABkAGUAIABDAGkAbgB6AGEAcwAgADIALAAyBBcEMAQzBDAEOwRMBD0EMAAgAEcAcgBhAHkALQQzBDAEPAQwACAAMgAuADIAUAByAG8AZgBpAGwAIABnAOkAbgDpAHIAaQBxAHUAZQAgAGcAcgBpAHMAIABnAGEAbQBtAGEAIAAyACwAMgDBAGwAdABhAGwA4QBuAG8AcwAgAHMAegD8AHIAawBlACAAZwBhAG0AbQBhACAAMgAuADKQGnUocHCWjlFJXqYAIAAyAC4AMgAggnJfaWPPj_AARwBlAG4AZQByAGkAcwBrACAAZwByAOUAIABnAGEAbQBtAGEAIAAyACwAMgAtAHAAcgBvAGYAaQBsAE8AYgBlAGMAbgDhACABYQBlAGQA4QAgAGcAYQBtAGEAIAAyAC4AMgXSBdAF3gXUACAF0AXkBdUF6AAgBdsF3AXcBdkAIAAyAC4AMgBQAHIAbwBmAGkAbABvACAAZwByAGkAZwBpAG8AIABnAGUAbgBlAHIAaQBjAG8AIABkAGUAbABsAGEAIABnAGEAbQBtAGEAIAAyACwAMgBHAGEAbQBhACAAZwByAGkAIABnAGUAbgBlAHIAaQBjAQMAIAAyACwAMgBBAGwAbABnAGUAbQBlAGkAbgBlAHMAIABHAHIAYQB1AHMAdAB1AGYAZQBuAC0AUAByAG8AZgBpAGwAIABHAGEAbQBtAGEAIAAyACwAMsd8vBgAINaMwMkAIKwQucgAIAAyAC4AMgAg1QS4XNMMx3xmbpAacHBepnz7ZXAAIAAyAC4AMgAgY8+P8GWHTvZOAIIsMLAw7DCkMKww8zDeACAAMgAuADIAIDDXMO0w1TChMKQw6wOTA7UDvQO5A7oDzAAgA5MDugPBA7kAIAOTA6wDvAO8A7EAIAAyAC4AMgBQAGUAcgBmAGkAbAAgAGcAZQBuAOkAcgBpAGMAbwAgAGQAZQAgAGMAaQBuAHoAZQBuAHQAbwBzACAAZABhACAARwBhAG0AbQBhACAAMgAsADIAQQBsAGcAZQBtAGUAZQBuACAAZwByAGkAagBzACAAZwBhAG0AbQBhACAAMgAsADIALQBwAHIAbwBmAGkAZQBsAFAAZQByAGYAaQBsACAAZwBlAG4A6QByAGkAYwBvACAAZABlACAAZwBhAG0AbQBhACAAZABlACAAZwByAGkAcwBlAHMAIAAyACwAMg4jDjEOBw4qDjUOQQ4BDiEOIQ4yDkAOAQ4jDiIOTA4XDjEOSA4nDkQOGwAgADIALgAyAEcAZQBuAGUAbAAgAEcAcgBpACAARwBhAG0AYQAgADIALAAyAFkAbABlAGkAbgBlAG4AIABoAGEAcgBtAGEAYQBuACAAZwBhAG0AbQBhACAAMgAsADIAIAAtAHAAcgBvAGYAaQBpAGwAaQBHAGUAbgBlAHIAaQENAGsAaQAgAEcAcgBhAHkAIABHAGEAbQBtAGEAIAAyAC4AMgAgAHAAcgBvAGYAaQBsAFUAbgBpAHcAZQByAHMAYQBsAG4AeQAgAHAAcgBvAGYAaQBsACAAcwB6AGEAcgBvAVsAYwBpACAAZwBhAG0AbQBhACAAMgAsADIEHgQxBEkEMARPACAEQQQ1BEAEMARPACAEMwQwBDwEPAQwACAAMgAsADIALQQ_BEAEPgREBDgEOwRMAEcAZQBuAGUAcgBpAGMAIABHAHIAYQB5ACAARwBhAG0AbQBhACAAMgAuADIAIABQAHIAbwBmAGkAbABlBjoGJwZFBicAIAAyAC4AMgAgBkQGSAZGACAGMQZFBicGLwZKACAGOQYnBkV0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDEyAABYWVogAAAAAAAA81EAAQAAAAEWzGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe_B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5_DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw_PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF_cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+_H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS_HL_4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M_E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E_oj_iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU_ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una_9sV2yvbQhtYG25bhJua27Ebx5veG_RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R_5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN_45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5_6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+_796v_XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36_gNuC94UThzOJT4tvjY+Pr5HPk_OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx__KM8xnzp_Q09ML1UPXe9m32+_eK+Bn4qPk4+cf6V_rn+3f8B_yY_Sn9uv5L_tz_bf__",
  "BTTTriggerConfig" : {
    "BTTScriptType" : 0,
    "BTTTouchBarButtonColor" : "75.323769, 75.323769, 75.323769, 255.000000",
    "BTTTouchBarColorRegex" : "00:00",
    "BTTTouchBarItemIconWidth" : 30,
    "BTTTouchBarItemPlacement" : 0,
    "BTTTouchBarAlternateBackgroundColor" : "255.000000, 38.028511, 0.000000, 255.000000",
    "BTTTouchBarButtonCornerRadius" : 6,
    "BTTTouchBarScriptUpdateInterval" : 60,
    "BTTTouchBarAppleScriptString" : "tell application \"BetterTouchTool\"\r\tset remainingSeconds to get_number_variable \"remainingSeconds\"\r\t\r\tif (remainingSeconds is equal to 99999) or (remainingSeconds is equal to missing value) then -- the timer is not running\r\t\treturn \"timer\"\r\telse -- the timer is running or is finished\r\t\t\r\t\t--create return text\r\t\tset outputSeconds to ((remainingSeconds mod 3600) mod 60) as integer\r\t\tset outputMinutes to (((remainingSeconds - outputSeconds) mod 3600) \/ 60) as integer\r\t\tset outputHours to ((remainingSeconds - outputMinutes * 60 - outputSeconds) \/ 3600) as integer\r\t\tif length of (outputSeconds as string) is equal to 1 then\r\t\t\tset outputSeconds to \"0\" & outputSeconds as string\r\t\tend if\r\t\tif length of (outputMinutes as string) is equal to 1 then\r\t\t\tset outputMinutes to \"0\" & outputMinutes as string\r\t\tend if\r\t\t\r\t\t--return text\r\t\tif outputHours is greater than 0 then\r\t\t\treturn (outputHours & \":\" & outputMinutes & \":\" & outputSeconds) as string\r\t\telse\r\t\t\treturn (outputMinutes & \":\" & outputSeconds) as string\r\t\tend if\r\tend if\rend tell",
    "BTTTouchBarAppleScriptStringRunOnInit" : false,
    "BTTTouchBarButtonName" : "Timer",
    "BTTTouchBarAppleScriptUsePath" : 0,
    "BTTTouchBarFreeSpaceAfterButton" : 5,
    "BTTTouchBarItemIconHeight" : 30,
    "BTTTouchBarItemPadding" : 0
  }
}

the script for the return value:

tell application "BetterTouchTool"
	set remainingSeconds to get_number_variable "remainingSeconds"
	
	if (remainingSeconds is equal to 99999) or (remainingSeconds is equal to missing value) then -- the timer is not running
		return "timer"
	else -- the timer is running or is finished
		
		--create return text
		set outputSeconds to ((remainingSeconds mod 3600) mod 60) as integer
		set outputMinutes to (((remainingSeconds - outputSeconds) mod 3600) / 60) as integer
		set outputHours to ((remainingSeconds - outputMinutes * 60 - outputSeconds) / 3600) as integer
		if length of (outputSeconds as string) is equal to 1 then
			set outputSeconds to "0" & outputSeconds as string
		end if
		if length of (outputMinutes as string) is equal to 1 then
			set outputMinutes to "0" & outputMinutes as string
		end if
		
		--return text
		if outputHours is greater than 0 then
			return (outputHours & ":" & outputMinutes & ":" & outputSeconds) as string
		else
			return (outputMinutes & ":" & outputSeconds) as string
		end if
	end if
end tell

the script that is executed when the widget is pressed:

tell application "BetterTouchTool"
	
	set remainingSeconds to get_number_variable "remainingSeconds"
	
	if (remainingSeconds is equal to 99999) or (remainingSeconds is equal to missing value) then --timer is not running and should be started
		
		--ask for the duration via a dialog popup
		set dialogAnswer to display dialog "Please set timer using HH:MM:SS (max. 24 hours):" default answer "00:00:05" --edit this to change the default time
		set answer to text returned of dialogAnswer
		set answerHours to text 1 thru 2 of answer as text
		set answerMinutes to text 4 thru 5 of answer as text
		set answerSeconds to text 7 thru 8 of answer as text
		
		set totalSeconds to (answerHours * 3600) + (answerMinutes * 60) + answerSeconds
		
		set_number_variable "remainingSeconds" to 99998
		
		repeat totalSeconds times --count
			if (get_number_variable "remainingSeconds") ≠ 99999 then -- if the variable is 99999, that means the timer was pressed again and should be stopped
				set totalSeconds to (totalSeconds - 1)
				set_number_variable "remainingSeconds" to totalSeconds
				refresh_widget "2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10"
				delay 1
			end if
		end repeat
		
		if (get_number_variable "remainingSeconds") ≠ 99999 then
			repeat 10 times --blink to signal that the time is up
				update_touch_bar_widget "2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10" background_color "0,0,0,0"
				delay 0.5
				update_touch_bar_widget "2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10" background_color "255,38,0,255"
				delay 0.5
			end repeat
		end if
		
	else --timer is running and should be stopped
		set_number_variable "remainingSeconds" to 99999
		refresh_widget "2CA20DFA-8DAC-4E9A-A095-8BCC75ABAD10"
	end if
	
end tell

Nice! I was about to do something like this for a Pomodoro, I'll take a look into this this might solve some of my problems! :smiley: great work :+1:t3:

For whoever wants to use this, don't forget to adjust the Touchbar Widget UUID in the executable Script. :slightly_smiling_face:
@fidgetspinner by chance, do you know a solution to set the width of the widget to a constant size?

2 Likes

thanks! constant widget sizes are not possible as far as i know. I mostly use black backgrounds though, which kind of gets rid of that problem and in my opinion it looks nicer anyway. Maybe you can try that. Good luck with your work, let me know if you make any interesting enhancements :slight_smile:

1 Like

How to download this timer widget?

Whoa, this post was a little crazy! I've cleaned it up for you :smile:

I've also been looking to make a timer too, this seems pretty good.
Does it use any external apps or does it run entirley by itself?

One last thing, this may be a little greed but could I feature this in my AquaTouch Preset? Credits to you in the code of course!

2 Likes

Works all by itself, it uses general BTT variables afaik! :slightly_smiling_face: And just refreshes the widget.
I had some troubles though running it inside an CAG, but I'm working on it. Also trying to improve the time input method, but not sure yet how to manage this!

1 Like

Sounds great! I’m so keen on helping to improve but all the woorkk i wish i didn’t have :frowning:

1 Like

Big fat Exam on Monday :raising_hand_man:t2:

1 Like

year thanks im not really sure how to share widgets. Does it work now? It works all by itself. Feel free to use it in aquatouch!

What's (a) CAG? The input method could really be improved but I didn't have a better idea either

I thought you could just copy the json code (the first piece of code in my post) and paste it in BTT by right clicking and selecting paste from json. If it doesn't work, maybe @yuuiko can help?

Thanks for the permission! Can't get to get it out for people to use!

Unfortunatley BTT is having trouble pasting the code, it keeps crashing. I'm working around it for now and reported the bug to @Andreas_Hegenberg.

Answering;

A CAG is short for 'Conditional Activation Group' that us preset makers use, a feature in BTT that allows you to show a group of triggers based on a set of rules.

@Caliguvara i think the widget needs to be always frontmost so it can update itself constantly... Not sure if it'll work if you exit a group. I plan to add it into the schedule mode but there's a problem if I close that group i need to keep it running.

I suggest opening a group with preset options and a 'custom' button... Something like this but more refined:

  • Tap a time to set it, (it will highlight)
  • Tap start, the group exits and the timer starts.
1 Like

I edited the post and added a download link and info on how to recreate the widget in case importing from downloading and pasting from JSON does not work.

2 Likes

Thanks for the explanation. :wink:

But hey man, a long break should be only 15min long :smiling_imp:

1 Like

This is absolutely awesome and works so well. Is there a way to get the timer to flash once the timer is up? Essentially once the timer ends and if the TouchBar is asleep then the timer can't be seen and you don't know when it goes off. The timer also seems to stop when the screen goes to sleep. Mine keeps crashing after 1min and 30sec roughly. I'm not sure why, I've even replaced the UUID in the script

This might be a very stupid question, but I'm completely new to all of this.
Where do I paste the json script?

update: I understand I need to past it directly into BTT. Though oddly the widget still freezes almost always exactly after 1min and 30 seconds. It's very strange. I'm unsure of the cause. I'm currently on Catalina.

I guess that this is a limitation of BTT, BTT should have a time limit on script to avoid infinite loop.
running the applescript outside BTT (via the shell) might solves the issue (will need to test)

Cheers,

Olivier

EDIT: I confirm that running the applescript via the shell script/task does not have the 90s limitation and therefore is working better in this context.

https://community.folivora.ai/uploads/default/original/2X/1/1557ff96c29abdf0adfe82026b82b02c1c48e4ce.png
Is this picture in AQT? I cant find it.

It wasn't stable enough for the masses and AQT's switching system, but this was a while ago, might revisit

2 Likes

@yuuiko ill be attempting to make a timer preset similar to the pic u sent, ill try to make it look good if you want it for AQT??