Hallo Zusammen,
ich hab mich mal an das Auslesen meiner Heizungssteuerung gemacht.
Die Heizung hat einen kleinen Webserver der viele Werte an einer XML Schnittstelle ausgibt. Dimplex Steuerung mit NWPM-Webserver.
Die Vorlage ist das SunnyWeb.pl von Makki.
Das ist jetzt mal der erste Wurf um die Daten in der CometVisu anzuzeigen.
Bis auf die Kleinigkeit das noch alles als Temperatur angezeigt wird, läufts schon ganz gut.
Bisher hatte ich noch nichts mit Perl und XML am Hut, es gibt noch viel Verbesserungspotential.
Aber vielleicht kann es ja mal jemand brauchen.
Viel Spaß
rim
ich hab mich mal an das Auslesen meiner Heizungssteuerung gemacht.
Die Heizung hat einen kleinen Webserver der viele Werte an einer XML Schnittstelle ausgibt. Dimplex Steuerung mit NWPM-Webserver.
Die Vorlage ist das SunnyWeb.pl von Makki.
Das ist jetzt mal der erste Wurf um die Daten in der CometVisu anzuzeigen.
Bis auf die Kleinigkeit das noch alles als Temperatur angezeigt wird, läufts schon ganz gut.
Bisher hatte ich noch nichts mit Perl und XML am Hut, es gibt noch viel Verbesserungspotential.
Aber vielleicht kann es ja mal jemand brauchen.
Viel Spaß
rim
Code:
# Plugin zur Abfrage eines Dimplex NWPM bzw. Carel pCOWeb via HTTP/XML
# Umbau des SunnyWeb.pl von makki
# Parameter aus XML Schnittstelle des NWPM auslesen.
# V 0.3 30.11.2012
# Firmware des NWPM A1.4.2 - B1.2.4 Software Version 06/2010
#
# So sieht das XML des NWMP aus
#<PCOWEB>
# <PCO>
# <ANALOG>
# <VARIABLE>
# <INDEX>28</INDEX>
# <VALUE>29.3</VALUE>
# </VARIABLE>
# <VARIABLE>
# <INDEX>29</INDEX>
# <VALUE>34.9</VALUE>
# </VARIABLE>
# <VARIABLE>
# <INDEX>30</INDEX>
# <VALUE>50.2</VALUE>
# </VARIABLE>
# </ANALOG>
# </PCO>
#</PCOWEB>
##################
### DEFINITION ###
##################
my $ip = "192.168.1.123";
my $url = "/usr-cgi/xml.cgi?";
my $analog_range = "A|1|127"; #Für Analogwerte des pCOWeb
my $digital_range = "D|41|199"; #Für Digitalwerte des pCOWeb
my $integer_range = "I|1|127"; #Für Integerwerte des pCOWeb
my $name = "Heizung"; # Name fuer die RRD-Archive
#analog
my $ga_ww_soll_temp_aktuell = "10/1/17";
my $ga_min_temp_2HK = "10/1/18";
my $ga_aussen_temp = "10/1/27";
my $ga_ruecklauf_soll_temp = "10/1/28";
my $ga_ruecklauf_ist_temp = "10/1/29";
my $ga_warmwasser_ist_temp = "10/1/30";
my $ga_vorlauf_ist_temp = "10/1/31"; #richtung wp
my $ga_heizkreis_soll_temp = "10/1/32";
my $ga_heizkreis_ist_temp = "10/1/33";
my $ga_ww_soll_temp = "10/1/40";
my $ga_flow_limit_temp = "10/1/41";
my $ga_history_verdichter_1 = "10/1/64";
my $ga_history_verdichter_2 = "10/1/65";
my $ga_history_ventilator = "10/1/66";
my $ga_history_waermeerz_2 = "10/1/67";
my $ga_history_heizungspumpe = "10/1/68";
my $ga_history_ww_pumpe = "10/1/69";
my $ga_history_flanschheiz = "10/1/70";
#digital
my $ga_evu_sperre = "10/2/56";
my $ga_warmwasseranforderung = "10/2/57";
my $ga_verdichter_1 = "10/2/80";
my $ga_ventilator = "10/2/82";
my $ga_waermeerzeuger_2 = "10/2/83";
my $ga_heizungspumpe = "10/2/84";
my $ga_warmwasserpumpe = "10/2/85";
my $ga_mischer_auf = "10/2/86";
my $ga_mischer_zu = "10/2/87";
my $ga_zusatz_umwaelz_pumpe = "10/2/88";
my $ga_tauchheizkoerper = "10/2/89";
my $ga_heizpumpe_kreis2 = "10/2/90";
my $ga_mischer_auf_kreis2 = "10/2/91";
my $ga_mischer_zu_kreis2 = "10/2/92";
my $ga_heizpumpe_kreis1 = "10/2/94";
my $ga_umschaltventil = "10/2/97";
$plugin_info{$plugname.'_cycle'} = 300; # Eigenen Aufruf-Zyklus setzen
my $debug = 0; # Debug-Ausgaben aktivieren?
#######################
### ENDE DEFINITION ###
#######################
# Hauptverarbeitung
use LWP::Simple; # comment wenn lokales XML
use XML::Simple;
use Data::Dumper;
my $xml_analog = get("http://".$ip.$url.$analog_range);
return "Fehler beim auslesen der Analogwerte!" unless $xml_analog;
my $xml_digital = get("http://".$ip.$url.$digital_range);
return "Fehler beim auslesen der Digitalwerte!" unless $digital_range;
my $xml_integer = get("http://".$ip.$url.$integer_range);
return "Fehler beim auslesen der Integerwerte!" unless $integer_range;
if ($debug) {
open (XMLFILE, '>/tmp/heizung_analog.xml');
print XMLFILE $xml_analog;
close (XMLFILE);
}
if ($debug) { #Mal schaun ob überhaupt was geschrieben wird...
knx_write("10/2/1",33,9.001);
}
my $xs_a = new XML::Simple(KeyAttr=>'INDEX'); #Index Element als Schlüssel verwenden
my $xs_d = new XML::Simple(KeyAttr=>'INDEX'); #Index Element als Schlüssel verwenden
my $xs_i = new XML::Simple(KeyAttr=>'INDEX'); #Index Element als Schlüssel verwenden
my $data_a = $xs_a->XMLin($xml_analog);
my $data_d = $xs_d->XMLin($xml_digital);
my $data_i = $xs_i->XMLin($xml_integer);
#return Dumper($xml_analog);
#return Dumper($data);
#Analoge Werte der Heizung
my $XML_A_17= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{17}->{VALUE};
my $XML_A_18= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{18}->{VALUE};
my $XML_A_27= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{27}->{VALUE};
my $XML_A_28= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{28}->{VALUE};
my $XML_A_29= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{29}->{VALUE};
my $XML_A_30= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{30}->{VALUE};
my $XML_A_31= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{31}->{VALUE};
my $XML_A_32= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{32}->{VALUE};
my $XML_A_33= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{33}->{VALUE};
my $XML_A_40= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{40}->{VALUE};
my $XML_A_41= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{41}->{VALUE};
my $XML_A_64= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{64}->{VALUE};
my $XML_A_65= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{65}->{VALUE};
my $XML_A_66= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{66}->{VALUE};
my $XML_A_67= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{67}->{VALUE};
my $XML_A_68= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{68}->{VALUE};
my $XML_A_69= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{69}->{VALUE};
my $XML_A_70= $data_a->{PCO}->{ANALOG}->{VARIABLE}->{70}->{VALUE};
#Digitale Werte der Heizung
my $XML_D_56= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{56}->{VALUE};
my $XML_D_57= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{57}->{VALUE};
my $XML_D_80= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{80}->{VALUE};
my $XML_D_82= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{82}->{VALUE};
my $XML_D_83= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{83}->{VALUE};
my $XML_D_84= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{84}->{VALUE};
my $XML_D_85= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{85}->{VALUE};
my $XML_D_86= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{86}->{VALUE};
my $XML_D_87= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{87}->{VALUE};
my $XML_D_88= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{88}->{VALUE};
my $XML_D_89= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{89}->{VALUE};
my $XML_D_90= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{90}->{VALUE};
my $XML_D_91= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{91}->{VALUE};
my $XML_D_92= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{92}->{VALUE};
my $XML_D_94= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{94}->{VALUE};
my $XML_D_97= $data_d->{PCO}->{DIGITAL}->{VARIABLE}->{97}->{VALUE};
#Das ganze Zeugs auf den KNX schreiben
knx_write($ga_ww_soll_temp_aktuell, $XML_A_17,9);
knx_write($ga_min_temp_2HK, $XML_A_18,9);
knx_write($ga_aussen_temp, $XML_A_27,9);
knx_write($ga_ruecklauf_soll_temp, $XML_A_28,9);
knx_write($ga_ruecklauf_ist_temp, $XML_A_29,9);
knx_write($ga_warmwasser_ist_temp, $XML_A_30,9);
knx_write($ga_vorlauf_ist_temp, $XML_A_31,9);
knx_write($ga_heizkreis_soll_temp, $XML_A_32,9);
knx_write($ga_heizkreis_ist_temp, $XML_A_33,9);
knx_write($ga_ww_soll_temp, $XML_A_40,9);
knx_write($ga_flow_limit_temp, $XML_A_41,9);
knx_write($ga_history_verdichter_1, $XML_A_64,9);
knx_write($ga_history_verdichter_2, $XML_A_65,9);
knx_write($ga_history_ventilator, $XML_A_66,9);
knx_write($ga_history_waermeerz_2, $XML_A_67,9);
knx_write($ga_history_heizungspumpe, $XML_A_68,9);
knx_write($ga_history_ww_pumpe, $XML_A_69,9);
knx_write($ga_history_flanschheiz, $XML_A_70,9);
knx_write($ga_evu_sperre, $XML_D_56,9);
knx_write($ga_warmwasseranforderung, $XML_D_57,9);
knx_write($ga_verdichter_1, $XML_D_80,9);
knx_write($ga_ventilator, $XML_D_82,9);
knx_write($ga_waermeerzeuger_2, $XML_D_83,9);
knx_write($ga_heizungspumpe, $XML_D_84,9);
knx_write($ga_warmwasserpumpe, $XML_D_85,9);
knx_write($ga_mischer_auf, $XML_D_86,9);
knx_write($ga_mischer_zu, $XML_D_87,9);
knx_write($ga_zusatz_umwaelz_pumpe, $XML_D_88,9);
knx_write($ga_tauchheizkoerper, $XML_D_89,9);
knx_write($ga_heizpumpe_kreis2, $XML_D_90,9);
knx_write($ga_mischer_auf_kreis2, $XML_D_91,9);
knx_write($ga_mischer_zu_kreis2, $XML_D_92,9);
knx_write($ga_heizpumpe_kreis1, $XML_D_94,9);
knx_write($ga_umschaltventil, $XML_D_97,9);
#Und noch die RRDs erstellen und updaten.
update_rrd($name,"ww_soll_temp_aktuell", $XML_A_17);
update_rrd($name,"min_temp_2HK", $XML_A_18);
update_rrd($name,"aussen_temp", $XML_A_27);
update_rrd($name,"ruecklauf_soll_temp", $XML_A_28);
update_rrd($name,"ruecklauf_ist_temp", $XML_A_29);
update_rrd($name,"warmwasser_ist_temp", $XML_A_30);
update_rrd($name,"vorlauf_ist_temp", $XML_A_31);
update_rrd($name,"heizkreis_soll_temp", $XML_A_32);
update_rrd($name,"heizkreis_ist_temp", $XML_A_33);
update_rrd($name,"ww_soll_temp", $XML_A_40);
update_rrd($name,"flow_limit_temp", $XML_A_41);
update_rrd($name,"history_verdichter_1", $XML_A_64);
update_rrd($name,"history_verdichter_2", $XML_A_65);
update_rrd($name,"history_ventilator", $XML_A_66);
update_rrd($name,"history_waermeerz_2", $XML_A_67);
update_rrd($name,"history_heizungspumpe", $XML_A_68);
update_rrd($name,"history_ww_pumpe", $XML_A_69);
update_rrd($name,"history_flanschheiz", $XML_A_70);
update_rrd($name,"evu_sperre", $XML_D_56);
update_rrd($name,"warmwasseranforderung", $XML_D_57);
update_rrd($name,"verdichter_1", $XML_D_80);
update_rrd($name,"ventilator", $XML_D_82);
update_rrd($name,"waermeerzeuger_2", $XML_D_83);
update_rrd($name,"heizungspumpe", $XML_D_84);
update_rrd($name,"warmwasserpumpe", $XML_D_85);
update_rrd($name,"mischer_auf", $XML_D_86);
update_rrd($name,"mischer_zu", $XML_D_87);
update_rrd($name,"zusatz_umwaelz_pumpe", $XML_D_88);
update_rrd($name,"tauchheizkoerper", $XML_D_89);
update_rrd($name,"heizpumpe_kreis2", $XML_D_90);
update_rrd($name,"mischer_auf_kreis2", $XML_D_91);
update_rrd($name,"mischer_zu_kreis2", $XML_D_92);
update_rrd($name,"heizpumpe_kreis1", $XML_D_94);
update_rrd($name,"umschaltventil", $XML_D_97);
#return Dumper($xml);
#plugin_log($plugname,"Lebt die Kiste noch?-> 84 ".$XML_D_84);
# avoid memleaks?
$xml_analog = (); # comment wenn lokales XML
$xml_digital = ();
$xml_integer = ();
$data_a = ();
$data_d = ();
$data_i = ();
undef $xml_analog; # comment wenn lokales XML
undef $xml_digital;
undef $xml_integer;
undef $data_a;
undef $data_d;
undef $data_i;
return;



Kommentar