diff --git a/config/config.template.ini b/config/config.template.ini index e4f60ba..cdf6f85 100644 --- a/config/config.template.ini +++ b/config/config.template.ini @@ -228,7 +228,7 @@ mqtt = 0 # for developing - template-module template = 0 - +2calendar = 1 [MySQL] # MySQL configuration @@ -591,6 +591,9 @@ password = dummyPassword commandFMS = set SteckdoseSchlafzimmerEinsatz on-for-timer 90 commandZVEI = commandPOC = +[2calendar] +# Config-Daten des Kalenderplugins +filepath2calendar = #Pfad zur Kalenderdatei [mqtt] #Adress from MQTT-Broker diff --git a/plugins/2calendar/2calendar.py b/plugins/2calendar/2calendar.py new file mode 100644 index 0000000..5d03fac --- /dev/null +++ b/plugins/2calendar/2calendar.py @@ -0,0 +1,141 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +""" +Kalendereinträge für Alarmierungen +Erstellt eine Icalendar (ICS)-Datei, diese kann in Kalender wie Outlook etc. importiert werden. +Aktuell wird jeder Alarm der via Regex dieses Plugin anspricht, in eine "Gesamtdatei" geschrieben. Denkbar wäre aber auch +für jeden Filter eine seperate Datei anzulegen. +Auch wird aktuell nur ZVEI, aus mangel an Erfahrung, ausgewertet. +@author: Norbert Jahn +@author: Bastian Schroll +@requires: icalendar https://pypi.org/project/icalendar/ +@requires: dateutil https://github.com/dateutil/dateutil/ +@requires: pytz https://pypi.org/project/pytz/ +""" + +import logging # Global logger +import time +import requests +import re +from icalendar import Calendar, Event +from datetime import datetime, timedelta +import pytz +import os.path +from includes import globalVars # Global variables +from includes.helper import configHandler + + + + +## +# +# onLoad (init) function of plugin +# will be called one time by the pluginLoader on start +# +def onLoad(): + """ + While loading the plugins by pluginLoader.loadPlugins() + this onLoad() routine is called one time for initialize the plugin + @requires: nothing + @return: nothing + """ + # nothing to do for this plugin + return + + +## +# +# Main function of Calendar-plugin +# will be called by the alarmHandler +# +def run(typ,freq,data): + """ + This function is the implementation of a Calendar-Plugin + It will write Alarms in an ics-File. + @type typ: string (FMS|ZVEI|POC) + @param typ: Typ of the dataset for sending to BosMon + @type data: map of data (structure see readme.md in plugin folder) + @param data: Contains the parameter for dispatch to BosMon. + @type freq: string + @keyword freq: frequency is not used in this plugin + @requires: + @return: nothing + """ + try: + if configHandler.checkConfig("2calendar"): #read and debug the config + + try: + # + # Kalender instanzieren + # + cal = Calendar() + cal.add('proid', 'BOS') + cal.add('version', '2.0') + + except: + logging.error("Kann Kalender nicht erstellen") + else: + try: + # + # Erstelle das Event + # + + summary = "" + location = "" + msg = "" + enterEvent = False + + if typ == "ZVEI": + summary = data["description"] + location = data["zvei"] + enterEvent = True + elif typ == "POC": + summary = data["description"] + location = data["ric"] + data["functionChar"] + msg = data["msg"] + enterEvent = True + else: + logging.warning("Nicht unterstützter Typ: %s", typ) + + if enterEvent == True: + if os.path.exists(globalVars.config.get("2calendar", "filepath2calendar")+'alle.ics'): + g = open(globalVars.config.get("2calendar", "filepath2calendar")+'alle.ics','rb') + gcal = Calendar.from_ical(g.read()) + + for component in gcal.walk(): + + if component.name == "VEVENT": + event = Event() + event.add('summary', component.get('SUMMARY')) + event.add('dtstart', component.get('DTSTART')) + event.add('dtend', component.get('dtend')) + event.add('dtstamp', component.get('dtstamp')) + event.add('location', component.get('location')) + event['uid'] = component.get('UID') + cal.add_component(event) + + g.close() + + + timestamp = datetime.fromtimestamp(data["timestamp"]) + event = Event() + event.add('summary', summary) + event.add('dtstart',timestamp) + event.add('dtend',timestamp) + event.add('dtstamp',timestamp) + event.add('location', location) + event.add('description', msg) + event['uid'] = "{0}#{1}".format(timestamp,data["description"]) + cal.add_component(event) + with open(globalVars.config.get("2calendar", "filepath2calendar")+'alle.ics', 'wb') as f: + f.write(cal.to_ical()) + + except: + logging.error("cannot Insert %s", typ) + logging.debug("cannot Insert %s", typ, exc_info=True) + return + + except: + logging.error("unknown error") + logging.debug("unknown error", exc_info=True)