Hilfe beim Script

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tomrossi
User
Beiträge: 4
Registriert: Samstag 16. Mai 2015, 11:18

Hallo
ich habe jetzt einen Tag lang versucht mit Liste bzw Tupel zu arbeiten bzw in mein Script einzubinden.
Hoffe Ihr könnt mir hier weiterhelfen

Problem bei meinem Script ist, das mein Raspberry ein SMS versenden soll, das Script finktioniert soweit auch er schickt für jeden Temperatursensor eine Email und eine SMS.
Das Script läuft also in einer Schleife alle Sensoren surch und schickt dann Email und SMS, was natürlich blöd ist, es sollte so sein, das er nur die Sensorwerte schickt die nicht OK sind.
Ich muß noch erwähnen das ich ein totaler Anfänger bin und mir das Script aus einem anderen Forum zurechtgestrickt habe, aber jetzt steh ich am Schlauch.
Bitte helft mir, mein Ziel wäre es wenn Ihr noch Zeit findet mir es auch näher zu bringen, der Weg ist das Ziel

Code: Alles auswählen

#!/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) 

Grüsse Thomas
BlackJack

@tomrossi: Das kompiliert nicht weil die Einrückung kaputt ist. Die sollte zudem vier Leerzeichen pro Ebene betragen und nicht drei.

Das Problem an sich habe ich jetzt noch nicht verstanden, Mail und SMS werden doch nur versandt wenn der Wert ausserhalb der Alarmwerte liegt‽ Also wenn man das Anfangs angesprochene Syntaxproblem behoben hat.

Edit: Ein Hinweis auf den Style Guide for Python Code schadet an dieser Stelle sicherlich auch nicht.
tomrossi
User
Beiträge: 4
Registriert: Samstag 16. Mai 2015, 11:18

Ich denke ich habs behoben

Code: Alles auswählen

#!/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 ("Sensor:",Sensor, "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'] = 'txxx@gmail.com'
            #msg['From'] = mail_from
            msg['To'] = 'tXXX@XXne.de'
            #msg['To'] = mail_to

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

            s.starttls()
            s.login('txxx@gmail.com','xxxxx')
            #s.login(mail_from,mail_from_pass)
            s.sendmail('txxxxr@xxxx.de',['xxxxxr@xxxxx.de'], msg.as_string())
            #s.sendmail(mail_to,[mail_to], msg.as_string())
            s.quit()
#File with name sms.txt in /var/spool/sms/outgoing
        with open ("/var/spool/sms/outgoing/sms.txt","w") as f:
            f.write ("To: 0049xxxxxx\n\nSensor: %s / hat/ %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)

Stimmt schon, das Script funktioniert ja so auch, nur mal angenommen es stimmen 2 Werte ausserhalb der Alarmwerte werden jetzt 2 sms bzw 2 email losgeschickt, ich hätte gerne, das nur eine sms bzw email rausgeschickt werden mit den 2 Werten die ausserhalb sind.
Ich weiß ja das ich das Script so ändern muß das alle Werte in erst mal gesammelt werden dann erst übergeben werden an zB die sms.txt
Aber ich brech mir noch einen ab, ich versuchs schon zu lange und komme nicht drauf
BlackJack

@tomrossi: Wie kommst Du darauf das Du es behoben hast und warum *denkst* Du das nur? Der Compiler dürfte mit *der* Einrückung immer noch Probleme haben. Zu``with`` gibt es keinen ``else``-Zweig. Programmieren funktioniert nicht in dem man Code aus fremden Programmen zusammenstückelt ohne wirklich zu wissen was man tut und dann anfängt wild herum zu raten wenn es nicht läuft.

In dem Zusammenhang frage ich mich auch was jetzt die ganzen Klammern bei der ``print``-Anweisung sollen. Wenn das vorher mal lief (ohne die SMS-Geschichte) dann war das Python 2 und dann ist das jetzt falsch. Was einem auch sofort aufgefallen wäre wenn man es mal hätte laufen lassen. In Python 3 würde man auch mit dem speziellen Rückgabewert (Zeichenkette) wenn der Sensor nicht gelesen werden konnte beim Vergleichen mit Zahlen Probleme bekommen.

Edit: Teil das auf mehr Funktionen auf die nur eine Sache tun. Eine Prüfmethode sollte Prüfen und nicht auch noch E-Mails und SMS verschicken. Insgesamt gehört die Benutzerinteraktion, also Informieren über ``print`` und im weiteren Sinne auch E-Mail und SMS von der restlichen Programmlogik getrennt. Denn dann kann man eine Prüffunktion auch zum Ausfiltern von mehreren Werten verwenden *bevor* man das Gesamtergebnis weiterverarbeitet, also ausgibt und/oder verschickt.
Antworten