Ankündigung

Einklappen
Keine Ankündigung bisher.

XML einer Dimplex Wärmepumpe mit NWPM auslesen

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

    [wiregate] XML einer Dimplex Wärmepumpe mit NWPM auslesen

    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

    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;
    Angehängte Dateien

    #2
    Sehr schön und vielen Dank für das Teilen mit der Community.

    Herzliche Adventsgrüße

    Stefan

    Kommentar


      #3
      Wenns funzt (kann ich nicht beurteilen..) bitte gerne ins SVN, damits nicht im Wust der Postings verloren geht..

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

      Kommentar


        #4
        Rim, vl. könntest Du dich noch ein wenig vom ETA Pelletskessel Plugin inspirieren lassen, um nicht 30 Zeilen knx_write schreiben zu müssen...
        Aber sonst. Schön, das nun auch ne WP am WG hängt
        Derzeit zwischen Kistenauspacken und Garten anlegen.
        Baublog im Profil.

        Kommentar


          #5
          Zitat von greentux Beitrag anzeigen
          Schön, das nun auch ne WP am WG hängt
          Nun, das ist schon viel länger so (nur interessiert meine IDM keinen): nur deshalb gibt es das WG, weil eine schlechte WP-Regelung zu beweisen ist

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

          Kommentar

          Lädt...
          X