2019-09-19 14:46:18 +02:00
# <center>Eigenes Modul/Plugin schreiben</center>
2019-09-20 12:00:02 +02:00
2019-09-18 18:38:17 +02:00
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.
2018-01-15 14:18:15 +01:00
2019-09-19 14:46:18 +02:00
---
2019-09-20 12:00:02 +02:00
## Allgemeine Informationen
Im ersten Schritt sollte eine Kopie des jeweiligen Templates (Modul oder Plugin) erstellt werden. Nun sollten im Dateikopf die Angaben angepasst werden.
2018-01-15 14:18:15 +01:00
2019-09-19 14:46:18 +02:00
---
## Benötigte Methoden überschreiben
### Modul
2019-03-01 17:54:58 +01:00
Die Modul Basisklasse bietet einige Methoden, welche vom Modul überschrieben werden können.
2019-09-18 18:38:17 +02:00
2019-03-01 17:54:58 +01:00
- `onLoad()` wird direkt beim Import des Moduls ausgeführt
- `doWork(bwPacket)` wird bei der Ausführung aufgerufen
- `onUnload()` wird beim Zerstören der Plugin Modul zum Programmende ausgeführt
2019-03-10 19:41:42 +01:00
2019-09-19 14:46:18 +02:00
### Plugin
2018-01-15 14:18:15 +01:00
Die Plugin Basisklasse bietet einige Methoden, welche vom Plugin überschrieben werden können.
2019-09-18 18:38:17 +02:00
2018-01-15 14:18:15 +01:00
- `onLoad()` wird direkt beim Import des Plugins ausgeführt
- `setup()` wird vor jeder Ausführung gerufen
2018-01-15 21:37:24 +01:00
- `fms(bwPacket)` wird bei einem FMS Paket ausgeführt
- `pocsag(bwPacket)` wird bei einem POCSAG Paket ausgeführt
- `zvei(bwPacket)` wird bei einem ZVEI Packet ausgeführt
2018-02-22 13:36:50 +01:00
- `msg(bwPacket)` wird bei einem Nachrichten Packet ausgeführt
2018-01-15 14:18:15 +01:00
- `teardown()` wird nach jeder Ausführung gerufen
- `onUnload()` wird beim Zerstören der Plugin Instanz zum Programmende ausgeführt
2019-09-19 14:46:18 +02:00
---
## Konfiguration
### Konfiguration anlegen
2019-03-01 17:54:58 +01:00
Jedes Modul oder Plugin wird in einem Router folgendermaßen deklariert:
```yaml
2019-09-18 18:38:17 +02:00
- type: module # oder 'plugin'
2019-10-25 21:59:04 +02:00
res: template_module # Name der Python Datei (ohne .py)
name: Mein Modul # optionaler Name
2019-09-19 14:46:18 +02:00
config: # config-Sektion
option1: value 1
option2:
underOption1: value 21
underOption2: value 22
list:
2019-03-01 17:54:58 +01:00
- list 1
- list 2
```
2019-10-25 21:59:04 +02:00
Eine entsprechende Dokumentation der Parameter **muss** in der Dokumentation des jeweiligen Moduls oder Plugins hinterleget werden.
2019-09-18 18:38:17 +02:00
2019-09-19 14:46:18 +02:00
### 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`
2018-01-15 21:32:52 +01:00
2019-09-19 14:46:18 +02:00
- Verschachteltes Feld auslesen (beliebige tiefe möglich)
`self.config.get("option2", "underOption1")`
2019-09-18 18:38:17 +02:00
> liefert `value 21`
2019-09-19 14:46:18 +02:00
2019-10-25 21:59:04 +02:00
- Es kann ein Default Wert angegeben werden (falls entsprechender Eintrag fehlt)
2019-09-19 14:46:18 +02:00
`self.config.get("notSet", default="defValue")`
2019-09-18 18:38:17 +02:00
> liefert `defValue`
2019-09-19 14:46:18 +02:00
- Über Listen kann einfach iteriert werden
`for item in self.config.get(FIELD):`
2019-09-18 18:38:17 +02:00
> liefert ein Element je Iteration - hier `list 1` und `list 2`
2018-01-15 21:37:24 +01:00
2019-09-18 18:38:17 +02:00
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.
2018-01-15 21:37:24 +01:00
2019-09-19 14:46:18 +02:00
---
## Arbeiten mit dem bwPacket
2019-09-20 12:00:02 +02:00
An das Modul bzw. Plugin wird eine Instanz eines BOSWatch-Paket Objekts übergeben.
2019-09-19 14:46:18 +02:00
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.
2019-09-20 12:00:02 +02:00
Eine Auflistung der bereitgestellten Informationen findet sich im entsprechenden [BOSWatch Paket ](packet.md ) Dokumentation.
2019-10-25 21:59:04 +02:00
**Bitte beachten:**
2019-09-20 12:00:02 +02:00
- Selbst vom Modul hinzugefügte Felder **müssen** in der Modul Dokumentation unter `Paket Modifikation` aufgeführt werden.
2019-10-25 15:54:26 +02:00
- 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.
2019-03-01 17:54:58 +01:00
2019-10-26 08:22:36 +02:00
### Rückgabewert bei Modulen
2019-09-19 14:46:18 +02:00
Module können Pakete beliebig verändern. Diese Änderungen werden im Router entsprechend weitergeleitet.
2019-03-01 17:54:58 +01:00
Mögliche Rückgabewerte eines Moduls:
2019-09-18 18:38:17 +02:00
2019-10-25 21:59:04 +02:00
- `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)
2019-03-10 19:41:42 +01:00
2019-10-26 08:22:36 +02:00
### Rückgabewert bei Plugins
2019-09-18 18:38:17 +02:00
Plugins geben keine Pakete mehr zurück. Sie fungieren ausschließlich als Endpunkt.
2019-03-10 19:41:42 +01:00
Die Plugin Basisklasse liefert intern immer ein `None` an den Router zurück,
2019-09-19 14:46:18 +02:00
was zur weiteren Ausführung des Routers mit dem original Paket führt. Daher macht es in Plugins keinen Sinn ein Paket zu modifizieren.
2019-10-25 21:59:04 +02:00
---
## Nutzung der Wildcards
2019-10-26 10:18:55 +02:00
Es gibt einige vordefinierte Wildcards welche in der [BOSWatch Paket ](packet.md ) 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`
2019-10-25 21:59:04 +02:00
### 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.
2019-10-26 10:18:55 +02:00
- `newWildcard` muss im folgenden Format angegeben werden: `{WILDCARD}`
- `bwPacketField` ist der Name des Feldes im bwPacket - gestezt per `bwPacket.set(FIELDNAME, VALUE)`
2019-10-25 21:59:04 +02:00
**Bitte beachten:**
- Selbst vom Modul registrierte Wildcards **müssen** in der Modul Dokumentation unter `Zusätzliche Wildcards` aufgeführt werden.
2019-03-01 17:54:58 +01:00
2019-10-25 21:59:04 +02:00
### Wildcards parsen [Plugins]
2019-10-26 10:18:55 +02:00
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
2019-10-25 21:59:04 +02:00
Die Platzhalter der Wildcards findet man in der [BOSWatch Paket ](packet.md ) Dokumentation.
2019-10-26 18:56:39 +02:00
Sollten Module zusätzliche Wildcards registrieren, findet man Informationen dazu in der jeweiligen Modul Dokumentation
2019-10-25 21:59:04 +02:00
2019-09-20 12:00:02 +02:00
---
## Richtiges Logging
tbd ...
2019-10-25 21:59:04 +02:00