Tkinter Slider / Scaler

Fragen zu Tkinter.
Antworten
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo alle zusammen,
ich bin absoluter Anfänger ( kurz vor der Rente) im Bereich der Programmierung.
Ich möchte nicht, dass jemand die „arbeit“ für mich macht, würde mich also über Anregungen, Richtigstellungen und das evtl . aufzeigen eines Weges freuen.
So, nun mein Problem:
Ich möchte eine Beregnungsanlage für mein Grundstück realisieren. Ich habe mich für eine GUI entschieden und diese mit Tkinter erstellt. Leider schaffe ich es nicht, den Slider so zu programmieren, dass er den letzten Stand bei einem Neustart des Scrip´s wieder herstellt.
Also Slider auf 5 gestellt ist jetzt nach Neustart 0 soll aber 5 sein.
Danke im voraus!


from tkinter import*
from tkinter import ttk
import time

master = Tk()
master.title(" Test Slider ")
erka1=IntVar()

#das ist die erste Spalte==column=0

frame1=Frame(master, width=200, height=150, background="#030303")
frame1.grid(row=0, column=0, padx=3, pady=3)
frame2=Frame(master, width=160, height=115, background="#ffffff")
frame2.grid(row=0, column=0, padx=3, pady=3)

#ab hier ist es die zweite Spalte==column=1
frame9=Frame(master, width=5, height=150, background="Grey")
frame9.grid(row=0, column=1, padx=3, pady=3)

w1 = Label(master, textvariable=erka1, font = "Helvetica 47 bold italic", bg="#ffffff",).grid(row=0, column=0, pady=4, padx = 4,) # text im linken oberen feld

#ab hier ist es die dritte Spalte==column=2

frame1=Frame(master, width=400, height=150, background="#030303") # schwarz
frame1.grid(row=0, column=2, padx=4, pady=4)
S1 = Scale(master, from_=0, to=10, bg="#030303", resolution=1, orient=HORIZONTAL, length=380,
width=40, sliderlength=40, showvalue=0, label=" Magnetventil 1",
font = "Helvetica 30 bold italic", fg = "#ffff00", variable=erka1,) #schwarz
S1.grid(row=0, column=2, padx=3, pady=3,)

mainloop() # danach keine Elemente mehr setzen
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo RainerK,

woher soll dein Script denn wissen, wo Du vorher den Slider hingeschoben hast?
Womit steuerst Du dein Ventil? Raspberry Pi?
Vielleicht gibts in deiner "Steuerung" eine Möglichkeit die Sliderposition zu speichern und bei einem Neustart einzulesen?
Oder Du speicherst den Wert in einer Datei.

Für das nächste Mal, setze deinen Code in die Code Tags </>
und vermeide die Sternchenimporte., importiere tkinter as tk, das sieht dann so aus:

Code: Alles auswählen

import tkinter as tk
.......
frame1=tk.Frame(master, width=200, height=150, background="#030303")
Gruss
Peter
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo Peter,
danke für die schnelle Antwort. Ja, ich glaube die gegebenen Informationen waren zu spärlich das jemand der nicht in „meinen Gedanken“ ist damit wirklich was anfangen kann.
Will ich ab jetzt besser machen.
Historie: im Moment arbeitet die Bewässerung nach folgendem Procedere:
Lichtsensor ->Zeitmodul->Relais-> Magnetventil->Wasser läuft / der Lichtsensor wird über ein verbautes Telefon angesprochen und ist somit völlig unabhängig wo ich mich gerade aufhalte auslösbar. Es geht nur ein Ventil, oder eben mehrere parallel, was der Wasserdruck aber nicht hergibt.
JETZT NEU:
Das Ganze soll über einen Raspberry ausgeführt werden. Die Ansteuerung soll ebenfalls über einen LDR erfolgen und es sollen 4 Magnetventile (im Moment würden 3 gebraucht) angesprochen werden können. Das Modul LDR ist soweit schon mal fertig und arbeitet eigenständig nach meinen Vorstellungen. Nun kam die Idee der graphischen Oberfläche, damit meine Frau problemlos die Zeiten ändern kann. Die Slider Werte sollen dann an eine time.sleep() Funktion übergeben werden sodass das Programm eben erst nach dieser Zeit weiter läuft (Ventil offen ), das nächste Ventil öffnet usw.
Jetzt wäre noch das Problem die Stellung der Slider zu speichern und beim nächsten Start an der gleichen Stell zu stehen. Diese Problem würde nur bei Netzausfall – passiert halt in einer Kleingartenanlage manchmal - und Neustart da sein, das kann ich aber, wenn der Wert nicht zu speichern ist, über eine Batterie fast ausschließen.
Ich poste den jetzigen Code mit allen 4 Slidern noch einmal und hoffe das mir noch geholfen werden kann.

Code: Alles auswählen

from tkinter import*
import time

master = Tk()
master.title("Rainers Gartenbewaesserung 2020 / 2021")
master.geometry ("650x650+600+200")



#das ist die erste Spalte==column=0
frame1=Frame(master, width=200, height=150, background="#030303")
frame1.grid(row=0, column=0, padx=3, pady=3)
frame1=Frame(master, width=160, height=115, background="#ffffff")
frame1.grid(row=0, column=0, padx=3, pady=3)

frame2=Frame(master, width=200, height=150, background="#ff3300")
frame2.grid(row=1, column=0, padx=3, pady=3)
frame2=Frame(master, width=160, height=115, background="#ffffff")
frame2.grid(row=1, column=0, padx=3, pady=3)

frame3=Frame(master, width=200, height=150, background="#ffff00")
frame3.grid(row=2, column=0, padx=3, pady=3)
frame3=Frame(master, width=160, height=115, background="#ffffff")
frame3.grid(row=2, column=0, padx=3, pady=3)

frame4=Frame(master, width=200, height=150, background="#0225f7")
frame4.grid(row=3, column=0, padx=3, pady=3)
frame4=Frame(master, width=160, height=115, background="#ffffff")
frame4.grid(row=3, column=0, padx=3, pady=3)

#ab hier ist es die zweite Spalte==column=1
frame1=Frame(master, width=5, height=150, background="Grey")
frame1.grid(row=0, column=1, padx=3, pady=3)
frame2=Frame(master, width=5, height=150, background="Grey")
frame2.grid(row=1, column=1, padx=3, pady=3)
frame3=Frame(master, width=5, height=150, background="Grey")
frame3.grid(row=2, column=1, padx=3, pady=3)
frame4=Frame(master, width=5, height=150, background="Grey")
frame4.grid(row=3, column=1, padx=3, pady=3)

