Jython

17. Datenlogger


Mit den Diensten von IFTTT kann man du über HTTP Emails an eine bestimmte Email-Adresse versenden. Insbesondere kann man auch über längere Zeit  Messungen durchführen und nach einer bestimmten Zeit eine Zusammenfassung der Messwerte dir als Mail zusenden.

IFTTT konfigurieren

Um die Diensten von IFTTT zu nutzen, muss man für die Email-Adresse,an die man die Email-Benachrichtigungen erhalten soll, ein Konto einrichten. Als Anwendungsbeispiel soll ein Mail verschickt werden, sobald ein bestimmter Temperaturwert überschritten wird. 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, wieter auf New Applet und dort auf + this.


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

  Choose a service

und Connect klicken

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.

Connect

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 aus 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 einen optionalen 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 beim Temperaturanstieg senden

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 (keine Umlaute oder Spezialzeichen verwenden).

# Datenlogger1.py
from microbit import *
from linkup import *
from mbrobot import *
from sht31 import SHT31

alarmTemp = 28
alarmRearmTemp = 27
sht = SHT31()
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 man den Alarm mit dem Flag alarmArmed erst dann wieder aktivieren, wenn die Temperatur unter die Schwelle alarmRearmTemp sinkt.


Beispiel 2
: Mehrere Messwerte als EMail zusenden

Ein automatisches Messsystem soll über längere Zeit  Messungen durchführen und nach einer bestimmten Zeit eine Zusammenfassung der Messwerte dir als Mail zusenden. Dazu muss der ESP32 die Messdaten in einer Log-Datei abspeichern, und zwar mit Messzeit und Messwert. Dein Programm nimmt alle 10 Sekunden einen neuer Wert auf und versendet alle 10 Minuten die Messwerte als Mail.

Die Daten werden so in der Datei gespeichert, dass sie als Mail zeilenweise 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 *
from sht31 import SHT31
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="
sht = SHT31()
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(): Zu Berginn wird die interne Clock mit einiem NTP-Zeitserver synchronisiert. Diese Uhr läuft allerdings über längere Zeit nicht sehr genau
yy, mm, dd, h, m, s, w, b = utime.localtime(): Man holt Datumzeit aus der internen Clock
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 geschrieben
f.close(): Die Log-Datei wird geschlossen