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

    #16
    Naja, das ist kürzer, als diese lange Wochentagszeile
    Ausserdem könnte man gleich noch mtags ergänzen, und damit ggf Monate festlegen.
    Ziel könnte ja sein, die Gelbe Tonne Tage zu melden
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      #17
      Also die version mit DPT ist im SVN online. mtags kann ich auch noch ergänzen. Sollte dann aber so sein, dass man mtag auch leer lassen kann wen ein Schaltpunkt jede Woche ausgeführt werden soll.

      Das einstellen der Wochentage in Textform finde ich persönlich aber einfacher, da es auch durch absolute Laien logisch ist, weil wtag beginnt mit 0 für sonntag und zählt dann bis 6 hoch. Das ist nicht unbedingt für jeden sofort klar.
      Gruss Patrik alias swiss

      Kommentar


        #18
        Oder man nimmt doch die crontab Syntax her. Dann hätte man gleich "jeden Dienstag", "jeden Tag 23.15 Uhr" gleich miterschlagen...
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


          #19
          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?
          Gruss Patrik alias swiss

          Kommentar


            #20
            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

            Kommentar


              #21
              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.
              Derzeit zwischen Kistenauspacken und Garten anlegen.
              Baublog im Profil.

              Kommentar


                #22
                Ä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
                Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                Kommentar


                  #23
                  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.
                  Gruss Patrik alias swiss

                  Kommentar


                    #24
                    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.
                    Gruss Patrik alias swiss

                    Kommentar


                      #25
                      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.
                      Grüsse Bodo
                      Fragen gehören ins Forum, und nicht in mein Postfach;
                      EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                      Kommentar


                        #26
                        @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.
                        Gruss Patrik alias swiss

                        Kommentar


                          #27
                          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);   
                          }
                          Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                          Kommentar


                            #28
                            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.
                            Gruss Patrik alias swiss

                            Kommentar


                              #29
                              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"
                              TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                              Kommentar


                                #30
                                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 :-)
                                Kein Support per PN: Fragen bzw. Fehlermeldungen bitte im Forum posten.

                                Kommentar

                                Lädt...
                                X