def Caldav(self): # Verbinding maken met CalDav agenda client = caldav.DAVClient(self.config["url"]) principal = client.principal() calendars = principal.calendars() first_all = True # Lus door de beschikbare agenda's heen for calendar in calendars: # Zoek de naam hiervan op calendar_name = calendar.get_properties([ dav.DisplayName(), ])["{DAV:}displayname"] # Alleen doorgaan indien de agenda in de 'calendars' config regel staat if calendar_name in self.config["calendars"]: first = True now = f.Now(self.config_full) # Evenementen voor vandaag zoeken, met een beetje buffer terug in de tijd. results = calendar.date_search(now - timedelta(hours=2), now + timedelta(days=1)) for vevent in results: event = Event(client=client, url=vevent.url) event.load() # Oke.. in de documentatie niks over hoe hier een nette string van te maken # En in het object zelf zit ook niet echt een functie daarvoor, los van __str()__ start = event.instance.vevent.dtstart.__str__() summary = event.instance.vevent.summary.__str__() # Zo kan het ook. summary = summary.replace("<SUMMARY{}", "")[:-1] # Dit komt binnen: <DTSTART{'X-VOBJ-ORIGINAL-TZID': ['Europe/Amsterdam']} # Dus split op } en dan de eerste verwijderen, en het > teken achteraan verwijderen start = parse(''.join(start.split("}")[1:])[:-1]) # Eerste event in deze agenda? Toon de agenda naam if first: # Niet de eerste agenda? Extra witregel if not first_all: self.text += "<br/>" self.text += "<h3>" + calendar_name + "</h3>" first = False first_all = False # Event samenvatting (tijd + omschijving) toevoegen aan de text dt = "%A %H:%M" if (calendar_name.lower().find("birthday") >= 0 or calendar_name.lower().find("verjaardag") >= 0): dt = "%A" self.text += "{0} {1}<br/>".format(start.strftime(dt), summary) if not first_all: self.hasText = True
def Run(self): now = f.Now(self.config_full) # Na 11u is het toch al te laat if now.hour < 11: # Dag van vandaag weekday = now.weekday() # Staat vandaag in de config file? if str(weekday) in self.config: self.hasText = True self.text = "Vandaag moet het " + \ self.config[str(weekday)] + " bij de weg"
def Run(self): now = f.Now(self.config_full) with urllib.request.urlopen(self.config["url"]) as url: data = url.read() servers = json.loads(data) for server in servers: if not server in self.config["servers"]: continue ping = f.GetDateTimeWithTZ(self.config_full, (datetime.datetime.fromtimestamp( int(servers[server]["ping"])))) diffhour = ((now - ping).total_seconds() / 60 / 60) if (diffhour > int(self.config["servers"][server])): self.text += server + " is al " + \ str(round(diffhour, 2)) + " uur stil.<br />" self.hasText = True
config = Config(user).GetConfig() except Exception as e: print("Error: de config van {0} is niet correct.".format(user)) run = False pass if run: # Set de locale, voor de tijd functies (agenda) en de tijd van de cron if 'Locale' in config: locale.setlocale(locale.LC_TIME, '{0}.UTF-8'.format(config["Locale"])) # Checken of je de notificatie dit uur wilt ontvangen? run = False if 'Tijd' in config: if f.Now(config).hour in config["Tijd"]: run = True if run: userdir = "data/{0}/".format(user) if not os.path.isdir(userdir): os.makedirs(userdir) # Config extenden met runtime variabelen with open('secrets/secrets.json') as secrets: config['Runtime'] = { "datadir": datadir, "userdir": userdir, "secrets": json.load(secrets), "production": prod,
def Run(self): # Een textfile met de API-key. Met name om de key uit git te houden, en niet te hardcoden. apikey = self.config_full["Runtime"]["secrets"]["darksky_apikey"] temperatureKey = "temperature" if 'gevoel' in self.config: if self.config["gevoel"]: temperatureKey = "apparentTemperature" # Cache de API verzoeken in een map per dag. filename = "{0}/Weer{1}_{2}.json".format(self.config_full["Runtime"]["datadir"], str( self.config["lang"]), str(self.config["long"])) now = f.Now(self.config_full) # Alleen cachen op test verzoeken, ik blijf toch wel onder de max api calls if os.path.exists(filename) and not self.config_full["Runtime"]["production"]: data = open(filename).read() else: # Bouw de URL voor de API-call op en maak een weer object with urllib.request.urlopen("https://api.darksky.net/forecast/{0}/{1},{2}?units=si".format(apikey, str(self.config["lang"]), str(self.config["long"]))) as url: data = url.read() with open(filename, 'w') as outfile: json.dump(json.loads(data), outfile) weather = json.loads(data) # Weerbericht opbouwen op basis van voorkeurs tijden. if "tijden" in self.config: text_builder = "" weekday = now.weekday() # Wil je vandaag een voorspelling? if str(weekday) in self.config["tijden"]: # Stats voor het advies minTemp = 99 maxTemp = -99 maxRegen = 0 # Voor elk uur de voorspelling opzoeken for data in weather["hourly"]["data"]: hour = datetime.datetime.utcfromtimestamp( data["time"]).hour day = datetime.datetime.utcfromtimestamp(data["time"]).day # Alleen de voorspelling van vandaag gebruiken if day == now.day: # Staat het uur in de gewenste tijden, en na het huidige uur? if hour in self.config["tijden"][str(weekday)] and hour >= now.hour: # Text opbouwen per tijd. text_builder += "Om {0} uur is het {1}°".format( hour, data[temperatureKey]) if (data["precipProbability"] >= 0.1): perciptype = "regen" if data["precipType"] == "snow": perciptype = "sneeuw" text_builder += " met {0}% kans op {1}".format( round(data["precipProbability"]*100), perciptype) if data[temperatureKey] < minTemp: minTemp = data[temperatureKey] if data[temperatureKey] > maxTemp: maxTemp = data[temperatureKey] if (data["precipProbability"] * 100) > maxRegen: maxRegen = (data["precipProbability"] * 100) text_builder += "<br/>" if text_builder != "": # Advies opbouwen advies = "" if "advies" in self.config: for key in self.config["advies"]: if minTemp >= self.config["advies"][key]["min"] and maxTemp <= self.config["advies"][key]["max"] and maxRegen <= self.config["advies"][key]["regen"]: advies = self.config["advies"][key]["advies"] break # Het instellen van advies op basis van parameters is een onmogelijke taak. # Dus of heel veel in de config tweaken en super kleine advies sets maken, of nog iets in code verzinnen. # We gaan het meemaken.. ok doei. if advies != "": text_builder += "Advies: " + advies self.text = text_builder else: self.hasText = False else: self.hasText = False else: # Standaard tekst self.text = u"Het is nu {0}° en het wordt vandaag tussen de {1}° en {2}°".format( weather["currently"][temperatureKey], weather["daily"]["data"][0]["temperatureLow"], weather["daily"]["data"][0]["temperatureHigh"])
def Run(self): now = f.Now(self.config_full) dag = now.strftime("%A").lower() # Url checken en eventueel fixen zodat ik folder+file kan doen if self.config["folder"][-1:] != "/": self.config["folder"] += "/" if "weekly" in self.config: if self.config["weekly"][:1] == "/": self.config["weekly"] = self.config["weekly"][1:] weekly_url = self.config["folder"] + self.config["weekly"] weekly_url = weekly_url.replace("[year]", "[jaar]") weekly_url = weekly_url.replace("[week]", str(now.isocalendar()[1])) weekly_url = weekly_url.replace("[jaar]", str(now.year)) response = requests.get(weekly_url) if response.status_code == 200: weekly = response.text # Zoek op ## Dag weeklyDagIndex = weekly.lower().find("## " + dag) # index = start van ## Dag t/m eof, GetBlock kapt hem op de volgende ## af weeklyDag = self.GetBlock(weekly[weeklyDagIndex:]) # Filter alle uitgevoerde taken weeklyDag = self.FilterDone(weeklyDag) # Openstaande punten uit vorige dagen laatsteDag = "" firstDag = True histText = "" # DagIndex = index van vandaag, alles daarvoor is al geweest, dus scannen op gemist. for regel in weekly[:weeklyDagIndex].split("\n"): if regel.find( "## " ) >= 0: # Dag onthouden om in het bericht te zetten laatsteDag = regel firstDag = True if regel.find("[ ]") >= 0: if firstDag: histText += laatsteDag + "\n" firstDag = False histText += regel + "\n" histText = histText.rstrip() # Openstaande punten in de algemene ## TODO # .find = start van ## todo t/m eof, GetBlock kapt hem op de volgende ## af weeklyTodo = self.GetBlock( weekly[weekly.lower().find("## todo"):]) # Todo tekst opbouwen, alleen openstaande vinkjes todoText = self.FilterDone(weeklyTodo) # *# Tekst opbouwen # Gemiste punten van deze week toevoegen if histText != "": self.hasText = True self.text += histText + "\n\n" # Alle punten van vandaag toevoegen, indien er minimaal 1 openstaande is. if weeklyDag.find("[ ]") > 0: self.hasText = True self.text += weeklyDag + "\n\n" # Open algemene TODO toevoegen if todoText.find("[ ]") > 0: self.hasText = True self.text += todoText + "\n\n" # Omzetten naar HTML gezien main dat verwacht. self.text = f.plain2hml(self.text).rstrip()