Email Benachrichtigungen Unicorn Shield

Email Benachrichtigungen Unicorn Shield  Titelbild

Coding Unicorn Shield Projekt: Persöhnliche Email Benachrichtigungen

Emails gehören zu einer der ältesten digitalen Komunikationsarten. Sie sind deutlich älter als das World Wide Web und werden heutzutage immer noch von sehr vielen Menschen benutzt. Die Autoren dieser anleitung, Moin!, selbst benutzen E-Mails täglich egal ob für Arbeit, Hobby oder Freizeit. Also warum nicht diese wunderbare (alte) Technologie benutzen um diese mit deinem neuen Unicorn Shield zu verbinden. Hier haben wir mal ein kleines gif erstellt wie es dann aussehen könnte:

Coding Unicorn Shield Project Personal EMail Notificaitons

Grundlagen

Obwohl das Email Protokoll relativ alt ist, ist es immer noch in stetiger Benutzung. Ein grund ist dabei das jeder, wirklich jeder, einfach einen E-Mail Server installieren kann und dann damit die ersten Nachrichten in die weite Welt verschicken kann. Ein weiterer Grund ist das es für das Verwalten von E-Mails und E-Mail Postfächen ein offene Protokolle gibt. Eins davon wird auch IMAP genannt. Dieses Protokoll erlaubt es verschiedenen Clients (z.B. übers Internet oder Programme wie Thunderbird einfach auf deine e-Mail zuzugreifen und diese zu verwalten. Da das Protokoll so offen, standardisiert und alt ist ist, ist es ein leichtes für uns das mit Python oder einem anderen Programm zu kombinieren. Die Benötigten Bibliotheken befinden sich zum Teil schon auf deinem Pi.

Was du brauchst

  1. Einen laufenden Raspberry Pi mit einer Internet verbindung
  2. Ein E-Mail Account mit Zugansdaten (Email, Passwort und evlt. Die Adresse des Servers)
  3. Dein Coding Unicorn Shield

Das Programm

email-notifications.py

import imaplib
import unicornshield as unicorn
import time

mailServer = 'server'
mailUsername = 'password'
mailPassword = 'password'

mail = None

def connect():
        global mail

        mail = imaplib.IMAP4_SSL(mailServer)
        mail.login(mailUsername, mailPassword)
        mail.list()
        mail.select("inbox")

connect()

def getUnreadmails():
        data = mail.search(None, 'UNSEEN')
        unreadmails = len(str(data[1]).split())
        if str(data[1]) == "['']":
                unreadmails = 0
        return int(unreadmails)

doNotDisturb = False
lastChecked = time.time()
waitTillNextCheck = 60*2
unreadmails = getUnreadmails()

while True:
        oldUnreadMails = unreadmails
        if time.time() > lastChecked+waitTillNextCheck:
                try:
                        unreadmails = getUnreadmails()
                except:
                        connect()
                        unreadmails = getUnreadmails()
                lastChecked = time.time();

        if unicorn.buttonPressed() == True:
                if doNotDisturb == False:
                        doNotDisturb = True
                else:
                        doNotDisturb = False
                print(doNotDisturb)
        unicorn.clear()
        if doNotDisturb == True:
                unicorn.setPixel(0,0,0,155)
                unicorn.show()
        else:
                if oldUnreadMails == unreadmails:
                        pass
                if unreadmails <= 9 and unreadmails >=1:
                        for x in range(unreadmails):
                                unicorn.setPixel(x, 0, 155, 0)
                elif unreadmails > 9:
                        unicorn.setAll(155, 0, 0)
                else:
                        unicorn.setPixel(0,150,150,0)
                unicorn.show()
                time.sleep(0.1)

Schritt für Schritt

Weil das Programm relatativ lang und Komplex ist können wir nicht jedes Detail erklären. Mehr Infos zum Shield und wie du dieses Programmieren kannst, findest du auf cw42.de/einhorn.

In den ersten drei Zeilen werden alle benötigten Bibliotheken importiert. Wir brauchen die imaplib Bibliothek für die Kommunikation für den E-Mail Server.

In Zeile 5 bis 7 definieren wir dann die Variablen für die E-Mail server einstellungen. Als erstes mailServer ist für die Adresse des Mail Servers (z.B.: imap.googlemail.com), als zweites mailUsername das ist idr dein email adresse und als letztes noch mailPassword in dem du das Passwort für deinen E-Mail Account speichern kannst. Immer wenn du Passwörter in deine Programme integrierst achte darauf das du niemals veröffentlichst und du dieses Passwort bei keinem anderen dienst benutzt. Im nächsten Schritt erstellen wir eine lehre Variable mit dem Namen mail welche wir für später brauchen.

In Zeile 11 erstellen wir unsere Funktion und und rufen dann die Funktion connect() auf. Diese Funktion erstellt für da Programm die Verbindung zu dem E-Mail Server. Dafür müssen wir zuerst einmal sorge das auf die Variable mail auch außerhalb der Funktion zugegriffen werden kann. In den nächsten beiden Zeilen 14 und 15 werden dann die Pixel LEDs auf weiß geschaltet, damit kann der Benutzer später erkennen was gerade im Programm passiert. In Zeile 16 bis 10 erstellen wir eine Verbindung zu dem E-Mail Server und benutzen dabei die Zugsanddaten die wir vorher definiert haben und öffnen dann dass Postfach Inbox (im deutschen auch häufig Posteingang genannt). Das ist der Hautpordner und in diesem werden in der Regel auch alle neuen E-Mail gespeichert. Am ende der Funktion werden dann die Pixel wieder ausgeschaltet.

In Zeile 22 wird diese Funktion dann zum ersten mal aufgerufen. Bedenke dabei das beim aufrufen der Funktion die mail Variable verändert wird welche wir für die späteteren Programme brauchen.

In Zeile 24 erstellen wir eine zweite funktion. Diese wird getUnreadmails() genannt. Diese Funktion wird die Anzahl der ungelesenen Emails im Posteingang/Inbox auslesen und dann zurück geben. Dafür wird als erstes in Zeile 25 die data Variable erstellt und die ergebnisse von mail.search(None, 'UNSEEN') darin gespeichert. Mit dieser Funktion und Parameter bekommen wir alle ungelesen E-Mails zurück. Aber für diese Funktion und Projekt brauchen wir nicht die ungelesenen E-Mail sondern nur die Anzahl der ungelesenen e-Mails. Dafür benutzen wir in Zeile 26 einen kleinen Trick in dem zuerst das Ergebnis konvertieren und dann mit der len() Funktion zählen. In Zeile 27 und 28 erstellen wir dann noch eine Bedingung die mit dem Fall umgeht das es gerade keine ungelesenen E-Mails gibt. In Zeile 29 wird dann die Anzahl der ungelesenen E-Mails zurück gegeben. Mit der int() Funktion sorgen wir dafür das aufjedenfall eine Zahl zurück gegeben wird.

In Zeile 31 bis 24 erstellen wir die Variablen welche wichtig werden für den nächsten Schritt. Hier wird auch die getUnreadmail() Funktion aufgerufen und das ergebnis in der unreademails Variable gespeichert.

In Zeile 36 beginnt der Hauptteil des Programmes welches aus einer while-Schleife beginnt die immer am laufen ist. Am Anfang der Schleife speichern wir die Anzahl der E-Mails die vorher dagewesen sind.

In Zeile 38 gibt es eine if Bedingung die Kontrolliert ob es schon wieder Zeit ist bei dem E-Mail Server abzufragen wie viele ungelsenen e-Mails da sind. Wir sollten immer darauf achten das nicht zu häufig zu machen weil a) es gibt idr nicht so häufig veränderungen in deinem Posteingang und b) du willst deinen E-Mail Server auch nicht mit den vielen Aufrufen nerven. Du kannst den Zeitraum aber auch auf deinen Präferierten Zeitraum anpassen in dem du einfach die Variable waitTillNextCheck in Zeile 33 anpasst. Die Wartezeiten wird in Sekunden gespeichert. Wenn es wieder Zeit ist die Anzahl abzufragen wird der eingerückte Block von Zeile 39 bis 43 ausgeführt. Hier gibt es eine try bedingung oder Ausnahme Regel. Diese brauchen wir falls mal etwas in der getUnreadmails() Funktion schief gehen sollte und damit sich unser Programm nicht gleich beendet. Sollte das der Falls ein wird in Zeile 42 die Verbindung mit dem Server noch einmal aufgerufen und in Zeile 43 wird dann noch einmal versucht die ungelesenen E-Mails auszulesen. So oder so werden win der Variable lastChecked gespeichert wann zum letzten mal die E-Mails kontrolliert wurden.

