Hier geht's weiter, wenn ihr mögt:
https://knx-user-forum.de/forum/supp...385#post285971
Gruß,
Hendrik
Ankündigung
Einklappen
Keine Ankündigung bisher.
- √ - UVR1611 über BL-NET auslesen
Einklappen
Dieses Thema ist geschlossen.
X
X
-
So funktioniert es jetzt seit einigen Tagen stabil:
P.S: mein erster zählbarer Beitrag zur Community ;-oCode:#!/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 # Analog dazu müssen hier die Arrays @knxGA, @knxDPT, @rrdName im Abschnitt # [Definition der Variabeln] gefüllt werden. # Beispiel: # 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; # Definition der Variabeln my @knxGA = ('3/0/2','3/0/3','3/0/4','3/0/5','3/0/6','3/0/2','3/0/3','3/0/4','3/0/5','3/0/6','3/0/2','3/0/3','3/0/4','3/0/5','3/0/6',); my @knxDPT = (9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001,9.001); my @rrdName = ('Kollektor','Speicher 1', 'Speicher 2','Speicher 3','Speicher 4','Warmwasser','Netzwerk1' ,'Netzwerk2','Netzwerk3','Netzwerk4','Netzwerk5','Netzwerk6','PumpeSolar','PumpeSolar','Umschaltventil' ); my $uvrUrl = 'http://192.168.178.5/GRAFIK1.htm'; # 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/>
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Danke Makki,
das $1 war'S.
ich teste jetzt ein paar Tage und dann poste ich das Ergebnis hier.
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Also ich bin ja immernoch der Meinung das RE==SadoMaso ist
Nie gelernt, trotzdem lese ich lieber Assembler..
aber nun, es ist auch brutal mächtig:
gibt 26.1..Code:my $inputstr=' 26.1 °C'; $inputstr =~ s/([-+]?[0-9]*\.[0-9]+|[0-9]+)//g; print "Value is " . $1 . "\n";
Makki
Einen Kommentar schreiben:
-
Hallo,
ich hab mich echt bemüht... Aber ich brauche Perl/Regex hilfe.
Ich hab's an der Kommandozeile probiert. Dabei habe ich mich an perlretut - perldoc.perl.org gehalten
Der Output:Code:cat test.pl #!/usr/bin/perl my $inputstr=' 26.0 °C'; $inputstr =~ /^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$/; print $inputstr; my $inputstr=' 26.0 °C'; $inputstr =~ /[-+]?[0-9]*\.?[0-9]+/; print $inputstr; my $inputstr=' 26.0 °C'; $inputstr =~ /[\d*,-]/; print $inputstr;
Es passiert also bei allen Versuchen garnix. Was hab ich falsch verstanden?Code: 26.0 °C 26.0 °C 26.0 °C
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Hallo,
man kann d-logg nehmen, um die Werte, die auch in WinSol angezeigt werden auszugeben. Da hat man aber dann keine Möglichkeit zu konfigurieren.
Es gibt einen String mit den Zahlen in einer Reihenfolge und fertig.
Komfortabel ist das nicht.
Ich habe den Autor mal kontaktiert. Vielleicht geht da was.
@Makki: Prinzipiell parsen wir ja nicht HTML. Wir konfigurieren die UVR/BL-Net ja so, dass an einer Bestimmten Stelle der HTML Datei die Daten stehen. Das ist schon recht statisch und darin sind -außer diesen blöden nbsp keine Tags etc.
Allerdings wäre mir ne XML schon lieber ;-)
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Ja, genau das sind regex. Bei selfhtml ist dazu einiges erklärt...
Einen Kommentar schreiben:
-
Ich hab jetzt gerade keine Lust stundenlang nachzulesen und keine UVR1611 aber: die hatte auch eine vernünftige Schnittstelle statt sinnloses HTML zu parsen
Schaut da nochmal nach..
Makki
Einen Kommentar schreiben:
-
Hallo,
danke für deinen Einsatz.
Leidre funktioniert's noch immer nicht:
Ich glaub ich muss mal perl lernen. Sind das Reguläre Ausdrücke?2012-06-25 20:01:06.207,UVR1611,update_rrd(Solar Ertrag,'',- 0.1 kWh)
2012-06-25 20:01:06.207,UVR1611,1
2012-06-25 20:01:06.207,UVR1611,999,9 °C
2012-06-25 20:01:06.207,UVR1611,2
2012-06-25 20:01:06.207,UVR1611,999.9 °C
2012-06-25 20:01:06.207,UVR1611,3
2012-06-25 20:01:06.208,UVR1611,***999.9 °C ***
2012-06-25 20:01:06.209,UVR1611,knx_write(3/0/7, 999.9 °C , )
2012-06-25 20:01:06.211,UVR1611,update_rrd(Solar Kollektortemperatur,'',999.9 °C )
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Bei mir sind die Einheiten und Leerzeichen nicht drin, aber ich nehm ja auch andere Werte in der HTML Datei.
Versuch mal den Code folgendermaßen zu ändern (die beiden () rausnehmen):
Ich glaube, so ists richtig ....Code:$tempValue =~ /[\d*,-]/; # nur 0-9 und - und , herausfiltern
Einen Kommentar schreiben:
-
Hallo,
danke für deinen Tipp. Probiere ich aus.
Schade, dass es mit dem Senden nicht geklappt hat. Das hatte ich mir erhofft. Mal sehen, ob ich es hinbekomme.
Edit:
Schau mal
Ergibt dieses LogCode:plugin_log($plugname, '1'); $tempValue = $uvrVars[$counter]; plugin_log($plugname, $tempValue); plugin_log($plugname, '2'); $tempValue =~ /([\d*,-])/; # nur 0-9 und - und , herausfiltern $tempValue =~ s/\,/./g; # , durch . ersetzen plugin_log($plugname, $tempValue); plugin_log($plugname, '3'); plugin_log($plugname, '***'.$tempValue.'***');
Kann es an den liegen?Code:2012-06-24 22:04:25.692,UVR1611,6 Werte von UVR abgefragt,0.6s, 2012-06-24 22:07:15.356,UVR1611,1 2012-06-24 22:07:15.356,UVR1611, 0,0 2012-06-24 22:07:15.356,UVR1611,2 2012-06-24 22:07:15.356,UVR1611, 0.0 2012-06-24 22:07:15.357,UVR1611,3 2012-06-24 22:07:15.357,UVR1611,*** 0.0*** 2012-06-24 22:07:15.358,UVR1611,knx_write(3/0/2, 0.0, 9.001) 2012-06-24 22:07:15.361,UVR1611,update_rrd(Solar Vorlauftemp,'', 0.0) 2012-06-24 22:07:15.361,UVR1611,1 2012-06-24 22:07:15.361,UVR1611, 0 2012-06-24 22:07:15.361,UVR1611,2 2012-06-24 22:07:15.361,UVR1611, 0 2012-06-24 22:07:15.361,UVR1611,3 2012-06-24 22:07:15.361,UVR1611,*** 0*** 2012-06-24 22:07:15.362,UVR1611,knx_write(3/0/3, 0, 9.001) 2012-06-24 22:07:15.366,UVR1611,update_rrd(Solar Rücklauftemp,'', 0)
Die HTML-Datei vom BL-Net enthält
Die von mir erstellte HTML-Datei sieht so aus:[UVR1611DATEN] 0,0| 0| &n bsp;0,0| 0,0 kW|- 0,1 kWh|999,9 °C [/UVR1611DATEN]
Es ist mir nicht ersichtlich, woher die kommen. Sind die bei dir auch 'drin?<meta name="Description" content="<!-- [UVR1611DATEN]$X8D350901|$X95350901|$X91350901|$XA0350901|$XA135 0901|$X8D200101[/UVR1611DATEN] -->" />
Gruß&Danke,
Hendrik
Einen Kommentar schreiben:
-
Hallo Henfri,
Du hast vollkommen Recht, diese Zeile filtert bei mir die Einheiten raus und sollte es auch bei Dir tun. Zur Fehlersuche könntest Du vor der angesprochenen Zeile und nach der angesprochenen Zeile eine Debugausgabe einfügen :
plugin_log($plugname, tempValue);
Damit solltest Du dem Fehler auf die Spur kommen.
Ich habe mittlerweile den CAN-BC/E im Einsatz, mit dem ich die Werte auf den Bus übertrage und auch Werte vom Bus aus verändern kann. Bei meinen Versuchen ohne den BC/E Werte zu schreiben bin ich gescheitert. Ich vermute, dass ich die Initialisierung der Verbindung nicht korrekt durchgeführt hatte. Hier meine Quellen für die Versuche, die jedoch bei mir nie zuverlässig zum Ziel geführt haben:
UVR1611 ueber IPS steuern - geht das ??? - Seite 2 - IP-Symcon Community Forum
UVR 1611 Ausgänge mit Symcon stellen - IP-Symcon Community Forum
Ich hoffe, damit kann ich Dir helfen!
Viele Grüße
Micha
Einen Kommentar schreiben:
-
*push*
sollte doch eigentlich die Einheiten&Co loswerden, oder??Code:$tempValue = $uvrVars[$counter]; $tempValue =~ /([\d*,-])/; # nur 0-9 und - und , herausfiltern $tempValue =~ s/\,/./g; # , durch . ersetzen
Gruß,
Hendrik
Einen Kommentar schreiben:
-
Hm, das einlesen klappt allerdings noch nicht:
Er scheint die Einheiten nicht rauszufiltern. Eigentlich ist das aber im Quellcode doch vorgesehen?!2012-06-13 15:00:54.478,UVR1611,*** 50.0 °C ***
2012-06-13 15:00:54.479,UVR1611,knx_write(1/6/100, 50.0 °C , 9.001)
2012-06-13 15:00:54.480,UVR1611,update_rrd(Solar Vorlauftemp,'', 50.0 °C )
2012-06-13 15:00:54.480,UVR1611,*** 0 l/h***
2012-06-13 15:00:54.481,UVR1611,knx_write(1/6/101, 0 l/h, 9.001)
2012-06-13 15:00:54.482,UVR1611,update_rrd(Solar Rücklauftemp,'', 0 l/h)
2012-06-13 15:00:54.482,UVR1611,*** 51.0 °C ***
2012-06-13 15:00:54.484,UVR1611,knx_write(1/6/102, 51.0 °C , 9.001)
2012-06-13 15:00:54.484,UVR1611,update_rrd(Solar Durchfluss,'', 51.0 °C )
2012-06-13 15:00:54.484,UVR1611,*** 0.0 kW***
2012-06-13 15:00:54.486,UVR1611,knx_write(1/7/100, 0.0 kW, 1.001)
2012-06-13 15:00:54.486,UVR1611,update_rrd(Solar Momentanleistung,'', 0.0 kW)
2012-06-13 15:00:54.486,UVR1611,***- 0.1 kWh***
2012-06-13 15:00:54.487,UVR1611,knx_write(1/7/101, - 0.1 kWh, 1.001)
2012-06-13 15:00:54.487,UVR1611,update_rrd(Solar Ertrag,'',- 0.1 kWh)
2012-06-13 15:00:54.487,UVR1611,5 Werte von UVR abgefragt,0.6s,
Der String lautet:
Gruß,[UVR1611DATEN] 51,0 °C | 0 l/h| 57,6 °C | 0,0 kW|- 0,1 kWh|999,9 °C [/UVR1611DATEN]
Hendrik
Einen Kommentar schreiben:
-
Moin!
nach einigen Telefonaten mit dem tollen Support von TA habe ich erste Erfolge zu vermelden.
Das Online-Schema zu erstellen war ja bisher immer ein ziemlicher Krampf, da man sich die Strings wie $n0a1 zusammenfrickeln muss.
Das geht nun einfacher mit dem TA-Designer (gibt's bei TA zum Download).
Hier kann man einfach seine Projekt-Datei einlesen und erhält dann einen Baum mit allen im Projekt vorhandenen Parametern IM KLARTEXT.
So kann man also z.B. Solar-Vorlauf einfach auf's Bild ziehen. (Siehe Anhang).
Das Programm erstellt dann die graphik.gif, OnlineSchema.html und -und das ist der Clou für uns- eine xml Datei mit allen nötigen Informationen im Klartext.
Beispiel:
Aus dieser Datei kann man nun den Hex-Code für das Online-Schema UND die Bezeichnung (unter Bezeichnung) auslesen.<Objekt_0 Objekt_Typ="CAN_BL_Net_Obj" changeable="0" can_subindex="8" can_index="13709" can_knoten="1" Syntax2="" Syntax="" Schriftart="0;-16;0;0;0;700;0;0;0;0;3;2;1;34;Calibri" NachText="" Text="xxx" VorText="" Einheit="1" invisble="1" Hintergrund="16777215" Schriftfarbe="0" ausrichtung="0" locked="0" lockabel="0" Bezeichnung="Friedel.dat: Wärmemengenzähler-Solar- Vorlauftemperatur" Sondertype="0" y_u="206" x_r="-444" y_o="187" x_l="228"/>
Der Hex-Code ist allerdings versteckt in
Er berechnet sich wie folgt:Code:can_subindex="8" can_index="13709" can_knoten="1"
1) alle drei Werte in HEX, also
2) die zwei Bytes im can intdex vertauschen, alsoCode:can_subindex="8" can_index="358D" can_knoten="1"
3) Aneinander setzen und $X davor:Code:can_subindex="08" can_index="8D35" can_knoten="01"
Was bringt und das?Code:$x can_index can_subindex can_knoten $X8D350801
Na, das Plugin benötigt ja
Und beides lässt sich automatisch erstellen, wenn man auf diese Art sein Online-Schema erstellt hat -was ich dringend empfehlen würde, denn manuell ist es Masochismus.Code:<meta name="Description" content="<!-- [UVR1611DATEN]$n1a0|$n1a1|$n1a2|$n1d0|$n1d1[/UVR1611DATEN] -->" /> # my @rrdName =('aussen_temp','innen_temp','vorlauf_temp','ventilHzRL_bool','anforderungBrenner_bool');
Nun aber die Frage:
Wie automatisiere ich obiges? In Matlab könnte ich es recht fix. Aber das wäre wohl nicht sachdienlich...
Ideen?
Gruß,
HendrikAngehängte Dateien
Einen Kommentar schreiben:


Einen Kommentar schreiben: