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.
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
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.
"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..
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
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
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?
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..
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.
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.
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.
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