In nächsten teil werden von Zeile 46 bis 50 wird kontrolliert ob es irgendwelche änderungen für die nicht Stören (engl. Do not disturb) gegeben hat. Wir kontrollieren das in dem wir den Status des Tasters mit der Funktion .buttonPressed() abfragen. Wenn der Taster gedrückt wurde erändert isch auch der Status. Zum Glück gibt es nur zwei Möglichkeiten. Das heißt am Ende ist die Variable doNotDisturb True oder False.

Der Letzte Teil ist von Zeile 52 bis 67. In diesem Teil erstellen wir die Visualiserung für die E-Mails. Dafür setzen wir verschiedenen if Bedingungen für die verschiedenen Möglichkeiten ein. Die erste if Bedingung beginnt in Zeile 53 und kontrolliert den Status von der doNotDisturb Variable. Wenn die True ist wollen wir gar keine Informationen anzeigen. Dafür geben wir in Zeile 54 und 55 dem ersten Pixel die Farbe blau. Das sieht dann so aus auf dem Shield:

Activated Do Not Disturb Mode Coding Unicorn Shield

Wenn die Bedingung nicht Wahr ist fängt in Ziele 56 die Visualiserung mit einer else Bedingung an. In Zeile 57 wird in einer Bedingung getestet ob sich die Anzahl der ungelsene E-Mails verändert hat. Wenn es keine Veränderung gibt wird in Zeile 58 mit pass die nächsten Schritte übersprungen. Den wir brauchen ja nichts zu verändern was schon richtig angezeigt wird.

