Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin zum Aufrufen einer URL je nach GA

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

    [wiregate] Plugin zum Aufrufen einer URL je nach GA

    Hallo,

    ich möchte wenn eine GA empfangen wird, eine bestimmte URL aufrufen.
    Das Plugin soll gleichzeitig auf mehrere GA hören und je nach GA eine andere URL aufrufen.

    Hintergrund: So kann ich meine Heizungssteuerung beeinflussen (UVR1611).

    Durch geschicktes Klauen bin ich jetzt so weit:
    Code:
    #!/usr/bin/perl
    use strict;
    
    # ******************************************************************************
    # Das Plugin schaltet Ausgänge der UVR1611
    # Finden der URL über
    # http://IP-Der-1611/580600.htm
    # ******************************************************************************
    
    ####################
    ###Einstellungen:###
    ####################
    
    my $uvr_ip = '192.168.1.5';
    
    my %string_GA_URI_mapping = (
         '3/3/1' => '580600.htm?blw91A12005=' # Kessel - Kesselstatus (Text)
    )
         
    
    
    ######################
    ##ENDE Einstellungen##
    ######################
    
    use LWP::Simple;
    
    for my $ga (%string_GA_URI_mapping) {
    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
        get( "http://".$uvr_ip."/"$string_GA_URI_mapping{$ga});
        }
        else
    {    
    $plugin_info{$plugname.'_cycle'} = 86400; 
        if (exists $string_GA_URI_mapping{$ga}) {
        $plugin_subscribe{$ga}{$plugname} = 1; #An Gruppenadresse anmelden
    }    
    }

    Macht das Sinn so?

    Gruß,
    Hendrik

    #2
    Ganz falsch isses mal nicht, beim $plugin_subscribe müsste man allerdings schon die GA anmelden..
    Also nochmal
    for my $ga (%string_GA_URI_mapping) {

    oder so ähnlich (keys %..GA_URI_..) getestet hab ichs jetzt nicht..

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Hallo Makki,

      Zitat von makki Beitrag anzeigen
      Ganz falsch isses mal nicht, beim $plugin_subscribe müsste man allerdings schon die GA anmelden..
      Ich dachte, das mache ich:
      Ich gehe durch alle GAs:
      Code:
      for my $ga (%string_GA_URI_mapping) {
      Wenn eine GA aus der Liste gesendet wird, dann wird die URL aufgerufen:
      Code:
       if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
          get( "http://".$uvr_ip."/"$string_GA_URI_mapping{$ga});
          }
      Wenn jedoch keine GA aus der Liste gesendet wird, dann ist dieser Aufruf der erste Aufruf überhaupt und wir abonnieren die GAs:

      Code:
          else
      {    
      $plugin_info{$plugname.'_cycle'} = 86400; 
          if (exists $string_GA_URI_mapping{$ga}) {
          $plugin_subscribe{$ga}{$plugname} = 1; #An Gruppenadresse anmelden
      }    
      }
      Oder hab ich da etwas falsch verstanden?

      Also nochmal
      for my $ga (%string_GA_URI_mapping) {
      Der Bereich (plugin_subscribe) ist doch in der for-Schliefe...


      Gruß,
      Hendrik

      Kommentar


        #4
        Ich hab das mit dem hash jetzt nicht getestet aber das sollte reichen. Wie sieht das denn bei mehreren GAs aus? Sonst guck mal wie das im Nachdimmen Plugin ist...das finde ich übersichtlicher. Dort werden die Daten in einem Array abgelegt ... damit hast Du mehr Möglichkeiten in der Konfiguration und es ist rech übersichtlich.

        Gruß Mirko

        Code:
        use LWP::Simple;
        $plugin_info{$plugname.'_cycle'} = 86400; 
        
        for my $ga (%string_GA_URI_mapping) 
        {
             $plugin_subscribe{$ga}{$plugname} = 1; #An Gruppenadresse anmelden 
        
             if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
             get( "http://".$uvr_ip."/"$string_GA_URI_mapping{$ga});
             }
        
        }
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Hallo,

          danke für deine Hilfe.
          Irgendwo ist da noch ein Wurm drin:
          Code:
          #!/usr/bin/perl
          use strict;
          use LWP::Simple;
          # ******************************************************************************
          # Das Plugin schaltet Ausgänge der UVR1611
          # Finden der URL über
          # http://IP-Der-1611/580600.htm
          # ******************************************************************************
          
          ####################
          ###Einstellungen:###
          ####################
          
          my $uvr_ip = '192.168.1.5';
          
          my %string_GA_URI_mapping = (
               '3/3/1' => '580600.htm?blw91A12005=1' # Kessel - Kesselstatus (Text)
          );
               
          
          
          ######################
          ##ENDE Einstellungen##
          ######################
          
          
          $plugin_info{$plugname.'_cycle'} = 86400; 
          
          for my $ga (%string_GA_URI_mapping) 
          {
               $plugin_subscribe{$ga}{$plugname} = 1; #An Gruppenadresse anmelden 
          
               if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
               get( "http://".$uvr_ip."/"$string_GA_URI_mapping{$ga});
               }
          
          }
          syntax error at (eval 307255) line 34,
          near ""/"$string_GA_URI_mapping" syntax
          error at (eval 307255) line 37, near "} }"
          Ich sehe aber nix. Line 34 ist die mit "get".
          Ich sehe aber weder in der Zeile, oder in der davor/dahinter einen Syntax-Fehler.
          Ihr?

          Gruß,
          Hendirk

          Kommentar


            #6
            Da fehlt der . vor $string.....
            So wie an der Stelle davor, der Punkt verbindet Variable und Text.

            Sorry mit dem IPad hier kann ich keinen Code tippen

            So:
            Code:
                 if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
                 get( "http://".$uvr_ip."/".$string_GA_URI_mapping{$ga});
                 }
            
            }
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Hallo,

              danke ;-)
              klappt immer noch nicht (kein Syntax-Fehler, aber auch keine Funktion. Daher habe ich mal eine Log-Ausgabe hinzugefügt:
              Code:
              #!/usr/bin/perl
              use strict;
              use LWP::Simple;
              # ******************************************************************************
              # Das Plugin schaltet Ausgänge der UVR1611
              # Finden der URL über
              # http://IP-Der-1611/580600.htm
              # ******************************************************************************
              
              ####################
              ###Einstellungen:###
              ####################
              
              my $uvr_ip = '192.168.1.5';
              
              my %string_GA_URI_mapping = (
                   '3/3/1' => '580600.htm?blw91A12005=1' # Kessel - Kesselstatus (Text)
              );
                   
              
              
              ######################
              ##ENDE Einstellungen##
              ######################
              
              
              $plugin_info{$plugname.'_cycle'} = 86400; 
              
              for my $ga (%string_GA_URI_mapping) 
              {
                   $plugin_subscribe{$ga}{$plugname} = 1; #An Gruppenadresse anmelden 
                 plugin_log($plugname,'Subscribe: ' . $ga );
                   if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$ga}) {    
                   get( "http://".$uvr_ip."/".$string_GA_URI_mapping{$ga});
                   plugin_log($plugname,'Call: ' .  "http://".$uvr_ip."/".$string_GA_URI_mapping{$ga} );
                   }
              
              }
              Im Log steht jetzt aber -auch wenn ich die 3/3/1 aufrufe nur:
              2012-10-18 15:16:02.090,UVR_Senden,Subscribe: 3/3/1 2012-10-18 15:16:02.091,UVR_Senden,Subscribe: 580600.htm?blw91A12005=1
              Das zeigt mir aber, dass etwas mit dem $ga nicht stimmt.
              Ich dachte, dass for my $ga (%string_GA_URI_mapping)
              als Laufvariable $ga hat und darin die linke Seite von %string_GA_URI_mapping steht.

              Das ist aber scheinbar nicht so. In $ga steht wohl beides, denn nur so erklärt sich, dass beides im Log steht.

              Das zeigt, dass ich das Konstrukt
              my %string_GA_URI_mapping = (
              '3/3/1' => '580600.htm?blw91A12005=1' # Kessel - Kesselstatus (Text)
              ); nicht kapiert habe.
              Wie nennt sich das (ich will mich belesen)?
              Ich kenne es sonst als Array. Richtig?

              Gruß,
              Hendrik


              %string_GA_URI_mapping

              Kommentar


                #8
                Hallo Hendrik schau die mal das hier an, hab grad wenig Zeit.

                Plugin: SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/Nacht-Nachdimmen
                config:SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/conf.d/Nacht-Nachdimmen.conf_sample
                config kannste ja weglassen und gleich in das Plugin kopieren.

                Das ganze sind Arrays, aber irgendwie mehrdimensional ... bin ich auch überfragt.
                Das finde ich aber mit am besten was das Verständnis angeht.

                Vielleicht hilft dir auch das Plugin weiter:
                SourceForge.net Repository - [openautomation] Contents of /wiregate/plugin/generic/XBMC-notification.pl

                Achso... das was Du da hast ist ein Hash und im Nachdimmen-Plugin müsste es ein Array of Hahes sein ... aber ich bin selbst nur Perl-Dau
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Zitat von henfri Beitrag anzeigen
                  Das zeigt, dass ich das Konstrukt
                  my %string_GA_URI_mapping = (
                  '3/3/1' => '580600.htm?blw91A12005=1' # Kessel - Kesselstatus (Text)
                  ); nicht kapiert habe.
                  Wie nennt sich das (ich will mich belesen)?
                  Ich kenne es sonst als Array. Richtig?
                  Richtig, das ist ein Array, allerdings ist es so ein Hash mit einem Array of Hashes darin
                  Also ich sage nicht das das verständlich ist aber ich vermeide sowas wie der Teufel das Weihwasser weil da kommt so ne lustige Syntax wie
                  $string_GA_URI_mapping{''}[0]->{'3/3/1'} (oder so ähnlich) bei raus..

                  Dazu gibts viel zu lesen und IMHO wenig zu verstehen, weil ich kapiers bis heute nicht (es gibt ja noch hashref etc) wann "$", "%$", "@$" oder "->" angesagt ist
                  Edit: vorhandene Plugins und wiregated*.pl sind die beste Anleitung die ich liefern kann, ansonsten gibts dazu eben viel zu lesen..

                  Makki
                  EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                  -> Bitte KEINE PNs!

                  Kommentar


                    #10
                    Hm, dass das ist ja beruhigend... Aber was empfiehlst du stattdessen?

                    Kommentar


                      #11
                      Ganz einfach: Man macht sich einen Hash (die sind ja nicht böse sondern praktisch - definieren mit %hash.. , aufruf mit $hash{.. - siehe andere Plugins)
                      für GA und Wert, probiert das ggfs. vorher Standalone in einem Perl-Script auf einer beliebigen Plattform einfach aus (also z.B. dem eigenen Win/Mac/Linux -PC) und macht dann das Plugin draus..

                      Im Prinzip ist das easy und entspricht am ehesten den Dreambox* Plugins, das in zweifacher Ausfertigung im SVN liegt..

                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        Vielleicht habe ich als Perl-DAU wieder einmal das Problem nicht verstanden; falls es aber darum gehen würde, viele GAs an einem Plugin anzumelden (subscrib), habe ich eine Lösung, die bei mir arbeitet. Ich habe ca. 100 GA (repräsentieren jeweils eine Person an einer Tür), die als Auslöser für die Türöffnung in Frage kommen. Dazu habe ich eine Variable "@Rechte" erstellt, die u.a. auch die auslösende GA (hier durch XX/XX/XX maskiert) enthält (nachfolgend ein Ausschnitt):

                        Code:
                        @Rechte = 
                            ( 
                              { Name=>'DiegoHaupteingang', Aktion=>$Haupt_ga,    GA=>'X/X/X',     Aktiv=>'1', Wert=>'1', Std=>undef, Min=> undef,  MTag=>undef, Mon=>undef, WTag=>undef, DPT=>'1', Log=>'1'  },
                              { Name=>'DiegoVeloraum', Aktion=>$Velo_ga,    GA=>'X/X/X',     Aktiv=>'1', Wert=>'1', Std=>undef, Min=> undef,  MTag=>undef, Mon=>undef, WTag=>undef, DPT=>'1', Log=>'1'  },
                              { Name=>'DiegoKeller', Aktion=>$Keller_ga,    GA=>'X/X/X',     Aktiv=>'1', Wert=>'1', Std=>undef, Min=> undef,  MTag=>undef, Mon=>undef, WTag=>undef, DPT=>'1', Log=>'1'  }
                             );
                        Das Subskripieren erfolgt über folgende Schlaufe:
                        Code:
                        foreach my $element (@Rechte) {
                            $plugin_subscribe{$element->{GA}}{$plugname} = 1;    
                        }
                        Vielleicht ist es Dir dienlich.
                        Beste Grüsse
                        Diego

                        Kommentar


                          #13
                          Hallo,

                          Danke für eure Hilfe.
                          Ich bin eine ganze Ecke weiter (v.a. im Verständnis).

                          Aber an einer Stelle hängt es jetzt.

                          Code:
                          foreach my $curr_ga (@GAs) 
                          {
                               $plugin_subscribe{$curr_ga->{ga}}{$plugname} = 1; #An Gruppenadresse anmelden 
                               plugin_log($plugname,'Subscribe: ' . $curr_ga->{ga} );
                               plugin_log($plugname,'Grund des Aufruf: ' . $msg{'apci'}. $msg{'dst'} );
                               if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$curr_ga->{ga}}) {    
                                   get( "http://".$uvr_ip."/".$curr_ga->{URL});
                                   plugin_log($plugname,'Call: ' .  "http://".$uvr_ip."/".$curr_ga->{ga} );
                               }
                          }
                          Im Log steht
                          2012-10-19 21:33:04.621,UVR_Senden,Subscribe: 3/3/1 2012-10-19 21:33:04.621,UVR_Senden,WerteA_GroupValue_Write3/3/1
                          Wenn ich nix übersehe, sollte doch die if-Abfrage wahr sein.
                          Dennoch geht er nicht in die nächste Zeile...

                          Wie kommt's?
                          Was übersehe ich?

                          Gruß,
                          Hendrik


                          Hier der ganze Code:
                          Code:
                          #!/usr/bin/perl
                          use strict;
                          use LWP::Simple;
                          # ******************************************************************************
                          # Das Plugin schaltet Ausgänge der UVR1611
                          # Finden der URL über
                          # http://IP-Der-1611/580600.htm
                          # ******************************************************************************
                          
                          ####################
                          ###Einstellungen:###
                          ####################
                          
                          my $uvr_ip;# = '192.168.1.5';
                          my @GAs;
                          &readConf;
                          
                          ######################
                          ##ENDE Einstellungen##
                          ######################
                          
                          
                          $plugin_info{$plugname.'_cycle'} = 86400; 
                          
                          foreach my $curr_ga (@GAs) 
                          {
                               $plugin_subscribe{$curr_ga->{ga}}{$plugname} = 1; #An Gruppenadresse anmelden 
                               plugin_log($plugname,'Subscribe: ' . $curr_ga->{ga} );
                               plugin_log($plugname,'Grund des Aufruf: ' . $msg{'apci'}. $msg{'dst'} );
                               if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq {$curr_ga->{ga}}) {    
                                   get( "http://".$uvr_ip."/".$curr_ga->{URL});
                                   plugin_log($plugname,'Call: ' .  "http://".$uvr_ip."/".$curr_ga->{ga} );
                               }
                          
                          }
                          
                          return;
                          
                          ### READ CONF ###
                          sub readConf
                          {
                           my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                           if (! -f $confFile) {
                            plugin_log($plugname, "no conf file [$confFile] found."); 
                           } else {
                            #plugin_log($plugname, "reading conf file [$confFile]."); 
                            open(CONF, $confFile);
                            my @lines = <CONF>;
                            close($confFile);
                            my $result = eval("@lines");
                            #($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
                            if ($@) {
                             plugin_log($plugname, "ERR: conf file [$confFile] returned:");
                             my @parts = split(/\n/, $@);
                             plugin_log($plugname, "--> $_") foreach (@parts);
                            }
                           }
                          }
                          Die conf:
                          Code:
                          my $uvr_ip = '192.168.1.5';
                          push @GAs, { URL=> "580600.htm?blw91A12005=1", ga => "3/3/1", value => 1}; # Kessel - Kesselstatus (Text)

                          Kommentar


                            #14
                            Hallo Hendrik

                            Pass doch einmal Deine Config-Datei wie folgt an und schau was dann passiert:
                            Code:
                            $uvr_ip = '192.168.1.5';
                              @GAs = 
                                ( 
                                  { URL=> "580600.htm?blw91A12005=1", ga => "1/1/45", value => 1} # Kessel - Kesselstatus (Text)
                                 );
                            In einer Config-Datei darf "my" nicht verwendet werden.
                            Passe dann die IF-Zeile wie folgt an:
                            Code:
                                 if (($msg{'apci'} eq "A_GroupValue_Write") and ($msg{'dst'} eq ($curr_ga->{ga}))) {
                            In meinem Log steht Folgendes:
                            Code:
                            2012-10-20 01:32:27.629,TestHenfry,Subscribe: 1/1/45 
                            2012-10-20 01:32:27.629,TestHenfry,Grund des Aufruf: A_GroupValue_Write1/1/45 
                            2012-10-20 01:33:27.695,TestHenfry,Call: http://192.168.1.5/1/1/45
                            Vielleicht hilft es.
                            Gruss
                            Diego

                            Kommentar


                              #15
                              Hi Diego,

                              vielen Dank für die Nachtschicht!
                              Leider klappt's nicht. Ich bin auch etwas verwirrt. Du sagst "my" darf in der Konfig-Datei nicht verwendet werden, nutzte es aber doch selbst:
                              Code:
                              #my $uvr_ip = '192.168.1.5';
                              #push @GAs, { URL=> "580600.htm?blw91A12005=1", ga => "3/3/1", value => 1}; # Kessel - Kesselstatus (Text)
                              
                              my $uvr_ip = '192.168.1.5';
                              my @GAs = 
                                  ( 
                                    { URL=> "580600.htm?blw91A12005=1", ga => "3/3/1", value => 1} # Kessel - Kesselstatus (Text)
                                   );
                              Hier mein modifiziertes Plugin
                              Code:
                              #!/usr/bin/perl
                              use strict;
                              use LWP::Simple;
                              # ******************************************************************************
                              # Das Plugin schaltet Ausgänge der UVR1611
                              # Finden der URL über
                              # http://IP-Der-1611/580600.htm
                              # ******************************************************************************
                              
                              ####################
                              ###Einstellungen:###
                              ####################
                              
                              my $uvr_ip;# = '192.168.1.5';
                              my @GAs;
                              &readConf;
                              
                              ######################
                              ##ENDE Einstellungen##
                              ######################
                              
                              plugin_log($plugname,'Startet ');
                              $plugin_info{$plugname.'_cycle'} = 86400; 
                              
                              foreach my $curr_ga (@GAs) 
                              {
                                   $plugin_subscribe{$curr_ga->{ga}}{$plugname} = 1; #An Gruppenadresse anmelden 
                                   plugin_log($plugname,'Subscribe: ' . $curr_ga->{ga} );
                                   plugin_log($plugname,'Grund des Aufruf: ' . $msg{'apci'}. $msg{'dst'} );
                                  if (($msg{'apci'} eq "A_GroupValue_Write") and ($msg{'dst'} eq ($curr_ga->{ga}))) {    
                                      get( "http://".$uvr_ip."/".$curr_ga->{URL});
                                  plugin_log($plugname,'Call: ' .  "http://".$uvr_ip."/".$curr_ga->{ga} );
                                   }
                              
                              }
                              
                              return;
                              
                              ### READ CONF ###
                              sub readConf
                              {
                               my $confFile = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                               if (! -f $confFile) {
                                plugin_log($plugname, "no conf file [$confFile] found."); 
                               } else {
                                #plugin_log($plugname, "reading conf file [$confFile]."); 
                                open(CONF, $confFile);
                                my @lines = <CONF>;
                                close($confFile);
                                my $result = eval("@lines");
                                #($result) and plugin_log($plugname, "conf file [$confFile] returned result[$result]");
                                if ($@) {
                                 plugin_log($plugname, "ERR: conf file [$confFile] returned:");
                                 my @parts = split(/\n/, $@);
                                 plugin_log($plugname, "--> $_") foreach (@parts);
                                }
                               }
                              }
                              Im Log steht nur, dass das Plugin startet -als wäre GAs leer.
                              Ich bin verwirrt, denn das einlesen der Konfigurationsdatei schien ja vorher zu funktionieren. Sowohl, was die IPs anging, als auch was den Hash anging.

                              Gruß,
                              Hendrik

                              Kommentar

                              Lädt...
                              X