Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: Logikprozessor.pl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    1. Da der Logikprozessor delay-Timings in %plugin_info speichert, werden diese auch nach einem Neustart (ggf. um die Boot-Zeit verzögert) ausgeführt. Auch nach einem Neustart des Wiregate-Daemon und natürlich auch nach Modifikationen des Logikprozessors oder dessen .conf.

    2. Wenn es wirklich wichtig ist, bitte testen!

    3. Mein Wiregate (mit modifiziertem WG-Daemon) hat schon sehr, sehr lange (gefühlt ein Jahr) keinen unbeabsichtigten Neustart des Systems oder des Daemons ausgeführt. Das System läuft und läuft und läuft, und den Daemon starte ich hin und wieder neu, um neue GAs einzupflegen (eibga.conf liest er nur beim Neustart ein).

    VG, Fry

    Kommentar


      Zitat von Fry Beitrag anzeigen
      1. Da der Logikprozessor delay-Timings in %plugin_info speichert, werden diese auch nach einem Neustart (ggf. um die Boot-Zeit verzögert) ausgeführt. Auch nach einem Neustart des Wiregate-Daemon und natürlich auch nach Modifikationen des Logikprozessors oder dessen .conf.

      3. Mein Wiregate (mit modifiziertem WG-Daemon) hat schon sehr, sehr lange (gefühlt ein Jahr) keinen unbeabsichtigten Neustart des Systems oder des Daemons ausgeführt.
      VG, Fry
      ad 1.) Klingt gut, aber ist dann auch der Value noch vorhanden, ich habe hier im Thread Ansätze gesehen, die den Wert auch mittels Plugin-Info persistieren.

      ad 3.) Ich rede eher von den E.ON-getriebenen Neustarts ;-)
      Beste Grüße, Dirk

      ________________________________________
      Haus ist fertig - KNX wird's nie werden ;-)

      Kommentar


        zu 1. Ja, Zeit UND Wert werden in %plugin_info und damit einer persistenten Datenbank abgelegt.

        zu 3. Aha. Ich kann mich hier (in Hessen) nicht mehr an den letzten Stromausfall erinnern. Vielleicht ein spezifisches Problem von Neubaugebieten?

        VG, Fry

        Kommentar


          ...und noch was: alle meine Aussagen beziehen sich auf hinreichend neue Versionen von Logikprozessor.pl und wiregated.pl. (wie gerade neulich hier wieder gepostet)

          Anfangsversionen des Logikprozessors waren noch "Versuchsstadium" und löschten beim Start alle Logikprozessor-Variablen im %plugin_info.

          Ist aber schon lange nicht mehr so.

          Kommentar


            Hallo Fry

            Kannst du eventuell deine Konfigurationsdatei posten oder mir per PM zusenden? Ich möchte gerne damit herumspielen und schauen ob ich ein Prototyp einer Logik-Visualisierung damit zustande bringe. Falls andere ebenfalls umfangreiche Logiken konfiguriert haben wäre ich ebenfalls daran interessiert.

            Gruss, Markus

            Kommentar


              Hi Markus,
              lieber nicht. Erstens hat mein Logikprozessor.conf >2500 Zeilen, zweitens sind die Logiken gar nicht alle direkt definiert, sondern viele Schleifen und andere Tricks drin, drittens verwende ich konsequent GA-Kürzel - das erste Wort der GA-Beschreibung ist eindeutig und codiert die Bedeutung der GA, so dass "nackte" numerische GAs bei mir gar nicht vorkommen. Die Kürzel in Kombination mit Grep und Schleifen dienen mir dazu, viele Logiken auf diese Weise zu definieren.
              Das alles zusammengenommen, dürfte meine Conf für Außenstehende praktisch nicht lesbar sein ohne Zusatzinfo, welche GA was bewirkt usw.
              Viele Grüße,
              Fry

              Kommentar


                @Fry, wobei wir uns natürlich alle freuen, wenn Du noch einige Beispiele mit uns teilst

                @Markus, Du musst ja nicht direkt so kompliziert anfangen. Hier sind mal einige banale Logiken:

                Code:
                street_light_off_at_1am => { #during weekdays, switch off streetlight at 1am
                    transmit=>'1/4/0',
                    timer=>{
                        time=>'01:00',
                        day_of_week=>['Mo','Di','Mi','Do','Fr']
                    },
                    translate => 0
                },
                Code:
                switch_off_bed_lights => {  # in parent bedroom, switch off bedside lights when shutter is opened
                    receive=>'2/1/3',
                    transmit=>['1/1/12','1/1/13'],
                    translate=>sub {
                        if ($input < 30) {return 0;}
                        else {return undef;}
                    },
                },
                Code:
                today_electricity_cost => { # calculate cost electricity (at 17ct/kWh) 
                    receive=>'3/2/5',       
                    transmit=>'3/2/6', 
                    translate=>sub{
                        return $input*0.17 
                    },
                },

                Kommentar


                  @johnnychicago: Vielen Dank, für den Anfang hilft dies weiter

                  @Fry: Zum Glück muss ich die Logiken nicht verstehen.

                  Was ich erreichen möchte ist, dass das Konfigurationsfile eingelesen werden kann, richtig grafisch dargestellt wird, editiert mit drag und drop und abschliessend wieder gespeichert werden kann. Für mich am einfachsten wäre eine EBNF Syntax, aber das existiert vermutlich nicht. Daher werde ich iterativ vorgehen und die Syntax aufgrund der Beispielen und der Perl Syntax langsam aufnehmen. Also, wenn noch mehr interessante Beispiele existieren einfach posten

                  Gruss, Markus

                  Kommentar


                    Hallo @Fry

                    Irgendwas scheine ich mit meinem Timer falsch zu machen - ich hatte folgendes definiert:

                    timer => { time => '22:30+10m-01:00' },

                    In der Hoffnung, alle 10 Minuten die Logik zu sehen. Das macht sie aber nicht - sie ruft um 22:30 auf und danach nicht mehr.

                    Dann dachte ich, dass der Tageswechsel ein Problem sein könnte und habe auf:

                    timer => { time => '22:30+10m-23:59' },

                    umgestellt. Tat aber auch nichts.

                    Wie ist denn die richtige Syntax hier?

                    Kommentar


                      Ja, über Tageswechsel geht es nicht. Richtig wäre

                      Code:
                      timer => { time => ['22:30+10m-24:00','00:00+10m-01:00'] },
                      Wenn es so auch nicht klappt, bitte die gesamte Logik und einen Auszug aus der eib.log posten.

                      Nur am Rande: stimmt deine Uhr?

                      VG, Fry

                      Kommentar


                        Zitat von mivola Beitrag anzeigen
                        Und weil ich nun grade mal dabei war, habe ich auch noch eine Routine geschrieben um Einträge in das RSSLog (siehe hier, hier und hier) zu erzeugen, evtl. kann es ja jemand gebrauchen:
                        Danke dafür, ich bau das grad bei mir ein.

                        Code:
                            $requestURL = sprintf("%s?t=%s&c=%s&tags=%s",
                                uri_escape($url),
                                uri_escape(encode("utf8", $title)),
                                uri_escape(encode("utf8", $content)),
                                uri_escape(encode("utf8", $tags));
                        Da fehlt eine dritte ) hinter $tags, oder?

                        Kommentar


                          Zitat von johnnychicago Beitrag anzeigen
                          Da fehlt eine dritte ) hinter $tags, oder?
                          Völlig richtig. Muss wohl bei copy&paste verloren gegangen sein ;-) In meinem Code sind es 3 Klammern. Da sieht man mal wie dringend wir eine einheitliche Version im SVN brauchen ...

                          Kommentar


                            Hallo zusammen,

                            hier ein kleines Tool zum Debuggen von Timer-Logiken. Ich habe es "toptimer" genannt und in /root/bin/ gesteckt, und mit chmod a+x /root/bin/toptimer ausführbar gemacht.

                            Es zeigt die ersten 40 aktiven Timer (delay, cool, timer und followup) an und erneuert diese Anzeige (wie "top") alle paar Sekunden, so dass man verfolgen kann, wie sich die Tabelle verändert.

                            Darunter noch ein zweites Tool. Dieses heißt "plugininfo" und kann benutzt werden, um Variablen in %plugin_info anzusehen, zu verändern oder auch zu löschen.

                            Wie immer die Tools "ohne Gewähr" und "use at your own risk" - wobei das Risiko hier nicht groß ist...

                            Have fun,
                            Fry

                            hier "toptimer":

                            Code:
                            #!/usr/bin/perl  -W
                            ###############
                            # toptimer  #
                            ###############
                            # Wiregate-Utility
                            # (c) 2014 Fry under the GPL v2 or later
                            
                            # nimmt als Option ein Perl-Pattern an, und zeigt alle wartenden Timer (ggf gefiltert) kontinuierlich an
                            
                            use DB_File;
                            use Fcntl;
                            use strict;
                            use POSIX qw(strftime);
                            
                            my $plugin_infofile = "/tmp/wiregate_plugin.db";
                            my %plugin_info;
                            tie %plugin_info, "DB_File", $plugin_infofile, O_RDONLY, 0666, $DB_HASH
                                or die "Cannot open file 'plugin_info': $!";
                            
                            while(1)
                            {        
                                system "clear";
                                print "Stoppuhr Uhrzeit        Typ   Logik\n";
                            
                                my $line=0;
                                for my $timer (sort {$plugin_info{$a} <=> $plugin_info{$b}} grep /Logikprozessor.pl__.*_(timer|delay|cool|followup)/, keys %plugin_info)
                                {
                                    $timer=~/Logikprozessor.pl__(.*)_(timer|delay|cool|followup)/;
                                    my $t=$1; 
                                    my $type=$2; 
                            
                                    next if $ARGV[0] && $t!~/$ARGV[0]/;
                                    
                                    $type=sprintf("%8s",$type);
                                    print sprintf("%8d ",$plugin_info{$timer}-time())
                                        .strftime("%a %X $type $t\n",$plugin_info{$timer},0,int(strftime("%z",localtime)/100),-1,0,1970);
                                    
                                    $line++; last if $line>40;
                                }
                                sleep 5;
                            }
                            und hier "plugininfo":

                            Code:
                            #!/usr/bin/perl -W
                            
                            ###############
                            # plugininfo  #
                            ###############
                            # Wiregate-Utility
                            # (c) 2014 Fry under the GPL v2 or later
                            
                            use DB_File;
                            use Fcntl;
                            use strict;
                            
                            if(!@ARGV || grep /^\-h|^\-\-help/, @ARGV)
                            {
                                print "Usage: $0 [-n] <pluginkey> <pluginkey> <pluginkey> ...\n";
                                print "<pluginkey> can be:\n";
                                print "\t* a pattern, e.g. 'Logikprozessor.*' - then the result will be a listing of all matching entries in \%plugin_info\n";
                                print "\t* a pattern with '-d', e.g. '-dLogikprozessor.*' - then all matching keys will be DELETED from \%plugin_info (!)\n";
                                print "\t* a key with attached '=' and a value - then an existing entry in \%plugin_info will be overwritten with the value\n";
                                print "\t* a key for \%plugin_info with attached ':=' and a value - same as before, but may also create a new key\n";
                                print "\tOption -l shows also the (normally hidden) Logikprozessor system entries like __..._result, __..._timer etc.\n";
                                print "\tOption -s shows also the (normally hidden) system entries like _result, _lastsaved, _memstart etc.\n";
                                exit;
                            }
                            
                            my $system=0;
                            if(grep /^-s$/, @ARGV)
                            {
                                @ARGV=grep !/^-s$/, @ARGV;
                                $system=1;
                            }
                            
                            my $logikp=0;
                            if(grep /^-l$/, @ARGV)
                            {
                                @ARGV=grep !/^-l$/, @ARGV;
                                $logikp=1;
                            }
                            
                            my $plugin_infofile = "/tmp/wiregate_plugin.db";
                            my %plugin_info;
                            my $plugindb = tie %plugin_info, "DB_File", $plugin_infofile, O_RDWR, 0666, $DB_HASH
                                or die "Cannot open file 'plugin_info': $!";
                            
                            # suche und liste Eintraege aus %plugin_info
                            for my $key (@ARGV)
                            {
                                if($key!~/\=/)
                                {
                                    my $del=0; $del=1 if $key=~s/^\-d//;
                            
                                    my @keys=($key);
                                    
                                    unless(defined $plugin_info{$key})
                                    {
                                        @keys=grep /$key/i, keys %plugin_info;
                                        @keys=grep !/\s/, @keys;
                                    }
                            
                                    @keys=grep !/.pl_(last|lastsaved|result|memstart|runtime|ticks|timeout_err|cycle|meminc)$/, @keys unless $system;
                                    @keys=grep !/^Logikprozessor.pl_.*_result/, grep !/^Logikprozessor.pl__/, @keys unless $logikp;
                                    
                                    if($del)
                                    {
                                        for my $k (sort @keys) 
                                        { 
                                            print sprintf("%-50s",$k)."=\t".$plugin_info{$k}."\n"; 
                                        }    
                                        print "Do you really want to delete these entries? (y/N) ";
                                        my $ans=<STDIN>; chomp $ans;
                                        if($ans=~/^y$/i)
                                        {
                                            for my $k (@keys) 
                                            { 
                                                delete $plugin_info{$k};
                                            }    
                                        }      
                                    }
                                    else
                                    {
                                        for my $k (sort @keys) 
                                        { 
                                            print sprintf("%-50s",$k)."=\t".$plugin_info{$k}."\n";
                                        }
                                    }
                                }
                                elsif($key=~s/:=\s*(.*?)$//)
                                {
                                    $plugin_info{$key}=$1;
                                    print sprintf("%-50s",$key)."=\t".$plugin_info{$key}."\n";
                                }
                                elsif($key=~s/=\s*(.*?)$// && defined $plugin_info{$key})
                                {
                                    $plugin_info{$key}=$1;
                                    print sprintf("%-50s",$key)."=\t".$plugin_info{$key}."\n";
                                }
                                else
                                {
                                    print "$key - ignored\n";
                                }
                            }
                            
                            $plugindb->sync(); 
                            #untie %plugin_info;

                            Kommentar


                              Zitat von Fry Beitrag anzeigen
                              hier ein kleines Tool zum Debuggen von Timer-Logiken.
                              Funktioniert super. Lediglich "/root/bin/" gibts aufm Wiregate nicht - was wäre eine alternative Empfehlung?

                              Danke
                              Micha

                              Kommentar


                                /usr/local/bin

                                Kommentar

                                Lädt...
                                X