Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin: Pelletskessel ETA PU

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

    #46
    Irgendwer (tm) hat als Max/Min werte für rrd folgendes definiert:
    255000 / -55

    Da fällt obige Formel für 24h*3600s*1000 (wegen Gramm) gnadenlos durch.
    Aber nun hab ichs angepasst. Mal sehen.
    Derzeit zwischen Kistenauspacken und Garten anlegen.
    Baublog im Profil.

    Kommentar


      #47
      Hmm, den kenn ich

      Im Ernst, wie bereits geschreiben: es macht ja kaum Sinn, das bestehende RRDs::create nochmal zu (re-)implementieren, das kann und darf man 1:1 auch direkt verwenden, wies geht steht schon im Source.
      rrd_update ist für AW gedacht die davon nicht wissen wollen/müssen, irgendeinen Default-Wert muss man nun reinschreiben ohne den AW zu zwingen das anzugeben; 255kg Pellets in der Stunde (nicht am tag, der Wert pro Sekunde wird ins RRD geschrieben! und dafür gilt das max..), das wäre aber schon ne Menge Holz

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

      Kommentar


        #48
        Hallo Makki,

        Du sprichst etwas in rätseln.
        Erst heisst es, rrd kommt aus der Messung von Netzwerkkarten, da gehts um Bytes/Sekunde, also alles runter auf Standardeinheiten. Jetzt soll ich doch Gramm/Stunde machen.
        Weiterhin nutze ich Deine update_rrd Funktion. Nix eigenes. Diese legt natürlich das rrd dann an, wenn es nicht da ist.
        Könnten wir die Schritte vl. nochmal abklopfen:

        Ich lege das rrd händisch an. Mit Counter, Step 3600 (wegen Stunde) und entsprechenden Grenzen für Heartbeat, Max und Min Wert. Wie gesagt händisch, da update_rrd ja die globalen Werte nehmen würde, die wohl nicht passen.

        Dann rufe ich das Plugin jede Stunde auf und lasse den aktuelln kg-Stand multipliziert mit 1000 eintragen (update_rrd).

        Dann sollte es schön aussehen?
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


          #49
          "step" ist das Zeitintervall für die RRA's (genauer PDP's - für welchen Zeitraum/Einheit Werte abgelegt werden) - hat mit den Einheiten/Werten nichts zu tun. bei COUNTER ist das immer (erstmal) als Einheit/sekunde zu versetehn, egal ob bananen, Watt, Gramm oder..

          Ich hatte da mal ne schöne Präsentation drüber, die ich aber grad nicht wiederfinde
          Am Beispiel des Stromzählers sollte sich das aber beizeiten mal erklären lassen..

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

          Kommentar


            #50
            So, nun gibts die ersten Werte.

            Ich habs dann mal so gemacht:
            Firstly, remember that RRD stores <things> per second. No matter what
            you feed it, that's what it stores.
            So lets say you feed it a value once per day, and the value is 15kg -
            then rrd will convert that to 15/86400 = 1.736e-4 (or 0.0001736)
            kg/s. Your options are really to multiply by 86400 before storing the
            value, or on extracting the data.

            Another issue is that rrd works in UTC, so the "days" it will work
            with are not the same as your local days. You just need to be aware
            of that.

            You will want a counter data type since you conveniently have a
            counter to feed it with.
            Das mit dem UTC sieht man ja, stört in Mitteleuropa jetzt aber auch nicht sooo sehr.
            Na, dann schauen wir mal, wie das mit der Heizlastberechnung zusammengeht diesen Winter
            Angehängte Dateien
            Derzeit zwischen Kistenauspacken und Garten anlegen.
            Baublog im Profil.

            Kommentar


              #51
              So ist es..

              Das mit UTC ist aber seit vielen Jahren/rrdtool-Versionen nicht mehr so, das System weiss ja nun recht genau, in welcher Zeitzone es sitzt, das ist höchstens ein Problem wenn jemand aus Tokyo die Graphen abruft und erwartet, dass die Zeitachse seiner Lokalzeit entspricht

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

              Kommentar


                #52
                Auf dem WG stimmt die Zeitzone? Ich habe sie nie eingerichtet. Aber ja, date sagt "CET". Wie man an der Grafik aber sieht, ist das UTC, was dort gezeichnet wird... JEdenfalls legt der die 86400 Sekunden auf die 1 Uhr nachts Grenze...
                Nicht das es mich stört, aber wenns behoben ist, könnte ich das ggf fixen?
                Angehängte Dateien
                Derzeit zwischen Kistenauspacken und Garten anlegen.
                Baublog im Profil.

                Kommentar


                  #53
                  Also bei mir werden alle Graphen mit der lokalen (Default CET/CEST) Zeitzone gezeichnet(?)
                  Die man übrigens per normalem Webinterface als "user" einstellen kann..

                  Den Rest versteh ich ehrlichgesagt nicht, je nach step kann es auch sein, das die angehängte Grafik halt einfach nur keine aktuellen Werte im PDP hat, nochmal: "step" hat mit den Werten/Einheiten nichts zu tun..

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

                  Kommentar


                    #54
                    Das hängt davon ab, was Du aggregierst. Wenn Du eben genau einen Tag aggregieren möchtest, macht Dir rrd das in UTC.

                    Die Wiregatestandardsettings sind ja nicht so voreingestellt, das das passieren könnte. Da ich aber exakt kg/Tag (oder 86400s) wissen will, trifft es mich.

                    Die Diskussion findest Du hier:

                    RRDtool - RRDtool - Page without a Title
                    Weiter unten im Thread ist auch eine Lösungsidee skizziert.

                    Grüße
                    Derzeit zwischen Kistenauspacken und Garten anlegen.
                    Baublog im Profil.

                    Kommentar


                      #55
                      Problem mit Counter RRD

                      Hallo zusammen,

                      ich habe da noch ein Problem mit dem Counter RRD:
                      Ziel ist es aus dem Gesamtverbrauch den Tagesverbrauch zu berechnen.

                      Ich habe das RRD mit folgendem Befehl angelegt:
                      Code:
                      rrdtool create Pelletsverbrauch.rrd DS:PELLET:COUNTER:86500:0:10000000000 RRA:AVERAGE:0.5:1:365 RRA:AVERAGE:0.5:7:300 -s 86400

                      Aktualisiert wird es im Plugin hiermit:
                      Code:
                      update_rrd(Pelletsverbrauch,"",(8400*$value->{RAW}/$value->{scaleFactor}-$value->{advTextOffset}),"COUNTER");

                      Wenn ich jetzt mit dem Diagrammeditor das RRD aufrufe bekomme ich nix bzw. "Loading":
                      Code:
                      http://wiregate249/graph.pl?--start=now-7days;--end=now;-X=0;-W=WireGate;--slope-mode;-h=400;-w=650;--full-size-mode;--vertical-label=;--title=;-c=BACK%23000000;-c=CANVAS%23000000;-c=SHADEA%23000000;-c=SHADEB%23000000;-c=GRID%23960000;-c=MGRID%236B4F42;-c=FONT%23FFFFFF;-c=AXIS%23000000;-c=FRAME%23000000;-c=ARROW%23000080;DEF:ds0=Pelletsverbrauch.rrd:value:AVERAGE;LINE1:ds0%23FF0000:Pelletsverbrauch.rrd;
                      Das RRD exisitiert aber und wird anscheinend fortgeschrieben, da sich das Dateidatum/-uhrzeit ändert.

                      Was mache ich falsch?

                      Danke
                      Sascha

                      Kommentar


                        #56
                        Ich habs so gemacht:

                        Code:
                        rrdtool create 112_10021_0_0_12016.rrd DS:PELLET:COUNTER:86500:0:10000000000 RRA:AVERAGE:0.5:1:365 RRA:AVERAGE:0.5:7:300 -s 86400
                        und update mit dem StrValue:
                        Code:
                        update_rrd($uri,"",86400*$str,"COUNTER");
                        Ich verstehe die 8400 bei Dir nicht. ggf. fehlt eine 6?
                        Derzeit zwischen Kistenauspacken und Garten anlegen.
                        Baublog im Profil.

                        Kommentar


                          #57
                          Denke auch das hier nur der 6er bzw. eine tausender-Stelle fehlt, dann kommen halt 1000fach zu kleine Werte rein, beim create stimmts ja..

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

                          Kommentar


                            #58
                            Zitat von makki Beitrag anzeigen
                            Denke auch das hier nur der 6er bzw. eine tausender-Stelle fehlt, dann kommen halt 1000fach zu kleine Werte rein, beim create stimmts ja..

                            Makki
                            Hilfe bin ich blind! Danke!!

                            Kommentar


                              #59
                              Nun haben wir also Lesen, Statistik und Fehler2rss drin. Als nächstes kommt dann Schreiben. Ich will doch mal den Warmwasserspeicher manuell hochheizen bzw. die VL senken (Partymodus), wobei das mit den geheizten Massen hier grenzwertig ist.
                              Derzeit zwischen Kistenauspacken und Garten anlegen.
                              Baublog im Profil.

                              Kommentar


                                #60
                                Das RRD liefert bei mir noch keine Ergebnisse, ich lass dem Ding jetzt mal 2 Tage Zeit zum Datensammeln, vielleicht kommt ja dann was...

                                @greentux: Einen riesen Dank für das Framework!!!!

                                Ich habe das Ganze mal in ein einziges Plugin gepackt:
                                - Abfragen Value Werte (Offset / Faktor)
                                - Abfragen String Werte (speziell Statusmeldungen)
                                - Schreiben RRD für Messwerte
                                - Schreiben RRD für Tageswerte aus Zählerständen (z. B. Pelletsverbrauch)

                                Hier mal mein Kunstwerk
                                Wenn jemand einen Fehler findet, dann bin ich natürlich für alle Hinweise dankbar.

                                Code:
                                # Dieses Plugin steuert einen ETA Heizkessel und nutzt die
                                # ETAtouch RESTful Webservices Schnittstelle, die mit der Anbindung des Kessels
                                # an www.meineta.at zur Verfügung steht.
                                #
                                # Eine Beschreibung der Schnittstelle ist unter diesem Link verfügbar:
                                # https://www.meineta.at/user/download.action?contentType=application%2Fpdf&file=ETA-RESTful-v1.pdf
                                # CAN-BUS-URI können in der XML-Datei für die Menüstruktur entnommen werden:
                                # http://ip:port/user/menu
                                
                                
                                ## Beginn Definitionen ##
                                my $IP_PU = "192.168.10.11:8080";
                                my $ResVariables = "/user/vars";
                                my $ResSingleVariable = "/user/var";
                                my $ResErrors = "/user/errors";
                                my $set="basic";
                                
                                # Mapping ETA can-bus-uri zu Gruppenadressen für Werte aus string Rückgaben
                                my %string_GA_URI_mapping = (
                                	'4/0/20' 	=> '112/10021/0/0/12000', 	# Kessel - Kesselstatus (Text)
                                	'4/0/48' 	=> '112/10021/0/0/12078', 	# Kessel - UV-Speicher (Text)
                                	'4/0/60' 	=> '112/10101/0/0/12090', 	# Kessel - Entaschung Status (Text)
                                	'4/0/63' 	=> '112/10021/0/0/12248', 	# Kessel - Beginn Ruhezeit
                                	'4/0/64' 	=> '112/10021/0/0/12249', 	# Kessel - Dauer Ruhezeit
                                	'4/0/76' 	=> '112/10021/0/0/12152', 	# Kessel - Pellets Saugzeitpunkt
                                	'4/0/81' 	=> '112/10021/0/0/12153', 	# Kessel - Volllaststunden
                                
                                	'4/0/100' 	=> '112/10101/0/0/12090', 	# HK - Status (Text)
                                	'4/0/103' 	=> '112/10101/0/0/12092', 	# HK - Betrieb (Text)
                                	'4/0/117' 	=> '112/10101/0/0/12232', 	# HK - Urlaub Beginn
                                	'4/0/118' 	=> '112/10101/0/0/12239', 	# HK - Urlaub Ende
                                
                                	'4/0/150' 	=> '112/10102/0/0/12090', 	# FBH - Status (Text)
                                	'4/0/153' 	=> '112/10102/0/0/12092', 	# FBH - Betrieb (Text)
                                	'4/0/167' 	=> '112/10102/0/0/12232', 	# FBH - Urlaub Beginn
                                	'4/0/168' 	=> '112/10102/0/0/12239', 	# FBH - Urlaub Ende
                                
                                	'4/0/200' 	=> '112/10111/0/0/12129', 	# WW - Schaltzustand (Text)
                                );
                                
                                # Mapping ETA can-bus-uri zu Gruppenadressen für Werte aus Value Rückgaben
                                my %value_GA_URI_mapping = (
                                	'4/0/21' 	=> '112/10021/0/0/12000', 		# Kessel - Kesselstatus (Code)
                                	'4/0/22' 	=> '112/10241/0/11149/2001',	# Kessel - Störmeldung
                                	'4/0/25' 	=> '112/10021/0/0/12080', 		# Kessel - I/O Taste
                                	'4/0/26' 	=> '112/10021/0/0/12115', 		# Kessel - Emissionsmessung
                                	'4/0/30' 	=> '112/10021/0/0/12001', 		# Kessel - Kessel Solltemperatur
                                	'4/0/31' 	=> '112/10021/0/0/12161', 		# Kessel - Isttemperatur unten
                                	'4/0/32' 	=> '112/10021/0/0/12300', 		# Kessel - Isttemperatur unten
                                	'4/0/36' 	=> '112/10021/0/0/12162', 		# Kessel - Abgastemperatur
                                	'4/0/37' 	=> '112/10021/0/0/12165', 		# Kessel - Drehzahl Abgasgebläse
                                	'4/0/38' 	=> '112/10021/0/0/12164', 		# Kessel - Restsauerstoff
                                	'4/0/40' 	=> '112/10021/0/11121/2120', 	# Kessel - VL1-Solltemperatur
                                	'4/0/41' 	=> '112/10021/0/11121/2121', 	# Kessel - VL1-Isttemperatur
                                	'4/0/46' 	=> '112/10021/0/11123/2001', 	# Kessel - Kesselpumpe 1
                                	'4/0/49' 	=> '112/10021/0/0/12078', 		# Kessel - UV-Speicher (Code)
                                	'4/0/50' 	=> '112/10021/0/11152/2120', 	# Kessel - VL2-Solltemperatur
                                	'4/0/51' 	=> '112/10021/0/11152/2121', 	# Kessel - VL2-Isttemperatur
                                	'4/0/56' 	=> '112/10021/0/11138/2001', 	# Kessel - Kesselpumpe 2
                                	'4/0/61' 	=> '112/10101/0/0/12090', 		# Kessel - Entaschung Status (Code)
                                	'4/0/62' 	=> '112/10021/0/0/12112', 		# Kessel - Entaschentaste
                                	'4/0/65' 	=> '112/10021/0/0/12073', 		# Kessel - Entaschen nach kg frühestens
                                	'4/0/66' 	=> '112/10021/0/0/12074', 		# Kessel - Entaschen nach kg spätestens
                                	'4/0/67' 	=> '112/10021/0/0/12120', 		# Kessel - Kübel leeren nach
                                	'4/0/70' 	=> '112/10201/0/0/12015', 		# Silo - Vorrat
                                	'4/0/71' 	=> '112/10021/0/0/12011', 		# Kessel - Pellets Behälterinhalt
                                	'4/0/75' 	=> '112/10021/0/0/12071', 		# Kessel - Pellets Füllen
                                	'4/0/82' 	=> '112/10021/0/0/12016', 		# Kessel - Gesamtverbrauch
                                	'4/0/83' 	=> '112/10021/0/0/12014', 		# Kessel - kg seit Wartung
                                	'4/0/84' 	=> '112/10021/0/0/12012', 		# Kessel - kg seit Entaschung
                                	'4/0/85' 	=> '112/10021/0/0/12013', 		# Kessel - kg seit Kübel entleeren
                                
                                	'4/0/101' 	=> '112/10101/0/0/12090', 		# HK - Status (Code)
                                	'4/0/104' 	=> '112/10101/0/0/12092', 		# HK - Betrieb (Code)
                                	'4/0/105' 	=> '112/10101/0/0/12080', 		# HK - I/O Taste
                                	'4/0/110' 	=> '112/10101/0/0/12126', 		# HK - Auto Taste
                                	'4/0/111' 	=> '112/10101/0/0/12125', 		# HK - Tag Taste
                                	'4/0/112' 	=> '112/10101/0/0/12230', 		# HK - Nacht Taste
                                	'4/0/115' 	=> '112/10101/0/0/12218', 		# HK - Kommen Taste
                                	'4/0/116' 	=> '112/10101/0/0/12231', 		# HK - Gehen Taste
                                	'4/0/120' 	=> '112/10101/12113/0/1109', 	# HK - Zeitautomatik Schaltzustand
                                	'4/0/140' 	=> '112/10101/0/0/12111', 		# HK - Solltemperatur
                                	'4/0/141' 	=> '112/10101/0/0/12240', 		# HK - Schieber Position
                                	'4/0/142' 	=> '112/10101/0/0/12104', 		# HK - Vorlauf bei -10°C
                                	'4/0/143' 	=> '112/10101/0/0/12103', 		# HK - Vorlauf bei +10°C
                                	'4/0/144' 	=> '112/10101/0/0/12107', 		# HK - Vorlauf Absenkung
                                	'4/0/145' 	=> '112/10101/0/0/12096', 		# HK - Heizgrenze Tag
                                	'4/0/146' 	=> '112/10101/0/0/12097', 		# HK - Heizgrenze Nacht
                                	'4/0/147' 	=> '112/10101/12095/0/1071', 	# HK - Außen verzögert (Lag x)
                                	'4/0/148' 	=> '112/10101/12095/0/1072', 	# HK - Außen verzögert (Lag Tf)
                                	'4/0/149' 	=> '112/10101/12095/0/1073', 	# HK - Außen verzögert (Lag y)
                                	'4/0/151' 	=> '112/10102/0/0/12090', 		# FBH - Status (Code)
                                	'4/0/154' 	=> '112/10102/0/0/12092', 		# FBH - Betrieb (Code)
                                	'4/0/155' 	=> '112/10102/0/0/12080', 		# FBH - I/O Taste
                                	'4/0/160' 	=> '112/10102/0/0/12126', 		# FBH - Auto Taste
                                	'4/0/161' 	=> '112/10102/0/0/12125', 		# FBH - Tag Taste
                                	'4/0/162' 	=> '112/10102/0/0/12230', 		# FBH - Nacht Taste
                                	'4/0/165' 	=> '112/10102/0/0/12218', 		# FBH - Kommen Taste
                                	'4/0/166' 	=> '112/10102/0/0/12231', 		# FBH - Gehen Taste
                                	'4/0/170' 	=> '112/10102/12113/0/1109', 	# FBH - Zeitautomatik Schaltzustand
                                	'4/0/190' 	=> '112/10102/0/0/12111', 		# FBH - Solltemperatur
                                	'4/0/191' 	=> '112/10102/0/0/12240', 		# FBH - Schieber Position
                                	'4/0/192' 	=> '112/10102/0/0/12104', 		# FBH - Vorlauf bei -10°C
                                	'4/0/193' 	=> '112/10102/0/0/12103', 		# FBH - Vorlauf bei +10°C
                                	'4/0/194' 	=> '112/10102/0/0/12107', 		# FBH - Vorlauf Absenkung
                                	'4/0/195' 	=> '112/10102/0/0/12096', 		# FBH - Heizgrenze Tag
                                	'4/0/196' 	=> '112/10102/0/0/12097', 		# FBH - Heizgrenze Nacht
                                	'4/0/197' 	=> '112/10102/12095/0/1071', 	# FBH - Außen verzögert (Lag x)
                                	'4/0/198' 	=> '112/10102/12095/0/1072', 	# FBH - Außen verzögert (Lag Tf)
                                	'4/0/199' 	=> '112/10102/12095/0/1073', 	# FBH - Außen verzögert (Lag y)
                                	'4/0/201' 	=> '112/10111/0/0/12129', 		# WW - Schaltzustand (Code)
                                	'4/0/205' 	=> '112/10111/0/0/12134', 		# WW - Laden Taste
                                	'4/0/210' 	=> '112/10111/0/0/12132', 		# WW - Solltemperatur
                                	'4/0/211' 	=> '112/10111/0/0/12271', 		# WW - Temperatur Speicher oben
                                	'4/0/219' 	=> '112/10111/0/0/12133', 		# WW - Einschaltdifferenz
                                	'4/0/230' 	=> '112/10111/12130/0/1109', 	# WW - Zeitautomatik Schaltzustand
                                	'4/0/231' 	=> '112/10111/12130/0/1110', 	# WW - Zeitautomatik Temperatur
                                );
                                
                                # Mapping ETA can-bus-uri zu RRD Graphen (Gauge = Messerte) aus Value Rückgaben
                                my %value_URI_RRD_mapping = (
                                	'112/10021/0/0/12001' 		=> 'Heizung_KesselSolltemperatur',
                                	'112/10021/0/0/12161' 		=> 'Heizung_Kesseltemperatur',
                                	'112/10021/0/0/12300' 		=> 'Heizung_KesseltemperaturUnten',
                                	'112/10021/0/0/12162' 		=> 'Heizung_Abgastemperatur',
                                	'112/10021/0/0/12165' 		=> 'Heizung_DrehzahlAbgasgebläse',
                                	'112/10021/0/0/12164' 		=> 'Heizung_Restsauerstoff',
                                
                                	'112/10021/0/11121/2120'	=> 'Heizung_VL1_Solltemperatur',
                                	'112/10021/0/11121/2121'	=> 'Heizung_VL1_Isttemperatur',
                                	'112/10021/0/11152/2120' 	=> 'Heizung_VL2_Solltemperatur',
                                	'112/10021/0/11152/2121' 	=> 'Heizung_VL2_Isttemperatur',
                                
                                	'112/10101/0/0/12111' 		=> 'Heizung_HK_Solltemperatur',
                                	'112/10101/0/0/12240' 		=> 'Heizung_HK_Schieber',
                                	'112/10102/0/0/12111' 		=> 'Heizung_FBH_Solltemperatur',
                                	'112/10102/0/0/12240' 		=> 'Heizung_FBH_Schieber',
                                	'112/10111/0/0/12132' 		=> 'Heizung_WW_Solltemperatur',
                                	'112/10111/0/0/12271' 		=> 'Heizung_WW_TemperaturSpeicherOben',
                                );
                                
                                # Mapping ETA can-bus-uri zu RRD Graphen für Tageszähler (aus Zählerstand) aus Value Rückgaben
                                # Unbedingt vorher über die Konsole im Verziechnis /var/www/rrd die einzelnen RRD manuell anlegen
                                # z. B. Pelletsverbrauch / Tag: rrdtool create Heizung_PelletsverbrauchTag.rrd DS:PELLET:COUNTER:86500:0:10000000000 RRA:AVERAGE:0.5:1:365 RRA:AVERAGE:0.5:7:300 -s 86400
                                my %value_URI_RRDmanual_mapping = (
                                	'112/10021/0/0/12016' 		=> 'Heizung_PelletsverbrauchTag',
                                );
                                
                                
                                # Mappin der ETA Einheiten zu KNX Datenpunkttypen (leere Einheit muss auch definiert sein)
                                my %unit_DPT_mapping = (
                                	"%" 			=> '5.001',
                                	"U/min"			=> '7.001',
                                	"\N{U+00b0}C"	=> '9.001',
                                	"Sek"			=> '9.010',
                                	'kg'			=> '14.051',
                                	''				=> ''
                                );
                                
                                ## Ende Definitionen ##
                                
                                #Module laden
                                use strict;
                                use warnings;
                                use LWP::UserAgent;
                                use XML::Parser;
                                use IO::File;
                                
                                # Plugin alle 1 Minuten aufrufen
                                $plugin_info{$plugname.'_cycle'} = 60*1;
                                
                                #Letzte Laufzeit protokollieren
                                update_rrd("LaufzeitPlugin_".$plugname,"",$plugin_info{$plugname.'_runtime'});
                                
                                # Variablen definieren
                                my %value_GA_URI;
                                my %string_GA_URI;
                                
                                # Prüfung ob Plugin durch Speichern aufgerufen wurde
                                my $RunSave;
                                if ((stat('/etc/wiregate/plugin/generic/' . $plugname))[9] > time()-10) {
                                # Code nach PL30
                                #if = ($plugin_info{$plugname.'_lastsaved'} > $plugin_info{$plugname.'_last'}) {
                                	$RunSave = 1;
                                	# ETA Variablenset anlegen, wenn Plugin durch Speichern aufgerufen
                                	delete_set("http://".$IP_PU.$ResVariables, $set);
                                	create_set("http://".$IP_PU.$ResVariables, $set);
                                	plugin_log($plugname,"Erste Ausführung nach Speichern >> Variablenset ".$set);
                                }
                                
                                
                                for my $ga (%string_GA_URI_mapping) {
                                    if (exists $string_GA_URI_mapping{$ga}) {
                                		#$plugin_subscribe{$ga}{$plugname} = 1;				#An Gruppenadresse anmelden
                                		$string_GA_URI{$string_GA_URI_mapping{$ga}} = $ga;	# Hash URI -> GA aus Hash GA->URI bilden
                                		if ($RunSave == 1) {
                                			# ETA Uri zu Variablenset hinzufügen, wenn Plugin durch Speichern aufgerufen
                                			add_to_set("http://".$IP_PU.$ResVariables, $set, $string_GA_URI_mapping{$ga});
                                			plugin_log($plugname,"Erste Ausführung nach Speichern >> Variablenset ".$set." - String URI".$string_GA_URI_mapping{$ga});
                                		}
                                    }
                                }
                                
                                for my $ga (%value_GA_URI_mapping) {
                                    if (exists $value_GA_URI_mapping{$ga}) {
                                		#$plugin_subscribe{$ga}{$plugname} = 1;				#An Gruppenadresse anmelden
                                		$value_GA_URI{$value_GA_URI_mapping{$ga}} = $ga;	# Hash URI -> GA aus Hash GA->URI bilden
                                		if ($RunSave == 1) {
                                			# ETA Uri zu Variablenset hinzufügen, wenn Plugin durch Speichern aufgerufen
                                			add_to_set("http://".$IP_PU.$ResVariables, $set, $value_GA_URI_mapping{$ga});
                                			plugin_log($plugname,"Erste Ausführung nach Speichern >> Variablenset ".$set." - Value URI".$value_GA_URI_mapping{$ga});
                                		}
                                    }
                                }
                                
                                if ((! %msg) or ($msg{'apci'} ne "A_GroupValue_Read")) {
                                	my @values = query_user_set_variables("http://".$IP_PU.$ResVariables, $set);
                                
                                	for my $value (@values) {
                                		# Werte für String auf GA schreiben
                                		if (exists $string_GA_URI{$value->{uri}}) {
                                			my $dpt = $eibgaconf{$string_GA_URI{$value->{uri}}}{'DPTSubId'};
                                			knx_write($string_GA_URI{$value->{uri}},$value->{strValue},$dpt);
                                			plugin_log($plugname,$value->{uri}." - GA ".$string_GA_URI{$value->{uri}}." - String: ".$value->{strValue});
                                		}
                                
                                		# Werte für Value auf GA schreiben
                                		if (exists $value_GA_URI{$value->{uri}}) {
                                			my $dpt = $unit_DPT_mapping{$value->{unit}} || $eibgaconf{$value_GA_URI{$value->{uri}}}{'DPTSubId'};
                                			knx_write($value_GA_URI{$value->{uri}},($value->{RAW}/$value->{scaleFactor}-$value->{advTextOffset}),$dpt);
                                			plugin_log($plugname,$value->{uri}." - GA ".$value_GA_URI{$value->{uri}}." - Wert: ".($value->{RAW}/$value->{scaleFactor}-$value->{advTextOffset}));
                                		}
                                
                                		# Werte für Value auf RRD schreiben
                                		if (exists $value_URI_RRD_mapping{$value->{uri}}) {
                                			update_rrd($value_URI_RRD_mapping{$value->{uri}},"",($value->{RAW}/$value->{scaleFactor}-$value->{advTextOffset}));
                                		}
                                		# Werte für Value auf RRD Tagesverbrauch schreiben
                                		if (exists $value_URI_RRDmanual_mapping{$value->{uri}}) {
                                			update_rrd($value_URI_RRDmanual_mapping{$value->{uri}},"",(86400*$value->{RAW}/$value->{scaleFactor}-$value->{advTextOffset}),"COUNTER");
                                		}		
                                	}
                                }
                                sub do_request {
                                	my ($type, $url) = @_;
                                	my $request = HTTP::Request->new($type => $url);
                                	my $ua = LWP::UserAgent->new;
                                	my $response = $ua->request($request);
                                	#unless ($response->is_success) {
                                	#	die $response->status_line;
                                	#}
                                	if ($url =~ m|http://localhost:|) {
                                		# Sleep to allow testing with nc -l 8080 -w 1
                                		sleep 1;
                                	}
                                	if ($response->content eq undef) {
                                		return 'Abfrage '.$type.' - '.$url.' fehlgeschlagen' ;
                                	}
                                	return $response->content;
                                }
                                
                                
                                sub parse_response
                                {
                                    my ($response, $want_element) = @_;
                                    my @result;
                                
                                    my $raw_value = '';
                                    my $get_characters;
                                    my $current_attributes;
                                
                                    my $start_handler = sub {
                                	my ($expat, $element, %attr) = @_;
                                
                                	return if ($element ne $want_element);
                                
                                	$current_attributes = \%attr;
                                	$get_characters = 1;
                                    };
                                
                                    my $end_handler = sub {
                                	my ($expat, $element) = @_;
                                
                                	return if ($element ne $want_element);
                                	$get_characters = 0;
                                
                                	$current_attributes->{RAW} = $raw_value;
                                	push @result, $current_attributes;
                                	$raw_value = '';
                                    };
                                
                                    my $char_handler = sub {
                                	my ($expat, $value) = @_;
                                
                                	if ($get_characters) {
                                	    $raw_value .= $value;
                                	}
                                    };
                                
                                    my $parser = XML::Parser->new(Handlers => { Start => $start_handler,
                                						Char => $char_handler,
                                						End => $end_handler });
                                    $parser->parse($response);
                                    return @result;
                                }
                                
                                
                                sub query_user_set_variables {
                                	my ($base_url, $set) = @_;
                                	my $url = "$base_url/$set";
                                	my $response = do_request(GET => $url);
                                	return parse_response($response, 'variable');
                                }
                                
                                
                                sub create_set {
                                	my ($base_url, $set) = @_;
                                	my $url = "$base_url/$set";
                                	# Ignore errors here, set might already be existing
                                	eval {
                                	do_request(PUT => $url);
                                	};
                                }
                                
                                
                                sub delete_set {
                                	my ($base_url, $set) = @_;
                                	my $url = "$base_url/$set";
                                	do_request(DELETE => $url);
                                }
                                
                                
                                sub add_to_set {
                                	my ($base_url, $set, $uri) = @_;
                                	my $url = "$base_url/$set/$uri";
                                	do_request(PUT => $url);
                                }
                                
                                
                                sub delete_from_set {
                                	my ($base_url, $set, $uri) = @_;
                                	my $url = "$base_url/$set/$uri";
                                	do_request(DELETE => $url);
                                }
                                Schwierigkeiten macht mir noch das Lesen einer GA und danach das Ausführen des Plugin, deswegen habe ich das $plugin_subscribe auskommentiert. Irgendwie verheddert er sich da in einer Endlosschleife.

                                @greentux: Ich habe vergeblich versucht den Kesselstatus und die Pumpenleistung in % in den URI zu finden. Hast du das gefunden, oder haben das unsere österreichischen Freunde bei eta vergessen?
                                Anscheinend fehlen auch die Messwerte, die mit der Service-Berechtigung angezeigt werden komplett.

                                Hoffentlich kommt da mal ne neue Version, so dass man dem Kessel wirklich alle Infos ausquetschen kann. Anbei mal ein paar Screenshots aus der CV.

                                Was jetzt noch fehlt sich die Schreibbefehle mit einem HTTP-POST...

                                Neben dem Klicki-Klacki in der Visu steht dann folgendes auf meinem Zettel:
                                - Ausschalten der Heizkreise wenn alle Stellgrößen=0% sind (mein Kessel ist nur Außentemperaturgeführt)
                                - Ausschalten des Kessels wenn er nix zu tun hat
                                - Vorgabe der Heizzeiten aus den RTR
                                - Vorgabe der Warmwasserbereitung (Abwesenheit, Zeitprofile auf dem Bus)

                                Es gibt also noch viel zu tun...

                                Ist aber trotzdem der Wahnsinn, wie man den ETA-Kessel mit dem WG KNX fähig machen kann.
                                Der Knaller wird es, wenn man dem Teil mit Intelligenz des Busses ein bisschen auf die Sprünge helfen kann.

                                So genug geschrieben, ich mach mit jetzt nen Cocktail.

                                Gruß
                                Sascha
                                Angehängte Dateien

                                Kommentar

                                Lädt...
                                X