Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitschaltuhrplugin

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

    [wiregate] Zeitschaltuhrplugin

    Hallo, habe versucht gestern abend das Zeitschaltuhrplugin für meine Rolladen zu verwenden.
    Später möchte ich es ggf. erweitern um auf der Südseite die Rolladen auf ca 50% fahren zu können, wenn die Sonne einen gewissen Wert erreicht hat (da weiss ich noch nicht wie)

    Heute morgen passierte NIX

    Davon abgesehen scheint es dem Wiregate egal zu sein, ob da Scriptausführungszeit 20 oder 60 Sekunden steht, denn er führt es trotzdem alle 60 aus...

    Code:
    # Plugin zum Zeit abhängigem schaten von GA's (Schaltuhr)
    # Version 0.1 03.07.2011
    # Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
    # License: GPL (v2)
    # Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss!
    
    
    ####################
    ###Einstellungen:###
    ####################
    my @Schaltzeiten;
    
    push @Schaltzeiten, { name => "Wohnzimmer groß", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 08, Minuten => 00, Befehl => 0, ga => '5/0/4' };
    push @Schaltzeiten, { name => "Wohnzimmer groß", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 00, Befehl => 1, ga => '5/0/4' };
    
    push @Schaltzeiten, { name => "Wohnzimmer links", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 08, Minuten => 00, Befehl => 0, ga => '5/0/8' };
    push @Schaltzeiten, { name => "Wohnzimmer links", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 00, Befehl => 1, ga => '5/0/8' };
    
    push @Schaltzeiten, { name => "Wohnzimmer mitte", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 08, Minuten => 00, Befehl => 0, ga => '5/0/12' };
    push @Schaltzeiten, { name => "Wohnzimmer mitte", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 00, Befehl => 1, ga => '5/0/12' };
    
    push @Schaltzeiten, { name => "Wohnzimmer rechts", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 08, Minuten => 00, Befehl => 0, ga => '5/0/16' };
    push @Schaltzeiten, { name => "Wohnzimmer rechts", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 00, Befehl => 1, ga => '5/0/16' };
    
    push @Schaltzeiten, { name => "Küche", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 08, Minuten => 00, Befehl => 0, ga => '5/0/20' };
    push @Schaltzeiten, { name => "Küche", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 1, sonntag => 1, Stunden => 19, Minuten => 00, Befehl => 1, ga => '5/0/20' };
    
    ######################
    ##ENDE Einstellungen##
    ######################
    
    use POSIX;
    
    # Eigenen Aufruf-Zyklus auf 20sek. setzen
    $plugin_info{$plugname.'_cycle'} = 20;
    
    #Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu übersetzen
    my @Wochentag = ('sonntag', 'montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag');
    
    my $sec;
    my $min;
    my $hour;
    my $mday;
    my $mon;
    my $year;
    my $wday;
    my $yday;
    my $isdst;
    
    
    foreach my $element (@Schaltzeiten) {
    
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
        $year += 1900;
    
        if ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min) {
            knx_write($element->{ga},$element->{Befehl},1);
        }
    next;
    }

    #2
    Hallo. Das nix passiert ist seltsam... Aber diw Ausführungszeit von 20 Sekunden solltest du auf keinen Fall ändern. Das Plugin wird dabei sehr wohl alle 20 Sekunden aufgerufen aber nur 1 mal pro Minute abgearbeitet. Das ist bewusst so gelöst. Aber das ausfürlich zu erklären ist am Handy echt mühsam einzutippen...

    Das Problem wird daran liegen, dass du Sonderzeichen (scharfes Doppel s) verwendet hast. Erlaubt sind nur UTF-8 zeichen ohne Umlaute und Sonderzeichen.
    Gruss Patrik alias swiss

    Kommentar


      #3
      Habs jetzt gerade nochmal mit dem ursprünglichen Plugin versucht,

      https://knx-user-forum.de/forum/supp...wiregate/15278

      selbst da tut sich nix, gestern abend hat das jedoch funktioniert...

      Das Wiregate setzt auch immer 60 sekunden als ausführungszeit, anstelle der 20

      Ich verstehe es nicht, warum das WG mich nicht mag

      Kommentar


        #4
        Du hast die Urälteste Version erwischt die es von dem Plugin gibt...

        Ich würde mal die etwas neuere Version 0.5 versuchen:

        Code:
        # Plugin zum Zeit abhängigem schaten von GA's (Schaltuhr)
        # Version 0.5 BETA 03.07.2011
        # Copyright: swiss (https://knx-user-forum.de/members/swiss.html)
        # License: GPL (v2)
        # Aufbau möglichst so, dass man unterhalb der Einstellungen nichts verändern muss!
        
        
        ####################
        ###Einstellungen:###
        ####################
        my @Schaltzeiten;
        
        #Pro Schaltpunkt einfach den unten stehenden Eintrag kopieren und anpassen.
        
        push @Schaltzeiten, { name => "bewässerung_ein", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 21, Minuten => 02, Wert => 1, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
        
        push @Schaltzeiten, { name => "bewässerung_aus", montag => 1, dienstag => 1, mittwoch => 1, donnerstag => 1, freitag => 1, samstag => 0, sonntag => 1, Stunden => 21, Minuten => 03, Wert => 0, DPT => 1, ga => '2/0/0', KW => '', Monat => '' };
        
        ######################
        ##ENDE Einstellungen##
        ######################
        
        use POSIX;
        use Time::Local;
        
        # Eigenen Aufruf-Zyklus auf 20sek. setzen
        $plugin_info{$plugname.'_cycle'} = 20;
        
        #Hier wird ein Array angelegt, um die Wochentagsnummer von localtime zu übersetzen
        my @Wochentag = ('sonntag', 'montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag');
        
        my $sec; #Sekunde
        my $min; # Minute
        my $hour; #Stunde
        my $mday; #Monatstag
        my $mon; #Monatsnummer
        my $year; #Jahr
        my $wday; #Wochentag 0-6
        my $yday; #Tag ab 01.01.xxxx
        my $isdst;
        
        ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
        $year += 1900;
        $mon += 1;
        
        my $kw = getWeekNumber($year, $mon, $mday);
        
        foreach my $element (@Schaltzeiten) {
            if (knx_read($element->{ga},0,$element->{DPT}) ne $element->{Wert}) {
                if ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} ne '') {
                    if ($element->{KW} == $kw) {
                        knx_write($element->{ga},$element->{Wert},$element->{DPT});
                        next;
                    } else {
                        next;
                    }
                } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{Monat} ne '') {
                    if ($element->{Monat} == $mon) {
                        knx_write($element->{ga},$element->{Wert},$element->{DPT});
                        next;
                    } else {
                        next;
                    }
                } elsif ($element->{$Wochentag[$wday]} == 1 && $element->{Stunden} == $hour && $element->{Minuten} == $min && $element->{KW} eq '' && $element->{Monat} eq '') {
                    knx_write($element->{ga},$element->{Wert},$element->{DPT});
                    next;
                }
            }    
        next;
        }
        
        sub getWeekNumber {
        my ($year, $month, $day) = @_;
        my $weekNumber = checkWeekNumber($year, $month, $day);
        # wenn Wochennummer gleich 0, dann ist das aktuelle Datum
        # in der Woche vor dem 4. Januar
        # also in der letzten Woche des letzten Jahres
        if ($weekNumber eq 0)
        {
        # Wochennummer des letzten Woche des letzten Jahres suchen
        $weekNumber = checkWeekNumber(($year - 1), 12, 31);
        
        # wenn die Wochennummer größer als 52 ist
        # dann prüfen ob diese Wochennummer korrekt ist oder
        # sie bereits die erste Woche des aktuellen Jahres ist
        if ($weekNumber gt 52)
        {
        $weekNumber = checkWeekNumber($year, 1, 1);
        # wenn der 1. Januar des aktuellen Jahres in der Woche 0 liegt
        # dann ist es die Woche 53
        if ($weekNumber eq 0)
        {
        $weekNumber = 53;
        }
        }
        }
        # wenn die Wochennummer größer als 52 ist
        # dann prüfen ob diese Wochennummer korrekt ist oder
        # sie bereits die erste Woche des nächsten Jahres ist
        elsif ($weekNumber gt 52)
        {
        $weekNumber = checkWeekNumber(($year + 1), 1, 1);
        # wenn der 1. Januar des nächsten Jahres in der Woche 0 liegt
        # dann ist es die Woche 53
        if ($weekNumber eq 0)
        {
        $weekNumber = 53;
        }
        }
        
        return ($weekNumber);
        }
        
        sub checkWeekNumber {
        my ($year, $month, $day) = @_;
        
        # 4. Januar als erste Woche erstellen
        my $firstDateTime = timelocal(0, 0, 12, 4, 0, $year);
        # Wochentag des 4. Januar ermitteln
        my $dayOfWeek = (localtime($firstDateTime))[6];
        $dayOfWeek = abs((($dayOfWeek + 6) % 7));
        # geh zu Wochenanfang (Montag) zurück
        $firstDateTime -= ($dayOfWeek * 3600 * 24);
        
        # aktuelles Datum erstellen
        my $currentDateTime = timelocal(0, 0, 14, $day, ($month - 1),$year);
        
        # Differenz in Tagen berechnen
        my $diffInDay = ($currentDateTime - $firstDateTime) / 3600 / 24;
        # Anzahl der Wochen zwischen aktuellem Datum und 4. Januar berechnen
        my $weekNumber = floor($diffInDay / 7) + 1;
        
        return ($weekNumber);
        }
        Die Version 0.1 hatte noch einige Fehler drin...
        Gruss Patrik alias swiss

        Kommentar


          #5
          ...der FEHLER war, dass die 8 eine führende 0 voran hatte, was sie...warum auch immer.... nicht haben darf !

          puh

          Kommentar


            #6
            ...noch ne Sache, die ich nicht verstehe.

            in den KNX Grundeinstellungen des WG ist als lokale KNX Adresse 1.1.254 eingetrtagen.

            Wenni ch ejtzt in der ETS den Gruppenmonitor mitlaufen lasse, protokolliert dieser aber, dass die Befehle von 15.15.11 abgesetzt werden.

            Prinzipiell nicht schlimm, aber woher rührts ?

            Kommentar

            Lädt...
            X