Initiale Version für HArgassner FHEM Modul

git-svn-id: svn://svn.compuextreme.de/Projects/PelletsTank/FHEM_Hargassner@77 8b25ccb4-ac81-0410-8091-8ccfc2efc008
This commit is contained in:
kueller 2022-06-14 10:42:49 +00:00
commit f4f9b87a0f
3 changed files with 741 additions and 0 deletions

463
20_HGNanopk.pm Normal file
View File

@ -0,0 +1,463 @@
# 20_HGNanopk.pm
# HGNanopk Device (readings only)
#
# based on 20_HARGASSNER.pm from:
# (c) 2016 Alexander Kneer <alexander.kneer@gmx.de>
# 2020 tb. (modify readings)
#
# 20_HGNanopk.pm
package main;
use Net::Telnet;
use List::Util 'first';
use strict;
use warnings;
use HttpUtils;
use Unicode::String;
sub HGNanopk_UpdateValue($$$);
my %gets = (
"Fehlerdaten" => "Fehlerdaten",
);
#################################################################################
sub HGNanopk_Initialize($) {
#################################################################################
my ($hash) = @_;
# Normal devices
$hash->{UndefFn} = "HGNanopk_Undef";
$hash->{DefFn} = "HGNanopk_Define";
$hash->{AttrFn} = "HGNanopk_Attr";
$hash->{NOTIFYDEV} = "global";
# $hash->{AttrList} = "dummy:1,0 ";
# $hash->{AttrList} = $readingFnAttributes;
# $hash->{GetFn} = "HGNanopk_Get";
$hash->{DbLog_splitFn} = "HGNanopk_DbLog_split";
}
#################################################################################
sub HGNanopk_Define($$) {
#################################################################################
my ($hash, $def) = @_;
my @a = split("[ \t]+", $def);
if(@a != 4) {
return "wrong syntax: define <name> HGNanopk <hostname> <interval>";
}
my $name= $a[0];
my $hostname= $a[2];
my $interval= $a[3];
$hash->{DeviceName} = $name;
$hash->{Device} = $hostname;
$hash->{STATE} = 'Initialized';
$hash->{interval} = $interval;
Log 4,"HGNanopk_Define -> $name at $hostname (Update every $interval seconds)";
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+$hash->{interval}, "HGNanopk_GetUpdate", $hash, 0);
return undef;
}
#################################################################################
sub HGNanopk_Undef($@) {
#################################################################################
my ( $hash, $arg ) = @_;
RemoveInternalTimer($hash);
return undef;
}
##################################################################################
sub HGNanopk_DbLog_split($$) {
#################################################################################
my ( $event, $device_name ) = @_;
my ( $reading, $value, $unit) = split / /, $event;
$reading =~ s/://;
#$reading = substr($reading, 4);
return ( $reading, $value, $unit );
}
##################################################################################
sub HGNanopk_GetUpdate($)
#################################################################################
{
my ($hash) = @_;
my $name = $hash->{NAME};
sub query_bit($$) {
my ( $bitarray, $bit ) = @_;
$bitarray = hex("0x".$bitarray);
return ( ( $bitarray & 2**$bit ) ? 1 : 0);
}
Log3 $name, 4, "HGNanopk ($name) - Get Update";
my $telnet = Net::Telnet->new(Timeout => 30, Errmode => 'die');
if (!$telnet) {
Log3 $name, 4, "HGNanopk ($name) - telnet bad";
}
else
{
Log3 $name, 4, "HGNanopk ($name) - telnet ok";
if($telnet->open($hash->{Device}))
{
Log3 $name, 4, "HGNanopk ($name) - connected to pellet oven via telnet";
my $line1 = $telnet->getline();
my $line2 = $telnet->getline();
$telnet->close;
Log3 $name, 4, "HGNanopk ($name) - line ($line2)";
my @array = split(/ /, $line2);
readingsBeginUpdate($hash);
if ($array[0] eq "pm") {
#will contain the data readed from DAQ00001.translation
#First a hash (key = name of DAQ00001.DAQ, Value = Translation from DAQ00001.translation)
my %HG_TRANSLATION_HASH;
#second a hash (key = reading name, as used in fhem, Value is 0 or 1 for not displayed or displayed)
my %HG_ACTIVE_HASH;
my %HG_STATUS_CODES;
my $translation=1;
my $states=1;
my @HG_HEADER_ANALOG;
my @HG_HEADER_DIGITAL;
my $NAME;
my @HG_Reading_Names;
#my @array;
my @databuff;
sub query_bit($$) {
my ( $bitarray, $bit ) = @_;
$bitarray = hex("0x" . $bitarray);
return ( ( $bitarray & 2**$bit ) ? 1 : 0);
}
if ( -e "DAQ00001.translation" ) {
my @filebuffer;
open(TRANSLATE,'<','DAQ00001.translation') or $translation=0;
while(<TRANSLATE>) {
push(@filebuffer,$_);
}
close(TRANSLATE);
chomp(@filebuffer);
foreach(@filebuffer) {
my @data=split /;/,$_;
$HG_TRANSLATION_HASH{$data[0]} = $data[1];
if ( $data[1] ne "" ) {
$HG_ACTIVE_HASH{$data[1]} = $data[2];
} else {
$HG_ACTIVE_HASH{$data[0]} = $data[2];
}
}
} else {
$translation=0;
}
if ( -e "DAQ00001.states" ) {
open(STATUSCODE,"<","DAQ00001.states" ) or $states=0
} else {
$states=0;
}
if ( $states eq "1" ) {
my @filebuffer;
while (<STATUSCODE>) {
push(@filebuffer,$_);
}
close(STATUSCODE);
chomp(@filebuffer);
foreach(@filebuffer) {
my @data=split /;/,$_;
my @codes=split /,/,$data[1];
if ( $HG_TRANSLATION_HASH{$data[0]} ) {
$HG_STATUS_CODES{$HG_TRANSLATION_HASH{$data[0]}} = [ @codes ];
} else {
$HG_STATUS_CODES{$data[0]} = [ @codes ];
}
}
}
open(HGDATA,'<','DAQ00001.DAQ') or die "File DAQ00001.DAQ not found in FHEM Root dir";
while (<HGDATA>) {
push(@databuff,$_);
}
close(HGDATA);
chomp(@databuff);
my @data = split /</,$databuff[1];
foreach(@data) {
$_ = Unicode::String::latin1 ( $_ );
my @buffer;
if ( $_ =~ /unit/ ) {
$_ =~ s/^CHANNEL id=\'//;
$_ =~ s/\' name='/;/;
$_ =~ s/\' unit='/;/;
$_ =~ s/\'\/>//;
push(@HG_HEADER_ANALOG,$_);
@buffer = split /;/,$_;
$buffer[1] =~ s/ /_/g;
if ($HG_TRANSLATION_HASH{$buffer[1]}) {
push(@HG_Reading_Names,$HG_TRANSLATION_HASH{$buffer[1]})
} else {
push(@HG_Reading_Names,$buffer[1]);
}
}
if ( $_ =~ /bit/ ) {
$_ =~ s/^CHANNEL id=\'//;
$_ =~ s/\' bit='/;/;
$_ =~ s/' name='/;/;
$_ =~ s/\'\/>//;
push(@HG_HEADER_DIGITAL,$_);
@buffer = split /;/,$_;
$buffer[2] =~ s/ /_/g;
$buffer[2] =~ s/^/BIT-/;
if ($HG_TRANSLATION_HASH{$buffer[2]}) {
push(@HG_Reading_Names,$HG_TRANSLATION_HASH{$buffer[2]})
} else {
push(@HG_Reading_Names,$buffer[2]);
}
}
}
chomp(@HG_HEADER_ANALOG);
chomp(@HG_HEADER_DIGITAL);
my @readingList = sort keys %{$hash->{READINGS}};
foreach(@readingList) {
my $found=0;
my $Read=$_;
foreach(@HG_Reading_Names) {
if ( $Read eq $_ && $HG_ACTIVE_HASH{$_} == 1 ) {
$found=1;
}
}
if ( $found eq "0" ) {
readingsDelete($hash, $_);
print "$hash->{NAME}: Reading $_ deleted\n";
}
}
if ( $translation eq "0" ) {
open(TRANSLATE,'>','DAQ00001.translation') or die "could not open new translation file for Hargassner Module\n";
foreach(@HG_HEADER_ANALOG) {
my @data=split /;/,$_;
if ( $data[1] ne "DUMMY" ) {
$data[1] =~ s/ /_/g;
print(TRANSLATE $data[1] . ";;1\n");
}
}
foreach(@HG_HEADER_DIGITAL) {
my @data=split /;/,$_;
if ( $data[2] ne "DUMMY" ) {
$data[2] =~ s/ /_/g;
$data[2] =~ s/^/BIT-/;
print(TRANSLATE $data[2] . ";\n");
}
}
close(TRANSLATE);
}
my $LastID=0;
foreach(@HG_HEADER_ANALOG) {
my @data = split /;/,$_;
if ( $data[1] ne "DUMMY" ) {
$data[1] =~ s/ /_/g;
if ( $HG_TRANSLATION_HASH{$data[1]} ) {
if ( $HG_ACTIVE_HASH{$HG_TRANSLATION_HASH{$data[1]}} == 1 ) {
if ( $HG_STATUS_CODES{$HG_TRANSLATION_HASH{$data[1]}}[$array[$data[0]+1]] ) {
readingsBulkUpdate($hash, $HG_TRANSLATION_HASH{$data[1]}, $HG_STATUS_CODES{$HG_TRANSLATION_HASH{$data[1]}}[$array[$data[0]+1]].' ') if( ReadingsVal($name, $HG_TRANSLATION_HASH{$data[1]}, '') ne $HG_STATUS_CODES{$HG_TRANSLATION_HASH{$data[1]}}[$array[$data[0]+1]].' ');
} else {
readingsBulkUpdate($hash, $HG_TRANSLATION_HASH{$data[1]}, $array[$data[0]+1].' ') if( ReadingsVal($name, $HG_TRANSLATION_HASH{$data[1]}, '') ne $array[$data[0]+1].' ');
}
}
} else {
if ($HG_ACTIVE_HASH{$data[1]} == 1 ) {
if ( $HG_STATUS_CODES{$data[1]}[$array[$data[0]+1]] ) {
readingsBulkUpdate($hash, $data[1], $HG_STATUS_CODES{$data[1]}[$array[$data[0]+1]] .' ') if( ReadingsVal($name, $data[1], '') ne $HG_STATUS_CODES{$data[1]}[$array[$data[0]+1]-1].' ');
} else {
readingsBulkUpdate($hash, $data[1], $array[$data[0]+1].' ') if( ReadingsVal($name, $data[1], '') ne $array[$data[0]+1].' ');
}
}
}
}
$LastID=$data[0];
}
foreach(@HG_HEADER_DIGITAL) {
my @data = split /;/,$_;
if ( $data[2] ne "DUMMY" ) {
$data[2] =~ s/ /_/g;
$data[2] =~ s/^/BIT-/;
if ( $HG_TRANSLATION_HASH{$data[2]} ) {
if ( $HG_ACTIVE_HASH{$HG_TRANSLATION_HASH{$data[2]}} == 1 ) {
readingsBulkUpdate($hash, $HG_TRANSLATION_HASH{$data[2]}, query_bit($array[$data[0]+$LastID+1], $data[1])) if( ReadingsVal($name, $HG_TRANSLATION_HASH{$data[2]}, '') ne query_bit($array[$data[0]+$LastID+1], $data[1]));
}
} else {
if ( $HG_ACTIVE_HASH{$data[2]} == 1 ) {
readingsBulkUpdate($hash, $data[2], query_bit($array[$data[0]+$LastID+1], $data[1])) if( ReadingsVal($name, $data[2], '') ne query_bit($array[$data[0]+$LastID+1], $data[1]));
}
}
}
}
}
readingsEndUpdate($hash, 1);
$hash->{STATE} = 'Updated';
}
else
{
Log3 $name, 4, "HGNanopk ($name) - open telnet failed";
$hash->{STATE} = 'Failed';
}
}
RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+$hash->{interval}, "HGNanopk_GetUpdate", $hash, 0);
}
##################################################################################
sub HGNanopk_Get($@) {
##################################################################################
my ($hash, @a) = @_;
return "\"get HGNanopk\" needs only one parameter" if(@a != 2);
return "Unknown argument $a[1], choose one of " . join(" ", sort keys %gets)
if(!defined($gets{$a[1]}));
my ($fn, $arg) = split(" ", $gets{$a[1]});
my $v = join(" ", @a);
my $name = $hash->{NAME};
Log3 $name, 4, "HGNanopk get $v";
#HGNanopk_GetParameter($hash, $fn);
return "";
}
##################################################################################
sub HGNanopk_Attr($$$) {
##################################################################################
my ($cmd, $name, $attrName, $attrVal) = @_;
my $orig = $attrVal;
$attrVal = int($attrVal) if($attrName eq "interval");
$attrVal = 60 if($attrName eq "interval" && $attrVal < 60 && $attrVal != 0);
my $hash = $defs{$name};
# if( $attrName eq 'disable' ) {
# if( $cmd eq "set" && $attrVal ) {
# plex_stopTimelineListener($hash);
# plex_stopDiscovery($hash);
# foreach my $ip ( keys %{$hash->{clients}} ) {
# $hash->{clients}{$ip}{online} = 0;
# }
# } else {
# $attr{$name}{$attrName} = 0;
# plex_startDiscovery($hash);
# plex_startTimelineListener($hash);
# }
#
# } elsif( $attrName eq 'responder' ) {
# if( $cmd eq "set" && $attrVal ) {
# $attr{$name}{$attrName} = 1;
# plex_startDiscovery($hash);
#
# } else {
# $attr{$name}{$attrName} = 0;
# plex_startDiscovery($hash);
#
# }
# }
if( $cmd eq "set" ) {
if( $attrVal && $orig ne $attrVal ) {
$attr{$name}{$attrName} = $attrVal;
return $attrName ." set to ". $attrVal if( $init_done );
}
}
return;
}
#################################################################################
1;
=pod
=begin html
<a name="HGNanopk"></a>
<h3>HGNanopk</h3>
<ul>
This module connects to the Hargassner Pellet Heating.
<br /><br />
<a name="HGNanopk_define"></a>
<b>Define</b>
<ul>
<code>define &lt;name&gt; HGNanopk &lt;hostname&gt; &lt;interval&gt;</code>
<br />
<br />
&lt;hostname&gt; is the name or ip address of the HGNanopk Pellet Heating.
<br />
<br />
&lt;interval&gt; is the interval in seconds between fhem try to get new data from heating. (e.g. 60)
<br /><br />
<b>installation</b>
<br />
make sure this is running on a Linux/Unix System, and on the system ist the recode command installed.
<br />
Insert an SD Card into your Hargassner pellets oven (left Touchdisplay blow the rubber cover)
<br />
then enable in display setup the storage of logdata, let it run vor a few seconds, disable it
<br />
and remove the SD Card. Insert the Card into your PC, and copy the file named DAQ00001.DAQ from this card
<br />
into the root of your fhem installation.
This file will contain a header line, which define all the readings for this module
<br />
after the first run of the module you will find in your fhem root another file, named "DAQ00001.tranlations"
<br />
with all the named of the radings from hargassner. You can add you own interpretation of this names after each parameter.
<br />
when ready delete each configured HGNanopk device, and redefine it - you will now get your translated names for the radings.
<br />
Example:
<ul>
<code>define Pelletoven HGNanopk 192.168.1.69 60</code>
</ul>
</ul>
<br />
<b>Readings</b>
Actual readings vary with the oven and the Software version.
<br />
the readings are dynamically generated based on the <code>DAQ00001.DAQ</code> file, which must (!) be installed
<br /> in the root of your fhem installation.
<br />
</ul>
</ul>
=end html
=cut

