Ankündigung

Einklappen
Keine Ankündigung bisher.

XML in Plugin einlesen?

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

    #16
    Ein Beispiel

    -> Grundsätzlich mach ich sowas immer erst "standalone" am Rechner, Data:umper ist auch ein Freund und wenn die Systax (die bei XML recht wirr sein kann) passt-> ab ins Plugin damit.

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

    Kommentar


      #17
      Ich habe dir dass mal so umgestellt, dass einfach das gesammte XML unter config hineinkopiert werden kann.

      Code:
      #Ab hier nichts mehr ändern. Läuft automatisch
      
      use XML::Simple;
      use Encode qw(encode decode);
      
      my $xml = new XML::Simple;
      
      my $xml_file = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
      
      open in,"<$xml_file"|| "Fehler beim lesen";;
      my @datei = <in>;
      close in;
      
      my $value = $xml->XMLin(encode("utf8",@datei[11]));
      
      my $can_subindex = $value->{can_subindex};
      my $can_index = $value->{can_index};
      my $can_knoten = $value->{can_knoten};            
      
      $can_subindex = sprintf "%x" , $can_subindex; #Mache aus Integer HEX
      $can_index = sprintf "%x" , $can_index; #Mache aus Integer HEX
      $can_knoten = sprintf "%x" , $can_knoten; #Mache aus Integer HEX
      
      my $hilfsvariabel = substr($can_index,0,2); #Speichere die ersten beiden Stellen von can_index
      $can_index = substr($can_index,2) . $hilfsvariabel; #Stelle die ersten beiden Stellen hinten an
      
      my $ausgabe = '$X'.$can_index.'0'.$can_subindex.'0'.$can_knoten; # $ausgabe enthält den gewünschten Wert
      
      return $ausgabe;
      Gruss Patrik alias swiss

      Kommentar


        #18
        Hallo,

        danke euch Beiden. Ich muss gerade nebenan erstmal das Plugin wie es ist ans laufen kriegen. Danach kümmere ich mich um Einbindung des Einlesens.

        Danke!

        Kommentar


          #19
          Hallo Hendrik

          Dein Problem hat mich jetzt in den letzten Tagen ganz schön beschäftigt

          Ich habe erst vor ein paar Tagen bemerkt, dass für jedes Objekt dass in der XML hinterlegt ist ein eigener "Schlüssel" berechnet werden muss. -> Habe ich mal erfragt aber keine schlüssige Antwort darauf erhalten...

          Danach ging es los...

          Bis ich XMLin zum laufen gebracht habe dachte ich, ich bekomme graue Haare.

          DAS PROBEM WAR!:


          Du hast bei der Vergabe der Objektbezeichnungen äöü verwendet. Das ist nach UTF-8 nicht zulässig! Durch dass bekam ich im Code immer eine völlig sinnfreie Fehlermeldung die überhaupt nicht dabei half den Fehler zu finden. Ich habe das Problem nur zufällig entdeckt und nachdem ich in der XML alle äöü durch ae oe und ue ersetzte funktioniert der Code einwandfrei

          [ACHTUNG]Bitte keine ÄÖÜ oder sonnstige Sonderzeichen wie das scharfe Doppel-S in der XML verwenden.[/ACHTUNG]

          Nun kannst du direkt den "Schlüssel für jedes Objekt in deinem Code weiterverwenden in dem du folgendermassen zugreifst...

          Der Schlüssel für Objekt_0 wird durch $objekt[0] aufgerufen und liefert in deinem XML $X95350901. Analog dazu jedes weitere Objekt Hier der aktuelle Code:

          Code:
          #Ab hier nichts mehr ändern. Läuft automatisch
          # XML darf keine ÄÖÜ so wie andere Sonderzeichen oder das scharfe doppel S enthalten!!!!
          
          use XML::Simple;
          use Encode qw(encode decode);
          
          my $xml = new XML::Simple;
          
          my $xml_file = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
          
          my $i = 0;
          my @objekt;
          
          my $value = $xml->XMLin(encode("utf8","$xml_file"),GroupTags=>{RequestedTerminations=>'String'})->{Seiten}->{Seite_0}->{Objekte}; #lese alle Elemente zwischen <Objekte> und </Objekte> aus der xml
          
          while ((my $key) = each %{$value}) {        
              my $can_subindex = $value->{$key}->{can_subindex};
              my $can_index = $value->{$key}->{can_index};
              my $can_knoten = $value->{$key}->{can_knoten};            
                  
              $can_subindex = sprintf ("%x" , $can_subindex); #Mache aus Integer HEX
              $can_index = sprintf ("%x" , $can_index); #Mache aus Integer HEX
              $can_knoten = sprintf ("%x" , $can_knoten); #Mache aus Integer HEX
                  
              my $hilfsvariabel = substr($can_index,0,2); #Speichere die ersten beiden Stellen von can_index
              $can_index = substr($can_index,2) . $hilfsvariabel; #Stelle die ersten beiden Stellen hinten an
                  
              $objekt[$i] = '$X'.$can_index.'0'.$can_subindex.'0'.$can_knoten; # $ausgabe enthält den gewünschten Wert
              $i++;
          }
          Gruss Patrik alias swiss

          Kommentar


            #20
            Good Practice: Immer auf Umlaute und Sonderzeichen verzichten

            Zitat von swiss Beitrag anzeigen
            Du hast bei der Vergabe der Objektbezeichnungen äöü verwendet.
            Oh Mann, ist das bitter!!!

            Seit 30 Jahren seit ich in der IT tätig bin, sind es die "Nicht-7-Bit-ASCII-Zeichen" wie Umlaute oder Sonderzeichen die immer wieder zu Problemen führen.

            @ alle: Es ist eine very good practice auf Umlaute in Bezeichnern und Variableninhalten, insbesondere in Programmen sowie in technischen Steuer- und Regel-Systemen (eine Textverarbeitung kann das natürlich) komplett zu verzichten.

            glg

            Stefan

            Kommentar


              #21
              Hallo,

              sorry, dass ich mich hier so lange nicht gemeldet habe.

              Ich habe das Plugin jetzt so weit fertig -prinzipiell.
              Code:
              #!/usr/bin/perl
              use strict;
              
              # ******************************************************************************
              # Das Plugin liest Werte der UVR 1611 über BL-Net ein, legt sie in RRDs ab und 
              # sendet sie auf den Bus.
              # Im Onlineschema des BL-Net müssen die Variabeln der zu lesenden Ein-/Ausgänge
              # innerhalb der Tags [UVR1611DATEN] [/UVR1611DATEN] eingetragen sein. Dies kann
              # z.B. im META Tag "Description" manuell vor dem Übertragen mit dem Memory
              # Manager hinzugefügt werden.
              # Beispiel:
              # <meta name="Description" content="<!-- [UVR1611DATEN]$n1a0|$n1a1|$n1a2|
              # $n1d0|$n1d1[/UVR1611DATEN] -->" />
              # Info zum Schema: http://doku.uvr1611.at/doku.php/de/onlineschema/onlineschema 
              # Der String wird im Plugin-Log angegeben. Bitte daraus in die HTML kopieren. 
              # Konfiguration:
              # Das Plugin benötigt als Input lediglich die XML des TA-Designer (http://www.ta.co.at/download/datenblaumltter/volumenstromgeber-fts-vfs-vsg/fts-dl/index.php?option=com_jdownloads&Itemid=103&task=viewcategory&catid=153)
              # Hierzu bitte im Designer alle Größen, die eingelesen werden sollen per Drag&Drop in das Schema ziehen. 
              # Die Positionierung der Elemente ist nicht relevant -es bietet sich aber an, gleich die Visualisierung 
              # mit zu erstellen.
              # Die Gruppenadressen und DPT werden ebenfalls im TA-Designer definiert.
              # Hierzu wird der "Test-Text" (Doppelklick auf Feld) genutzt.
              # 1/2/3;9.001 (GA;DPT)
              # Die Daten werden zugleich in einen RRD gespeichert. Der Name entspricht der Bezeichnung in der XML
              # In der Plugin-Datei (dem Code, dieser Datei) muss nur die URL ($uvrURL) angepasst werden
              # *****************VORSICHT***************************
              # ****Die XML darf keine Sonderzeichen enthalten******
              # *****************VORSICHT***************************
              # ******************************************************************************
              
              my $uvrUrl = 'http://192.168.178.5/GRAFIK1.htm';
              
              # vorübergehedes disablen des Plugins:
              # return "disabled";
              
              # plugin nicht zyklisch ausführen
              # $plugin_info{$plugname.'_cycle'} = 0;
              # plugin zyklisch ausführen
              $plugin_info{$plugname.'_cycle'} = $wg_config{''}{'rrd_interval'};
              
              # Eine KNX GA abonnieren: Plugin wird aufgerufen, sobald ein Paket an diese GA
              # kommt. Der Inhalt des Pakets steht dann in $msg.
              # $plugin_subscribe{'7/0/15'}{$plugname} = 1;
              
              
              #Ab hier nichts mehr ändern. Läuft automatisch
              # XML darf keine ÄÖÜ so wie andere Sonderzeichen oder das scharfe doppel S enthalten!!!!
              
              use XML::Simple;
              use Encode qw(encode decode);
              
              my $xml = new XML::Simple;
              
              my $xml_file = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
              
              my $i = 0;
              my @objekt;
              my @rrdName;
              my @knxGA;
              my @knxDPT;
              my @tmpText;
              my $tmpStr;
              my $value = $xml->XMLin(encode("utf8","$xml_file"),GroupTags=>{RequestedTerminations=>'String'})->{Seiten}->{Seite_0}->{Objekte}; #lese alle Elemente zwischen <Objekte> und </Objekte> aus der xml
              
              while ((my $key) = each %{$value}) {        
                  my $can_subindex = $value->{$key}->{can_subindex};
                  my $can_index = $value->{$key}->{can_index};
                  my $can_knoten = $value->{$key}->{can_knoten};            
                      
                  $can_subindex = sprintf ("%x" , $can_subindex); #Mache aus Integer HEX
                  $can_index = sprintf ("%x" , $can_index); #Mache aus Integer HEX
                  $can_knoten = sprintf ("%x" , $can_knoten); #Mache aus Integer HEX
                      
                  my $hilfsvariabel = substr($can_index,0,2); #Speichere die ersten beiden Stellen von can_index
                  $can_index = substr($can_index,2) . $hilfsvariabel; #Stelle die ersten beiden Stellen hinten an
                      
                  $objekt[$i] = '$X'.$can_index.'0'.$can_subindex.'0'.$can_knoten; # $ausgabe enthält den gewünschten Wert
                  
              
                  $tmpStr = $value->{$key}->{Bezeichnung};
                  #$tmpStr  =~ tr/:s+/__/;
                  $rrdName[$i] = $tmpStr;  
                  
                  $tmpStr = $value->{$key}->{Text};
                  @tmpText = split(/;/,$tmpStr);
                  $knxGA[$i] = @tmpText[1]; 
                  $knxDPT[$i] =  @tmpText[2];     
                  $i++;
              }
              
              plugin_log($plugname, 'Der String in der HTML sollte so aussehen:');
              plugin_log($plugname, $objekt);
              
              # Falls keine Zahl vom BL-Net übertragen wird sollten folgende Werte als boolean true (1) erkannt werden
              my @booleanTrue = ('EIN','ON','ein','true');
              my $tempValue;
              
              use LWP::Simple;
              my $urlContent = get($uvrUrl);
              return 'UVR-Datenabfrage fehlgeschlagen für $uvrUrl' unless defined $urlContent;
              $urlContent =~ /\[UVR1611DATEN\](.+)\[\/UVR1611DATEN\]/;
                plugin_log($plugname, 'Content');
                plugin_log($plugname, $1 );
              my @uvrVars = split(/\|/,$1);
              my $counter = 0;
              my $dbgOut;
              foreach (@knxGA){
                plugin_log($plugname, 'CurrentTempValue');
                $tempValue = $uvrVars[$counter]; 
                plugin_log($plugname, $tempValue);
                #plugin_log($plugname, '2');
                $tempValue =~ s/EIN/1/g;
                $tempValue =~ s/AUS/0/g;
                $tempValue =~ s/\,/./g; # , durch . ersetzen
                $tempValue =~ s/([-+]?[0-9]*\.[0-9]+|[0-9]+)//g;
                $tempValue = $1;
                plugin_log($plugname, $tempValue);
                plugin_log($plugname, '***'.$tempValue.'***');
                if ($tempValue !~ /[+-]?\d+[.,]?d*/) {
                   plugin_log($plugname, 'tempValue ist keine zahl');
                  foreach my $x (@booleanTrue) {
                    if ($tempValue eq $x) {
                      $tempValue = '1';
                       plugin_log($plugname, 'tempValue wird 1 zugewiesen');
                      last;
                    }
                  }
                  if ($tempValue ne '1') {
                    $tempValue = '0';
                     plugin_log($plugname, 'tempValue wird 0 zugewiesen');
                  }
                }
                if($_ ne ''){
                  knx_write($_, $tempValue, $knxDPT[$counter]);
                  plugin_log($plugname, "knx_write($_, $tempValue, $knxDPT[$counter])");
                  }
                if($rrdName[$counter] ne ''){
                  update_rrd($rrdName[$counter],'',$tempValue);
                  plugin_log($plugname, "update_rrd($rrdName[$counter],'',$tempValue)");
                  }
                # plugin_log($plugname, $dbgOut.'--- '.$counter.':'.$rrdName[$counter].'*'.$uvrVars[$counter].'*'.$tempValue.'*'.$_.'*'.$knxDPT[$counter]);
                $counter++;
                }
                
              # plugin_log($plugname, "@uvrVars -- @knxGA");
              return $counter." Werte von UVR abgefragt";
              
              # Copyright (C) 2012 Michael Schneider
              #
              # This program is free software: you can redistribute it and/or modify
              # it under the terms of the GNU General Public License as published by
              # the Free Software Foundation, either version 3 of the License, or
              # (at your option) any later version.
              #
              # This program is distributed in the hope that it will be useful,
              # but WITHOUT ANY WARRANTY; without even the implied warranty of
              # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
              # GNU General Public License for more details.
              #
              # You should have received a copy of the GNU General Public License
              # along with this program.  If not, see <http://www.gnu.org/licenses/>
              Leider gibt es einen Fehler:
              Code:
              Global symbol "$objekt" requires explicit package name at (eval 53027) line 92. BEGIN not safe after errors--compilation aborted at (eval 53027) line 98.
              Es hilft sicher nicht, dass Perl neu für mich ist ;-)
              Jetzt wird ja immer empfohlen, dass Plugin zunächst an der Kommandozeile zu testen. Wie geht das? Ich meine: Prinzipiell ist es kein Problem ein Perl-Skript an der Kommandozeile zu starten. Aber es gibt ja in den Plugins Befehle wie knx_write, rrd, ...

              Außerdem:
              Ich würde gerne eine IDE verwenden -auch gerne am Desktop- um das Programm während des Laufens zu debuggen/mir den Inhalt von Variablen anzeigen zu lassen.

              Geht das?


              Gruß,
              Hendrik

              Kommentar


                #22
                AW: XML in Plugin einlesen?

                Zum Fehler:

                Variablen deklarieren z.B: my $object ... !
                Also das "my" bei der ersten Verwendung nicht vergessen.

                Baustelle 2.0
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #23
                  Genau. Aber es ist ein Array. Also...

                  my @objekt;

                  So wie im von mir bereitgestellten Codeschnipsel, auf dem der Einleseteil des XML beruht

                  EDIT: Der Fehler beziet sich auf die Zeile 92... Das Problem ist, dass @objekt ein Array und keine Variable ist. Desshalb geht $objekt nicht. wenn schon z.B. $objekt[0]
                  Gruss Patrik alias swiss

                  Kommentar


                    #24
                    Hallo,

                    den Einleseteil habe ich doch 1:1 aus deinem Beitrag kopiert.
                    Und "objekt" habe ich doch auch in Zeile 57 deklariert:
                    Code:
                    my @objekt;
                    Gruß,
                    Hendrik

                    Kommentar


                      #25
                      Stimmt. hatte es oben schon editiert... Unsere Antworten haben sich wohl überschnitten.

                      Das Problem ist, dass objekt ein array ist und desshalb $objekt in Zeile 92 nicht geht. Das müsste wenn dann $objekt[0] heissen.
                      Gruss Patrik alias swiss

                      Kommentar


                        #26
                        Man kann (ehrlichgesagt mache ich das selbst so!) die Plugin-Laufzeitumgebung "emulieren", knx_write ist dann eben ein dummy mit printf
                        ist gerade outdatet aber ich schiebe das die Tage mal wieder ins SVN..

                        Die teils krude Syntax von Perl ist dann nochmal ne andere Sache

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

                        Kommentar


                          #27
                          Hallo,

                          danke (!), das läuft soweit schonmal. Versuche das noch End-User tauglich zu machen. Dann würde ich es hochladen (@Makki: Würdest du mich (henfri1) freischalten?).


                          Noch eine Frage: Ich möchte ja RRDs schreiben. Dabei können die Namen aus der Konfig-Datei (Schreibt der Editor der UVR selbst) so aussehen:
                          Dateiname.dat: Pumpe-Hzkr 2 Zustand (Ein/Aus)

                          Das ist natürlich für eine RRD gefährlich.
                          Gibt es eine Funktion, einen String in einen "ungefährlichen" Dateinamen umzuwandeln?
                          Also alles, was in einem Dateinamen stören kann durch Unterstriche zu ersetzen?


                          Gruß&Danke,
                          Hendrik

                          Kommentar


                            #28
                            Hallo,

                            zusätzlich zum oben stehenden:
                            Code:
                            $xml_file = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                            my $value = $xml->XMLin(encode("utf8","$xml_file"),GroupTags=>{RequestedTerminations=>'String'})->{Seiten}->{Seite_0}->{Objekte};
                            wird durch encode("utf8","$xml_file") nicht nur der String (also der Name der Conf) in utf8 umgewandelt?

                            Hintergrund:
                            In der Konfigurationsdatei sind Umlaute enthalten -das möchte ich auch nicht verbieten. Deshalb würde ich die Umlaute gerne ersetzen -das ist auch kein Problem, im Prinzip.
                            Im Plugin kommen die Umlaute aber gar nicht mehr an, sondern nur etwas wie
                            Code:
                            Z\xE4hler
                            Ich müsste die Conf also als String einlesen, die Umlaute ersetzen und das Resulat in die XMLIn einlesen, oder?

                            Edit:
                            So geht's:
                            Code:
                            my $xmlStr= do {
                                local $/ = undef;
                                open my $fh, "<", $xml_file
                                    or die "could not open $xml_file: $!";
                                <$fh>;
                            };
                            
                            $xmlStr=~ s/($umlautkeys)/$umlaute{$1}/g;
                            
                            $value = $xml->XMLin(encode("utf8","$xmlStr"),GroupTags=>{RequestedTerminations=>'String'})->{Seiten}->{Seite_0}->{Objekte}; #lese alle Elemente zwischen <Objekte> und </Objekte> aus der xml
                            Bleibt nur noch die Frage oben zum Umwandeln in einen dateinamen-kompatiblen-String.

                            Macht das Sinn?
                            Code:
                            $rrdNameStr=~ s/[^A-Za-z0-9\-\.]//g;
                            Gruß,
                            Hendrik

                            Kommentar


                              #29
                              Hallo Hendrik

                              Eine kurze Zwischenfrage... Für was genau hast du nochmal den Hexwert aus der CAN-ID gebraucht, der im Array @objekt abgelegt wird? Ich sehe dazu keine konkrete Verwendung im weiteren Code?
                              Gruss Patrik alias swiss

                              Kommentar


                                #30
                                Doch doch!
                                Code:
                                #!/usr/bin/perl
                                use strict;
                                
                                # ******************************************************************************
                                # by Hendrik Friedel (henfri) basierend auf Plugin von micha218 erweitert um XML-Einlesen
                                # Vielen Dank für die Hilfe von swiss beim XML.
                                # Das Plugin liest Werte der UVR 1611 über BL-Net ein, legt sie in RRDs ab und 
                                # sendet sie auf den Bus.
                                # Im Onlineschema des BL-Net müssen die Variabeln der zu lesenden Ein-/Ausgänge
                                # innerhalb der Tags [UVR1611DATEN] [/UVR1611DATEN] eingetragen sein. Dies kann
                                # z.B. im META Tag "Description" manuell vor dem Übertragen mit dem Memory
                                # Manager hinzugefügt werden.
                                # Beispiel:
                                # <!-- [UVR1611DATEN]$n1a0|$n1a1|$n1a2|$n1d0|$n1d1[/UVR1611DATEN] -->
                                # Info zum Schema: http://doku.uvr1611.at/doku.php/de/onlineschema/onlineschema 
                                # Der String wird im Plugin-Log angegeben. Bitte daraus in die HTML kopieren. 
                                # Konfiguration:
                                # Das Plugin benötigt als Input lediglich die XML des TA-Designer (http://www.ta.co.at/download/datenblaumltter/volumenstromgeber-fts-vfs-vsg/fts-dl/index.php?option=com_jdownloads&Itemid=103&task=viewcategory&catid=153)
                                # Hierzu bitte im Designer alle Größen, die eingelesen werden sollen per Drag&Drop in das Schema ziehen. 
                                # Die Positionierung der Elemente ist nicht relevant -es bietet sich aber an, gleich die Visualisierung 
                                # mit zu erstellen.
                                # Die Gruppenadressen und DPT werden ebenfalls im TA-Designer definiert.
                                # Hierzu wird der "Test-Text" (Doppelklick auf Feld) genutzt.
                                # 1/2/3;9.001 (GA;DPT)
                                # Die Daten werden zugleich in einen RRD gespeichert. Der Name entspricht der Bezeichnung in der XML
                                # In der Plugin-Datei (dem Code, dieser Datei) muss nur die URL ($uvrURL) angepasst werden
                                # *****************VORSICHT***************************
                                # ****Die XML darf keine Sonderzeichen enthalten******
                                # *****************VORSICHT***************************
                                # Idee zur Vereinfachung: in der XML haben alle Zeilen eine ID/sind nummeriert.
                                # Diese IDs sind auch in der HTML vorhanden (div-Elemente)
                                # Hierüber können die Daten zugeordnet werden, ohne dass der String in die HTML eingefügt werden muss.
                                # ******************************************************************************
                                
                                my $uvrUrl = 'http://192.168.178.5/GRAFIK1.htm';
                                
                                my @rrdName;
                                my @knxGA;
                                my @knxDPT;
                                
                                # Alternative Konfiguration ohne XML:
                                # my @knxGA = ('1/6/100','1/6/101','1/6/102','1/7/100','1/7/101');
                                # my @knxDPT = (9.001,9.001,9.001,1.001,1.001);
                                # my @rrdName = ('aussen_temp','innen_temp','vorlauf_temp','ventilHzRL_bool','anforderungBrenner_bool');
                                
                                
                                
                                # vorübergehedes disablen des Plugins:
                                # return "disabled";
                                
                                # plugin nicht zyklisch ausführen
                                # $plugin_info{$plugname.'_cycle'} = 0;
                                # plugin zyklisch ausführen
                                $plugin_info{$plugname.'_cycle'} = $wg_config{''}{'rrd_interval'};
                                
                                # Eine KNX GA abonnieren: Plugin wird aufgerufen, sobald ein Paket an diese GA
                                # kommt. Der Inhalt des Pakets steht dann in $msg.
                                # $plugin_subscribe{'7/0/15'}{$plugname} = 1;
                                
                                
                                #Ab hier nichts mehr ändern. Läuft automatisch
                                my %umlaute = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss" );
                                my $umlautkeys = join ("|", keys(%umlaute));
                                my $i = 0;
                                
                                
                                if (@knxGA) {
                                  plugin_log($plugname, 'Manuelle Konfiguration ohne XML via Variablen im Plugin-Code')
                                } else
                                {
                                # XML darf keine ÄÖÜ so wie andere Sonderzeichen oder das scharfe doppel S enthalten!!!!
                                
                                
                                
                                use XML::Simple;
                                use Encode qw(encode decode);
                                
                                my $xml = new XML::Simple;
                                
                                my $xml_file = '/etc/wiregate/plugin/generic/conf.d/'.basename($plugname,'.pl').'.conf';
                                
                                my @objekt;
                                my @tmpText;
                                my $tmpStr;
                                my $value;
                                my $htmlStr='';
                                my $GAStr='';
                                my $rrdNameStr='';
                                my $DPTStr='';
                                
                                
                                
                                
                                my $xmlStr= do {
                                    local $/ = undef;
                                    open my $fh, "<", $xml_file
                                        or die "could not open $xml_file: $!";
                                    <$fh>;
                                };
                                
                                $xmlStr=~ s/($umlautkeys)/$umlaute{$1}/g;
                                
                                $value = $xml->XMLin(encode("utf8","$xmlStr"),GroupTags=>{RequestedTerminations=>'String'})->{Seiten}->{Seite_0}->{Objekte}; #lese alle Elemente zwischen <Objekte> und </Objekte> aus der xml
                                
                                while ((my $key) = each %{$value}) {        
                                    my $can_subindex = $value->{$key}->{can_subindex};
                                    my $can_index = $value->{$key}->{can_index};
                                    my $can_knoten = $value->{$key}->{can_knoten};            
                                        
                                    $can_subindex = sprintf ("%x" , $can_subindex); #Mache aus Integer HEX
                                    $can_index = sprintf ("%x" , $can_index); #Mache aus Integer HEX
                                    $can_knoten = sprintf ("%x" , $can_knoten); #Mache aus Integer HEX
                                        
                                    my $hilfsvariabel = substr($can_index,0,2); #Speichere die ersten beiden Stellen von can_index
                                    $can_index = substr($can_index,2) . $hilfsvariabel; #Stelle die ersten beiden Stellen hinten an
                                        
                                    $objekt[$i] = '$X'.$can_index.'0'.$can_subindex.'0'.$can_knoten; # $ausgabe enthält den gewünschten Wert
                                    
                                
                                    $tmpStr = $value->{$key}->{Bezeichnung};
                                    #$tmpStr  =~ tr/:s+/__/;
                                    @tmpText = split(/.dat: /,$tmpStr);
                                    $tmpStr = @tmpText[1];
                                    #Replace Umlaute
                                    $tmpStr =~ s/($umlautkeys)/$umlaute{$1}/g;
                                    #Convert RRD Names to be compatible to Filename
                                    $tmpStr =~ s/[^A-Za-z0-9\-\.]/_/g;
                                    $rrdName[$i] = 'UVR_'.$tmpStr;   
                                    
                                    $tmpStr = $value->{$key}->{Text};
                                    plugin_log($plugname, 'DEBUG tmpStr Text'.$tmpStr);
                                    @tmpText = split(/\;/,$tmpStr);
                                    $knxGA[$i] = @tmpText[0]; 
                                    $knxDPT[$i] =  @tmpText[1];    
                                    plugin_log($plugname, 'DEBUG GA_DPT'.$knxGA[$i].'_'.$knxDPT[$i]);
                                    $htmlStr = $htmlStr.'|'.$objekt[$i]; 
                                    $GAStr = $GAStr.'|'.$knxGA[$i];
                                    $DPTStr = $DPTStr.'|'.$knxDPT[$i];
                                    $rrdNameStr = $rrdNameStr.'|'.$rrdName[$i];
                                    $i++;
                                }
                                
                                #Convert HTML-String for Online-Schema to UpperCase
                                $htmlStr=~ tr/A-Za-z/a-zA-Z/;
                                
                                
                                plugin_log($plugname, 'Konfiguration eingelesen.');
                                plugin_log($plugname, 'Namen:'.$rrdNameStr);
                                plugin_log($plugname, 'Gruppenadressen:'.$GAStr);
                                plugin_log($plugname, 'DPTs:'.$DPTStr);
                                plugin_log($plugname, 'UVR Variablen:'.$htmlStr);
                                $htmlStr='<!-- [UVR1611DATEN]'.$htmlStr.'[/UVR1611DATEN] -->';
                                plugin_log($plugname, 'Der String in der HTML sollte so aussehen:');
                                plugin_log($plugname, $htmlStr);
                                }
                                
                                
                                
                                
                                
                                # Falls keine Zahl vom BL-Net übertragen wird sollten folgende Werte als boolean true (1) erkannt werden
                                my @booleanTrue = ('EIN','ON','ein','true');
                                my $tempValue;
                                
                                use LWP::Simple;
                                my $urlContent = get($uvrUrl);
                                return 'UVR-Datenabfrage fehlgeschlagen für $uvrUrl' unless defined $urlContent;
                                $urlContent =~ /\[UVR1611DATEN\](.+)\[\/UVR1611DATEN\]/;
                                  plugin_log($plugname, 'Rueckgabe aus HTML');
                                  plugin_log($plugname, $1 );
                                my @uvrVars = split(/\|/,$1);
                                my $counter = 0;
                                my $rrd_counter = 0;
                                my $knx_counter = 0;
                                
                                my $dbgOut;
                                
                                foreach (@knxGA){
                                  plugin_log($plugname, '------Bearbeite Nr'.$counter.' Name='.$rrdName[$counter].'-------');
                                  $tempValue = $uvrVars[$counter+1]; 
                                  plugin_log($plugname, 'RückgabeUVR='.$tempValue);
                                  $tempValue =~ s/EIN/1/g;
                                  $tempValue =~ s/AUS/0/g;
                                  $tempValue =~ s/\,/./g; # , durch . ersetzen
                                  $tempValue =~ s/([-+]?[0-9]*\.[0-9]+|[0-9]+)//g;
                                  $tempValue = $1;
                                  plugin_log($plugname, 'Nachbehandelter Text='.$tempValue);
                                  if ($tempValue !~ /[+-]?\d+[.,]?d*/) {
                                     plugin_log($plugname, 'Nachbehandelter Text ist keine Zahl');
                                    foreach my $x (@booleanTrue) {
                                      if ($tempValue eq $x) {
                                        $tempValue = '1';
                                         plugin_log($plugname, 'tempValue wird 1 zugewiesen');
                                        last;
                                      }
                                    }
                                    if ($tempValue ne '1') {
                                      $tempValue = '0';
                                       plugin_log($plugname, 'tempValue wird 0 zugewiesen');
                                    }
                                  }
                                  if(($_ ne '')&&($_ ne 'xxx')){
                                    knx_write($_, $tempValue, $knxDPT[$counter]);
                                    plugin_log($plugname, "knx_write($_, $tempValue, $knxDPT[$counter])");
                                    $knx_counter++;
                                    }
                                  if($rrdName[$counter] ne ''){
                                    update_rrd($rrdName[$counter],'',$tempValue);
                                    plugin_log($plugname, "update_rrd($rrdName[$counter],'',$tempValue)");
                                    $rrd_counter++;
                                    }
                                   #plugin_log($plugname, $dbgOut.'--- '.$counter.':'.$rrdName[$counter].'*'.$uvrVars[$counter].'*'.$tempValue.'*'.$_.'*'.$knxDPT[$counter]);
                                  $counter++;
                                  }
                                  
                                # plugin_log($plugname, "@uvrVars -- @knxGA");
                                return $counter." Werte von UVR abgefragt, ".$rrd_counter." Werte als RRD gespeichert und ".$knx_counter." Werte an KNX gesendet";
                                
                                # Copyright (C) 2012 Michael Schneider
                                #
                                # This program is free software: you can redistribute it and/or modify
                                # it under the terms of the GNU General Public License as published by
                                # the Free Software Foundation, either version 3 of the License, or
                                # (at your option) any later version.
                                #
                                # This program is distributed in the hope that it will be useful,
                                # but WITHOUT ANY WARRANTY; without even the implied warranty of
                                # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                                # GNU General Public License for more details.
                                #
                                # You should have received a copy of the GNU General Public License
                                # along with this program.  If not, see <http://www.gnu.org/licenses/>
                                In $htmlstr wird der Hex-Code verwendet!
                                Allerdings hab ich tatsächlich noch eine andere Möglichkeit gefunden, bei der der Hex-Code nicht mehr gebraucht würde (siehe https://knx-user-forum.de/forum/supp...wiregate/25382). Das würde es für den User einfacher machen. Bei mir läuft obiges Plugin jetzt wunderbar. Ich werde es noch ein bisschen testen und mal offiziell veröffentlichen -in einem eigenen Thread.

                                Der Rest der XML wird aber weiter gebraucht, somit wäre auch dann die Arbeit nicht umsonst.

                                Gruß,
                                Hendrik

                                Kommentar

                                Lädt...
                                X