Eigenes Modul/Plugin schreiben
Um ein eigenes Modul oder Plugin zu schreiben, sollte man sich am besten zuerst einmal das das template
im entsprechenden Ordner ansehen. Dies kann als Vorlage für das eigene Modul oder Plugin genutzt werden.
Allgemeine Informationen
Im ersten Schritt sollte eine Kopie des jeweiligen Templates (Modul oder Plugin) erstellt werden. Nun sollten im Dateikopf die Angaben angepasst werden.
Benötigte Methoden überschreiben
Modul
Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben werden können.
onLoad()
wird direkt beim Import des Moduls ausgeführtdoWork(bwPacket)
wird bei der Ausführung aufgerufenonUnload()
wird beim Zerstören der Plugin Modul zum Programmende ausgeführt
Plugin
Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können.
onLoad()
wird direkt beim Import des Plugins ausgeführtsetup()
wird vor jeder Ausführung gerufenfms(bwPacket)
wird bei einem FMS Paket ausgeführtpocsag(bwPacket)
wird bei einem POCSAG Paket ausgeführtzvei(bwPacket)
wird bei einem ZVEI Packet ausgeführtmsg(bwPacket)
wird bei einem Nachrichten Packet ausgeführtteardown()
wird nach jeder Ausführung gerufenonUnload()
wird beim Zerstören der Plugin Instanz zum Programmende ausgeführt
Konfiguration
Konfiguration anlegen
Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert:
- type: module # oder 'plugin'
res: template_module # Name der Python Datei (ohne .py)
name: Mein Modul # optionaler Name
config: # config-Sektion
option1: value 1
option2:
underOption1: value 21
underOption2: value 22
list:
- list 1
- list 2
Eine entsprechende Dokumentation der Parameter muss in der Dokumentation des jeweiligen Moduls oder Plugins hinterleget werden.
Konfiguration verwenden
Wird der Instanz eine Konfiguration übergeben wird diese in self.config
abgelegt und kann wie folgt abgerufen werden:
(Dies Ergebnisse beziehen sich auf das Konfigurationsbeispiel oben)
-
Einzelnes Feld auslesen
self.config.get("option1")
liefert
value 1
-
Verschachteltes Feld auslesen (beliebige tiefe möglich)
self.config.get("option2", "underOption1")
liefert
value 21
-
Es kann ein Default Wert angegeben werden (falls entsprechender Eintrag fehlt)
self.config.get("notSet", default="defValue")
liefert
defValue
-
Über Listen kann einfach iteriert werden
for item in self.config.get(FIELD):
liefert ein Element je Iteration - hier
list 1
undlist 2
Wird ein End-Wert ausgelesen, wird dieser direkt zurück gegeben.
Sollten weitere Unterelemente oder eine Liste exisitieren wird erneut ein Objekt der Klasse Config()
zurück gegeben, auf welches wiederum nach obigem Schema zugegriffen werden kann.
Arbeiten mit dem bwPacket
An das Modul bzw. Plugin wird eine Instanz eines BOSWatch-Paket Objekts übergeben.
Aus dieser kann mittels bwPacket.get(FIELDNAME)
das entsprechende Feld ausgelesen werden.
Mittels bwPacket.set(FIELDNAME, VALUE)
kann ein Wert hinzugefügt oder modifiziert werden.
Eine Auflistung der bereitgestellten Informationen findet sich im entsprechenden BOSWatch Paket Dokumentation.
Bitte beachten:
- Selbst vom Modul hinzugefügte Felder müssen in der Modul Dokumentation unter
Paket Modifikation
aufgeführt werden. - Sollte ein Modul oder Plugin Felder benutzen, welche in einem anderen Modul erstellt werden, muss dies im Punkt
Abhänigkeiten
des jeweiligen Moduls oder Plugins dokumentiert werden.
Rückgabewert bei Modulen
Module können Pakete beliebig verändern. Diese Änderungen werden im Router entsprechend weitergeleitet.
Mögliche Rückgabewerte eines Moduls:
return bwPacket
Gibt das modifizierte bwPacket an den Router zurück (Paket Modifikation)return None
Der Router fährt mit dem unveränderten bwPacket fort (Input = Output)return False
Der Router stopt sofort die Ausführung (zB. in Filtern verwendet)
Rückgabewert bei Plugins
Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt.
Die Plugin Basisklasse liefert intern immer ein None
an den Router zurück,
was zur weiteren Ausführung des Routers mit dem original Paket führt. Daher macht es in Plugins keinen Sinn ein Paket zu modifizieren.
Nutzung der Wildcards
Es gibt einige vordefinierte Wildcards welche in der BOSWatch Paket Dokumentation zu finden sind.
Außerdem sind die folgenden allgemeinen Wildcards definiert:
{BR}
- Zeilenumbruch\r\n
{LPAR}
- öffnende Klammer(
{RPAR}
- schließende Klammer)
{TIME}
- Aktueller Zeitstempel im Format%d.%m.%Y %H:%M:%S
Wildcards registrieren [Module]
Module können zusätzliche Wildcards registrieren welche anschließend in den Plugins ebenfalls geparst werden können.
Dies kann über die interne Methode self.registerWildcard(newWildcard, bwPacketField)
gemacht werden.
newWildcard
muss im folgenden Format angegeben werden:{WILDCARD}
bwPacketField
ist der Name des Feldes im bwPacket - gestezt perbwPacket.set(FIELDNAME, VALUE)
Bitte beachten:
- Selbst vom Modul registrierte Wildcards müssen in der Modul Dokumentation unter
Zusätzliche Wildcards
aufgeführt werden.
Wildcards parsen [Plugins]
Das parsen der Wildcars funktioniert komfortabel über die interne Methode msg = self.parseWildcards(msg)
.
msg
enstrpicht dabei dem String in welchem die Wildcards ersetzt werden sollen
Die Platzhalter der Wildcards findet man in der BOSWatch Paket Dokumentation.
Sollten Module zusätzliche Wildcards registrieren, findet man Informationen dazu in der jeweiligen Modul Dokumentation
Richtiges Logging
tbd ...