Emails als sms text verschicken

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • HI
    ich habe das Script unten benutzt, funktioniert, email wird verschickt.
    Ich hätte gerne das mir eine Datei in den Outgoing Ordner meines smstools kopiert wird, damit eine SMS mit den Temperaturen verschickt wird, die nicht ok sind

    Hoffe Ihr könnt mir helfen, bin kein Softwerkler

    [code=php]
    #!/usr/bin/python

    import os
    import sys
    import smtplib
    from email.mime.text import MIMEText

    verbose_level = 2
    dead_hi = -0.02
    dead_lo = -0.20
    debug_level = 0
    error_temp = -999


    # dictionary with for 1-wire sensors: [sensor name] [1-Wire device]
    sensor_dict = { 'Vorn_Oben':'28-000004c4dfe0',
    'Vorn_Unten':'28-000004e0a730',
    'Hinten_Oben':'28-000004e0b498',
    'Hinten_Unten':'28-000004e10f1c',
    'Erde':'28-000004e0f4c2'
    }

    #---------------------------------------------------------------------------------------------
    def read_sensor(Sensor):

    if verbose_level > 2:
    print "1++++ read_sensor()"
    print "sensor:" , Sensor
    if debug_level == 0:
    # get 1-Wire id from dictionary
    sensor_slave = str(sensor_dict.get(Sensor))
    # Open 1-wire slave file
    sensor_device = '/sys/bus/w1/devices/' + str(sensor_slave) + '/w1_slave'
    if verbose_level > 2:
    print "open: ", sensor_device
    try:
    file = open(sensor_device)
    filecontent = file.read() # Read content from 1-wire slave file
    file.close() # Close 1-wire slave file
    stringvalue = filecontent.split("\n")[1].split(" ")[9] # Extract temperature string
    if stringvalue[0].find("YES") > 0:
    temp = error_temp
    else:
    temp = float(stringvalue[2:]) / 1000 # Convert temperature value
    # temp=str(temp)
    except IOError:
    print "PANIC read_sensor - Cannot find file >" + sensor_slave + "< in /sys/bus/w1/devices/"
    print "No sensor attached"
    print "check with > cat /sys/devices/w1_bus_master1/w1_master_slaves"
    temp=("Sensor not attached")

    return(temp) # exit function read_sensor

    #---------------------------------------------------------------------------------------------
    def control_sensor(Sensor,alarm_hi,alarm_lo):
    cur_temp = read_sensor(Sensor)
    print "Aktuelle Temperatur:", cur_temp, "/ Alarm High:", alarm_hi, "/ Alarm Low:", alarm_lo

    if cur_temp >= dead_lo and cur_temp <= dead_hi or cur_temp == error_temp:
    print "read error - CRC = NO"
    else:
    if (cur_temp > alarm_hi) or (cur_temp < alarm_lo):
    emailtext = "Sensor: " + Sensor + " / Die Temperatur betraegt: " + str(cur_temp) + " Grad Celsius"
    msg = MIMEText(emailtext)
    msg['Subject'] = 'Temperatur Alarm'
    msg['From'] = 'ABSENDER'
    #msg['From'] = mail_from
    msg['To'] = 'EMPFÄNGER'
    #msg['To'] = mail_to

    s = smtplib.SMTP('smtp.gmail.com:587')
    #s = smtplib.SMTP(mail_smtp)

    s.starttls()
    s.login('ABSENDER','PASSWORT')
    #s.login(mail_from,mail_from_pass)
    s.sendmail('EMPFÄNGER',['EMPFÄNGER'], msg.as_string())
    #s.sendmail(mail_to,[mail_to], msg.as_string())
    s.quit()
    else:
    print "o.k."
    return; # exit function control_sensor
    #---------------------------------------------------------------------------------------------

    if __name__ == "__main__":
    ### /etc/profile Umgebungsvariable festlegen
    mail_from = os.getenv("MAIL-FROM")
    mail_from_pass = os.getenv("MAIL-FROM-PASS")
    mail_to = os.getenv("MAIL-TO")
    mail_smtp = os.getenv("MAIL-SMTP")

    ### Sensor Kontrollfunktion fuer jeden aufrufen 1. Parameter = Alarm Hoechstwert 2. Parameter = Alarm Niedrigwert
    control_sensor("Vorn_Oben",50.0,3.5)
    control_sensor("Vorn_Unten",50.0,3.5)
    control_sensor("Hinten_Oben",50.0,3.5)
    control_sensor("Hinten_Unten",50.0,3.5)
    control_sensor("Erde",50.0,3.5)
    sys.exit(0)
    [/php]

  • Ich habe ja das smstolls installiert, der Ordner ist in /var/spool/sms/Outgoing

    Ich frag mich grad ob ich nicht ein extra Script verwenden soll, indem das gleiche geschieht, nur nicht als email versendet wird, sondern als sms
    Was meint Uhr, wäre das besser?

    • Offizieller Beitrag

    ungefähr so
    [code=php]
    def control_sensor(Sensor,alarm_hi,alarm_lo):
    cur_temp = read_sensor(Sensor)
    print "Aktuelle Temperatur:", cur_temp, "/ Alarm High:", alarm_hi, "/ Alarm Low:", alarm_lo

    if cur_temp >= dead_lo and cur_temp <= dead_hi or cur_temp == error_temp:
    print "read error - CRC = NO"
    else:
    if (cur_temp > alarm_hi) or (cur_temp < alarm_lo):
    emailtext = "Sensor: " + Sensor + " / Die Temperatur betraegt: " + str(cur_temp) + " Grad Celsius"
    msg = MIMEText(emailtext)
    msg['Subject'] = 'Temperatur Alarm'
    msg['From'] = 'ABSENDER'
    #msg['From'] = mail_from
    msg['To'] = 'EMPFÄNGER'
    #msg['To'] = mail_to

    s = smtplib.SMTP('smtp.gmail.com:587')
    #s = smtplib.SMTP(mail_smtp)

    s.starttls()
    s.login('ABSENDER','PASSWORT')
    #s.login(mail_from,mail_from_pass)
    s.sendmail('EMPFÄNGER',['EMPFÄNGER'], msg.as_string())
    #s.sendmail(mail_to,[mail_to], msg.as_string())
    s.quit()
    #Datei namens sms.txt in /var/var/spool/sms/Outgoing erstellen
    with open("/var/spool/sms/Outgoing/sms.txt","w") as f:
    f.write("Sensor: %s / Die Temperatur betraegt: %s Grad Celsius" %(Sensor, str(cur_temp)))
    else:
    print "o.k."
    return; # exit function control_sensor[/php]

  • Kann ich das To: MOBILNUMMER mit aufnehmen, wie unten?

    with open("/var/spool/sms/Outgoing/sms.txt","w") as f:
    f.write("To: MOBILNUMMER / Sensor: %s / Die Temperatur betraegt: %s Grad Celsius" %(Sensor, str(cur_temp)))

  • Da bekomme ich eine Fehlermeldung

    File "alarm.py" , line 82
    with open ("var/spool/sms/Outgoing/sms.txt","w") as f:

    IndentationError: unindent does not match any outer indentation level

    Hab das file mit sudo gestartet

    • Offizieller Beitrag

    Da stimmt deine Einrückung nicht, muss genau unter dem s.quit() stehen, die write zeile dann eine Einrückung weiter innen. Wie bist du denn soweit gekommen ohne einmal auf diesen Fehler zu stossen? :denker:

  • Yep jetzt komme ich etwas weiter, nur es geht noch nicht

    pi@raspberrypi ~/temp $ sudo python alarm.py
    Aktuelle Temperatur: 55.75 / Alarm High: 29.0 / Alarm Low: 3.5
    Traceback (most recent call last):
    File "alarm.py", line 97, in <module>
    control_sensor("G1",29.0,3.5)
    File "alarm.py", line 82, in control_sensor
    with open ("/var/spool/sms/Outgoing/sms.txt","w") as f:
    IOError: [Errno 2] No such file or directory: '/var/spool/sms/Outgoing/sms.txt'
    pi@raspberrypi ~/temp $

    Hier nochmal mein Script
    [code=php]
    #!/usr/bin/python

    import os
    import sys
    import smtplib
    from email.mime.text import MIMEText

    verbose_level = 2
    dead_hi = -0.02
    dead_lo = -0.20
    debug_level = 0
    error_temp = -999


    # dictionary with for 1-wire sensors: [sensor name] [1-Wire device]
    sensor_dict = { 'G1':'28-01146530dbff',
    'G2':'28-0114657640ff',
    'G3':'28-0114658046ff',
    'G4':'28-0114653517ff',
    'G5':'28-0114652d46ff'
    }

    #---------------------------------------------------------------------------------------------
    def read_sensor(Sensor):

    if verbose_level > 2:
    print "1++++ read_sensor()"
    print "sensor:" , Sensor
    if debug_level == 0:
    # get 1-Wire id from dictionary
    sensor_slave = str(sensor_dict.get(Sensor))
    # Open 1-wire slave file
    sensor_device = '/sys/bus/w1/devices/' + str(sensor_slave) + '/w1_slave'
    if verbose_level > 2:
    print "open: ", sensor_device
    try:
    file = open(sensor_device)
    filecontent = file.read() # Read content from 1-wire slave file
    file.close() # Close 1-wire slave file
    stringvalue = filecontent.split("\n")[1].split(" ")[9] # Extract temperature string
    if stringvalue[0].find("YES") > 0:
    temp = error_temp
    else:
    temp = float(stringvalue[2:]) / 1000 # Convert temperature value
    # temp=str(temp)
    except IOError:
    print "PANIC read_sensor - Cannot find file >" + sensor_slave + "< in /sys/bus/w1/devices/"
    print "No sensor attached"
    print "check with > cat /sys/devices/w1_bus_master1/w1_master_slaves"
    temp=("Sensor not attached")

    return(temp) # exit function read_sensor

    #---------------------------------------------------------------------------------------------
    def control_sensor(Sensor,alarm_hi,alarm_lo):
    cur_temp = read_sensor(Sensor)
    print "Aktuelle Temperatur:", cur_temp, "/ Alarm High:", alarm_hi, "/ Alarm Low:", alarm_lo

    if cur_temp >= dead_lo and cur_temp <= dead_hi or cur_temp == error_temp:
    print "read error - CRC = NO"
    else:
    if (cur_temp > alarm_hi) or (cur_temp < alarm_lo):
    emailtext = "Sensor: " + Sensor + " / Die Temperatur betraegt: " + str(cur_temp) + " Grad Celsius"
    msg = MIMEText(emailtext)
    msg['Subject'] = 'Temperatur Alarm'
    msg['From'] = 'XXX@gmail.com'
    #msg['From'] = mail_from
    msg['To'] = 'XXX@t-online.de'
    #msg['To'] = mail_to

    s = smtplib.SMTP('smtp.gmail.com:587')
    #s = smtplib.SMTP(mail_smtp)

    s.starttls()
    s.login('XXX@gmail.com','PASSWORD')
    #s.login(mail_from,mail_from_pass)
    s.sendmail('XXX@t-online.de',['XXX@t-online.de'], msg.as_string())
    #s.sendmail(mail_to,[mail_to], msg.as_string())
    s.quit()
    #Datei namens sms.txt in /var/spool/sms/outgoing erstellen
    with open ("/var/spool/sms/Outgoing/sms.txt","w") as f:
    f.write ("To: 0049170xxxxxxx / Sensor: %s / Temperatur ist/ %s Celsius" %(Sensor, str(cur_temp)))
    else:
    print "o.k."
    return; # exit function control_sensor
    #---------------------------------------------------------------------------------------------

    if __name__ == "__main__":
    ### /etc/profile Umgebungsvariable festlegen
    mail_from = os.getenv("MAIL-FROM")
    mail_from_pass = os.getenv("MAIL-FROM-PASS")
    mail_to = os.getenv("MAIL-TO")
    mail_smtp = os.getenv("MAIL-SMTP")

    ### Sensor Kontrollfunktion fuer jeden aufrufen 1. Parameter = Alarm Hoechstwert 2. Parameter = Alarm Niedrigwert
    control_sensor("G1",29.0,3.5)
    control_sensor("G2",20.0,3.5)
    control_sensor("G3",45.0,3.5)
    control_sensor("G4",35.0,3.5)
    control_sensor("G5",38.0,3.5)
    sys.exit(0)
    [/php]

  • Ja ich starte das Script mit sudo
    Es funktioniert auch soweit, Email ist ok, alle Werte die nicht OK sind werden mittels Email verschickt, jeder Wert einzeln, schöner wäre alle in einem Email.

    Bei der SMS stimmt die Syntax der SMS noch nicht, die Datei sollte so aussehen

    To: MOBILNUMMER

    HIER DER TEXT

    Der Text der SMS sollte dann alle nicht OK Werte einthalten
    Jetzt steht immer nur der letzte nicht OK Wert drin

    Evtl könnt Ihr mir nochmal helfen, danke

    • Offizieller Beitrag

    Du rufst die Funktion ja 1x pro sensor auf. Dementsprechend generiert er eine Mail pro Sensor. Du willst jetzt eine Mail mit allen Sensoren die ausserhalb der Spec sind?
    Dann musst die Funktion einmal aufrufen und alle Sensore + Warnschwellen als Liste/Tupel übergeben. Die Prüfung machen, alle alarmierten Sensoren + Temps in ne Liste/Dict schreiben und aus diesem dann deine Mail/SMS generieren

    So sollte das Design passen "\n" ist ein Zeilenumbruch.
    [code=php] f.write ("To: 0049170xxxxxxx\n\nSensor: %s / Temperatur ist/ %s Celsius" %(Sensor, str(cur_temp)))[/php]

  • Hi
    ich hab gestern den ganzen Tag damit verbracht mir das reinzuziehen und muß feststellen das ich noch weit entfernt bin vom Guru, wie Ihr es seid.

    Da ich Euch auch nicht mehr damit nerven will, werde ich heute nochmal einen versuch starten
    die Funktion nur einmal ausführen zu lassen
    und zum anderen dann nur eine email bzw sms rauszuschicken

    Drückt mir mal die Daumen, danke

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!