erka1=IntVar()
erka2=IntVar()
erka3=IntVar()
erka4=IntVar()

w1 = Label(master, textvariable=erka1, font = "Helvetica 47 bold italic",\
           bg="#ffffff",).grid(row=0, column=0, pady=4, padx = 4,)                  # text im linken oberen feld
w1 = Label(master, textvariable=erka2, font = "Helvetica 47 bold italic",\
           bg="#ffffff",).grid(row=1, column=0, pady=4, padx = 4,)
w1 = Label(master, textvariable=erka3, font = "Helvetica 47 bold italic",\
           bg="#ffffff",).grid(row=2, column=0, pady=4, padx = 4,)
w1 = Label(master, textvariable=erka4, font = "Helvetica 47 bold italic", \
           bg="#ffffff",).grid(row=3, column=0, pady=4, padx = 4,)

def getValue1(value):
    print("S1",S1.get())
def getValue2(value):
    print("S2",S2.get())
def getValue3(value):
    print("S3",S3.get())
def getValue4(value):
    print("S4",S4.get())
    
#ab hier ist es die dritte Spalte==column=2
frame1=Frame(master, width=400, height=150, background="#030303")                                   # schwarz #030303
frame1.grid(row=0, column=2, padx=4, pady=4)
S1 = Scale(master, from_=0, to=10, bg="#030303", resolution=1, orient=HORIZONTAL, length=380,\
           width=40, sliderlength=40, showvalue=0, label="   Magnetventil 1",
           font = "Helvetica 30 bold italic", fg = "#ffff00", variable=erka1,\
           command=getValue1)                                                                        # gelb #ffff00
S1.grid(row=0, column=2, padx=3, pady=3)

frame2=Frame(master, width=400, height=150, background="#ff3300")
frame2.grid(row=1, column=2, padx=4, pady=4)
S2 = Scale(master, from_=0, to=60, bg="#ff3300", resolution=1, orient=HORIZONTAL,\
           length=380, width=40, sliderlength=40,showvalue=0, label="   Magnetventil 2",\
           font = "Helvetica 30 bold italic", fg = "#ffff00", variable=erka2,\
           command=getValue2)                                                                           #rot #ff3300
S2.grid(row=1, column=2, padx=3, pady=3)

frame3=Frame(master, width=400, height=150, background="#ffff00")
frame3.grid(row=2, column=2, padx=4, pady=4)
S3 = Scale(master, from_=0, to=60, bg="#ffff00", resolution=1, orient=HORIZONTAL, length=380,\
           width=40, sliderlength=40,showvalue=0, label="    Magnetventil 3",\
           font = "Helvetica 30 bold italic", fg = "#0225f7", variable=erka3,\
           command=getValue3)  #gelb
S3.grid(row=2, column=2, padx=3, pady=3)

frame4=Frame(master, width=400, height=150, background="#0225f7")
frame4.grid(row=3, column=2, padx=4, pady=4)
S4 = Scale(from_=0, to=60, bg="#0225f7", resolution=1, orient=HORIZONTAL, length=380,\
           width=40, sliderlength=40,showvalue=0, label="   Magnetventil 4",\
           font = "Helvetica 30 bold italic", fg = "#ffff00", variable=erka4,\
           command=getValue4)                                                                           # blau #0225f7
S4.grid(row=3, column=2, padx=3, pady=3)


mainloop()  # danach keine Elemente mehr setzen
    
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo RainerK,
Auf dem Raspberry kannst Du doch eine Datei anlegen.
Beim Start deines Programms prüfst Du, ob diese Datei existiert.
Wenn nicht, wird diese erstellt.
Für vier Sliderwerte genügt da eine Textdatei.
Diese beinhaltet vier Zeilen, z:B:
Ventil 1, 0
Ventil 2, 0
Ventil 3, 0
Ventil 4, 0
Solltest Du aber mehrere Varianten und Daten speichern wollen, wäre SQLITE3 etwas.

Dann solltest Du dir noch überlegen, durch welchen Auslöser die Daten gespeichert werden.
Vielleicht benötigst Du noch einen Button?
An Stelle der Time.sleep() Funktion würde ich after() benutzen.
Die sleep Funktion blockiert dir die Benutzeroberfäche.
Startet dein Script, liest Du die Daten aus deiner Datei ein und stellst die Schieber.
Gruss
Peter
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo RainerK,
ich hatte gestern nicht viel Zeit,
aber heute hab ich mir dein Script angesehen.
Wenn Du nur Elemente erstellst, ohne etwas in diese zu setzen, brauchst Du diesen keinen Namen zuzuweisen.

Code: Alles auswählen

#from tkinter import*
import time
import tkinter as tk
from pathlib import Path
master = tk.Tk()
erka1=tk.IntVar()
erka2=tk.IntVar()
erka3=tk.IntVar()
erka4=tk.IntVar()

