Modul Selbstbau

Eigenes TCL – Modul einrichten

Wer Spaß am Softwarebasteln hat sollte versuchen, ein eigenes Modul unter svxlink zu installieren. An drei verschiedenen Stellen muss man dazu aktiv werden:

1. Eine Datei MeinModul.tcl erstellen.

Man kann sich dazu das Template Tcl.tcl.example aus der /usr/share/svxlink/events.d kopieren, ergänzt es und legt es unter /usr/share/svxlink/events.d/local ab. Das hat bei mir auf Anhieb funktioniert, hat aber jede Menge Fehlermeldungen im Log produziert, weil einige Prozeduren fehlten, wie z.B. proc dtmfDigitReceived und andere. Hat man nun die fehlenden Prozeduren ergänzt – als Grundlage und für die Syntax kann man sich in /usr/share/svxlink/events.d/ umschauen – kommt der eigentliche Kern der Prozedur, die Auswertung der eingegeben DTMF-Töne in dtmfCmdReceived. Bei mir sieht die Prozedur in der Datei /usr/share/svxlink/events.d/local/MeinModul.tcl so aus:

 

proc dtmfCmdReceived {cmd} {
variable module_name;
printInfo "Modul SystemInfo: DTMF command received: $cmd";

if {$cmd == "0"} {
Module::play_help $module_name

} elseif {$cmd == "1"} {
getSysInfo

} elseif {$cmd == "2"} {
playWetterinfos

} elseif {$cmd == ""} {
deactivateModule

} else {
processEvent "unknown_command $cmd"
}
}

2. Dort wird bestimmt, wie es reagieren soll und entsprechende Prozeduren, wie in meinem Fall getSysInfo, müssen hinterlegt bzw. programmiert werden. Bevor nun die eigene Prozedur eingefügt wird, sollten zunächst die Grundfunktionen getestet werden. Der eigentlich Aufruf des Moduls, die Hilfe (falls vorhanden) und die Deaktivierung sollten getestet werden, dabei das Log beobachten. In meinem einfachen Beispiel gibt  getSysInfo die CPU-Temperatur des BananaPi aus. Per cronjob wird alle 2 Minuten die Temperatur mit dem Befehl

 cat /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input

in die Datei /tmp/svx_cpu_temp ausgegeben. Die eigentliche Funktion muss nun noch in der Datei /usr/share/svxlink/events.d/local/MeinModul.tcl definiert werden, die WAV-Dateien gitb es bereits auf dem System und ich bediene mich der Prozeduren spellNumber und playMsg aus dem Metarmodul:

 

proc getSysInfo {} {
global langdir;
variable Temperatur_soc
source "/tmp/svx_cpu_temp";
puts $Temperatur_soc
playSilence 100;
playMsg "soc_temp";
playSilence 100;
spellNumber $Temperatur_soc;
playMsg "unit_degrees";
playSilence 200;
}

 

  1. Eine Datei ModuleMeinModul.conf muß unter /etc/svxlink/svxlink.d/ eingerichtet werden. Die Minimalparameter sind:

 

[ModuleMeinModul]
NAME=MeinModul
PLUGIN_NAME=Tcl
ID=11
TIMEOUT=20
PLAY_DIR=/usr/share/svxlink/sounds/de_DE/MeinModul

 

Mit dem Aufruf 11# ist die Prozedur aktivierbar, s. a. Parameter ID. Falls Ihr später noch weitere Funktionen hinzufügt – in meinem Fall gebe ich per TTS-Mary das aktuelle Wetter aus welches ich mir zuvor von der Internetseite des DWD hole – muss noch ein Pfad für die erzeugten Soundfiles hinterlegt werden, hier als /usr/share/svxlink/sounds/de_DE/MeinModul.

 

  1. In der /etc/svxlink/svxlink.conf muss nun noch in der Zeile MODULES= MeinModul angehangen werden, um es beim Start von svxlink zu aktivieren.

Nun ist es einsatzbereit.

Schmankerl (Für Fortgeschrittene)

Weitere Funktionen wie z.B. den aktuellen Wetterbericht einer Internetseite just in time vorlesen lassen (hier für Berlin das Bashscript aktwx.sh):

proc playWetterinfos {} {
set warten 3
while "$warten > 2" {

if {[catch {exec /bin/bash /home/svxlink/Wetter/aktwx.sh} result] == 0} {
 if { $result == "wxready" } {
 puts "OK"
 set warten 1
 break
 }
} else {
 puts "BASH ERROR"
 puts $result
 set warten 1
break
}
}
playSilence 50;
playFile "/tmp/Wettermeldung.wav";
playSilence 250;
}

Basteltipps:

  • Auf die Benutzerrechte achten, gerne wird als root gearbeitet und später kann der user svxlink nicht darauf zugreifen,
  • CamelCase Wording, also Gross- und Kleinschreibung bei Linux beachten, ich suche immer gerne meine Typos,
  • Pfadangaben beachten, ich habe mir einen gewissen Pfadstandard angewöhnt, um Prozeduren und Arbeitsdateien schnell wiederzufinden.

So, viel Vergnügen beim Experimentieren an der Tastatur.