Zeit und string Raspberry Pi

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Shurdel
User
Beiträge: 4
Registriert: Donnerstag 20. Juli 2017, 18:50

Also mein Problem liegt in der 30. Zeile... ich möchte das, wenn der "timestamp" zwischen 10 und 21 liegt Licht gechekt wird usw. aber so wie ich mir das gedacht habe geht es wohl nicht und der Pi springt direkt zum else :? . Wenn ich den Wert so wie in Zeile 1 in der Zweiten Codebox direkt reinschreibe, funktioniert alles wie ich will.
Wie bekomme ich nun eine brauchbare Stunde an die Stelle? Also das print unter dem timestamp = time.strftime("%H") , sagt bei mir z.B. 19, warum wird der wert in der Zeile 30 nicht benutzt?


Code: Alles auswählen

SETTINGS = {
    "LIGHT_GPIO":       17,                     # GPIO Number (BCM) for the Relay
    "LIGHT_FROM":       10,                     # from which time the light can be turned on (hour)
    "LIGHT_UNTIL":      21,                     # until which time (hour)
    "LIGHT_CHANNEL":    0,                      # of MCP3008
    "LIGHT_THRESHOLD":  500,                    # if the analog Threshold is below any of those, the light will turn on
    "DHT_GPIO":         27,                     # GPIO Number (BCM) of the DHT Sensor
    "DHT_SENSOR":       Adafruit_DHT.DHT11,     # DHT11 or DHT22
    "TEMP_THRESHOLD":   23.0,                   # in Celcius. Above this value, the window will be opened by the servo
    "MOTOR_GPIO+":       14,                    # GPIO Number (BCM), which opens the window
    "MOTOR_GPIO-":       15,                    # GPIO Number (BCM), which closes the window
    "ENDSTOP":           23,                    # GPIO Number of Endstop input
    "PLANTS": [
        {
            "NAME":                 "Plant1",
            "MOISTURE_CHANNELS":    [6],        # of MCP3008
            "MOISTURE_THRESHOLD":   450,        # if the average analog value of all sensors is above of this threshold, the Pump will turn on
            "WATER_PUMP_GPIO":      18,         # GPIO Number (BCM) for the Relais
            "WATERING_TIME":        10,         # Seconds, how long the pump should be turned on
        },
    ]
}


def checkLight():
    timestamp = time.strftime("%H")
    print timestamp


    if SETTINGS["LIGHT_FROM"] <=  timestamp <= SETTINGS["LIGHT_UNTIL"]:
        # check light sensors
        print "check"
        adc = MCP3008()
        # read 10 times to avoid measuring errors
        value = 0
        for i in range(10):
            value += adc.read( channel = SETTINGS["LIGHT_CHANNEL"] )
        value /= 10.0
        print value

        if value <= SETTINGS["LIGHT_THRESHOLD"]:
            # turn light on
            GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.LOW) # Relay LOW = ON
        else:
            # turn light off
            GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.HIGH)
    else:
        print "off"
        # turn light off
        GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.HIGH)

usw...

Code: Alles auswählen

  if SETTINGS["LIGHT_FROM"] <=  15 <= SETTINGS["LIGHT_UNTIL"]:
        # check light sensors
        print "check"
        adc = MCP3008()
        # read 10 times to avoid measuring errors
        value = 0
        for i in range(10):
            value += adc.read( channel = SETTINGS["LIGHT_CHANNEL"] )
        value /= 10.0
        print value

        if value <= SETTINGS["LIGHT_THRESHOLD"]:
            # turn light on
            GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.LOW) # Relay LOW = ON
        else:
            # turn light off
            GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.HIGH)
    else:
        print "off"
        # turn light off
        GPIO.setup(SETTINGS["LIGHT_GPIO"], GPIO.OUT, initial=GPIO.HIGH)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Weil bei Dir timestamp ein String ist und kein Wert, den man einfach wie einen int-Wert mit <= vergleichen könnte. Könntest ihn höchstens vorher wandeln.

Code: Alles auswählen

import time

timestamp = time.strftime("%H")
print(timestamp)        # 20
print(type(timestamp))  # <class 'str'>

Code: Alles auswählen

import time

timestamp = time.strftime("%H")
print(timestamp)             # 20
print(type(timestamp))       # <class 'str'>
print(type(int(timestamp)))  # <class 'int'>
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Melewo: statt die Zeit in einen String und dann wieder in eine Zahl umzuwandeln, sollte man direkt den passenden Datentyp für Zeiten verwenden, ›datetime.time‹, dann kann man auch bei Bedarf Sekundengenaue Zeiten angeben.

@Shurdel: die aktuelle Zeit bekommst Du mit datetime.datetime.now().time(). Statt dreimal im Code das Licht an oder auszuschalten solltest Du ein Flag setzen und den Ausgang nur einmal damit ansteuern.
Shurdel
User
Beiträge: 4
Registriert: Donnerstag 20. Juli 2017, 18:50

Wenn ich den Int jetzt so in einen String umwandele, warum kann ich ihn dann noch nicht so vergleichen, mir geht es gar nicht um das print:)

Code: Alles auswählen

import time

def checkLight():
    timestamp = time.strftime("%H")

    str_timestamp = str(timestamp)
    print str_timestamp                      # 21

    if SETTINGS["LIGHT_FROM"] <= str_timestamp  <= SETTINGS["LIGHT_UNTIL"]:       #Wie vergleichen so ja nicht...
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Shurdel: `timestamp` ist schon ein String, das erneute Umwandeln bewirkt also gar nichts. Zum Vergleichen von Zeiten nimm den passenden Datentype datetime.time!
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Shurdel hat geschrieben:Wenn ich den Int jetzt so in einen String umwandele, warum kann ich ihn dann noch nicht so vergleichen,
Weil ein String ein String ist und z.B. aus Buchstaben und sonstigen Satzzeichen bestehen könnte, jedoch nicht aus Zahlen, denn die sind innerhalb eines Strings auch nur String-Literale. 20 ist da praktisch genauso lang wie 10, da jeweils nur aus zwei Literalen gebildet. Du möchtest aber mit ganzen Zahlen, also mit Integer-Werten rechnen und vergleichen.
Shurdel
User
Beiträge: 4
Registriert: Donnerstag 20. Juli 2017, 18:50

@Sirius3 Achso ja ich hatte vorhin deine Antwort noch nicht gesehen. Da ich jetzt kein Elan habe mir die Flags anzuschauen, würde ich aus dem datetime, das ja bis Millisekunden ausgibt, nur die stunde raus bekommen wollen. Aus dem https://docs.python.org/2/library/datetime.html bin ich jetzt noch nicht richtig schlau geworden wie...
Shurdel
User
Beiträge: 4
Registriert: Donnerstag 20. Juli 2017, 18:50

OH GOOOT ja ok ich habe str und int verwechselt läuft Danke :D
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Musste ich erst einmal ausprobieren, wie das mit datetime geschrieben wird.

Code: Alles auswählen

from datetime import datetime

stunde = datetime.now()

print(stunde.hour)         # 12
print(type(stunde.hour))   # <class 'int'>
BlackJack

@Melewo: Wobei `stunde` als Name falsch ist — es ist ja bedeutend mehr als nur die Stunde die in diesem Wert enthalten ist. :-)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Ja, hatte anfänglich überlegt ob Stunden als Bezeichner zutreffender wäre, doch dann dachte ich mir, dass er lieber wissen möchte, ob die richtige Stunde geschlagen hat. Aber ja, es ist mehr enthalten.
Antworten