def gui():
    
    master.title("Rainers Gartenbewaesserung 2020 / 2021")
    master.geometry ("650x700+600+200")

    #das ist die erste Spalte==column=0

    tk.Frame(master, width=200, height=150,
          background="#030303").grid(row=0, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=0, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#ff3300").grid(row=1, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=1, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#ffff00").grid(row=2, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=2, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#0225f7").grid(row=3, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=3, column=0, padx=3, pady=3)

    #ab hier ist es die zweite Spalte==column=1
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=0, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=1, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=2, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=3, column=1, padx=3, pady=3)    

    tk.Label(master, textvariable=erka1, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=0, column=0, pady=4, padx = 4,)
    # text im linken oberen feld
    tk.Label(master, textvariable=erka2, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=1, column=0, pady=4, padx = 4,)
    tk.Label(master, textvariable=erka3, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=2, column=0, pady=4, padx = 4,)
    tk.Label(master, textvariable=erka4, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=3, column=0, pady=4, padx = 4,)
        
    #ab hier ist es die dritte Spalte==column=2
    tk.Frame(master, width=400, height=150,
          background="#030303").grid(row=0, column=2, padx=4, pady=4)
    # schwarz #030303
    tk.Frame(master, width=400, height=150,
          background="#ff3300").grid(row=1, column=2, padx=4, pady=4)

    tk.Frame(master, width=400, height=150,
          background="#ffff00").grid(row=2, column=2, padx=4, pady=4)

    tk.Frame(master, width=400, height=150,
          background="#0225f7").grid(row=3, column=2, padx=4, pady=4)

    s1 = tk.Scale(master, from_=0, to=10, bg="#030303", resolution=1,
                  orient='horizontal', length=380, width=40, sliderlength=40,
                  showvalue=0, label="   Magnetventil 1",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka1)#, command=getValue1)                                                                       
    s1.grid(row=0, column=2, padx=3, pady=3)
    
    # gelb #ffff00

    s2 = tk.Scale(master, from_=0, to=60, bg="#ff3300", resolution=1,
                  orient='horizontal', length=380, width=40,
                  sliderlength=40, showvalue=0, label="   Magnetventil 2",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka2)#, command=getValue2)                                                                           
    s2.grid(row=1, column=2, padx=3, pady=3)
    #rot #ff3300

    s3 = tk.Scale(master, from_=0, to=60, bg="#ffff00", resolution=1,
                  orient='horizontal', length=380,
                  width=40, sliderlength=40, showvalue=0,
                  label="    Magnetventil 3", font = "Helvetica 30 bold italic",
                  fg = "#0225f7", variable=erka3)#, command=getValue3)  #gelb
    s3.grid(row=2, column=2, padx=3, pady=3)

    s4 = tk.Scale(from_=0, to=60, bg="#0225f7", resolution=1,
                  orient='horizontal', length=380, width=40,
                  sliderlength=40, showvalue=0,
                  label="   Magnetventil 4",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka4)#, command=getValue4)                                                                           
    s4.grid(row=3, column=2, padx=3, pady=3)
    # blau #0225f7

    tk.Button(master, text='Sliderwerte\nspeichern', command=schreibe_datei,
              bg="yellow",bd=4).grid(columnspan=3, row=4)
    
    tk.mainloop()  # danach keine Elemente mehr setzen

def pruefe_datei():
    if Path("ventilstellungen.txt").exists():        
        auswerte_ventilstellungen()     

def lese_ventilstellungen():    
    ventile = []
    with open("ventilstellungen.txt", "r") as lese:
        for stellung in lese:                
            ventile.append(stellung.split()[2])        
        lese.close()
        return ventile   

def auswerte_ventilstellungen():       
    stellung = lese_ventilstellungen()
    ventile = []
    for i in range(4):
        print("{}{} {} {}".format("Ventil_", i+1, "--", stellung[i]))
        ventile.append(stellung[i])
        
    erka1.set(ventile[0])
    erka2.set(ventile[1])
    erka3.set(ventile[2])
    erka4.set(ventile[3])
    
def schreibe_datei():
    ventil_1 = erka1.get()
    ventil_2 = erka2.get()
    ventil_3 = erka3.get()
    ventil_4 = erka4.get()
    
    ventile = [ventil_1, ventil_2, ventil_3, ventil_4]
      
    with open("ventilstellungen.txt", "w") as erstelle_datei:
        for i, ventil in enumerate(ventile):
           erstelle_datei.write("{}{} {} {}{}".format("ventil_", i+1, "=",
                                                      ventil, "\n"))      
        erstelle_datei.close()
    auswerte_ventilstellungen()

if __name__ == "__main__":
    pruefe_datei()
    gui()
Gruss
Peter
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@peterpy: benutze keine globalen Variablen. Wenn man anfängt, Variablen durchzunummerieren, möchte man wahrscheinlich eine Datenstruktur, z.B. eine Liste, verwenden.
Path("ventilstellungen.txt") sollte eine Konstante sein, da es an drei Stellen im Code verwendet wird/werden sollte.
Wenn man eine Datei per with öffnet, braucht man kein close.
Konstante Strings sollten im Formatstring stehen und nicht als format-Parameter. Eine for-Schleife über einen Index macht man nicht. Braucht man einen Index benutzt man enumerate.

Code: Alles auswählen

VENTILSTELLUNG = Path("ventilstellungen.txt")
def pruefe_datei():
    if VENTILSTELLUNG.exists():        
        auswerte_ventilstellungen()     

def lese_ventilstellungen():    
    with VENTILSTELLUNG.open() as lines:
        return [stellung.split()[2] for stellung in lines]

def auswerte_ventilstellungen(erkas):       
    stellung = lese_ventilstellungen()
    for index, (stellung, erka) in enumerate(zip(sellungen, erkas), 1):
        print("Ventil_{} -- {}".format(iindex, stellung))
        erka.set(stellung)
    
