From 0e5a30d946039bfb9f7532c59986e5529c17821a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 17 Jul 2026 09:16:56 +0200 Subject: [PATCH] mode-button: spilt the into two scripts --- doc/mode-button.md | 6 +-- mode-button-scheduler.rsc | 78 +++++++++++++++++++++++++++++++++++++++ mode-button.rsc | 71 +++-------------------------------- 3 files changed, 86 insertions(+), 69 deletions(-) create mode 100644 mode-button-scheduler.rsc diff --git a/doc/mode-button.md b/doc/mode-button.md index 2ac3149b..547396d5 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -16,7 +16,7 @@ Mode button with multiple presses Description ----------- -This script extend the functionality of mode button. Instead of just one +These scripts extend the functionality of mode button. Instead of just one you can trigger several actions by pressing the mode button several times. The hardware needs to have a mode button, see @@ -39,9 +39,9 @@ Copy this code to terminal to check: Requirements and installation ----------------------------- -Just install the script: +Just install the scripts: - $ScriptInstallUpdate mode-button; + $ScriptInstallUpdate mode-button,mode-button-scheduler; Then configure the mode button to run `mode-button`: diff --git a/mode-button-scheduler.rsc b/mode-button-scheduler.rsc new file mode 100644 index 00000000..921cee22 --- /dev/null +++ b/mode-button-scheduler.rsc @@ -0,0 +1,78 @@ +#!rsc by RouterOS +# RouterOS script: mode-button-scheduler +# Copyright (c) 2018-2026 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.21 +# requires device-mode, scheduler +# +# act on multiple mode and reset button presses +# https://rsc.eworm.de/doc/mode-button.md + +:local ExitOK false; +:onerror Err { + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; + :local ScriptName [ :jobname ]; + + :global ModeButton; + + :global LogPrint; + :global ModeButtonScheduler; + :global ValidateSyntax; + + :local LEDInvert do={ + :global ModeButtonLED; + + :global IfThenElse; + + :local LED [ /system/leds/find where leds=$ModeButtonLED \ + !disabled type~"^(on|off)\$" interface=[] ]; + :if ([ :len $LED ] = 0) do={ + :return false; + } + /system/leds/set type=[ $IfThenElse ([ get $LED type ] = "on") "off" "on" ] $LED; + } + + :local Count ($ModeButton->"count"); + :local Code ($ModeButton->[ :tostr $Count ]); + + :set ($ModeButton->"count") 0; + :set ModeButtonScheduler; + /system/scheduler/remove [ find where name="mode-button-scheduler" ]; + + :if ([ :len $Code ] = 0) do={ + $LogPrint info $ScriptName ("No action defined for " . $Count . " mode-button presses."); + :set ExitOK true; + :error false; + } + + :if ([ $ValidateSyntax $Code ] = false) do={ + $LogPrint warning $ScriptName \ + ("The code for " . $Count . " mode-button presses failed syntax validation!"); + :set ExitOK true; + :error false; + } + + $LogPrint info $ScriptName ("Acting on " . $Count . " mode-button presses: " . $Code); + + :for I from=1 to=$Count do={ + $LEDInvert; + :if ([ /system/routerboard/settings/get silent-boot ] = false) do={ + :beep length=200ms; + } + :delay 200ms; + $LEDInvert; + :delay 200ms; + } + + :onerror Err { + [ :parse $Code ]; + } do={ + $LogPrint warning $ScriptName \ + ("The code for " . $Count . " mode-button presses failed with runtime error: " . $Err); + } +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; +} diff --git a/mode-button.rsc b/mode-button.rsc index d7a0b3f1..fb70101b 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -21,75 +21,14 @@ :set ($ModeButton->"count") ($ModeButton->"count" + 1); - :local Scheduler [ /system/scheduler/find where name="_ModeButtonScheduler" ]; + :local Scheduler [ /system/scheduler/find where name="mode-button-scheduler" ]; :if ([ :len $Scheduler ] = 0) do={ - $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); - :global ModeButtonScheduler do={ :onerror Err { - :local FuncName $0; - - :global ModeButton; - - :global LogPrint; - :global ModeButtonScheduler; - :global ValidateSyntax; - - :local LEDInvert do={ - :global ModeButtonLED; - - :global IfThenElse; - - :local LED [ /system/leds/find where leds=$ModeButtonLED \ - !disabled type~"^(on|off)\$" interface=[] ]; - :if ([ :len $LED ] = 0) do={ - :return false; - } - /system/leds/set type=[ $IfThenElse ([ get $LED type ] = "on") "off" "on" ] $LED; - } - - :local Count ($ModeButton->"count"); - :local Code ($ModeButton->[ :tostr $Count ]); - - :set ($ModeButton->"count") 0; - :set ModeButtonScheduler; - /system/scheduler/remove [ find where name="_ModeButtonScheduler" ]; - - :if ([ :len $Code ] = 0) do={ - $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); - :return false; - } - - :if ([ $ValidateSyntax $Code ] = false) do={ - $LogPrint warning $FuncName \ - ("The code for " . $Count . " mode-button presses failed syntax validation!"); - :return false; - } - - $LogPrint info $FuncName ("Acting on " . $Count . " mode-button presses: " . $Code); - - :for I from=1 to=$Count do={ - $LEDInvert; - :if ([ /system/routerboard/settings/get silent-boot ] = false) do={ - :beep length=200ms; - } - :delay 200ms; - $LEDInvert; - :delay 200ms; - } - - :onerror Err { - [ :parse $Code ]; - } do={ - $LogPrint warning $FuncName \ - ("The code for " . $Count . " mode-button presses failed with runtime error: " . $Err); - } - } do={ - :global ExitOnError; $ExitOnError $0 $Err; - } } - /system/scheduler/add name="_ModeButtonScheduler" \ - on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; + $LogPrint info $ScriptName ("Creating scheduler mode-button-scheduler, counting presses..."); + /system/scheduler/add name="mode-button-scheduler" interval=3s \ + on-event="/system/script/run mode-button-scheduler;"; } else={ - $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); + $LogPrint debug $ScriptName ("Updating scheduler mode-button-scheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } } do={