Jython
Deutsch   English 

17. Datenlogger über Email


Mit den Diensten von IFTTT kann man du über HTTP Emails an eine bestimmte Email-Adresse versenden.

IFTTT zum Versenden von Mails konfigurieren

Um die Diensten von IFTTT zu nutzen, muss man für jede Email-Adresse,an die man eine Email- senden will, ein Konto einrichten. Als Anwendungsbeispiel wird ein Mail verschickt, sobald die  Temperatur, die mit einem Temperatursensor gemessen wird, einen bestimmten Wert überschreitet. Ein IFTTT-Konto richtet man wie folgt ein:

Man geht auf die Seite http://www.iftt.com und gibt die gewünschte Email-Adresse ein.



Man wählt ein Passwort und klickt Sign up.



Man ist jetzt eingeloggt (in diesem Fall als abcxyz_gmail_com). Die Email-Adresse und das Passwort muss man sich merken. Dann klickt man auf die Schaltfläche My Applets, weiter auf New Applet und dort auf + this.


Unter Choose a service schreibt. man das Wort web in die Search-Box und klickt auf die Kachel Webhooks.

  Choose a service

Auf die Kachel Receive a web request klicken



Einen Event Name wählen und Create trigger klicken.



Auf + that und auf die Kachel Email klicken.


Unter Choose action auf Send me an email. wählen

Den weiteren Anweisungen folgen: EMail-Adresse eingeben und den zugesendete PIN eingeben.

Unter Complete action fields das Formular ausfüllen und Create action klicken. Damit legst du den Betreff (Subject) und einen Teil des Inhalts der Mails fest. Man verwendet dabei die Platzhalter {{EventName}} für eine Eventbezeichner (hier overheat) {{OccurredAt}} für die aktuelle Datumzeit und {{Value1}}, {{Value2}} und {{Value3}} für optionale URL-Parameter (siehe später). Man kann auch HTML-Tags verwenden, insbesondere für Umlaute und Accents.


Auf Finish klicken und dann erhält man eine Bestätigung:



Auf die obere Ikone Webhooks und dann auf Settings klicken


Die URL in einen Webbrowser kopieren und es wird ein Key (Schlüssel) sichtbar, den man aufbewahren sollte, da man ihn in im Python-Programm benötigt.


 

Beispiel 1: Ein Email versenden, wenn die Temperatur einen bestimmten Wert überschreitet
Im Programm wird mit dem Sensirion-Sensor die Temperatur gemessen. Falls der Messwert eine bestimmte Grenze übersteigt, wird per EMail eine Alarm-Meldung verschickt. Um dem Mailversand mit IFTTT auszulösen, muss man dem Server http://maker.ifttt.com einen GET-Request mit folgenden Option zusenden:

/trigger/overheat/with/key/{key}value1={value1}&value2={value2}&value3={value3}

wo {key} dein Schlüssel ist und {value1}, {value2}, {value3} die Stringwerte sind, die im Mail an den gleichnamigen Platzhaltern erscheinen sollen (verwende keine Umlaute oder Spezialzeichen oder codiere sie mit URL encoding).

# Datenlogger1.py
from microbit import *
from linkup import *
from mbrobot import *
import sht 

alarmTemp = 28
alarmRearmTemp = 27
host = "maker.ifttt.com"
port = 80
key = "oPn2kQcK5zgWtX_eR4JB6LKAc9xcpN6lm5WRty"
inquiry = "/trigger/overheat/with/key/" + key + "?value1=%d"
Wlan.connect("myssid", "mypassword")
client = HTTPClient()
alarmArmed = True
while True:
    t, h = sht.getValues()
    temp = int(t + 0.5)
    display.scroll(temp)
    if alarmArmed:
        if temp >= alarmTemp:
            print("Triggering alarm")
            alarmArmed = False
            insertBigChar(">", RED)
            client.connect(host, port)
            request = inquiry % temp
            print(request)
            reply = client.sendGetRequest(request)
            print(reply)
            client.closeConnection()
    else:    
       if temp < alarmRearmTemp:
           print("Rearming alarm")
           alarmArmed = True 
           insertBigChar("<", GREEN)
           sleep(100)
► In Zwischenablage kopieren

Erklärungen zum Programmcode:

alarmArmed = True:Das Mail soll nur einmal versendet werden, wenn die Temperatur die Alarmschwelle alarmTemp übersteigt. Daher muss unter Verwendung des Flags alarmArmed den Alarm erst dann wieder aktivieren, wenn die Temperatur unter die Schwelle alarmRearmTemp gesunken ist


Beispiel 2
: Datenlogger durch Versenden eines Emails
Ein automatisches Messsystem soll über längere Zeit  Messungen durchführen und nach einer bestimmten Zeit eine Zusammenfassung der Messwerte als Emaill versenden. Dazu muss der micro:bit die Messdaten als Textzeilen in einer Log-Datei abspeichern, und zwar mit Messzeit und Messwert. Dein Programm nimmt alle 10 Sekunden einen neuen Wert auf und versendet alle 10 Minuten den Inhalt der Log-Datei als Email.

Die Daten werden zeilenweise so in der Datei gespeichert, dass sie leicht lesbar sind, und zwar als hh:mm:ss;temp, wo hh die Stunden, mm die Minuten und ss die Sekunden, sowie temp die gemessene Temperatur sind. Um die Zeilen zu trennen, wird das HTML-Tag <br> verwendet.

#Datenlogger2.py
from microbit import *
from linkup import *
from mbrobot import *
import sht 
import ntptime, utime

def synchTime():
    Wlan.connect(ssid, pwd)
    ntptime.settime()
    Wlan.disconnect()

def sendMail(log): 
    Wlan.connect(ssid, pwd)
    client = HTTPClient()
    client.connect(host, port)
    request = inquiry + log
    print(request)
    reply = client.sendGetRequest(request)
    print(reply)
    client.closeConnection()
    Wlan.disconnect()

ssid = "myssid"
pwd = "mypassword"
host = "maker.ifttt.com"
port = 80
key = "jGKt1Nz6XXRMfJGBhje0_FFWXMecvWkEs5wwSQ"
inquiry = "/trigger/MyLogger/with/key/" + key + "?value1="
synchTime()
logFile = "data.txt"
f = open(logFile, "w") 
ready = True
while True:
    t, h = sht.getValues()
    temp = int(t + 0.5)
    yy, mm, dd, h, m, s, w, b = utime.localtime()
    f.write("%02d:%02d:%02d;%02d<br>" %(h, m, s, temp))
    display.scroll(temp)
    if m % 5 == 0 and ready:
        insertBigChar(">", GREEN)
        ready = False
        f.close()
        f = open(logFile)
        log = f.read()
        sendMail(log)
        f.close()
        f = open(logFile, "w") 
    if m % 5 == 1 and not ready:
        ready = True
    sleep(100)    
► In Zwischenablage kopieren

Erklärungen zum Programmcode:

synchTime(): Beginn wird die interne Clock mit einiem NTP-Zeitserver synchronisiert. Diese Uhr läuft allerdings über längere Zeit nicht sehr genau (sie könnte wieder synchronisiert werden)
yy, mm, dd, h, m, s, w, b = utime.localtime(): Gibt die Datumzeit aus der internen Clock zurück
f.open(logFile, 'w'):Die Log-Datei wird neu erstellt und zum Schreiben geöffnet
f.write("%02d:%02d:%02d;%02d" %(h, m, s, temp)):Es wird eine formatierte Zeile in die Log-Datei geschriebengeöffnet
log = f.read():Der Inhalt der Log-Datei wird in den String log kopiert
f.close():Die Log-Datei wird geschlossen