Zeitlich gesteuerte Ausgaben generieren

Viele OM’s möchten gern per automatischer Relaisansage beispielsweise auf den nächsten OV-Abend hinweisen. Um so eine Ausgabe zu realisieren gibt es viele Ansätze, im Folgenden sollen drei davon vorgestellt werden. Alle basieren auf dem SvxLink-eigenen TCL-Framework und darin enthaltenen Zeitfunktionen.

Für den weiteren Verlauf wird davon ausgegangen, dass eine Ansage-Datei mit Namen „OV-Abend.wav“ bereits erstellt und ins Verzeichnis /usr/share/svxlink/events.d/de_DE/Core kopiert wurde (oder unter ../en_US/… je nach Locale-Umgebung).

1) Nutzung der every_minute{}-Prozedur
Im TCL-Framework gibt es eine Prozedur, die zu jeder vollen Minute aufgerufen wird, die every_minute{}-Prozedur. Diese kann man zur Ausgabe heranziehen, allerdings indirekt über addTimerTickSubscriber{}!

Erstellen Sie nach dem locale-Konzept eine Datei meine_ansage.tcl mit folgendem Inhalt:

# /usr/share/svxlink/events.d/local/meine_ansagen.tcl
namespace eval Logic {
 Logic::addTimerTickSubscriber relaisansage;

 proc relaisansage {} {
   puts "Ausgabe Relaisansage?";
   source "/home/svxlink/relaisansage.tcl";
  }
}

Erstellen Sie eine Datei relaisansage.tcl im /home/svxlink-Verzeichnis mit folgendem Inhalt:

# /home/svxlink/relaisansage.tcl
# aktuelle Uhrzeit ermitteln
set now [clock seconds];
set hour [clock format $now -format "%H"];
set minute [clock format $now -format "%M"];

# eigene Ausgabezeiten definieren
set ansage_Minute 05;
set ansage_Stunde 09;

puts "Es ist $hour:$minute, Ausgabe um $ansage_Stunde:$ansage_Minute";

# prüfen ob Ausgabezeit erreicht ist
if {$hour == $ansage_Stunde && $minute == $ansage_Minute} {
  puts "Ausgabe Relaisansage";
  playMsg "Core" "OV-Abend";
}

Alle Zeilen mit puts beginnend dienen nur der Kontrollausgabe und können selbstverständlich weggelassen bzw. auskommentiert werden. Wichtig ist, die gewünschte Ausgabezeit mit führenden Nullen bei Werten kleiner 10 einzutragen, also 09 statt 9!

Wird eine periodisch über den Tag verteilte Ausgabe gewünscht so kann man hier die Modulo-Funktion zielführend einsetzen. Ändern Sie hierzu die Datei /home/svxlink/relaisansage.tcl wie folgt:

# /home/svxlink/relaisansage.tcl
# aktuelle Uhrzeit ermitteln
set now [clock seconds];
set hour [clock format $now -format "%H"];
set minute [clock format $now -format "%M"];

# eigene Ausgabezeiten definieren
set interval 6;
set ansage_Minute 22;

# hier prüfen ob Ausgabekriterium erreicht ist
if {($hour % $interval) == 0 && $minute == $ansage_Minute} {
  puts "Ausgabe Relaisansage";
  playMsg "Core" "OV-Abend";
}

In diesem Beispiel würde die Ausgabe zur 22. Minute einer ohne Teilungsrest durch 6 teilbaren Stunde erfolgen, also um 0:22, 6:22, 12:22 und 18:22.

2) Nutzung der periodischen Relais-Identifikationfunktion

Erstellen Sie nach dem locale-Konzept eine Datei „meine_ansagen.tcl“ mit nachfolgendem Inhalt. Achten Sie darauf, dass der Inhalt der Funktion Logic::send_long_ident{} dem Standard nach einer Neuinstallation entspricht. Falls Sie also diese Funktion schon geändert haben (z.B. per locale-Konzept in einer anderen tcl-Datei), so sollten Sie die gewünschten Änderungen dort durchführen!