In Zeile 59 wird dann in einer if bedingung kontrolliert ob die Variable unreadmails gleich oder kleiner als 9 aber mindestens 1 ist. Das ist wichtig weil wir nicht mehr als 9 Pixel haben. Wenn das der Falls ist wir die Schleife in Zeile 60 und 61 ausgeführt. Mit der Hilfe der Schleife werden so viele LEDs angeschaltet wie es leuchtende LEDs auf dem Shield gibt. Hier gibt es ein Beispiel für ein Postfach mit 7 ungelesenen E-Mails.

7 Unread emails Coding Unicorn Shield

Jetzt gibt es nur noch zwei Möglichkeiten welche wir noch nicht abgebildet haben. In Zeile 62 gibt es eine Bedingung die dann ausgeführt wird wenn es mehr als 9 ungelesenen E-Maisl gibt. In diesem Fall können wir nicht die genaue Anzahl der e-Mails anzeigen aber wir können einfach alle Pixel zum roten leuchten bringen. Das ist dann hoffentlich auch eine gute Motivation sich endlich mal diesen ganzen ungelesenen E-Mails anzusehen.

11 Unread emails Coding Unicorn Shield

Die letzte Möglichkeit wird dann in Zeile 64 und 64 nachgegangen. Falls wir keinen ungelesenen E-Mails haben müssen wir das ja auch irgendwie darstellen. Dafür lassen wir einfach den ersten Pixel in Gelb leuchten.

0 Unread emails Coding Unicorn Shield

Damit wir nur einmal die .show() Funktion aufrufen müssen kommt diese ganz ans Ende. Somit werden die Änderungen auch auf dem Shield angezeigt.

Zusammenfassung

A) Emails sind ein großartiges Beispiel was in einem offenen ökosystem alles möglich sind und welche möglichkeiten sie einem zum experiementen bieten. Niemand hat sich bei der Erfindung des Protokolls gedacht das sich dieses super auf einem Einhorn Shield einsetzen lassen könnte, trotzdem ist dank der offenen Schnittstellen möglich. B) Das Unicorn Shield ermöglicht es über die einzelnd ansprechbaren LEDs genau solche Daten zu visualiseren.

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!