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