Programmcode zur Steuerung Rollo, funktioniert, aber ist das schon optimal

  • Hey Leute,

    ich bin jetzt nicht als Profi Progger hier unterwegs, aber ich möchte doch mal an und wann auch was lernen und hab mir einen Code zusammengebaut, um meine Zentralesteuerung meines Rollos um zusetzen.

    Als erstes habe ich für jedes Zimmer und für jeden Zustand (Rauf oder Runterfahren) jeweils ein Script gemacht, aber das war mir klar, dass das nicht der Weißheit letzter Schluß war. Daher hab ich nun was rumprobiert und es kam was raus, wo ich denke ich kann stolz auf mich sein.

    Aber hier nun der Code erstmal:

    Ich hoffe man kann verstehen, was da Passiert, auch wenn der Hardwareaufbau im Detail nicht bekannt ist.


    Michael

    PS: vielleicht Hilft der Code anderen auch mal bei ähnlichen Ideen, daher hoffe ich mit vernünftigen und ausreichenden Kommentaren bestückt.

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Programmcode zur Steuerung Rollo, funktioniert, aber ist das schon optimal? Schau mal ob du hier fündig wirst!

  • OK, gut. Aber wann steuerst Du das Rollo rauf und wann runter? Ich könnte mir vorstellen, dass man das Rollo bei viel Wind, bei starker Sonne aber nur im Sommer, wenn es innen schon wärmer als 23 Grad ist, sowie regelmäßig bei Dukelheit abends (abhängig von der Jahreszeit) runterfahren möchte, und morgens je nach Helligkeit draussen und aber nicht vor der Zeit, wo die Familie aufstehen soll hochfährt, es sei denn es ist Surm oder Hitze.
    Automatisch zusammengefügt:
    Vielleicht noch zusammen mit einer Funktion, dass das Rollo halb geöffnet wird, wenn das zugehörige Fenster zum Lüften aufgemacht wird.

    Einmal editiert, zuletzt von wend (15. Januar 2017 um 11:36)

  • Interessanter Ansatz, aber ich habe die Rollos in den Räumen zusammengefasst. Also wenn kann ich alle Rollos im Raum hoch fahren oder keines. Hab Pro Raum 2 Rollos. Vor Ort sind örtliche Taster mit denen ich diese seperat ansteuern kann. Aber das Script selbst dient in erster Linie zur Ansteuerung. Die "Kontrolle" über Details kommt von Außen. Also hab das SHC System seit kurzem am Laufen, vorher war es "nur" ein Crontab, der die zeitliche Steuerung übernommen hat.

    Und normal macht Starker Wind einem Rollo nichts aus. Es ist ja kein außen angebrachter Sonnenschutz in Lammellenform. Aber zu zusätzlichen Bedingungen zum runter fahren des Rollos werde ich mir noch gedanken machen werden. Da wäre in erster Linie starke Sonneneinstrahlung im Sommer. Und naja Lüften mach ich tagsüber, da ist in der Regel das Rollo oben. Aber wie gesagt, das Script soll in erster Linie die Stuerung der Rollos selbst übernehmen. Die Ereignisskontrolle kommt von außen durch SHC z.B.

    Aber trotzdem danke für die Tipps.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Prinzipiell sieht das Script gut aus, auch wenn nicht der Standard Aufbau eines Python Scripts eingehalten wurde.
    Was nur noch nicht aus deinem Beitrag hervor geht ist wie das Script angesprochen / aufgerufen werden soll - also schon mit welchen Parametern es gestartet wird, aber nicht was entscheidet wann welches Rolle in welchen Zustand gefahren werden soll.

    Ein kleinen Fehler hast du in der rollo() Funktion: bei "sys.exit" fehlen die "()" damit es ein Methodenaufruf ist. Allerdings würde ich sagen das beide sys.exit() gänzlich überflüssig sind, da ausser der if und elif keine weitere Verarbeitung stattfindet.

    Was dem Verständnis helfen würde wäre die Lesbarkeit des Codes. Leider passen die Einrückungen für die Kommentare nicht, was mich beim ersten mal lesen verwirrt hat. Das erste Kommentar in der rollo() Funktion ist mit 2 Leerzeichen eingerückt die nachfolgende if bzw die nachfolgenden Einrückungen aber mit 8 Leerzeichen. Das Kommentar zur elif hat gar keine Einrückung. Normal wären pro Einrückung 4 Leerzeichen.
    Auch wären Leerzeichen beim angeben von Parametern nicht verkehrt also bei den p.digital_write() Aufrufen.
    Kommentare sollten das was geschieht aufwerten - aber wenn es offensichtlich ist brauch man es nicht kommentieren, wie zB was die import Zeilen machen/bewirken.

    Ich würde folgendes vorschlagen - damit sich das Script auch an den typischen Aufbau hält:

    [code=php]
    #!/usr/bin/python2

    # Rollosteuerung mit PiFace Digital
    # erstellt am: 15.01.2017
    # Version: 1.1

    import sys
    import pifacedigitalio as piface
    from time import sleep


    # Ort mit Relais Verknuepfen
    relais = {"wz" : 0, "ez" : 2, "sz" : 4, "kiz" : 6}


    # Funktion "rollo" definieren
    def rollo(ort, zustand, delay):
    # Runter fahren
    if zustand == "1":
    # Fahr-Relais aktivieren, Richtungs-Relais ist aus
    piface.digital_write(relais[ort], 1)
    sleep(delay)
    piface.digital_write(relais[ort], 0)
    # Rauf fahren
    elif zustand == "0":
    # Erst Richtigungs-Relais schalten, dann Fahr-Relais schalten
    piface.digital_write(relais[ort]+1, 1)
    piface.digital_write(relais[ort], 1)
    sleep(delay)
    piface.digital_write(relais[ort]+1, 0)
    piface.digital_write(relais[ort], 0)


    def main():
    if len(sys.argv) < 3:
    print "Usage: %s <ort> <zustand>" % sys.argv[0]
    sys.exit()
    piface.init()
    rollo(sys.argv[1], sys.argv[2], 20)


    if __name__ == "__main__":
    main()


    #EOF
    [/php]

  • Okay,

    das mit dem woher der Aufruf kommt, hätte ich ergänzen können / sollen. Dann hole ich das fix nach. Auf dem Raspberry Pi läuft das Smarthome System was jemand hier aus dem Forum entwickelt und super umgesetzt hat. Und dieses ruft einfach dieses Script auf und gestalltet so die "Planung" meines Rollolaufplans (Geiles Wort find ich mal :) ).

    Aber werd mir dein Code nochmal angucken, möchte auf Dauer ja was dazu lernen und das geht am besten durch eure Tipps. Auch wenn mein Plan nicht ist Vollprofi zu werden. Dafür fehlt dann doch Zeit. Der Tag hat ja leider nur 24 Stunden.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Hallo,

    was man IMHO noch einbauen sollte, ist eine Wert-Prüfung für den `Zustand`. Weil: Wenn man das Skript z.B. mit `rollo wz 666` aufruft, passiert genau: nichts. Das Skript läuft, macht nichts, weil weder der `if` noch der `elif` Block erfüllt sind und kehrt zum Prompt zurück. Und - wenn man das Skript nicht kennt - weiß man nicht, ob jetzt nichts oder was "unsichtbares" passiert ist.

    Die Prüfung kann z.B. direkt mit der Verwendung des argparse-Moduls erledigen. Hat zusätzliche den Vorteil, dass an a) Hilfstexte hat, b) der Ort auf geprüft werden kann, c) man nicht mit `sys.argv` hantieren muss. Klar, bei nur zwei Parametern / Optionen geht es auch ohne, aber mit ist IMHO eleganter.

    Gruß, noisefloor

  • Stimmt, hab ich vorher so nich dran gedacht. Aber wo es erwähnst machts schon Sinn, zu checken ob entweder 0 oder 1 eingegeben ist. Da sonst das Programm unnötig arbeitet. Werd ich gleich mal ergänzen.

    meigrafd: Mit dem alternativen Code werde ich mich auch noch beschäftigen. Aber das wird ein paar Tage dauern. Kommt aber noch.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (16. Januar 2017 um 22:10)

Jetzt mitmachen!

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