def schreibe_datei(erkas):
    with VENTILSTELLUNG.open("w") as output:
        for index, erka in enumerate(erkas, 1):
           output.write("ventil_{} = {}\n".format(index, erka.get())      
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo,
Danke für die schnellen Antworten. Ich denke da hab ich erst mal ein bisschen was zu tun um das nachzuvollziehen. Ich will ja noch etwas lernen.
Das wird sicherlich eine Weile brauchen. Ich melde mich dann wieder.

Danke nochmal Rainer
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo RainerK,
ich hab mal die Anregungen von Sirius3 in das Script übernommen und die eingeschlichenen Fehler beseitigt.
Doch es braucht jetzt wieder eine zusätzliche Funktion, nämlich partial, um die Argumente mit dem command Befehl der Funktion zu übergeben.
Da Du dich als Anfänger in Python bezeichnest, finde ich die zusammengesetzten Befehle zu komplex.

Code: Alles auswählen

for index, (stellung, erka) in enumerate(zip(stellung, erkas), 1):
Aber doch ein gutes Beispiel wie's gehen kann.
Ich hab mir abgewöhnt, solch zusammengesetzte Codezeilen zu schreiben. Auch wenn ich solche mal selbst entworfen habe.Irgendwann stolpere ich dann darüber und brauche mehr Zeit, um das Konstrukt zu verstehen, als zwei, drei einfache Zeilen zu lesen und zu verstehen. Ich bin kein berufsmässiger Programmierer, hab Python für mich entdeckt und Gefallen daran gefunden und nutze es beruflich und privat. Nun wünsch ich dir viel Erfolg mit der Sprinkleranlage und mit Python.

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
from functools import partial

def gui():
    master = tk.Tk()
    erka1=tk.IntVar()
    erka2=tk.IntVar()
    erka3=tk.IntVar()
    erka4=tk.IntVar()

    VENTILSTELLUNG = Path("ventilstellungen.txt")
    
    master.title("Rainers Gartenbewaesserung 2020 / 2021")
    master.geometry ("650x700+600+200")
    
    #das ist die erste Spalte==column=0

    tk.Frame(master, width=200, height=150,
          background="#030303").grid(row=0, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=0, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#ff3300").grid(row=1, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=1, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#ffff00").grid(row=2, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=2, column=0, padx=3, pady=3)

    tk.Frame(master, width=200, height=150,
          background="#0225f7").grid(row=3, column=0, padx=3, pady=3)
    tk.Frame(master, width=160, height=115,
          background="#ffffff").grid(row=3, column=0, padx=3, pady=3)

    #ab hier ist es die zweite Spalte==column=1
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=0, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=1, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=2, column=1, padx=3, pady=3)
    tk.Frame(master, width=5, height=150,
          background="Grey").grid(row=3, column=1, padx=3, pady=3)    

    tk.Label(master, textvariable=erka1, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=0, column=0, pady=4, padx = 4,)
    # text im linken oberen feld
    tk.Label(master, textvariable=erka2, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=1, column=0, pady=4, padx = 4,)
    tk.Label(master, textvariable=erka3, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=2, column=0, pady=4, padx = 4,)
    tk.Label(master, textvariable=erka4, font = "Helvetica 47 bold italic",
               bg="#ffffff",).grid(row=3, column=0, pady=4, padx = 4,)
        
    #ab hier ist es die dritte Spalte==column=2
    tk.Frame(master, width=400, height=150,
          background="#030303").grid(row=0, column=2, padx=4, pady=4)
    # schwarz #030303
    tk.Frame(master, width=400, height=150,
          background="#ff3300").grid(row=1, column=2, padx=4, pady=4)

    tk.Frame(master, width=400, height=150,
          background="#ffff00").grid(row=2, column=2, padx=4, pady=4)

    tk.Frame(master, width=400, height=150,
          background="#0225f7").grid(row=3, column=2, padx=4, pady=4)

    s1 = tk.Scale(master, from_=0, to=10, bg="#030303", resolution=1,
                  orient='horizontal', length=380, width=40, sliderlength=40,
                  showvalue=0, label="   Magnetventil 1",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka1)#, command=getValue1)                                                                       
    s1.grid(row=0, column=2, padx=3, pady=3)
    
    # gelb #ffff00

    s2 = tk.Scale(master, from_=0, to=60, bg="#ff3300", resolution=1,
                  orient='horizontal', length=380, width=40,
                  sliderlength=40, showvalue=0, label="   Magnetventil 2",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka2)#, command=getValue2)                                                                           
    s2.grid(row=1, column=2, padx=3, pady=3)
    #rot #ff3300

    s3 = tk.Scale(master, from_=0, to=60, bg="#ffff00", resolution=1,
                  orient='horizontal', length=380,
                  width=40, sliderlength=40, showvalue=0,
                  label="    Magnetventil 3", font = "Helvetica 30 bold italic",
                  fg = "#0225f7", variable=erka3)#, command=getValue3)  #gelb
    s3.grid(row=2, column=2, padx=3, pady=3)

    s4 = tk.Scale(from_=0, to=60, bg="#0225f7", resolution=1,
                  orient='horizontal', length=380, width=40,
                  sliderlength=40, showvalue=0,
                  label="   Magnetventil 4",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka4)#, command=getValue4)                                                                           
    s4.grid(row=3, column=2, padx=3, pady=3)
    # blau #0225f7
    erkas = [erka1, erka2, erka3, erka4]
    pruefe_datei(erkas, VENTILSTELLUNG)

    tk.Button(master, text='Sliderwerte\nspeichern',
              command=partial(schreibe_datei, erkas, VENTILSTELLUNG),
              bg="yellow",bd=4).grid(columnspan=3, row=4)
    
    tk.mainloop()  # danach keine Elemente mehr setzen

def pruefe_datei(erkas, VENTILSTELLUNG):    
    if VENTILSTELLUNG.exists():        
        auswerte_ventilstellungen(erkas, VENTILSTELLUNG)     

def lese_ventilstellungen(VENTILSTELLUNG):    
    with VENTILSTELLUNG.open() as lines:
        return [stellung.split()[2] for stellung in lines]

def auswerte_ventilstellungen(erkas, VENTILSTELLUNG):       
    stellung = lese_ventilstellungen(VENTILSTELLUNG)
    for index, (stellung, erka) in enumerate(zip(stellung, erkas), 1):
        print("Ventil_{} -- {}".format(index, stellung))
        erka.set(stellung)
    
def schreibe_datei(erkas, VENTILSTELLUNG):
    with VENTILSTELLUNG.open("w") as output:
        for index, erka in enumerate(erkas, 1):
           output.write("ventil_{} = {}\n".format(index, erka.get()))

if __name__ == "__main__":
    #pruefe_datei()
    gui()
Gruss
Peter
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Den Dateiname hatte ich als Konstante geschrieben, daher auch komplett groß geschrieben. Konstanten müssen nicht per Argument übergeben werden. So macht die Schreibweise keinen Sinn.
Das komplizierte for liegt nur daran, dass das Dateiformat nicht ganz so günstig ist. Benutze ein Standardformat, wie json oder falls lesbarer, yaml.
Statt Code zu kopieren, versucht man, die Gemeinsamkeiten zusammenzufassen, hier z.B. alles in einer for-Schleife erzeugen:

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
from functools import partial
import json

VENTILSTELLUNG = Path("ventilstellungen.json")

def auswerte_ventilstellungen(erkas):       
    if VENTILSTELLUNG.exists():        
        with VENTILSTELLUNG.open() as input:
            stellungen = json.load(input)
        for key, value in stellungen.items():
            erkas[key].set(value)
    
def schreibe_datei(erkas):
    with VENTILSTELLUNG.open("w") as output:
        json.dump({k: v.get() for k,v in erkas.items()}, output)

def gui():
    master = tk.Tk()
    erkas = {
        "#030303": tk.IntVar(),
        "#ff3300": tk.IntVar(),
        "#ffff00": tk.IntVar(),
        "#0225f7": tk.IntVar(),
    }
    
    master.title("Rainers Gartenbewaesserung 2020 / 2021")
    master.geometry ("650x700+600+200")

    for row, (color, erka) in enumerate(erkas.items()):
        # erste Spalte
        frame = tk.Frame(master, width=200, height=150, background=color)
        frame.grid(row=row, column=0, padx=3, pady=3)
        frame = tk.Frame(master, width=160, height=115, background="#ffffff")
        frame.grid(row=row, column=0, padx=3, pady=3)
        label = tk.Label(master, textvariable=erka,
            font="Helvetica 47 bold italic", bg="#ffffff")
        label.grid(row=row, column=0, pady=4, padx=4)

        # zweite Spalte
        frame = tk.Frame(master, width=5, height=150, background="Grey")
        frame.grid(row=row, column=1, padx=3, pady=3)
        
        # dritte Spalte
        frame = tk.Frame(master, width=400, height=150, background=color)
        frame.grid(row=row, column=2, padx=4, pady=4)

        scale = tk.Scale(master, from_=0, to=10, bg=color, resolution=1,
                  orient='horizontal', length=380, width=40, sliderlength=40,
                  showvalue=0, label="   Magnetventil 1",
                  font = "Helvetica 30 bold italic", fg = "#ffff00",
                  variable=erka)
        scale.grid(row=row, column=2, padx=3, pady=3)

    tk.Button(master, text='Sliderwerte\nspeichern',
              command=partial(schreibe_datei, erkas),
              bg="yellow",bd=4).grid(columnspan=3, row=4)
    
    auswerte_ventilstellungen(erkas)
    tk.mainloop()

if __name__ == "__main__":
    gui()
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo Peter,
an den zusammengesetzten Codezeilen bin ich nicht weitergekommen. Das war aber wohl auch nicht zu erwarten ;-)).
Im Moment komm ich zeitlich nicht so viel dazu wie ich eigentlich wollte, das wir aber auf absehbare Zeit besser.
Danke noch mal
und wenn´s dann fertig ist, oder es weitere Fragen gibt melde ich mich auf jeden fall noch mal.

