Zeitschaltuhr problem!

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
alflife
User
Beiträge: 2
Registriert: Samstag 17. April 2021, 13:45

Hi!

Ich versuche grade ein Zeitschaltuhr am Raspberry pi zu bauen um dort einige Dinge mit zu steuern.
Das funktioniert auch soweit wie ich mir das vorstelle bis auf einen endscheidenen Fehler!

so wie mein Code im moment geschrieben ist entsteht das Problem wenn man die Zeitschaltuhr von 21:00:00 Uhr Anschalten - 09:00:00 Uhr Ausschalten kommt es dazu das er nach 00:00:00 Ausschaltet.
hier der code:

Code: Alles auswählen

import mysql.connector
from datetime import datetime as DateTime
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# GPIO Pinbelegung
RELAIS_1_GPIO = 17
RELAIS_2_GPIO = 18
RELAIS_3_GPIO = 27
RELAIS_4_GPIO = 22

# Relaischaltung
GPIO.setup(RELAIS_1_GPIO, GPIO.OUT) # GPIO Modus zuweisen
GPIO.setup(RELAIS_2_GPIO, GPIO.OUT) # GPIO Modus zuweisen
GPIO.setup(RELAIS_3_GPIO, GPIO.OUT) # GPIO Modus zuweisen
GPIO.setup(RELAIS_4_GPIO, GPIO.OUT) # GPIO Modus zuweisen

zeit=DateTime.now().strftime('%H:%M:%S')
db = mysql.connector.connect(host='localhost', database='meineDB', user='user', password='pw')
cursor = db.cursor()
cursor.execute("select * from Zeitschaltuhr")
data = cursor.fetchone()


if data[0] < zeit and zeit < data[1]: # das Problem
	GPIO.output(RELAIS_1_GPIO, GPIO.HIGH) # an steckdose1
	GPIO.output(RELAIS_2_GPIO, GPIO.HIGH) # an steckdose2
	GPIO.output(RELAIS_3_GPIO, GPIO.HIGH) # an steckdose3
	GPIO.output(RELAIS_4_GPIO, GPIO.HIGH) # an steckdose4
	

	print("licht AN")
	print "Aktuelle Uhrzeit: " + zeit
	
else:
	GPIO.output(RELAIS_1_GPIO, GPIO.LOW) # aus steckdose1
	GPIO.output(RELAIS_2_GPIO, GPIO.LOW) # aus steckdose2
	GPIO.output(RELAIS_3_GPIO, GPIO.LOW) # aus steckdose3
	GPIO.output(RELAIS_4_GPIO, GPIO.LOW) # aus steckdose4
	print("licht AUS")
	print "Aktuelle Uhrzeit: " + zeit
	


	# Ende der Verarbeitung
cursor.close()
# Abmelden
db.disconnect()
wahrscheinlich ist die Lösung simple aber ich habe grade ein Brett vorm Kopf.

danke für die Hilfe

fG
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze kein Python2 mehr, das ist veraltet. Verwende python3.

`as` ist zum Umbenennen da. Bei datetime machst Du das ja, bei GPIO aber nicht. Was soll also das `as` da?

Warnungen sind dazu da, dass man die Ursache behebt, nicht dass man sie einfach ignoriert.
Statt mit Strings solltest Du mit Time-Objekten arbeiten, sowohl in Python als auch in der Datenbank.
Apropos Datenbank. Eine Tabelle mit nur einem einzigen Eintrag ist etwas übertrieben.
Benutze keine *-Selects, weil das den Code schwer lesbar und schlecht wartbar macht.

Code: Alles auswählen

from contextlib import closing
from datetime import datetime as DateTime
import mysql.connector
from RPi import GPIO


RELAIS_GPIOS = [17, 18, 27, 22]

def initalize():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(RELAIS_GPIOS, GPIO.OUT)

def read_times():
    db = mysql.connector.connect(host='localhost', database='meineDB', user='user', password='pw')
    with closing(db.cursor()) as cursor:
        cursor.execute("select von, bis from Zeitschaltuhr")
        von, bis = cursor.fetchone()
    db.disconnect()
    return von, bis

def main():
    try:
        initalize()
        zeit = DateTime.now().time()
        print(f"Aktuelle Uhrzeit: {zeit}")
        von, bis = read_times()

        if von <= zeit < bis:
            output = GPIO.HIGH
            print("licht AN")
        else:
            output = GPIO.LOW
            print("licht AUS")

        GPIO.output(RELAIS_GPIOS, output)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Und zum eigentlichen Problem. Wenn `von` größer ist als `bis` dann mußt Du die Bedingung einfach aufspalten: von <= zeit or zeit < bis.
alflife
User
Beiträge: 2
Registriert: Samstag 17. April 2021, 13:45

Danke das war sehr Lehrreich und hat auch funktioniert.
ich bin grade dabei Python zu lernen aber Tutorials sind nicht so mein ding ,das erklärt warum ich einige dinge gemacht habe die du angesprochen hast.

fG
Antworten