Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Zeitschaltuhr Plugin?

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • makki
    antwortet
    Zitat von emax Beitrag anzeigen
    Ich kenne die die Details zum WG und den Plugins noch nicht. Aber spontan fällt mir cron ein ...?
    Grundsätzlich !
    Man muss bestehende Räder nicht neu erfinden.. Aber swiss' Plugin funktioniert auch, es führen eben immer viele Wege nach Rom..

    Um den Flash muss man sich wie bereits geschrieben nun keine Sorgen machen (die theoretischen Berechnungen gingen hier von hunderten Sensoren und deren RRD's aus!) Das schreibt 1000x mehr als ein gelegentliches Update der crontab.

    Makki

    Einen Kommentar schreiben:


  • swiss
    antwortet
    Hallo Chris

    Entscheidend ist dabei, dass Events exakt 1x gesendet werden - nicht vergessen und nicht mehrfach.
    Das Problem habe ich in der neusten Version gefixt.

    Zusätzlich zu den üblichen Zeiten bräuchte man aber noch benutzerdefinierte Zustände, wie "Urlaub und anwesend" oder "Urlaub und abwesend"
    Hast du da einen Vorschlag? Die Urlaubs und Sondertage könnte man in ein eigenes Array packen und in den Einstellungen der Schaltpunkte eine Option Sondertage => 1 /0 hinzufügen. Oder sogar noch eine Option Urlaub => 1 / 0 Für Schalpunkte die zwar an den Feiertagen NICHT aber wärend der Urlaubszeit SCHON geschaltet werden sollen.

    Einen Kommentar schreiben:


  • emax
    antwortet
    Zitat von swiss Beitrag anzeigen
    Eines der Probleme die mir aufgefallen sind ist der fest vorgegebene DPT der nur 0 und 1 erlaubt. Du hast aber oben im array Wert => '123' das geht schonmal nicht.
    Die '123' ist nur ein Eintrag zum ausprobieren, auf die Formate habe ich noch nicht weiter geachtet. Es ging mir mehr um die Zeitverarbeitung.

    Trotzdem macht es mich neugierig: Was geht daran nicht?
    Dann weiter...

    Code:
    (exists $Zeit->{Aktiv} && !$Zeit->{Aktiv}) and next;
    (exists $Zeit->{Min}  && !&matches($lMin,  $Zeit->{Min}))  and next;
    (exists $Zeit->{Std}  && !&matches($lStu,  $Zeit->{Std}))  and next;
    (exists $Zeit->{MTag} && !&matches($lMTag, $Zeit->{MTag})) and next;
    (exists $Zeit->{Mon}  && !&matches($lMon,  $Zeit->{Mon}))  and next;
    (exists $Zeit->{WTag} && !&matches($lWTag, $Zeit->{WTag})) and next;
    (exists $Zeit->{Msg}) and print "$Zeit->{Msg}, [URL="http://redaktion.knx-user-forum.de/lexikon/GA/"]GA[/URL][$Zeit->{GA}]\n";
    
    knx_write($Zeit->{GA},$Zeit->{Wert},1);
    öömm... Das funktioniert so auch nicht ganz.
    Ich habe das in einer kleinen Umgebung hier (ohne wiregate) laufen lassen, da sah es eigentlich ganz passabel aus. Wo liegt das Problem, also ich meine: Was habe ich übersehen, wo liegt es genau?

    Und zu guter letzt:

    Code:
    # Eigenen Aufruf-Zyklus auf 20sek. setzen # $plugin_info{$plugname.'_cycle'} = 20;  ------> Das wird so nicht vernünftig gehen, siehe Anmerkung. 
    
    # Anmerkung:  # Wenn man keine Sekunden verarbeitet, 
    # muss dieses Plugin alle 60 Sekunden aufgerufen werden, weil die aktuellen Ereignisse 
    # sonst 3 mal pro Minute getriggert werden. #
    # Es ist überdies sinnvoll, dafür zu sorgen, dass die Startzeit dieses Plugins 
    # mit der Zeit nicht "abdriftet", es sollte immer _exakt_ zur gleichen Sekunde laufen,
    # da sonst bei einem Minutenüberlauf Ereignisse verloren gehen können. 
    
    $plugin_info{$plugname.'_cycle'} = 60;
    Danke für den Hinweis. Daran habe ich nicht gedacht. Bei 60s kann es aber im dümmsten fall geschehen, das das Ereihniss nie WAHR wird, wenn das Plugin z.B. genau um 21:19:99 [ich vermute, du meinst '59'] ausgeführt wird und die Schaltzeit 21:20 ist, ist das Ergebnis beim ersten Durchlauf FALSE wenn dann nach 60sek nochmal ausgeführt wird, ist 21:20:99 wenn dan noch durch ein anderes Plugin eine millisekunde länger gebraucht wird ist bereits 21:21:00 und das Ergebnis ist wieder FALSE.
    Ich kenne dieses Problem. Deshalb war 'cron' mein erster Gedanke, dort ist das gelöst

    Man könnte ein "Fenster" bzw. eine Toleranz einbauen, innerhalb derer der Zeitpunkt 'gültig' ist, naheliegend wäre alles, was eindeutig unter 60 Sekunden liegt.


    Wie auch immer: Wäre nett, wenn Du mir erklärst, WAS an den Sachen oben nicht geht, da vermisse ich etwas Handfestes. ich will ja dazu lernen :-)

    Einen Kommentar schreiben:


  • Chris M.
    antwortet
    Sorry, dass ich den Text nur überflogen habe.

    Eine ordentliche Abhandlung von Zeitabhängigen-Plugins ist IMHO auch die z.Zt. gravierendste Lücke bei den Plugins. Neben einer gescheiten Zeitschaltuhr (wie hier) auch noch Themen wie Delays in einzelnen Plugins (wie z.B. ein Treppenhausautomat), wobei ich verstehe, dass es in diesem Thread nur um das Thema Zeitschaltuhr gehen soll.

    Entscheidend ist dabei, dass Events exakt 1x gesendet werden - nicht vergessen und nicht mehrfach.

    Das Vergessen zu vermeiden kann bei der offensichtlichen Implementierung (= Periodisch) nur dadurch gelöst werden, dass das Plugin öfters als dessen Granularität aufgerufen wird. D.h. wenn man Zeiten per Stunden und Minuten festlegt (also auf die Sekunden verzichtet) muss das Plugin schneller als 60s wiederholt werden. Z.B. alle 30 Sekunden.
    (Bei einer Rate von 60s könnte es in dummen Zufällen dazu kommen, dass eine Minute knapp übersprungen wird)

    Um nun zu verhindern, dass ein Wert öfters gesendet wird, muss also noch der Status der Ausführung gemerkt werden (und zu einem geeigneten Zeitpunkt zurückgesetzt).
    (Wenn man das mit den Stati gut löst, kann man auch mit einem 60s Zyklus das Problem lösen und keine Events verpassen...)

    Die Dinge, die ich bei mir auf diese Art gelöst habe, laufen sehr gut. Nur ist das leider jedes mal ein übles gebastel - ein ordentlich spezialisiertes Plugin mit guter Syntax wäre Gold wert.

    Zusätzlich zu den üblichen Zeiten bräuchte man aber noch benutzerdefinierte Zustände, wie "Urlaub und anwesend" oder "Urlaub und abwesend"

    Einen Kommentar schreiben:


  • swiss
    antwortet
    Das funktioniert so nicht ganz.

    Eines der Probleme die mir aufgefallen sind ist der fest vorgegebene DPT der nur 0 und 1 erlaubt. Du hast aber oben im array Wert => '123' das geht schonmal nicht.

    Dann weiter...

    Code:
    (exists $Zeit->{Aktiv} && !$Zeit->{Aktiv}) and next;
    (exists $Zeit->{Min}  && !&matches($lMin,  $Zeit->{Min}))  and next;
    (exists $Zeit->{Std}  && !&matches($lStu,  $Zeit->{Std}))  and next;
    (exists $Zeit->{MTag} && !&matches($lMTag, $Zeit->{MTag})) and next;
    (exists $Zeit->{Mon}  && !&matches($lMon,  $Zeit->{Mon}))  and next;
    (exists $Zeit->{WTag} && !&matches($lWTag, $Zeit->{WTag})) and next;
    (exists $Zeit->{Msg}) and print "$Zeit->{Msg}, [URL="http://redaktion.knx-user-forum.de/lexikon/GA/"]GA[/URL][$Zeit->{GA}]\n";
    
    knx_write($Zeit->{GA},$Zeit->{Wert},1);
    öömm... Das funktioniert so auch nicht ganz. Wenn es soo einfach wäre hät ich nicht mit mehreren verschachtelten IF abfragen gearbeitet Aber egal. Wenn es der Wunsch der Merheit ist, werde ich die Auswertung der linknx befehle noch integrieren.

    Und zu guter letzt:

    Code:
    # Eigenen Aufruf-Zyklus auf 20sek. setzen # $plugin_info{$plugname.'_cycle'} = 20;  ------> Das wird so nicht vernünftig gehen, siehe Anmerkung. 
    
    # Anmerkung:  # Wenn man keine Sekunden verarbeitet, 
    # muss dieses Plugin alle 60 Sekunden aufgerufen werden, weil die aktuellen Ereignisse 
    # sonst 3 mal pro Minute getriggert werden. #
    # Es ist überdies sinnvoll, dafür zu sorgen, dass die Startzeit dieses Plugins 
    # mit der Zeit nicht "abdriftet", es sollte immer _exakt_ zur gleichen Sekunde laufen,
    # da sonst bei einem Minutenüberlauf Ereignisse verloren gehen können. 
    
    $plugin_info{$plugname.'_cycle'} = 60;
    Danke für den Hinweis. Daran habe ich nicht gedacht. Bei 60s kann es aber im dümmsten fall geschehen, das das Ereihniss nie WAHR wird, wenn das Plugin z.B. genau um 21:19:99 ausgeführt wird und die Schaltzeit 21:20 ist, ist das Ergebnis beim ersten Durchlauf FALSE wenn dann nach 60sek nochmal ausgeführt wird, ist 21:20:99 wenn dan noch durch ein anderes Plugin eine millisekunde länger gebraucht wird ist bereits 21:21:00 und das Ergebnis ist wieder FALSE. Da aber wie du richtig gesehen hast bis jetzt immer 3mal gesendet wurde, habe ich jetzt eine Überprüfung nachgerüstet, die überprüft, ob der Kontakt bereits den Wert des Schaltpunktes besitzt. Wenn ja wird dieser Schaltpunkt direkt übersprungen und beim nächsten Schaltpunkt weiter gemacht.

    PS: Gefixte Version im SVN online.

    Einen Kommentar schreiben:


  • emax
    antwortet
    Ohne nun ein Wiregate zu besitzen oder irgendwelche Doku dazu zu haben, hab ich anhand des zuvor geposteten plugins mal was zusammengenagelt.

    Vielleicht kann das ja mal einer ausprobieren, es erlaubt Listen oder Bereiche von Tagen, Stunden, Minuten usw, und ist leicht zu erweitern. Man könnte z.B. bei Ausführung eine Nachricht verschicken, dafür habe ich zur Veranschaulichung das 'Msg' Schlüsselwort verwendet. Aber es gingen natürlich beliebig mehr Erweiterungen in der Zeittabelle.

    Die Funktionalität ist grob an Cron orientiert, das 'undef' in der Zeittabelle entspricht dabei dem cron - asterisk. Irrelevante Werte kann man auch ganz aus der Tabelle weglassen, dieser Zustand ist abgefangen. Über das Schlüsselwort 'Aktiv' kann man einen Eintrag stilllegen, ohne ihn löschen zu müssen. Details zu Tages-, Monats- und den anderen Werten müsste ich bei Gefallen natürlich noch genauer dokumentieren.

    Auf Versionsangabe und Copyright hab ich jetzt mal verzichtet, es ist ja nur ein Versuch.

    Ich konnte es allerdings nicht testen.

    Code:
    # Plugin zum Zeitabhängigen Schalten von GA's (Schaltuhr)
    # License: GPL (v2)
    # version von emax
    
    ####################
    ###Einstellungen:###
    ####################
    
    my @Zeiten = 
        ( 
          { Name=>'Test',           Aktiv=>'1', Std=>undef, Min=>undef, MTag=>undef, Mon=>undef, WTag=>undef,   Wert=>'123', GA=>'1/1/30' }, 
          { Name=>'Bewaesserung',   Aktiv=>'1', Std=>'7',   Min=> '0',  MTag=>'3',   Mon=>'4-9', WTag=>'1-5',   Wert=>'1',   GA=>'1/1/30', Msg=>'Bewaesserung ein'},
          { Name=>'AussenlichtEin', Aktiv=>'1', Std=>'19',  Min=>'30',  MTag=>'4',   Mon=>undef, WTag=>'1,3,5', Wert=>'1',   GA=>'1/2/40' },
          { Name=>'AussenlichtAus', Aktiv=>'1', Std=>'7',   Min=> '0',  MTag=>undef, Mon=>undef, WTag=>'2,4,6', Wert=>'0',   GA=>'1/2/40' }
        );
    
    ######################
    ##ENDE Einstellungen##
    ######################
    
    use POSIX;
    
    # Eigenen Aufruf-Zyklus auf 20sek. setzen
    # $plugin_info{$plugname.'_cycle'} = 20;  ------> Das wird so nicht vernünftig gehen, siehe Anmerkung.
    
    # Anmerkung: 
    # Wenn man keine Sekunden verarbeitet, 
    # muss dieses Plugin alle 60 Sekunden aufgerufen werden, weil die aktuellen Ereignisse 
    # sonst 3 mal pro Minute getriggert werden.
    #
    # Es ist überdies sinnvoll, dafür zu sorgen, dass die Startzeit dieses Plugins 
    # mit der Zeit nicht "abdriftet", es sollte immer _exakt_ zur gleichen Sekunde laufen,
    # da sonst bei einem Minutenüberlauf Ereignisse verloren gehen können.
    
    $plugin_info{$plugname.'_cycle'} = 60;
    
    ###################################################################
    # Auswertung von Bereichs und Listenvergleichen                   #
    # Prüft, ob ein Wert zu einer Liste oder in einen Bereich passt   #
    ###################################################################
    sub matches
    {
        my ($value, $def) = @_;  # Zu prüfender Wert, Bereichsdefinition
        (!$def) and return 1;
        foreach (split(/,/, $def))
        {        
            s/\s+//g;
            (/^$value$/) and return 1;
            (/^([\d]+)-(\d+)/) and return ($value >= $1 && $value <= $2);
        }
        return 0;
    }
    
    my ($lSec,$lMin,$lStu,$lMTag,$lMon,$lJahr,$lWTag,$lJTag,$isdst) = localtime(time);
    $lJahr += 1900;
    
    foreach my $Zeit (@Zeiten) 
    {
        (exists $Zeit->{Aktiv} && !$Zeit->{Aktiv}) and next;
    
        (exists $Zeit->{Min}  && !&matches($lMin,  $Zeit->{Min}))  and next;
        (exists $Zeit->{Std}  && !&matches($lStu,  $Zeit->{Std}))  and next;
        (exists $Zeit->{MTag} && !&matches($lMTag, $Zeit->{MTag})) and next;
        (exists $Zeit->{Mon}  && !&matches($lMon,  $Zeit->{Mon}))  and next;
        (exists $Zeit->{WTag} && !&matches($lWTag, $Zeit->{WTag})) and next;
    
        (exists $Zeit->{Msg}) and print "$Zeit->{Msg}, GA[$Zeit->{GA}]\n";
    
        knx_write($Zeit->{GA},$Zeit->{Wert},1);   
    }

    Einen Kommentar schreiben:


  • swiss
    antwortet
    @Bodo:

    Danke für die Erklärung.

    Hmm. Wäre eigentlich kein grosses Problem das so zu lösen. Fragt sich welche Variante besser ankommt. Vieleicht wäre eine Hybrid-variante gut. (2 mögliche Configzeilen je nach Gusto)?

    PS: Version 0.4 ist jetzt im SVN Online. Da die Funktion localtime nicht die Kalenderwoche lieferte wurde die Berechnung dafür in einer eigenen Subroutine ergänzt.

    Einen Kommentar schreiben:


  • Bodo
    antwortet
    Hoi

    Naja linknx ist eigentlich nicht besser als das was Du machst.
    Code:
    <at type="sunrise" wdays="1234567" />
    heisst einfach an jedem Wochentag
    Code:
    wdays="2356"
    heisst Di,Mi,Fr,Sa
    Code:
    exception="no"
    heisst an Ausnahmetagen nicht ausführen
    Ausnahmetage sind Feiertage oder Ferientage
    Code:
    <exceptiondays>
          <date day="1"  month="1"  /> <!-- Neujahrstag -->
          <date day="2"  month="1"  /> <!-- Berchtoldstag -->
          <date day="1"  month="5"  /> <!-- Tag der Arbeit -->
          <date day="1"  month="8"  /> <!-- Nationalfeiertag Schweiz -->
          <date day="25" month="12" /> <!-- Weihnachtstag -->
          <date day="26" month="12" /> <!-- Stephanstag -->
          <date day="22" month="4" year="2011" /> <!-- Karfreitag -->
          <date day="25" month="4" year="2011" /> <!-- Ostermontag -->
          <date day="2"  month="6" year="2011" /> <!-- Auffahrt Do -->
          <date day="13" month="6" year="2011" /> <!-- Pfingstmontag -->
        </exceptiondays>
    Ich glaub' das war's schon.

    Einen Kommentar schreiben:


  • swiss
    antwortet
    Man könnte natürlich die Wochentage abkürzern. Dann wäre die Configzeile etwas kürzer. Was haltet ihr davon? Sind noch weitere Wünsche? Eine Abkürzun für "alle Wochentage" sollte kein Problem sein. Muss mir nur noch überlegen wie ich das am smartesten auswerte.

    PS Wenn es hier viele gibt, die mit der linknx Variante besser zurecht kommen, denke ich über eine Version nach, die analog zu linknx konfiguriert werden kann. Dazu müsste mir aber jemand mal die Syntax erklären. Ich kenne mich in linknx nicht aus.

    Einen Kommentar schreiben:


  • swiss
    antwortet
    So die neue Version mit KW und Monat ist im SVN online. Allerdings lassen sich momentan pro schaltpunkt nur 1 Monat oder 1 KW eintragen. Konnte leider noch nicht ausgibig getestet werden und ist daher BETA.

    Eine Bitte an die Leute, die das Plugin testen wollen. Bitte Fehler und anregungen hier melden, damit das Plugin weiter verbessert werden kann.

    Einen Kommentar schreiben:


  • emax
    antwortet
    Ähm, mit "Tag" habe ich allerdings so was gemeint, das kann dann natürlich alles Mögliche sein ;-)

    So ist das mit dem Denglisch: Berufskrankheit, pardon

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Ne, ist schon ok. Im Moment ist es ja im Grunde eine Wochenschaltuhr. Damit müsste man schon ne Weile hinkommen.
    Vl. noch ne Abkürzung, das wenn man keinen Tag setzt, es alle Tage meint, aber dann paßt es schon.
    Knifflig wäre ja noch, sich durch die Sommer-/Winterzeitsachen nicht aus dem Tritt bringen zu lassen. Aber naja.

    Einen Kommentar schreiben:


  • StefanW
    antwortet
    Zitat von emax Beitrag anzeigen
    Die Frage könnte sein, ob häufiges I/O auf den internen Speicher problematisch ist. Das Ding speichert doch sicher auf eine SSD, und die mögen dauernde Schreiboperationen ja nun nicht so sehr ...
    Keine Sorge. Das SSD ist zum einen ein Industrial Grade SLC, das läßt um Faktoren mehr Schreibvorgänge zu als die üblichen (billigen) MLC. Macht auch ein Drittel des HW-Preises aus.

    Zum anderen ist ein Schreibcache aktiv, es wird nur alle viertel Stunde wirklich auf das SSD geschrieben (und bei bestimmten Trigger). Darum soll zum runterfahren auch der Ethernet-Stecker gezogen werden, das WG flashed den Cache, fährt runter und piepst dann, dann darf man ihm den Strom nehmen.

    Nach unseren Rechnungen gehen wir von einer Haltbarkeit von 12 bis 15 Jahren für das SSD bei der eingestellten Schreibrate aus.

    LG

    Stefan

    Einen Kommentar schreiben:


  • swiss
    antwortet
    Zitat von greentux Beitrag anzeigen
    Oder man nimmt doch die crontab Syntax her. Dann hätte man gleich "jeden Dienstag", "jeden Tag 23.15 Uhr" gleich miterschlagen...
    Dann wird es wieder komplizierter das Plugin zu schreiben, da man jeden TEXT in bestimmte Optionen (Werte) umwandeln müsste. Aber mal abgesehen davon. Was wird noch gebraucht?

    Nur schalten in der KW XX?
    Nur schalten im Monat XX?

    Einen Kommentar schreiben:


  • greentux
    antwortet
    Oder man nimmt doch die crontab Syntax her. Dann hätte man gleich "jeden Dienstag", "jeden Tag 23.15 Uhr" gleich miterschlagen...

    Einen Kommentar schreiben:

Lädt...
X