VG
Rainer
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo mal wieder,
ich hatte eigentlich gedacht, das ich mit der Übergabe der Werte aus der GUI in mein Programm zurechtkommen sollte.
Leider ist dem nicht so. Ich versuche seit Tagen die Sliderwerte in mein "Gartenprogramm" zu übernehmen.
Im der GUI klappt das auch indem ich eine dict schreibe, dann kan ich mit print darauf zugreifen. eine variable zu definieren klappt genau so, nu eben nicht im "Gartenprogramm".
Die Sliderwerte sollen in die Zeilen 65,79,93,107 (time(sleep()) übernommen werden.

Code: Alles auswählen

#!/usr/bin/python3
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) # GPIO Nummern werden verwendet
delayt = .1 
value = 0 # diese variable wird zum speichern des ldr wertes verwendet
ldr = 25 # Lichtsensor ist an GPIO 25
relais_1 = 7  # Relais 1 ist an GPIO 7
relais_2 = 8  # Relais 2 ist an GPIO 8
relais_3 = 23  # Relais 3 ist an GPIO 23
relais_4 = 24  # Relais 4 ist an GPIO 24
GPIO.setwarnings(False)
GPIO.setup(relais_1, GPIO.OUT) 
GPIO.output(relais_1, False) 
#GPIO.output(relais_1, GPIO.HIGH)
GPIO.setup(relais_2, GPIO.OUT) 
GPIO.output(relais_2, False) 
#GPIO.output(relais_2, GPIO.HIGH)
GPIO.setup(relais_3, GPIO.OUT) 
GPIO.output(relais_3, False) 
#GPIO.output(relais_3, GPIO.HIGH)
GPIO.setup(relais_4, GPIO.OUT) 
GPIO.output(relais_4, False) 
#GPIO.output(relais_4, GPIO.HIGH)
def rc_time (ldr):
    count = 0
 
    #Output on the pin for
    GPIO.setup(ldr, GPIO.OUT)
    GPIO.output(ldr, False)
    time.sleep(delayt)
 
    #Change the pin back to input
    GPIO.setup(ldr, GPIO.IN)
 
    #Count until the pin goes high
    while (GPIO.input(ldr) == 0):
        count += 1
 
    return count
 
