Variable Zeitschaltuhr

  • Ich möchte gerne über den Pi per Phyton (?) eine Zeitschaltuhr realisieren. Ich bin mir noch nicht schlüssig über das Design des Ganzen. Ein Problem dabei ist, dass bei einem Neustart (aus welchem Grund auch immer) der letzte Zustand angenommen werden soll.

    Die Zeitschaltuhr soll z.B. die Beleuchtung täglich ein- und ausschalten; wobei die Beleuchtungszeiten im ganzen Jahr variieren (es soll eine Amazonas-Beleuchtung simuliert werden). Genauso soll auch die Temperatur eingestellt werden.
    Um es kurz zu machen: Ich möchte über Relais verschiedene Dinge zeitlich variabel ansteuern.

    Ich könnte nun in einem Array einfach die Zeiten speichern und z.B. in einer Schleife alle 60 Sekunden die aktuelle Zeit mit der hinterlegten Zeit vergleichen. Quasi ein Script, welches beim Start des Pi eine Endlosschleife durchläuft und dann Relais schalten bzw. andere Scripte ausführt.

    Oder aber ich verwende Crontabs. Da bin ich noch nicht so geübt und weiß nicht genau wie ich die Varibilität hinbekomme. Für verschiedene Peripherien tägliche Zeiten ergeben natürlich X mal 365 Einträge (x2 für Ein- und Ausschaltfunktion)
    Ich kann mich auch auf wöchentliche Werte beschränken damit der Aufwand nicht zu groß wird.

    Aber vielleicht gibt es auch bessere Werkzeuge oder Ansätze, die mir einfach nicht bekannt sind.

    Meine Problempunkte:
    1) Variable Zeiten, d.h. ein- und ausschalten der Relais variiert im ganzen Jahr (z.B. Jahreszeiten und Beleuchtung)
    2) Beibehalten des Settings bei Stromausfall o.ä.

  • Sehe ich das richtig dass Du pro Tag des Jahres 365 Einträge in Tabellen haben willst, also einen pro Tag oder soll es da variable Bereiche geben? Der größte Aufwand wird dann sein die Tabelle mit ihren Werten zu erstellen. Der Lookup ist dann nicht so schlimm. Du musst nur den aktuellen Tag des Datums errechnen mit http://docs.python.org/2/library/time.html und dann in einem Array nachsehen.

    Python
    from datetime import datetime, date, time
    
    
    day_of_year = datetime.now().timetuple().tm_yday
    print day_of_year
    
    
    print myArray[day_of_year]
  • Als Beispiel:

    10.03.: 08:00 Uhr einschalten; 18:00 Uhr ausschalten
    11.03.: 07:58 Uhr einschalten; 18:02 Uhr ausschalten
    ...
    10.08.: 06:00 Uhr einschalten; 22:00 Uhr ausschalten

    So in der Art würde ein Relais geschaltet werden. Wie gesagt, vielleicht mache ich es auch lieber einfach nur mit wöchentlichen Werten, dann sind es weniger Einträge.
    Ein anderes Relais würde eben etwas anderes schalten und entsprechend andere Ein- und Ausschaltzeiten zugewiesen bekommen. Aber vom Prinzip ist es gleich.

    Oder aber es gelten verschiedene Werte von Sensoren:
    z.B. Wird über Tag (z.B. von 08:00 Uhr bis 18:00 Uhr) ein bestimmter pH-Wertebereich vorgegeben um so den Säuregehalt zu regulieren. In der Nacht gilt ein anderer Wertebereich. Gesteuert wird das auch über ein Relais, d.h. wenn der Wert nach oben hin zu hoch wird, dann wird die Säure zugeführt (Ventil offen), sonst wird das Ventil geschlossen.


  • 10.03.: 08:00 Uhr einschalten; 18:00 Uhr ausschalten
    11.03.: 07:58 Uhr einschalten; 18:02 Uhr ausschalten
    ...
    10.08.: 06:00 Uhr einschalten; 22:00 Uhr ausschalten

    So in der Art würde ein Relais geschaltet werden.


    Dann müsste in dem Array eben der Start- und Endwert stehen in einem Tupel und regelmäßig gepollt werden über den Tag.

    Zitat

    Wie gesagt, vielleicht mache ich es auch lieber einfach nur mit wöchentlichen Werten, dann sind es weniger Einträge.

    Man kann ja auch die Woche des Jahres berechnen. Aber wie ich schon geschrieben habe - der größte Aufwand ist das Erstellen der Daten.

    Zitat

    Oder aber es gelten verschiedene Werte von Sensoren:
    z.B. Wird über Tag (z.B. von 08:00 Uhr bis 18:00 Uhr) ein bestimmter pH-Wertebereich vorgegeben um so den Säuregehalt zu regulieren. In der Nacht gilt ein anderer Wertebereich. Gesteuert wird das auch über ein Relais, d.h. wenn der Wert nach oben hin zu hoch wird, dann wird die Säure zugeführt (Ventil offen), sonst wird das Ventil geschlossen.


    Das ist ein anderer Anwendungsfall - eben nicht Zeitgrenzen pro Tag - sondern pH Grenzen, die zu beobachten sind. Nur mit dem Unterschied dass natürlich das Unter- bzw Überschreiten der Limits mehrere Male pro Tag passieren kann. Aber vom Algorithmus nicht anders.

  • Zitat


    ...und regelmäßig gepollt werden über den Tag[/color]


    Das verstehe ich nicht. Genau daran hängt es... Hättest du dafür ein kleines Beispiel-Script?

    Es ist ja die eine Sache, dass die Werte in eine Tabelle müssen (nehmen wir mal an, ich hätte die Daten schon), eine andere Sache ist aber, dass der Pi erkennt, dass zu einem Zeitpunkt nun etwas gemacht werden soll - und genau das ist gerade mein Problem. Wie bekomme ich es hin, dass der Pi dann genau zu diesen Zeiten den Relais schaltet?

    Einmal editiert, zuletzt von blabla333 (10. März 2014 um 21:48)

  • Ok, danke.
    Ich hatte diesen Thread gefunden, allerdings hört er genau da auf, wo es für mich spannend wird - eben bei dem Programm: Zeitschaltuhr jeden Tag andere Zeiten

    Verstehe ich das Prinzip richtig?

    Mit "While True" ergibt sich quasi eine Endlos-Schleife, d.h. er geht ständig die Schleife durch.
    Anschließend werden die Werte des bestimmten Tages aus dem Array gelesen... In der Schleife muss ich dann immer wieder die aktuelle Uhrzeit mit der hinterlegten Uhrzeit abgleichen und dann eben meine Funktion starten (Ein- oder Ausschalten)

    Ok, das hilft. Also kann ich mir den Ansatz mit dem Cron sparen.
    Muss mir nur noch überlegen, wie ich den Array am Besten anlege (wg. Schaltjahr oder ähnlichem). Naja, da muss ich mal sehen.

    Einmal editiert, zuletzt von blabla333 (10. März 2014 um 22:23)


  • Jupp, entweder hast Du irgendwo Datenquellen aus denen Du die Datenarrays generierst oder Du tippst die Werte manuell ein :wallbash:

    Ist es möglich deine Zeiten mit einer mathematischen Funktion (näherungsweise) zu beschreiben? Jeweils eine für die Ein- und Ausschaltzeit? Also f(x) [x=Tag des Jahres]...

    Dann sparst Du Dir das Anlegen des riesigen Arrays. :)

    Einmal editiert, zuletzt von Chris1705 (10. März 2014 um 23:14)

  • Schon mal was von calendar (Lib/calendar.py) gehört? Dort werden deine Schaltjahre bis zum Tag des jüngsten Gerichts berechnet :@


  • Also ich hätte meine Daten zusammen. Welches Format wäre denn am günstigsten?
    zeiten = [ ("06:03:45","18:34:23"), ("06:13:32","18:31:20") ]

    Denn so hätte ich das Problem, dass die Zeiten als String angesehen werden, so dass der Vergleich dann nicht mehr geht.
    Und wie erhalte ich den aktuellen Tag des Jahres?


    Code
    aktueller_tag = <wie ermittel ich den tag des Jahres, also aktuell 070?>
    aktuelle_zeit = <ermitteln>
    gpio_wert = <ermitteln>
    (start, ende) = zeiten(aktueller_tag)
    
    
    if start < aktuelle_zeit < ende and gpio_wert = 0
       # Einschalten und andere Dinge machen
    else
      # Ausschalten usw..

    Das ganze könnte auch eine kleine Korrektur vertragen *lächel*

    Einmal editiert, zuletzt von blabla333 (11. März 2014 um 09:37)

  • Ich kenne es von anderen Programmiersprachen eigentlich immer eher so, dass man mit Zeitstempeln arbeitet, also mit Zahlen und nicht mit Strings. Strings kann man ja eigentlich nicht mathematisch vergleichen.


  • Ich kenne es von anderen Programmiersprachen eigentlich immer eher so, dass man mit Zeitstempeln arbeitet, also mit Zahlen und nicht mit Strings. Strings kann man ja eigentlich nicht mathematisch vergleichen.

    wenn der String logisch aufgebaut ist dann kann man schon vergleichen und es geht sogar > < als

    2012 ist > 2010
    23:00:00 ist > 09:00:59

    jedenfalls was ich bis heute so programmiert habe, mir ist selbst in der Prüfmittelentwicklung kein Fehler aufgefallen. Wer es nicht glaubt dem steht frei den String 20140311 oder 102731 in eine Zahl zu wandeln und zu vergleichen. wozu gibt es atoul atoi atol ;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

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