Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - UVR1611 über BL-NET auslesen

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

    [wiregate] - √ - UVR1611 über BL-NET auslesen

    Temperaturwerte und Schaltzustände der UVR 1611 können mit diesem Plugin auf KNX GAs und auf RRDs geschrieben werden. Dokumentation steht im Code, viel Erfolg beim Einsatz!

    Danke übrigens ans Forum für die vielen Tips und Beispiele, ohne die es sicherlich viel länger dauern würde sowas hier umzusetzen!

    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 
    # 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 = ('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');
    my $uvrUrl = 'http://192.168.0.1/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\]/;
    my @uvrVars = split(/\|/,$1);
    my $counter = 0;
    my $dbgOut;
    foreach (@knxGA){
      $tempValue = $uvrVars[$counter]; 
      $tempValue =~ /([\d*,-])/; # nur 0-9 und - und , herausfiltern
      $tempValue =~ s/\,/./g; # , durch . ersetzen
      # 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/>
    Fragen bitte hier posten!

    Gruß

    Micha

    #2
    Toll!
    Werde ich bald ausprobieren!

    Kommentar


      #3
      Supi

      Wunderbar, vielen Dank für das teilen Deiner Entwicklung mit der Community!

      glg

      Stefan

      Kommentar


        #4
        Hallo,

        d.h. mit dem Script kann man sich fast den CAN-BC/E sparen (zumindest wenn man nur auslesen will)?

        Ich kämpfe gerade damit die Brennerstarts und Dauer via CAN-BC/E auf den Eib zu schicken
        Gruss
        Uwe

        Kommentar


          #5
          Richtig, ich habe nur den BL-Net. Funktioniert damit auch sehr zuverlässig. Über das Onlineschema stehen alle Netzwerkvariabeln und die Datensätze des CAN-Datenlogging zur Verfügung.

          Gruß

          Micha

          Kommentar


            #6
            hmm wenn ich mir dieses script aber so ansehe, liest es die werte aus der grafik.html aus, das setzt ja aber voraus, das man diese erst erstellt und diese auch auf irgend nem webserver laufen sollte.

            der von ta vorgeschriebene weg direkt am can bus per web abfrage durchzuführen wäre doch sicherlich besser?

            mit dem html befehl ich http://192.168.100.27/c_index.htm?C=8D20053b bekommt man den 5. sensorwert in °C von der knoten nummer 59

            ich denke so etwas sollte sich doch einfacher implemntieren lassen als das über den umweg der grafik html zu machen?

            vielleicht wisst ihr ja wie so etwas schnell realisierbar ist.

            Kommentar


              #7
              Die GRAFIK.htm läuft auf dem BL-Net, brauchst da keinen extra Webserver für. Mit der Methode aus der Script bekomme ich mit einer Webabfrage alle analogen und digitalen Werte geliefert. Das finde ich besser als für jeden Wert eine eigene Abfrage durchzuführen. Der BL-Net ist wohl auch nicht so sehr belastbar ...

              Gruß

              Micha

              Kommentar


                #8
                hmm da muss ich mir nun wohl oder übel doch die html datei erstellen.

                obwohl, eigentlich hab ich ja den bc da :-)

                Kommentar


                  #9
                  Hallo,

                  Gibt es eigentlich eine Möglichkeit Werte an die UVR zu *senden*?
                  Edit: siehe hier: https://knx-user-forum.de/knx-eib-forum/14247-uvr-1611-knx-ist-moeglich.html

                  Gruß,
                  Hendrik

                  Kommentar


                    #10
                    Ja gibt es,

                    allerdings nur mittels des von TA lieferbaren Busconverters

                    grüße

                    Kommentar


                      #11
                      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:
                      <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"/>
                      Aus dieser Datei kann man nun den Hex-Code für das Online-Schema UND die Bezeichnung (unter Bezeichnung) auslesen.
                      Der Hex-Code ist allerdings versteckt in
                      Code:
                      can_subindex="8" can_index="13709" can_knoten="1"
                      Er berechnet sich wie folgt:
                      1) alle drei Werte in HEX, also
                      Code:
                      can_subindex="8" can_index="358D" can_knoten="1"
                      2) die zwei Bytes im can intdex vertauschen, also
                      Code:
                      can_subindex="08" can_index="8D35" can_knoten="01"
                      3) Aneinander setzen und $X davor:
                      Code:
                      $x can_index can_subindex  can_knoten
                      $X8D350801
                      Was bringt und das?
                      Na, das Plugin benötigt ja
                      Code:
                      <meta name="Description" content="<!-- [UVR1611DATEN]$n1a0|$n1a1|$n1a2|$n1d0|$n1d1[/UVR1611DATEN] -->" />
                      # my @rrdName =('aussen_temp','innen_temp','vorlauf_temp','ventilHzRL_bool','anforderungBrenner_bool');
                      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.

                      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ß,
                      Hendrik
                      Angehängte Dateien

                      Kommentar


                        #12
                        Hm, das einlesen klappt allerdings noch nicht:
                        2012-06-13 15:00:54.478,UVR1611,***&nbsp;50.0 &deg;C ***
                        2012-06-13 15:00:54.479,UVR1611,knx_write(1/6/100, &nbsp;50.0 &deg;C , 9.001)
                        2012-06-13 15:00:54.480,UVR1611,update_rrd(Solar Vorlauftemp,'',&nbsp;50.0 &deg;C )
                        2012-06-13 15:00:54.480,UVR1611,***&nbsp;&nbsp;&nbsp;&nbsp;0 l/h***
                        2012-06-13 15:00:54.481,UVR1611,knx_write(1/6/101, &nbsp;&nbsp;&nbsp;&nbsp;0 l/h, 9.001)
                        2012-06-13 15:00:54.482,UVR1611,update_rrd(Solar Rücklauftemp,'',&nbsp;&nbsp;&nbsp;&nbsp;0 l/h)
                        2012-06-13 15:00:54.482,UVR1611,***&nbsp;51.0 &deg;C ***
                        2012-06-13 15:00:54.484,UVR1611,knx_write(1/6/102, &nbsp;51.0 &deg;C , 9.001)
                        2012-06-13 15:00:54.484,UVR1611,update_rrd(Solar Durchfluss,'',&nbsp;51.0 &deg;C )
                        2012-06-13 15:00:54.484,UVR1611,***&nbsp;&nbsp;&nbsp;0.0 kW***
                        2012-06-13 15:00:54.486,UVR1611,knx_write(1/7/100, &nbsp;&nbsp;&nbsp;0.0 kW, 1.001)
                        2012-06-13 15:00:54.486,UVR1611,update_rrd(Solar Momentanleistung,'',&nbsp;&nbsp;&nbsp;0.0 kW)
                        2012-06-13 15:00:54.486,UVR1611,***-&nbsp;0.1 kWh***
                        2012-06-13 15:00:54.487,UVR1611,knx_write(1/7/101, -&nbsp;0.1 kWh, 1.001)
                        2012-06-13 15:00:54.487,UVR1611,update_rrd(Solar Ertrag,'',-&nbsp;0.1 kWh)
                        2012-06-13 15:00:54.487,UVR1611,5 Werte von UVR abgefragt,0.6s,
                        Er scheint die Einheiten nicht rauszufiltern. Eigentlich ist das aber im Quellcode doch vorgesehen?!

                        Der String lautet:
                        [UVR1611DATEN]&nbsp;51,0 &deg;C |&nbsp;&nbsp;&nbsp;&nbsp;0 l/h|&nbsp;57,6 &deg;C |&nbsp;&nbsp;&nbsp;0,0 kW|-&nbsp;0,1 kWh|999,9 &deg;C [/UVR1611DATEN]
                        Gruß,
                        Hendrik

                        Kommentar


                          #13
                          *push*
                          Code:
                            $tempValue = $uvrVars[$counter];    $tempValue =~ /([\d*,-])/; # nur 0-9 und - und , herausfiltern   $tempValue =~ s/\,/./g; # , durch . ersetzen
                          sollte doch eigentlich die Einheiten&Co loswerden, oder??

                          Gruß,
                          Hendrik

                          Kommentar


                            #14
                            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

                            Kommentar


                              #15
                              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
                              Code:
                                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.'***');
                              Ergibt dieses Log
                              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,&nbsp;&nbsp;0,0 
                              2012-06-24 22:07:15.356,UVR1611,2 
                              2012-06-24 22:07:15.356,UVR1611,&nbsp;&nbsp;0.0 
                              2012-06-24 22:07:15.357,UVR1611,3 
                              2012-06-24 22:07:15.357,UVR1611,***&nbsp;&nbsp;0.0*** 
                              2012-06-24 22:07:15.358,UVR1611,knx_write(3/0/2, &nbsp;&nbsp;0.0, 9.001) 
                              2012-06-24 22:07:15.361,UVR1611,update_rrd(Solar Vorlauftemp,'',&nbsp;&nbsp;0.0) 
                              2012-06-24 22:07:15.361,UVR1611,1 
                              2012-06-24 22:07:15.361,UVR1611,&nbsp;&nbsp;&nbsp;&nbsp;0 
                              2012-06-24 22:07:15.361,UVR1611,2 
                              2012-06-24 22:07:15.361,UVR1611,&nbsp;&nbsp;&nbsp;&nbsp;0 
                              2012-06-24 22:07:15.361,UVR1611,3 
                              2012-06-24 22:07:15.361,UVR1611,***&nbsp;&nbsp;&nbsp;&nbsp;0*** 
                              2012-06-24 22:07:15.362,UVR1611,knx_write(3/0/3, &nbsp;&nbsp;&nbsp;&nbsp;0, 9.001) 
                              2012-06-24 22:07:15.366,UVR1611,update_rrd(Solar Rücklauftemp,'',&nbsp;&nbsp;&nbsp;&nbsp;0)
                              Kann es an den &nbsp; liegen?

                              Die HTML-Datei vom BL-Net enthält
                              [UVR1611DATEN]&nbsp;&nbsp;0,0|&nbsp;&nbsp;&nbsp;&nbsp;0|&nbsp;&n bsp;0,0|&nbsp;&nbsp;&nbsp;0,0 kW|-&nbsp;0,1 kWh|999,9 &deg;C [/UVR1611DATEN]
                              Die von mir erstellte HTML-Datei sieht so aus:
                              <meta name="Description" content="<!-- [UVR1611DATEN]$X8D350901|$X95350901|$X91350901|$XA0350901|$XA135 0901|$X8D200101[/UVR1611DATEN] -->" />
                              Es ist mir nicht ersichtlich, woher die &nbsp; kommen. Sind die bei dir auch 'drin?

                              Gruß&Danke,
                              Hendrik

                              Kommentar

                              Lädt...
                              X