email

22. EMAILS VERSENDEN - DATENLOGGER

 

 

DU LERNST HIER...

 

wie du mit der Oxocard programmgesteuert Emails mit aktuellen Daten versenden kannst. Dies ist besonders interessant, um bei bestimmten Messergebnissen Alarme auszulösen und gesammelte Messdaten zu übertragen.

 

 

IFTTT KONFIGURIEREN

 

Mit den Diensten von IFTTT kannst du über das Internet Emails an eine bestimmte Email-Adresse versenden, für die du ein Konto eingerichtet hast. Als Anwendungsbeispiel willst du selbst ein Mail erhalten, sobald die mit einem Sensor gemessene Temperatur einen bestimmten Grenzwert überschreitet.
Konfiguriere dazu IFTTT wie folgt:

Gehe auf die Seite http://www.iftt.com und gib die gewünschte Email-Adresse ein.



Wähle ein Passwort und klicke Sign up.



Du bist nun eingeloggt (in diesem Fall als abcxyz_gmail_com). Merke dir die Email-Adresse und das Passwort. Klicke auf die Schaltfläche My Applets, dann auf New Applet und dort auf + this.


Unter Choose a service schreibe in die Search-Box das Wort web und klicke auf die Kachel Webhooks.

  Choose a service

Klicke auf die Kachel Receive a web request.



Wähle einen Event Name und klicke Create trigger.



Klicke auf + that und klicke auf die Kachel Email.


Unter Choose action, klicke auf Send me an email.


Unter Complete action fields fülle das Formular aus und klicke Create action. Damit legst du den Betreff (Subject) und einen Teil des Inhalts der Mails fest. Du verwendest 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). Du kannst auch HTML-Tags verwenden, insbesondere für Umlaute und Accents.


Klicke Finish und du erhältst eine Bestätigung:



Klicke auf die obere Ikone Webhooks und dann auf Settings.


Kopiere die URL in einen Webbrowser und es wird ein Key (Schlüssel) sichtbar, den du aufbewahren solltest, da du ihn in deinem Python-Programm benötigst.


 

 

MUSTERBEISPIEL

 

In deinem Programm misst du mit dem Sensirion-Sensor die Temperatur. Du kannst aber auch irgendeinen anderen Sensor verwenden oder sogar die Messung simulieren. Um dem Mailversand mit IFTTT auszulösen, musst du 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. (Als String sollten diese URL-codiert sein. Falls du keine Umlaute oder Spezialzeichen verwendest, ist keine Codierung nötig.)

Beachte, dass du das Mail nur einmal versenden willst, wenn die Temperatur die Alarmschwelle alarmTemp übersteigt. Daher musst du den Alarm mit dem Flag alarmArmed erst dann wieder aktivieren, wenn die Temperatur unter die Schwelle alarmRearmTemp sinkt.

Programm:

from tcpcom import *
from sht31 import SHT31
from oxocard import *

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.get_temp_humi()
    temp = int(t + 0.5)
    display(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(3)
► In Zwischenablage kopieren

Zur Demonstration werden der Request und der Reply des Servers auf der Konsole ausgeschrieben. Nach einigen Minuten kannst du in deiner Inbox ein Mail abholen.

 

 

MERKE DIR...

 

Um über HTTP Mails zu versenden, erstellst du ein Konto auf einem Gateway-Server und sendest diesem einen HTTP GET-Request.

Analog könntest du vorgehen, um SMS zu versenden. Dazu benötigst du allerdings einen kostenpflichtigen HTTP-SMS Gateway, beispielsweise www.ecall.ch oder www.lox24.eu. Du musst mit Kosten von 5 Cents/Rappen pro SMS rechnen.

 

 

ZUM SELBST LÖSEN

 

 

1.

Versende ein Mail mit entsprechendem Betreff und Inhalt, wenn du auf der Oxocard einen bestimmten Button klickst.

 

 

 

 

ZUSATZSTOFF: DATENLOGGER

 

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 die Oxocard 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. Als Zeilentrenner wird das HTML-Tag <br> verwendet.

Programm:

from tcpcom import *
from sht31 import SHT31
import ntptime, utime
from oxocard import *

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.get_temp_humi()
    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(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(10)    
► In Zwischenablage kopieren


 

Du kannst nun aus dem erhaltenen Mail die Datenzeilen herauskopieren und beispielsweise mit einem Grafikprogramm, z.B. mit Excel, darstellen.