4
DAQ00001.states Normal file
View File

@ -0,0 +1,4 @@
kesselzustand;unknown_0,Brenner_aus,refill_in_x_minutes,refill_pellets,Zuendueberwachung,Zuendung,Uebergang_LB,Leistungsbrand,ignition_reduced,Ausbrand,ember_preservation,deashing_fan,sliding_grate_open,cleaning_stated,cleaning,cleaning_ended
kessel_programm;Handbetrieb,Aus,WarmWasser,Automatik,Brenner_Aus
heizkreis1_einstellung;unknown_0,Zeitschaltung,Nacht,Tag,Aus,Party,Frostschutz
Stoerungs_nummer;Kein_Fehler,Uebertemperatur_STB_gefallen,Ueberstrom_Einschub,Ueberstrom_Raumaustragung,Thermoschutz_Raumschnecke,Aschelade_entleeren,Aschelade_zu_voll,Schieberost_oeffnet_nicht,Schieberost_schliesst_nicht,Ueberstrom_Putzeinrichtung,Fuehler_Rauchgastemp_anschluss,Fuehler_Rauchgastemp_unterbrechung,Fuehler_Kesseltemperatur_kurzschluss

274
DAQ00001.translation Normal file
View File

@ -0,0 +1,274 @@
ZK;kesselzustand;1
O2;sauerstoff;1
O2soll;sauerstoff_soll;1
TK;kessel_temp;1
TKsoll;kessel_temp_soll;1
TRG;rauchgas_temp;1
SZist;saugzug_ist;1
SZsoll;saugzug_soll;1
Leistung;leistung;1
ESsoll;einschub_soll;1
I_Es;einschub_strom;1
I_Ra;raumaustragung_strom;1
I_Aa;ascheaustragung_strom;1
I_Sr;schieberost_strom;1
I_Rein;putzeinheit_strom;1
Taus;aussen_temp;1
TA_Gem.;aussen_temp_gemittelt;1
TPo;puffer_temp_oben;1
TPmo;puffer_temp_mitteoben;0
TPm;puffer_temp_mitte;1
TPmu;puffer_temp_mitteunten;0
TPu;puffer_temp_unten;1
TFW;frischwasser_temp;1
TRL;ruecklauf_temp;1
TRLsoll;ruecklauf_temp_soll;1
Tplat;platine_temp;1
BRT;brennraum_temp;1
Regler_K;regler_k;1
KeBrstScale;kesselbrannstoff_scale;1
ESRegler;einschubregler;1
BLDC_ES_ist;;1
BLDC_ES_soll;;1
LZ_ES_seit_Füll.;einschubschnecke_laufzeit_seit_fuellung;1
LZ_ES_seit_Ent.;einschubschnecke_laufzeit_seit_Entaschen;1
Anzahl_Entasch.;entaschungslaeufe;1
Anzahl_SR_Beweg.;schieberost_bewegung;1
Heiz_P_Lambda;lambdasondenheizung_watt;1
Heiz_U_Lambda;lambdasondenheizung_spannung;1
Heiz_I_Lambda;lambdasondenheizung_strom;1
Sens_U_Lambda;lambdasonde_spannung;1
PuffZustand;pufferzustand;1
Puffer_soll;puffer_soll;1
Puff_Füllgrad;puffer_fuellstand;1
max.Leist.P3F.HT;;1
Spreizung;;1
AIN17;;1
Lagerstand;lager_kg;1
Verbrauchszähler;verbrauch_kg;1
UsePos;lager_saugsonde_nr;1
Störungs_Nr;stoerungs_nummer;1
TVL_A;vorlaufA_temp;0
TVLs_A;vorlaufA_temp_soll;0
TRA_A;raumA_temp;0
TRs_A;raumA_temp_soll;0
HKZustand_A;heizkreisA_zustand;0
FRA_Zustand;heizkreisA_einstellung;0
TVL_1;vorlauf1_temp;1
TVLs_1;vorlauf1_temp_soll;1
TRA_1;raum1_temp;1
TRs_1;raum1_temp_soll;1
HKZustand_1;heizkreis1_zustand;1
FR1_Zustand;heizkreis1_einstellung;1
TVL_2;vorlauf2_temp;0
TVLs_2;vorlauf2_temp_soll;0
TRA_2;raum2_temp;0
TRs_2;raum2_temp_soll;0
HKZustand_2;heizkreis2_zustand;0
FR2_Zustand;heizkreis2_einstellung;0
TVL_3;vorlauf3_temp;0
TVLs_3;vorlauf3_temp_soll;0
TRA_3;raum3_temp;0
TRs_3;raum3_temp_soll;0
HKZustand_3;heizkreis3_zustand;0
FR3_Zustand;heizkreis3_einstellung;0
TVL_4;vorlauf4_temp;0
TVLs_4;vorlauf4_temp_soll;0
TRA_4;raum4_temp;0
TRs_4;raum4_temp_soll;0
HKZustand_4;heizkreis4_zustand;0
FR4_Zustand;heizkreis4_einstellung;0
TVL_5;vorlauf5_temp;0
TVLs_5;vorlauf5_temp_soll;0
TRA_5;raum5_temp;0
TRs_5;raum5_temp_soll;0
HKZustand_5;heizkreis5_zustand;0
FR5_Zustand;heizkreis5_einstellung;0
TVL_6;vorlauf6_temp;0
TVLs_6;vorlauf6_temp_soll;0
TRA_6;raum6_temp;0
TRs_6;raum6_temp_soll;0
HKZustand_6;heizkreis6_zustand;0
FR6_Zustand;heizkreis6_einstellung;0
TBA;boiler_temp_A;0
TBs_A;boiler_temp_A_soll;0
TB1;boiler_temp_1;1
TBs_1;boiler_temp_1_soll;1
TB2;boiler_temp_2;0
TBs_2;boiler_temp_2_soll;0
TB3;boiler_temp_3;0
TBs_3;boiler_temp_3_soll;0
Ext.HK_Soll;externer_heizkreis_1_soll;0
Ext.HK_Soll_2;externer_heizkreis_2_soll;0
Ext.HK_Soll_3;externer_heizkreis_3_soll;0
Höchste_Anf;;1
Anf._HKR0;heizkreis0_anforderung;1
Anf._HKR1;heizkreis1_anforderung;1
Anf._HKR2;heizkreis2_anforderung;0
Anf._HKR3;heizkreis3_anforderung;0
Anf._HKR4;heizkreis4_anforderung;0
Anf._HKR5;heizkreis5_anforderung;0
Anf._HKR6;heizkreis6_anforderung;0
Anf._HKR7;heizkreis7_anforderung;0
Anf._HKR8;heizkreis8_anforderung;0
Anf._HKR9;heizkreis9_anforderung;0
Anf._HKR10;heizkreis10_anforderung;0
Anf._HKR11;heizkreis11_anforderung;0
Anf._HKR12;heizkreis12_anforderung;0
Anf._HKR13;heizkreis13_anforderung;0
Anf._HKR14;heizkreis14_anforderung;0
Anf._HKR15;heizkreis15_anforderung;0
T_Spülung;spuelung_temp;1
Programm_HKM1;;1
Programm_HKM2;;1
TVG;;1
U_Netzteil;netzteil_spannung;1
TBB;boiler_temp_B;0
TBs_B;boiler_temp_B_soll;0
TVL_B;vorlaufB_temp;0
TVLs_B;vorlaufB_temp_soll;0
TRB;;1
TRs_B;raumB_temp_soll;0
HKZustand_B;heizkreisB_zustand;0
TRA_B;raumB_temp;0
FRB_Zustand;heizkreisB_einstellung;0
Programm;kessel_programm;1
Anf._EHK_Spg;;1
FWS_VORL;frischwasserstation_temp_vorlauf;1
FWS1_Anf.;frischwasserstation_1_temp_1_anforderung;1
FWS1_Pumpe;frischwasserstation_1_pumpe;1
FWS1_Leist;frischwasserstation_1_leistung;1
FWS1_T;frischwasserstation_1_temp;1
FWS1_D;;1
FWS1_PID_I_Anteil;;1
FWS1_PID_D_Anteil;;1
FWS1_Basis_Regler;;1
FWS2_Anf.;frischwasserstation_2_temp_anforderung;0
FWS2_Pumpe;frischwasserstation_2_pumpe;0
FWS2_Leist;frischwasserstation_2_leistung;0
FWS2_T;frischwasserstation_2_temp;0
FWS2_D;;0
FWS2_PID_I_Anteil;;0
FWS2_PID_D_Anteil;;0
FWS2_Basis_Regler;;0
FWS3_Anf.;frischwasserstation_3_temp_anforderung;0
FWS3_Pumpe;frischwasserstation_3_pumpe;0
FWS3_Leist;frischwasserstation_3_leistung;0
FWS3_T;frischwasserstation_3_temp;0
FWS3_D;;0
FWS3_PID_I_Anteil;;0
FWS3_PID_D_Anteil;;0
FWS3_Basis_Regler;;0
FWS4_Anf.;frischwasserstation_4_temp_anforderung;0
FWS4_Pumpe;frischwasserstation_4_pumpe;0
FWS4_Leist;frischwasserstation_4_leistung;0
FWS4_T;frischwasserstation_4_temp;0
FWS4_D;;0
FWS4_PID_I_Anteil;;0
FWS4_PID_D_Anteil;;0
FWS4_Basis_Regler;;0
FWS_PWR_KASK;;1
Puffer_soll_oben;puffer_soll_oben;1
Puffer_soll_unten;puffer_soll_unten;1
AUPSoll;;1
AUPIst;;1
AUPStrom;;1
BIT-Stb;;1
BIT-Fuellstand;;1
BIT-Es_Rein_Endl;;1
BIT-HKPA;heizkreisA_pumpe;0
BIT-MAA;;1
BIT-MAZ;;1
BIT-HKP1;heizkreis1_pumpe;1
BIT-M1A;;1
BIT-M1Z;;1
BIT-HKP2;heizkreis2_pumpe;0
BIT-M2A;;1
BIT-M2Z;;1
BIT-Störung;stoerung_aktiv;1
BIT-WS_freig.;;1
BIT-Akt._Code;;1
BIT-L_Heiz.;;1
BIT-Z_Heiz.;;1
BIT-Z_Geb.;;1
BIT-AA_Run;;1
BIT-AA_Dir;;1
BIT-ES_Run;;1
BIT-ES_Dir;;1
BIT-AS_Saug;;1
BIT-AS_RA_Run;;1
BIT-AS_RA_Dir;;1
BIT-Rein_En;;1
BIT-Rein_Run;;1
BIT-RLm_auf;ruecklaufmischer_auf;1
BIT-RLm_zu;ruecklaufmischer_zu;1
BIT-RLP/PuffP;ruecklaufpumpe_puffer;1
BIT-BPA;boilerpumpe_A;0
BIT-BP1;boilerpumpe_1;1
BIT-BP2;boilerpumpe_2;0
BIT-BP3;boilerpumpe_3;0
BIT-BZPA;;1
BIT-BZP1;;1
BIT-BZP2;;1
BIT-BZP3;;1
BIT-EHKP;;0
BIT-EHKP2;;0
BIT-EHKP3;;0
BIT-EHK_Anf;;0
BIT-EHK_Anf2;;0
BIT-EHK_Anf3;;0
BIT-HKP3;heizkreis3_pumpe;0
BIT-M3A;;1
BIT-M3Z;;1
BIT-HKP4;heizkreis4_pumpe;0
BIT-M4A;;1
BIT-M4Z;;1
BIT-HKP5;heizkreis5_pumpe;0
BIT-M5A;;1
BIT-M5Z;;1
BIT-HKP6;heizkreis6_pumpe;0
BIT-M6A;;1
BIT-M6Z;;1
BIT-Entasch_gesp.;;1
BIT-ATW;;1
BIT-HKPB;heizkreis7_pumpe;0
BIT-MBA;;1
BIT-MBZ;;1
BIT-BPB;boilerpumpe_B;1
BIT-BZPB;;1
BIT-KASK_KWK_OK;;1
BIT-KASK_FW_OK;;1
BIT-KASK1_Run;;1
BIT-KASK2_Run;;1
BIT-KASK3_Run;;1
BIT-KASK4_Run;;1
BIT-FW_Freig.;;1
BIT-sAS_Anf_Füll;;1
BIT-HKV;;1
BIT-FLP;;1
BIT-Netztrafo;;1
BIT-Netzrelais;;1
BIT-Lagerraum;;1
BIT-Aschebox;;1
BIT-KASK1_OK;;1
BIT-KASK2_OK;;1
BIT-KASK3_OK;;1
BIT-KASK4_OK;;1
BIT-gFlP;;1
BIT-gFlM_auf;;1
BIT-gFlM_zu;;1
BIT-Spülung_Aktiv;spuelung_aktiv;1
BIT-DReg_P2;;1
BIT-DReg_P3;;1
BIT-DReg_Mi_auf;;1
BIT-DReg_Mi_zu;;1
BIT-Kask_FW_Out;;1
BIT-DReg2_P2;;1
BIT-DReg2_P3;;1
BIT-DReg2_Mi_auf;;1
BIT-DReg2_Mi_zu;;1
BIT-Kask_KWK_Out;;1
BIT-DReg3_P2;;1
BIT-DReg3_P3;;1
BIT-DReg3_Mi_auf;;1
BIT-DReg3_Mi_zu;;1