# /usr/share/svxlink/events.d/local/meine_ansagen.tcl
namespace eval Logic {

#
# Executed when a long identification (e.g. hourly) should be sent
#   hour    - The hour on which this identification occur
#   minute  - The hour on which this identification occur
#
proc send_long_ident {hour minute} {
  global mycall;
  global loaded_modules;
  global active_module;
  variable CFG_TYPE;

  spellWord $mycall;
  if {$CFG_TYPE == "Repeater"} {
    playMsg "Core" "repeater";
  }
  playSilence 500;

  playMsg "Core" "the_time_is";
  playSilence 100;
  playTime $hour $minute;
  playSilence 500;

  # Call the "status_report" function in all modules if no module is active
  if {$active_module == ""} {
    foreach module [split $loaded_modules " "] {
      set func "::";
      append func $module "::status_report";
      if {"[info procs $func]" ne ""} {
        $func;
      }
    }
  }
  playSilence 250;
  source "/home/svxlink/relaisansage.tcl";
  playSilence 250;
}
}

Erstellen Sie dann wieder eine Datei relaisansage.tcl im /home/svxlink-Verzeichnis. Der Inhalt kann jetzt etwas einfacher sein, muß aber nicht. Es ist jetzt allerdings wichtig geworden, wie oft Sie den LONG_IDENT_INTERVAL ausgeben lassen. Hat man LONG_IDENT_INTERVAL=120 konfiguriert, so würde die Datei relaisansage.tcl nur jede 2h aufgerufen werden:

# /home/svxlink/relaisansage.tcl
puts "Ausgabe Relaisansage";
playMsg "Core" "OV-Abend";

Natürlich kann man das mit dem Vergleich einer vordefinierten Stunde kombinieren wie unter Punkt 1) beschrieben. Hier muß man einfach ein bisschen probieren. Bitte vorher überlegen, ob das Kriterium überhaupt true werden kann.

Ein grosser Vorteil dieser Varianten ist, dass Änderungen in o.g. Datei sofortige Auswirkungen haben. Man kann diese Ausgaben quasi on-thy-fly herausnehmen, indem man in der /home/svxlink/relaisansage.tcl einfach das

playMsg "Core" "OV-Abend";

auskommentiert. Ein Neustart ist nicht erforderlich. Bitte diese Datei nicht löschen!

3) Ansagen vor dem „Abfallen“ einer Relaisstation
Diese Variante funktioniert nur bei einer RepeaterLogic. Durch eine Änderung der Prozedur RepeaterLogic::repeater_down{} (locale-Konzept!) kann man auf einfache Weise realisieren, dass die gewünschte Ausgabe z.B. bei jedem 20. Relaisschließen erfolgen soll. Erstellen Sie eine Datei meine_ansage.tcl nach dem locale-Konzept und prüfen Sie, ob Sie eventuell eine Änderung dieser Prozedur schon irgendwo RepeaterLogic::repeater_down{} vorgenommen haben.

# /usr/share/svxlink/events.d/local/meine_ansagen.tcl
namespace eval RepeaterLogic {
#
# Executed when the repeater is deactivated
#   reason  - The reason why the repeater was deactivated
#             IDLE         - The idle timeout occured
#             SQL_FLAP_SUP - Closed due to interference
#
proc repeater_down {reason} {
  global mycall;
  variable repeater_is_up;
  variable count;
  incr count;

  set repeater_is_up 0;

  if {$reason == "SQL_FLAP_SUP"} {
    playSilence 500;
    playMsg "Core" "interference";
    playSilence 500;
    return;
  }

  if {$count > 19} {
    source "/home/svxlink/relaisansage.tcl";
    set count 0;
  }

  set now [clock seconds];
  if {$now-$Logic::prev_ident < $Logic::min_time_between_ident} {
    playTone 400 900 50
    playSilence 100
    playTone 360 900 50
    playSilence 500
    return;
  }
  set Logic::prev_ident $now;

  spellWord $mycall;
  playMsg "Core" "repeater";
  playSilence 250;
  #playMsg "../extra-sounds" "shutdown";
}

# end of namespace
}

Erzeugen Sie wieder die bekannte Datei "relaisansage.tcl" im /home/svxlink-Verzeichnis:

# /home/svxlink/relaisansage.tcl
puts "Ausgabe Relaisansage";
playMsg "Core" "OV-Abend";