Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
-> 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.
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;
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++;
}
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.
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.
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]
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
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?
$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.
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?
#!/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.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar