diff --git a/docu/docs/modul/double_filter.md b/docu/docs/modul/double_filter.md
new file mode 100644
index 0000000..e857c79
--- /dev/null
+++ b/docu/docs/modul/double_filter.md
@@ -0,0 +1,49 @@
+#
Double Filter
+---
+
+## Beschreibung
+Mit diesem Modul ist es möglich, die Pakete auf Duplikate zu Filtern. Je nach Konfiguration werden doppelte Pakete im aktuellen Router weitergeleitet oder verworfen.
+
+## Unterstütze Alarmtypen
+- Fms
+- Pocsag
+- Zvei
+
+## Resource
+`filter.doubleFilter`
+
+## Konfiguration
+|Feld|Beschreibung|Default|
+|----|------------|-------|
+|ignoreTime|Zeitfenster für doppelte Pakte in Sekunden|10|
+|maxEntry|Maximale Anzahl an Paketen in der Vergleichsliste|20|
+|pocsagFields|Liste der Pocsag Felder zum Vergleichen: `ric`, `subric` und/oder `message`|`ric,subric`|
+
+**Beispiel:**
+```yaml
+- type: module
+ res: filter.doubleFilter
+ config:
+ ignoreTime: 30
+ maxEntry: 10
+ pocsagFields:
+ - ric
+ - subric
+```
+
+---
+## Modul Abhängigkeiten
+- keine
+
+---
+## Externe Abhängigkeiten
+- keine
+
+---
+## Paket Modifikationen
+- keine
+
+---
+## Zusätzliche Wildcards
+- keine
+
diff --git a/docu/mkdocs.yml b/docu/mkdocs.yml
index df708b9..ff4f904 100644
--- a/docu/mkdocs.yml
+++ b/docu/mkdocs.yml
@@ -22,6 +22,7 @@ nav:
- Geocoding: modul/geocoding.md
- Mode Filter: modul/mode_filter.md
- Regex Filter: modul/regex_filter.md
+ - Double Filter: modul/double_filter.md
- Plugins:
- Http: plugin/http.md
- Telegram: plugin/telegram.md
diff --git a/module/filter/___doubleFilter.py b/module/filter/doubleFilter.py
similarity index 53%
rename from module/filter/___doubleFilter.py
rename to module/filter/doubleFilter.py
index aa8ba9f..4b0a20a 100644
--- a/module/filter/___doubleFilter.py
+++ b/module/filter/doubleFilter.py
@@ -10,33 +10,45 @@
by Bastian Schroll
@file: doubleFilter.py
-@date: 15.01.2018
-@author: Bastian Schroll
-@description: Class to implement a filter for double alarms
-@todo test, refactor and document / check_msg is not implemented yet
+@date: 09.07.2020
+@author: Bastian Schroll, b-watch
+@description: Filter module for double packages
"""
import logging
+from module.moduleBase import ModuleBase
+
+# ###################### #
+# Custom plugin includes #
import time
+# ######################
logging.debug("- %s loaded", __name__)
-class DoubleFilter:
- """!Double Filter Class"""
-
+class BoswatchModule(ModuleBase):
+ """!Description of the Module"""
def __init__(self, config):
- """!init"""
- self._config = config
+ """!Do not change anything here!"""
+ super().__init__(__name__, config) # you can access the config class on 'self.config'
self._filterLists = {}
+ logging.debug("Configured ignoreTime: %d", self.config.get("ignoreTime", default=10))
+ logging.debug("Configured maxEntry: %d", self.config.get("maxEntry", default=10))
- def filter(self, bwPacket):
+ def onLoad(self):
+ """!Called by import of the plugin
+ Remove if not implemented"""
+ pass
+ def doWork(self, bwPacket):
+ """!start an run of the module.
+
+ @param bwPacket: A BOSWatch packet instance"""
if bwPacket.get("mode") == "fms":
- scanWord = "fms"
+ filterFields = ["fms"]
elif bwPacket.get("mode") == "pocsag":
- scanWord = "ric"
+ filterFields = self.config.get("pocsagFields", default=["ric", "subric"])
elif bwPacket.get("mode") == "zvei":
- scanWord = "zvei"
+ filterFields = ["tone"]
else:
logging.error("No Filter for '%s'", bwPacket)
return False
@@ -45,31 +57,36 @@ class DoubleFilter:
logging.debug("create new doubleFilter list for '%s'", bwPacket.get("mode"))
self._filterLists[bwPacket.get("mode")] = []
- logging.debug("scanWord for '%s' is '%s'", bwPacket.get("mode"), scanWord)
+ logging.debug("filterFields for '%s' is '%s'", bwPacket.get("mode"), ", ".join(filterFields))
- return self._check(bwPacket, scanWord)
+ return self._check(bwPacket, filterFields)
- def _check(self, bwPacket, scanWord):
+ def onUnload(self):
+ """!Called by destruction of the plugin
+ Remove if not implemented"""
+ pass
+
+ def _check(self, bwPacket, filterFields):
self._filterLists[bwPacket.get("mode")].insert(0, bwPacket)
# delete entries that are to old
counter = 0
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
- if listPacket.get("timestamp") < (time.time() - self._config["ignoreTime"]):
+ if float(listPacket.get("timestamp")) < (time.time() - self.config.get("ignoreTime", default=10)):
self._filterLists[bwPacket.get("mode")].remove(listPacket)
counter += 1
if counter:
logging.debug("%d old entry(s) removed", counter)
# delete last entry if list is to big
- if len(self._filterLists[bwPacket.get("mode")]) > self._config["maxEntry"]:
+ if len(self._filterLists[bwPacket.get("mode")]) > self.config.get("maxEntry", default=20):
logging.debug("MaxEntry reached - delete oldest")
self._filterLists[bwPacket.get("mode")].pop()
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
- if listPacket.get(scanWord) is bwPacket.get(scanWord):
- logging.debug("found duplicate: %s", bwPacket.get(scanWord))
+ if all(listPacket.get(x) == bwPacket.get(x) for x in filterFields):
+ logging.debug("found duplicate: %s", bwPacket.get("mode"))
return False
logging.debug("doubleFilter ok")
- return True
+ return None