#Catch when script is interrupted, cleanup correctly
try:
    # Main loop Relais 1
    while True:
        print("Helligkeit:")
        value = rc_time(ldr)
        print(value)
        if ( value > 6000 ):
                print ("Wasser Stopp")
                print (time.strftime("%d.%m.%Y %H:%M:%S"))#grosses Y dann jahr 4 stellig - klein 2 stellig
                GPIO.output(relais_1, False)
                GPIO.output (relais_2, False)
                GPIO.output(relais_3, False)
                GPIO.output (relais_4, False)
        if ( value < 1900 ):
                print("Wasser Marsch")
                print (time.strftime("%d.%m.%Y %H:%M:%S"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                GPIO.output(relais_1, True)
                if ( relais_1, True ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Marsch Kreis 1 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                time.sleep(5) 					[b][u]# Relais 1 bleit ()sekunden ON <-- hier soll der Slider die Zeit ändern[/u][/b]
                GPIO.output(relais_1, False)
                if ( relais_1, False ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Stopp  Kreis 1 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n""\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                    time.sleep(2) # relais2 schaltet erst nach der eingestellten zeit ein (2 sekunden)
                GPIO.output(relais_2, True)
                if ( relais_2, True ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Marsch Kreis 2 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                time.sleep(10) 			[u][b]# Relais 2 bleit ()sekunden ON <-- hier soll der Slider die Zeit ändern[/b][/u]
                GPIO.output(relais_2, False)
                if ( relais_2, False ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Stopp  Kreis 2 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n""\n")) #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                    time.sleep(5) # relais4 schaltet erst nach der eingestellten zeit ein (10 sekunden)
                GPIO.output(relais_3, True)
                if ( relais_3, True ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Marsch Kreis 3 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                    time.sleep(10) 		[b][u]# Relais 3 bleit ()sekunden ON <-- hier soll der Slider die Zeit ändern[/u][/b]
                GPIO.output(relais_3, False)
                if ( relais_3, False ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Stopp  Kreis 3 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n""\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                    time.sleep(5) # relais4 schaltet erst nach der eingestellten zeit ein (10 sekunden)
                GPIO.output(relais_4, True)
                if ( relais_4, True ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Marsch Kreis 4 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n"))  #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()
                time.sleep(10) 	[u][b]# Relais 4 () bleit ()sekunden ON <-- hier soll der Slider die Zeit ändern[/b][/u]
                GPIO.output(relais_4, False)
                if ( relais_4, False ):
                    f = open("/home/pi/Desktop/DAUER.txt", "a") #hier den absoluten Pfad angeben , wo die Datei erstellt werden soll
                    f.write("  Wasser Stopp  Kreis 4 :")
                    f.write(time.strftime(" %d.%m.%Y -- %H:%M:%S\n""\n")) #grosses Y dann jahr 4 stellig - klein 2 stellig
                    f.close()   
                    time.sleep(15) # die Abfrage der Helligkeit wird um () Sekunden verzögert
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()   
Es wäre schön, wenn mir da jemand ??Peter?? auf die sprünge helfen könnte.

Danke
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du redest von GUI. Aber im Ganzen Programm kommt keine einzige GUI-Zeile vor. Ich sehe auch nicht, wo da Slider herkommen sollen.
Das Programm besteht quasi nur aus kopiertem Code. Die Klammern um die if-Bedingungen sind allesamt unnötig. Einige Bedingungen sind falsch, da sie immer wahr sind.
Die Einrückungen sind uneinheitlich und an manchen Stellen offensichtlich falsch.
Räume dein Programm erst einmal auf, definiere Funktionen, und teste diese ausführlich.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wenn man sowieso noch in der Phase ist wo noch nix funktioniert, könnte man auch noch einen Umstieg auf das `gpiozero`-Modul in Betracht ziehen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Rainer,
wie willst Du dein Raspi ansteuern, mit einem separaten Thread? Ich komme da drauf, weil Du sleep und eine Endlosschlaufe benutzt.
Willst Du den Code für den Raspi in einem separaten Modul halten? Das würd ich so nicht empfehlen.
Willst Du aber deinen Code im Tkinter Mainloop laufen lassen, dann benötigst Du einen Taktgenerator.
Verwende after an Stelle von sleep
Dann schreib eine setup Funktion für die Himbeere, diese Funktion rufst Du nur einmal auf.
Schreibe Funktionen für den Dämmerungssensor und Ventile.
Die Sliderwert kannst Du mit variablenname.get() abrufen.
Gruss
Peter
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Rainer,
ich hoffe ich hab dich mit meiner letzten Nachricht nicht entmutigt.
Dein Problem hat mir keine Ruhe gelassen, so hab ich mir mal die Bewässerung aufgebaut. Meine Annahme: Strommmessung; sollte das anders sein, kannst Du das sicher beheben.
Da ich die erforderliche Hardware nicht hab, sind alle Raspi spezifischen Zeilen mit ## auskommentiert.
Was der Simulation dient, ist mit <Zum Testen> markiert.
Die Ventilöffnungszeiten können auch während der aktiven Dauer verändert werden, was auch protokolliert wird.
Zu tun hast Du dennoch, die Protokolldatei sollte nicht ins Unendliche wachsen. Nun wünsch ich viel Erfolg und genügend Wasser.
Gruss Peter

Code: Alles auswählen

import tkinter as tk
from pathlib import Path
import json
import time
##import RPi.GPIO as GPIO

class Gui():
    def __init__(self):
        self.VENTIL_OEFFNUNGSZEITEN = Path("ventil_oeffnungszeiten.json")
        self.zaehlerstand = 0
        self.master = tk.Tk()
        self.FAKTOR = 5 # Anpassen an gewünschte Einheit
        #                   (Sek = 1, Min = 60, Std = 3600)

        self.erkas = {"#030303": tk.IntVar(), "#ff3300": tk.IntVar(),
                      "#ffff00": tk.IntVar(), "#0225f7": tk.IntVar()}

        self.master.title("Rainers Gartenbewaesserung 2020 / 2021")
        self.master.geometry ("650x700+600+200")

        for row, (color, erka) in enumerate(self.erkas.items()):
            if row is not 2:
                vordergrund = "#ffff00"
            else:
                vordergrund = "black"
                # Vordergrungfarbe für gelben Hintergrund

            # erste Zeile
            frame = tk.Frame(self.master, width=200, height=150, bg=color)
            frame.grid(row=row, column=0, padx=3, pady=3)
            frame = tk.Frame(self.master, width=160, height=115, bg="#ffffff")
            frame.grid(row=row, column=0, padx=3, pady=3)
            label = tk.Label(self.master, textvariable=erka,
                font="Helvetica 47 bold italic", bg="#ffffff")
            label.grid(row=row, column=0, pady=4, padx=4)

            # zweite Zeile
            frame = tk.Frame(self.master, width=5, height=150, bg="Grey")
            frame.grid(row=row, column=1, padx=3, pady=3)

            # dritte Zeile
            frame = tk.Frame(self.master, width=400, height=150, bg=color)
            frame.grid(row=row, column=2, padx=4, pady=4)

            scale = tk.Scale(self.master, from_=0, to=10, bg=color,
                             resolution=1, orient='horizontal', length=380,
                             width=40, sliderlength=40, showvalue=0,
                             label="{:^18} {}".format("Magnetventil", row+1),
                             font = "Helvetica 30 bold italic",
                             fg = vordergrund, variable=erka)
            scale.grid(row=row, column=2, padx=3, pady=3)

        tk.Button(self.master, text='Sliderwerte\nspeichern',
                  command=self.schreibe_datei, bg="yellow",
                  bd=4).grid(columnspan=3, row=4)
        
        self.ventil_oeffnungszeiten_laden()
        oeffnungszeiten = self.lese_ventil_oeffnungszeiten()
        self.steuern = Ventilsteuerung(oeffnungszeiten, self.master)
        self.taktgenerator()
        self.master.mainloop()

    def lese_ventil_oeffnungszeiten(self):
        """
        liest die Sliderwerte und multipliziert diese mit dem Faktor
        um die gewünschte Bewässerungszeit in ??? zu erhalten
        """
        ventil_oeffnungszeiten = []
        for key, value in self.erkas.items():
            stellung = self.erkas[key].get()
            ventil_oeffnungszeiten.append(stellung*self.FAKTOR)
        return ventil_oeffnungszeiten

    def taktgenerator(self):
        """
        erzeugt zusammen mit dem Taktzaehler einen 0.2 Sekundentakt
        zum aktualisieren der Sliderwerte und
        einen 1 Sekundentakt zum Abfragen des LDR
        """
        self.master.after(200, self.taktzaehler)

    def taktzaehler(self):
        oeffnungszeiten = self.lese_ventil_oeffnungszeiten()
        #Jede Skunde die Sliderwerte aktualisieren
        self.zaehlerstand += 1
        if self.zaehlerstand == 5:
            self.steuern.taktauswertung(oeffnungszeiten)
        if self.zaehlerstand == 10:
            self.steuern.taktauswertung(oeffnungszeiten)
            #alle 2 Sekunden den LDR abfragen
            self.zaehlerstand = 0
        self.taktgenerator()

    def ventil_oeffnungszeiten_laden(self):
        # holt die abgespeicherten ventil_oeffnungszeiten
        # aus der Datei ventil_oeffnungszeiten.json
        if self.VENTIL_OEFFNUNGSZEITEN.exists():
            with self.VENTIL_OEFFNUNGSZEITEN.open() as input:
                stellungen = json.load(input)
            for key, value in stellungen.items():
                self.erkas[key].set(value)

    def schreibe_datei(self):
        # speichert die Ventil_oeffnungszeiten in die Datei
        # ventil_oeffnungszeiten.json
        with self.VENTIL_OEFFNUNGSZEITEN.open("w") as output:
            json.dump({k: v.get() for k,v in self.erkas.items()}, output)

class Ventilsteuerung():
    """
    Die Bewässerungsanlage hat drei Zustände:
    - Zustand hell (Tag, es wird nicht bewässert)
    - Zustand dunkel (Nacht, es wird bewässert)
    - Zustand Bewässerung Ende (Nur ein Mal während eines Hell -
        Dunkel Zyklus bewässern)
    Bewässert wird mit vier nacheienander eingeschalteten Ventilen,
    welche für die von der Gui vorgegbenen Zeiten offen bleiben.
    Der Faktor gibt den Multiplikator für die Sliderwerte aus
    der Gui an. Die Sliderwerte haben einen Range von 0 bis 10
    """    
    def __init__(self, ventil_oeffnungszeiten, master):
        self.ventil_oeffnungszeiten = ventil_oeffnungszeiten
        self.master = master
        self.ldr_merker = True # ZUM TESTEN
        self.schrittzaehler = 0
        self.taktzaehler = 0
        self.zustand = "hell"
        self.bewaesserungstaktzaehler = 0
        self.pausentaktzaehler = 0
        self.ldr_zaehler = 2100 #ZUM TESTEN
        self.ldr = 25 # Lichtsensor ist an GPIO 25
        self.relais_1 = 7  # Relais 1 ist an GPIO 7
        self.relais_2 = 8  # Relais 2 ist an GPIO 8
        self.relais_3 = 23  # Relais 3 ist an GPIO 23
        self.relais_4 = 24  # Relais 4 ist an GPIO 24
        ##GPIO.setwarnings(False)
        ##GPIO.setmode(GPIO.BCM) # GPIO Nummern werden verwendet
        ##GPIO.setup(self.relais_1, GPIO.OUT)
        ##GPIO.setup(self.relais_2, GPIO.OUT)
        ##GPIO.setup(self.relais_3, GPIO.OUT)
        ##GPIO.setup(self.relais_4, GPIO.OUT)
        self.value = 0
        self.protokolliere("", "Programm Start", "", "")
        self.ventile_ausschalten(ventil="Alle", art="", oeffnungszeit=0)
        self.auswerte_ldr(self.ventil_oeffnungszeiten)

    def ventile_ausschalten(self, ventil, art, oeffnungszeit):
        ##GPIO.output(self.relais_1, False)
        ##GPIO.output(self.relais_2, False)
        ##GPIO.output(self.relais_3, False)
        ##GPIO.output(self.relais_4, False)
        print(ventil)
        self.protokolliere(ventil, "Wasser stopp", "effektiv", oeffnungszeit)
        print("ventile Aus")

    def ventil_1_einschalten(self, oeffnungszeit):
        print ("Ventil 1 Ein",time.strftime("%d.%m.%Y %H:%M:%S"))
        ##GPIO.output(self.relais_1, True)
        self.protokolliere(1, "Wasser Marsch Kreis", "geplant", oeffnungszeit)

    def ventil_2_einschalten(self, oeffnungszeit):
        print ("Ventil 2 Ein", time.strftime("%d.%m.%Y %H:%M:%S"))
        ##GPIO.output(self.relais_2, True)
        self.protokolliere(2, "Wasser Marsch Kreis", "geplant", oeffnungszeit)

    def ventil_3_einschalten(self, oeffnungszeit):
        print ("Ventil 3 Ein", time.strftime("%d.%m.%Y %H:%M:%S"))
        ##GPIO.output(relais_3, True)
        self.protokolliere(3, "Wasser Marsch Kreis", "geplant", oeffnungszeit)

    def ventil_4_einschalten(self, oeffnungszeit):
        print ("Ventil 4 Ein", time.strftime("%d.%m.%Y %H:%M:%S"))
        ##GPIO.output(self.relais_4, True)
        self.protokolliere(4, "Wasser Marsch Kreis", "geplant", oeffnungszeit)

    def protokolliere(self, ventil_nr, aktion, art, dauer):
        zeit = time.strftime("%d.%m.%Y %H:%M:%S")
        with open("Bewässerungsprotokoll.txt", "a") as protokoll:# ZUM TESTEN
        ##with open("/home/pi/Desktop/DAUER.txt", "a") as protokoll:
            text_aktion = "{} {}".format(aktion, ventil_nr)
            protokoll.write("{:<20};{:<25};{:<10};{:>10}{}".format(zeit,
                                                                   text_aktion,
                                                                   art, dauer,
                                                                   "\n"))

    def taktauswertung(self, oeffnungszeiten):
        self.taktzaehler += 1
        if self.taktzaehler == 2:
            self.auswerte_ldr(oeffnungszeiten)
            #Alle 2 Sekunden den LDR abfragen
            self.taktzaehler = 0

    # ZUMTESTEN_________________________________
    def ldr_simulieren(self):# ZUM TESTEN
        """
        Zählt endlos im Sekundentakt vom Startwert 2100 runter bis 100
        und wieder hoch bis 6200 und wieder runter.
        Dient zur Tag Nacht simulation zum Testen.
        """
        print("LDR", self.ldr_zaehler)# ZUM TESTEN
        if self.ldr_merker == False:# ZUMTESTEN
            self.ldr_zaehler += 100# ZUMTESTEN
        if self.ldr_merker == True:# ZUMTESTEN
            self.ldr_zaehler -= 100# ZUMTESTEN
        if self.ldr_zaehler <= 100:# ZUMTESTEN
            self.ldr_merker = False# ZUMTESTEN
        if self.ldr_zaehler >= 6200:# ZUMTESTEN
            self.ldr_merker = True# ZUMTESTEN
        self.value = self.ldr_zaehler# ZUMTESTEN
        #__________________________________________

    def auswerte_ldr(self, oeffnungszeiten):
        """
        der Strom der durch den LDR (Photowiderstand) fliesst wird gemessen.
        Dunkel entspricht wenig Strom -> kleiner Wert, hell entspricht grossem
        Strom -> grosser Wert.
        Schaltschwelle dunkel = 1900,
        Schaltschwelle hell = 6000
        """
        self.ldr_simulieren()#ZUM TESTEN

        ##self.value = rc_time(ldr)
        if self.value > 6000:
            self.zustand = "hell"
            #print (time.strftime("%d.%m.%Y %H:%M:%S"))
            if self.schrittzaehler is not 0:
                self.ventile_ausschalten()
        if self.value < 1900:
            if self.zustand == "hell":
                self.zustand = "dunkel"
        if self.zustand == "dunkel":
            self.ventile_schalten(oeffnungszeiten)

    def ventile_schalten(self, oeffnungszeiten):
        aus_schritte = {2: "Ventil 1", 5:"Ventil 2", 8:"Ventil 3",
                        11:"Ventil 4"}
        if self.zustand == "dunkel":
            if self.schrittzaehler == 0:
                self.pruefe_groesse_protokolldatei()
                self.protokolliere("", "Bewässerung Start", "", "")
                oeffnungszeit = oeffnungszeiten[0]
                print("Ventil 1", oeffnungszeit)
                if oeffnungszeit == 0:
                    self.schrittzaehler += 1
                else:
                    self.ventil_1_einschalten(oeffnungszeit)
                    self.schrittzaehler += 1

            if self.schrittzaehler == 1:
                oeffnungszeit = oeffnungszeiten[0]
                self.bewaesserungszeit(oeffnungszeit)

            if self.schrittzaehler == 2:
                oeffnungszeit = oeffnungszeiten[0]
                self.pausenzeit(aus_schritte, oeffnungszeit)

            if self.schrittzaehler == 3:
                oeffnungszeit = oeffnungszeiten[1]
                if oeffnungszeit == 0:
                    self.schrittzaehler += 1
                    print("Ventil 2", oeffnungszeit)
                else:
                    self.ventil_2_einschalten(oeffnungszeit)
                    self.schrittzaehler += 1

            if self.schrittzaehler == 4:
                oeffnungszeit = oeffnungszeiten[1]
                self.bewaesserungszeit(oeffnungszeit)

            if self.schrittzaehler == 5:
                oeffnungszeit = oeffnungszeiten[1]
                self.pausenzeit(aus_schritte, oeffnungszeit)

            if self.schrittzaehler == 6:
                oeffnungszeit = oeffnungszeiten[2]
                if oeffnungszeit == 0:
                    self.schrittzaehler += 1
                    print("Ventil 3", oeffnungszeit)
                else:
                    self.ventil_3_einschalten(oeffnungszeit)
                    self.schrittzaehler += 1

            if self.schrittzaehler == 7:
                oeffnungszeit = oeffnungszeiten[2]
                self.bewaesserungszeit(oeffnungszeit)

            if self.schrittzaehler == 8:
                oeffnungszeit = oeffnungszeiten[2]
                self.pausenzeit(aus_schritte, oeffnungszeit)

            if self.schrittzaehler == 9:
                oeffnungszeit = oeffnungszeiten[3]
                if oeffnungszeit == 0:
                    self.schrittzaehler += 1
                    print("Ventil 4", oeffnungszeit)
                else:
                    self.ventil_4_einschalten(oeffnungszeit)
                    self.schrittzaehler += 1

            if self.schrittzaehler == 10:
                oeffnungszeit = oeffnungszeiten[3]
                self.bewaesserungszeit(oeffnungszeit)

            if self.schrittzaehler == 11:
                oeffnungszeit = oeffnungszeiten[3]
                self.pausenzeit(aus_schritte, oeffnungszeit)

            if self.schrittzaehler == 12:
                self.protokolliere("", "bewässern Ende", "", "")
                self.zustand = "Ende"
                self.schrittzaehler = 0

    def bewaesserungszeit(self, oeffnungszeit):
        """
        Alle 2 Sekunden den Zaehler um 2 erhöhen.
        """
        self.bewaesserungstaktzaehler += 2
        if self.bewaesserungstaktzaehler >= oeffnungszeit:
            self.schrittzaehler += 1
            self.bewaesserungstaktzaehler = 0

    def pausenzeit(self, aus_schritte, oeffnungszeit):
        """
        Schaltet die Ventile aus und wartet 2 Sekunden bis zum nächsten Schritt.
        """ 
        ventil = aus_schritte[self.schrittzaehler]
        if self.pausentaktzaehler == 0:
            self.ventile_ausschalten(ventil, "effektiv", oeffnungszeit)
        self.pausentaktzaehler += 1
        if self.pausentaktzaehler == 2:
            self.schrittzaehler += 1
            self.pausentaktzaehler = 0

    def pruefe_groesse_protokolldatei(self):
        """
        Sollte die Protokolldatei.txt > 100KiB werden, wird diese in .bak
        umbenannt. Vor dem Umbennennen wird eine allfällige .bak Datei
        gelöscht
        """
        pass

if __name__ == "__main__":
    gui = Gui()
RainerK
User
Beiträge: 6
Registriert: Montag 7. September 2020, 10:07

Hallo Peter,
da ist ganz viel dabei was ich nicht verstehe ( im Moment jedenfalls noch nicht) aber auf jeden Fall ganz vielen Dank.
Für mich sieht das immer so aus, als ob du diese mal in einer " Zigarettenpause" so einfach runterschreibst. Hut ab.
Ich hatte schon mal darüber nachgedacht, im Forum zu fragen ob jemand vielleicht in meiner Nähe wohnt und mir einiges erklären kann.
Vielleicht mach ich das auch noch mal und dann wird´s hoffentlich besser Zusammenhänge, Abläufe usw. zu verstehen.
Viele Grüße aus Berlin
Rainer
Antworten