diff --git a/fhem/FHEM/00_KM271.pm b/fhem/FHEM/00_KM271.pm index c19ac98d3..d77704435 100755 --- a/fhem/FHEM/00_KM271.pm +++ b/fhem/FHEM/00_KM271.pm @@ -12,12 +12,9 @@ sub KM271_CloseDev($); sub KM271_SimpleWrite(@); sub KM271_SimpleRead($); sub KM271_crc($); -sub KM271_setbits($$); +sub KM271_setbits($$$); sub KM271_Reading($$); -my %sets = ( -); - my $stx = pack('H*', "02"); my $dle = pack('H*', "10"); my $etx = pack('H*', "03"); @@ -31,110 +28,131 @@ my $logmode = pack('H*', "EE00001003FD"); # http://www.buderus.de/pdf/unterlagen/0063061377.pdf my %km271_trhash = ( - "8000" => 'Betriebswerte_1_HK1', # 76, 4 [repeat] - "8001" => 'Betriebswerte_2_HK1', # 0 (22:33), 2 (7:33) - "8002" => 'Vorlaufsolltemperatur_HK1', # 50-65 - "8003" => 'Vorlaufisttemperatur_HK1', # Schwingt um soll herum - "8004" => 'Raumsolltemperatur_HK1', # 34 (22:33) 42 (7:33) - "8005" => 'Raumisttemperatur_HK1', - "8006" => 'Einschaltoptimierungszeit_HK1', - "8007" => 'Ausschaltoptimierungszeit_HK1', - "8008" => 'Pumpenleistung_HK1', # 0/100 == Ladepumpe - "8009" => 'Mischerstellung_HK1', - "800a" => 'nicht_belegt', - "800b" => 'nicht_belegt', - "800c" => 'Heizkennlinie_HK1_bei_+_10_Grad', # bei Umschaltung tag/nacht - "800d" => 'Heizkennlinie_HK1_bei_0_Grad', # bei Umschaltung tag/nacht - "800e" => 'Heizkennlinie_HK1_bei_-_10_Grad', # bei Umschaltung tag/nacht - "800f" => 'nicht_belegt', - "8010" => 'nicht_belegt', - "8011" => 'nicht_belegt', + "007e" => "Manuell_WW", + "0085" => "Manuell_ZirkulationsPumpe", + "0093" => "Manuell_Uhrzeit", - "8112" => 'Betriebswerte_1_HK2', - "8113" => 'Betriebswerte_1_HK2', - "8114" => 'Vorlaufsolltemperatur_HK2', - "8115" => 'Vorlaufisttemperatur_HK2', - "8116" => 'Raumsolltemperatur_HK2', - "8117" => 'Raumisttemperatur_HK2', - "8118" => 'Einschaltoptimierungszeit_HK2', - "8119" => 'Ausschaltoptimierungszeit_HK2', - "811a" => 'Pumpenleistung_HK2', - "811b" => 'Mischerstellung_HK2', - "811c" => 'nicht_belegt', - "811d" => 'nicht_belegt', - "811e" => 'Heizkennlinie_HK2_bei_+_10_Grad', # == HK1 - (1 bis 3) - "811f" => 'Heizkennlinie_HK2_bei_0_Grad', # == HK1 - (1 bis 3) - "8120" => 'Heizkennlinie_HK2_bei_-_10_Grad', # == HK1 - (1 bis 3) - "8121" => 'nicht_belegt', - "8122" => 'nicht_belegt', - "8123" => 'nicht_belegt', + "0300" => "Tagwechsel_1", + "0307" => "Tagwechsel_2", + "030e" => "Tagwechsel_3", + "0315" => "Tagwechsel_4", - "8424" => 'Betriebswerte_1_WW', - "8425" => 'Betriebswerte_2_WW', # 0 64 96 104 225 228 - "8426" => 'Warmwassersolltemperatur', # 10/55 - "8427" => 'Warmwasseristtemperatur', # 32-55 - "8428" => 'Warmwasseroptimierungszeit', - "8429" => 'Ladepumpe', # 0 1 (an/aus?) + "0400" => "NoData", + + "8000" => 'HK1_Betriebswerte1', # 76, 4 [repeat] + "8001" => 'HK1_Betriebswerte2', # 0 (22:33), 2 (7:33) + "8002" => 'HK1_Vorlaufsolltemperatur', # 50-65 + "8003" => 'HK1_Vorlaufisttemperatur', # Schwingt um soll herum + "8004" => 'HK1_Raumsolltemperatur', # 34 (22:33) 42 (7:33) + "8005" => 'HK1_Raumisttemperatur', + "8006" => 'HK1_Einschaltoptimierungszeit', + "8007" => 'HK1_Ausschaltoptimierungszeit', + "8008" => 'HK1_Pumpenleistung', # 0/100 == Ladepumpe + "8009" => 'HK1_Mischerstellung', + "800c" => 'HK1_Heizkennlinie_bei_+_10_Grad', # bei Umschaltung tag/nacht + "800d" => 'HK1_Heizkennlinie_bei_0_Grad', # bei Umschaltung tag/nacht + "800e" => 'HK1_Heizkennlinie_bei_-_10_Grad', # bei Umschaltung tag/nacht + + "8112" => 'HK2_Betriebswerte1', + "8113" => 'HK2_Betriebswerte2', + "8114" => 'HK2_Vorlaufsolltemperatur', + "8115" => 'HK2_Vorlaufisttemperatur', + "8116" => 'HK2_Raumsolltemperatur', + "8117" => 'HK2_Raumisttemperatur', + "8118" => 'HK2_Einschaltoptimierungszeit', + "8119" => 'HK2_Ausschaltoptimierungszeit', + "811a" => 'HK2_Pumpenleistung', + "811b" => 'HK2_Mischerstellung', + "811e" => 'HK2_Heizkennlinie_bei_+_10_Grad', # == HK1 - (1 bis 3 Grad) + "811f" => 'HK2_Heizkennlinie_bei_0_Grad', # == HK1 - (1 bis 3 Grad) + "8120" => 'HK2_Heizkennlinie_bei_-_10_Grad', # == HK1 - (1 bis 3 Grad) + + # 1377, page 11 + "8424" => 'WW_Betriebswerte1', + "8425" => 'WW_Betriebswerte2', # 0 64 96 104 225 228 + "8426" => 'WW_Solltemperatur', # 10/55 + "8427" => 'WW_Isttemperatur', # 32-55 + "8428" => 'WW_Einschaltoptimierungszeit', + "8429" => 'WW_Ladepumpe', # 0 1 (an/aus?) # 1377, page 13 - "882a" => 'Kesselvorlaufsolltemperatur', - "882b" => 'Kesselvorlaufisttemperatur', # == Vorlaufisttemperatur_HK1 - "882c" => 'Brennereinschalttemperatur', # 5-81 - "882d" => 'Brennerausschalttemperatur', # 19-85 - "882e" => 'Kesselintegral_1', # 0-23 - "882f" => 'Kesselintegral_2', # 0-255 - "8830" => 'Kesselfehler', - "8831" => 'Kesselbetrieb', # 0 2 32 34 - "8832" => 'Brenneransteuerung', # 0 1 (an/aus?) + "882a" => 'Kessel_Vorlaufsolltemperatur', + "882b" => 'Kessel_Vorlaufisttemperatur', # == Vorlaufisttemperatur_HK1 + "882c" => 'Brenner_Einschalttemperatur', # 5-81 + "882d" => 'Brenner_Ausschalttemperatur', # 19-85 + "882e" => 'Kessel_IntegralHB', # 0-23 + "882f" => 'Kessel_IntegralLB', # 0-255 + "8830" => 'Kessel_Fehler', + "8831" => 'Kessel_Betrieb', # 0 2 32 34 + "8832" => 'Brenner_Ansteuerung', # 0 1 (an/aus?) "8833" => 'Abgastemperatur', - "8834" => 'modulare_Brenner_Stellwert', - "8835" => 'nicht_belegt', - "8836" => 'Brennerlaufzeit_1_Minuten_Byte2', - "8837" => 'Brennerlaufzeit_1_Minuten_Byte1', # 176 - "8838" => 'Brennerlaufzeit_1_Minuten_Byte0', # 0-255 (Minuten) - "8839" => 'Brennerlaufzeit_2_Minuten_Byte2', - "883a" => 'Brennerlaufzeit_2_Minuten_Byte1', - "883b" => 'Brennerlaufzeit_2_Minuten_Byte0', + "8834" => 'Brenner_Stellwert', + "8836" => 'Brenner_Laufzeit1_Minuten2', + "8837" => 'Brenner_Laufzeit1_Minuten1', # 176 + "8838" => 'Brenner_Laufzeit1_Minuten0', # 0-255 (Minuten) + "8839" => 'Brenner_Laufzeit2_Minuten2', + "883a" => 'Brenner_Laufzeit2_Minuten1', + "883b" => 'Brenner_Laufzeit2_Minuten0', # 1377, page 16 "893c" => 'Aussentemperatur', # 0 1 254 255 - "893d" => 'gedaempfte_Aussentemperatur', # 0 1 2 + "893d" => 'Aussentemperatur_gedaempft', # 0 1 2 "893e" => 'Versionsnummer_VK', "893f" => 'Versionsnummer_NK', "8940" => 'Modulkennung', - "8941" => 'nicht_belegt', ); # Do not generate fhem events for the following high volume telegrams # the % represents the relative nr of messages in an unfiltered stream. # You can switch them on with attr all_km271_events -my %km271_ignore = ( - "Vorlaufisttemperatur_HK1" => 1, # 23% +my %km271_noevent = ( + "HK1_Vorlaufisttemperatur" => 1, # 23% of all messages + "HK2_Vorlaufisttemperatur" => 1, "Kesselvorlaufisttemperatur" => 1, # 23%, same as Vorlaufisttemperatur_HK1 - "Kesselintegral_1" => 1, # 8%, ?? - "Kesselintegral_2" => 1, # 38%, ?? + "Kessel_IntegralHB" => 1, # 8%, ?? + "Kessel_IntegralLB" => 1, # 38%, ?? ); -my @km271_Betriebswerte_1_HK = ( +my @km271_HK_Betriebswerte1 = ( "Ausschaltoptimierung", "Einschaltoptimierung", "Automatik", "Warmwasservorrang", "Estrichtrocknung", "Ferien", "Frostschutz", "Manuell", ); -my @km271_Betriebswerte_2_HK = ( +my @km271_HK_Betriebswerte2 = ( "Sommer", "Tag", "keine Kommunikation mit FB", "FB fehlerhhaft", "Fehler Vorlauffühler", "maximaler Vorlauf", "externer Störeingang", "frei", ); -my @km271_Betriebswerte_1_WW = ( +my @km271_WW_Betriebswerte1 = ( "Automatik", "Desinfektion", "Nachladung", "Ferien", "Fehler Desinfektion", "Fehler Fuehler", "Fehler WW bleibt kalt", "Fehler Anode", ); -my @km271_Betriebswerte_2_WW = ( +my @km271_WW_Betriebswerte2 = ( "Laden", "Manuell", "Nachladen", "Ausschaltoptimierung", "Einschaltoptimierung", "Tag", "Warm", "Vorrang", ); -my @km271_Kesselbetrieb = ( +my @km271_Kessel_Betrieb = ( "Tag", "Automatik", "Sommer", "Bit3", "Bit4", "Bit5", "Bit6", "Bit7", ); +my @km271_WW_Ladepumpe = ( + "Ladepumpe", "Zirkulationspumpe", "Absenkung Solar", + "Bit3", "Bit4", "Bit5", "Bit6", "Bit7", +); + + +my %km271_set_betriebsart = ( + "manuell_nacht"=>0, + "manuell_tag" =>1, + "automatik" =>2, +); + +my %km271_sets = ( + "hk1_nachtsoll" => "07006565%02x656565", # 0.5 celsius + "hk1_tagsoll" => "0700656565%02x6565", # 0.5 celsius + "hk1_betriebsart" => "070065656565%02x65", + "ww_soll" => "0C07656565%02x6565", # 1.0 celsius + "ww_betriebsart" => "0C0E%02x6565656565", +); + @@ -150,6 +168,8 @@ KM271_Initialize($) $hash->{UndefFn} = "KM271_Undef"; $hash->{SetFn} = "KM271_Set"; $hash->{AttrList}= "do_not_notify:1,0 all_km271_events loglevel:0,1,2,3,4,5,6"; + my @a = (); + $hash->{SENDBUFFER} = \@a; } ##################################### @@ -193,12 +213,29 @@ KM271_Set($@) my ($hash, @a) = @_; return "\"set KM271\" needs at least one parameter" if(@a < 2); - return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets) - if(!defined($sets{$a[1]})); - my $name = shift @a; - my $type = shift @a; - my $arg = join("", @a); + my $fmt = $km271_sets{$a[1]}; + return "Unknown argument $a[1], choose one of " . + join(" ", sort keys %km271_sets) if(!defined($fmt)); + my $val = $a[2]; + my $numeric_arg = ($val =~ m/^[.0-9]+$/); + + if($a[1] =~ m/^hk.*soll$/) { + return "Argument must be numeric (between 10 and 30)" if(!$numeric_arg); + $val *= 2; + } + if($a[1] =~ m/^ww.*soll$/) { + return "Argument must be numeric (between 30 and 60)" if(!$numeric_arg); + } + if($a[1] =~ m/_betriebsart/) { + $val = $km271_set_betriebsart{$val}; + return "Unknown arg, use one of " . + join(" ", sort keys %km271_set_betriebsart) if(!defined($val)); + } + my $data = sprintf($fmt, $val); + + push @{$hash->{SENDBUFFER}}, $data; + KM271_SimpleWrite($hash, $stx) if(!$hash->{WAITING}); return undef; } @@ -211,6 +248,7 @@ KM271_Read($) { my ($hash) = @_; my $name = $hash->{NAME}; + my ($data, $crc); my $buf = KM271_SimpleRead($hash); Log GetLogLevel($name,5), "KM271 RAW: " . unpack('H*', $buf); @@ -221,86 +259,125 @@ KM271_Read($) return; } - $buf = unpack('H*', $buf); - if($buf eq "02") { + if($buf eq "02") { # KM271: Want to send $hash->{PARTIAL} = ""; - KM271_SimpleWrite($hash, $dle); + KM271_SimpleWrite($hash, $dle); # We are ready + $hash->{WAITING} = 1; return; } + if(!$hash->{WAITING}) { # Send data + + if($buf eq "10") { + if($hash->{DATASENT}) { # ACK Data + delete($hash->{DATASENT}); + return; + } + $data = pop @{ $hash->{SENDBUFFER} }; + $data =~ s/10/1010/g; + $crc = KM271_crc($data); + KM271_SimpleWrite($hash, $data."1003$crc"); # Send the data + $hash->{DATASENT} = 1; + } + + if($buf eq "15" && $hash->{DATASENT}) { # NACK from the KM271 + Log 1, "$name: NACK!"; + delete($hash->{DATASENT}); + return; + } + } + + $hash->{PARTIAL} .= $buf; my $len = length($hash->{PARTIAL}); return if($hash->{PARTIAL} !~ m/^(.*)1003(..)$/); - my ($data, $crc) = ($1, $2); + ($data, $crc) = ($1, $2); if(KM271_crc($data) ne $crc) { Log 1, "Wrong CRC in $hash->{PARTIAL}: $crc vs. ". KM271_crc($data); $hash->{PARTIAL} = ""; KM271_SimpleWrite($hash, $nak); return; } - KM271_SimpleWrite($hash, $dle); + KM271_SimpleWrite($hash, $dle); # Data received ok + delete($hash->{WAITING}); + if($hash->{SENDBUFFER}) { + KM271_SimpleWrite($hash, $stx) + } $data =~ s/1010/10/g; - if($data =~ m/^(8...)(..)/) { - my ($fn, $arg) = ($1, $2); - - my $msg = $km271_trhash{$fn}; - $msg = "UNKNOWN_$fn" if(!$msg); - my $tn = TimeNow(); - my $val = hex($arg); - my $ignore = $km271_ignore{$msg}; - if($msg =~ m/Aussentemperatur/) { - $val = $val-256 if($val > 128); + if($data !~ m/^(....)(.*)/) { + Log 1, "$name: Bogus message: $data"; + return; + } - } elsif($msg =~ m/Brennerlaufzeit_(.)_Minuten_Byte(.)/) { - my ($idx, $no) = ($1, $2); + my ($fn, $arg) = ($1, $2); + my $msg = $km271_trhash{$fn}; + $msg = "UNKNOWN_$fn" if(!$msg); + my $tn = TimeNow(); + my $val = unpack('H*', $arg); + my $gen_notify = $km271_noevent{$msg} ? 0 : 1; + $gen_notify = KM271_attr($name, "all_km271_events") + if(!$gen_notify); - if($no == 2 || $no == 1) { - $ignore = 1; - } else { - $msg = "Brennerlaufzeit_${idx}_Minuten"; - $val = KM271_Reading($hash, $msg . "_Byte2") * 65536 + - KM271_Reading($hash, $msg . "_Byte1") * 256 + - $val; - } + if($msg eq "NoData") { + $gen_notify = 0; - } elsif($msg =~ m/Betriebswerte_1_HK/) { - $val = KM271_setbits($val, \@km271_Betriebswerte_1_HK); + } elsif($msg =~ m/^UNKNOWN/) { + $val = $data; + $gen_notify = 0; + + } elsif($msg =~ m/Aussentemperatur/) { + $val = $val-256 if($val > 128); - } elsif($msg =~ m/Betriebswerte_2_HK/) { - $val = KM271_setbits($val, \@km271_Betriebswerte_2_HK); + } elsif($msg =~ m/Brenner_Laufzeit(.)_Minuten(.)/) { + my ($idx, $no) = ($1, $2); - } elsif($msg =~ m/Betriebswerte_1_WW/) { - $val = KM271_setbits($val, \@km271_Betriebswerte_1_WW); - - } elsif($msg =~ m/Betriebswerte_2_WW/) { - $val = KM271_setbits($val, \@km271_Betriebswerte_2_WW); - - } elsif($msg =~ m/Brenneransteuerung/) { - $val = ($val ? "an" : "aus"); - - } elsif($msg =~ m/Kesselbetrieb/) { - $val = KM271_setbits($val, \@km271_Kesselbetrieb); + if($no == 2 || $no == 1) { + $gen_notify = 0; + } else { + $msg = "Brenner_Laufzeit${idx}_Minuten"; + $val = KM271_Reading($hash, $msg . "2") * 65536 + + KM271_Reading($hash, $msg . "1") * 256 + + $val; } - Log GetLogLevel($name,4), "KM271 $name: $msg $val"; - $hash->{READINGS}{$msg}{TIME} = $tn; - $hash->{READINGS}{$msg}{VAL} = $val; - if(KM271_attr($name, "all_km271_events") || !$ignore) { - DoTrigger($name, "$msg: $val"); - } + } elsif($msg =~ m/HK._Betriebswerte/) { + $val = KM271_setbits($val, \@km271_HK_Betriebswerte1, "leer"); - } elsif($data eq "04000701c4024192") { - # No data message + } elsif($msg =~ m/HK._Betriebswerte2/) { + $val = KM271_setbits($val, \@km271_HK_Betriebswerte2, "leer"); - } else { - Log 1, "$name: UNKNOWN $data"; + } elsif($msg =~ m/WW_Betriebswerte1/) { + $val = KM271_setbits($val, \@km271_WW_Betriebswerte1, "aus"); + + } elsif($msg =~ m/WW_Betriebswerte2/) { + $val = KM271_setbits($val, \@km271_WW_Betriebswerte2, "aus"); + + } elsif($msg =~ m/Brenner_Ansteuerung/) { + $val = ($val ? "an" : "aus"); + + } elsif($msg =~ m/Kessel_Betrieb/) { + $val = KM271_setbits($val, \@km271_Kessel_Betrieb, "aus"); + + } elsif($msg =~ m/WW_Ladepumpe/) { + $val = KM271_setbits($val, \@km271_WW_Ladepumpe, "aus"); + + } elsif($msg =~ m/HK?_Raum.*temperatur/) { + $val = $val/2; } + + $val = $arg if(length($arg) > 2); + + Log GetLogLevel($name,4), "KM271 $name: $msg $val"; + $hash->{READINGS}{$msg}{TIME} = $tn; + $hash->{READINGS}{$msg}{VAL} = $val; + DoTrigger($name, "$msg: $val") if($gen_notify); + $hash->{PARTIAL} = ""; } @@ -321,7 +398,7 @@ sub KM271_SimpleWrite(@) { my ($hash, $msg) = @_; - $hash->{Dev}->write($msg); + $hash->{Dev}->write($msg) if($hash->{DeviceName}); } ######################## @@ -393,18 +470,21 @@ KM271_OpenDev($) $po->parity('none'); $po->stopbits(1); $po->handshake('none'); - $po->write($logmode); $hash->{STATE} = "Initialized"; + #$po->write($logmode); + push @{$hash->{SENDBUFFER}}, "EE0000"; + KM271_SimpleWrite($hash, $stx); + Log 3, "$dev opened"; return undef; } sub -KM271_setbits($$) +KM271_setbits($$$) { - my ($val, $arr) = @_; + my ($val, $arr, $nulltxt) = @_; my $bit = 1; my @ret; @@ -412,7 +492,7 @@ KM271_setbits($$) push(@ret, $arr->[$idx]) if($val & $bit); $bit *= 2; } - return "keine Bits gesetzt" if(!@ret); + return $nulltxt if(!@ret); return join(",", @ret); } diff --git a/fhem/FHEM/11_FHT.pm b/fhem/FHEM/11_FHT.pm index b3880490d..28ca7c880 100755 --- a/fhem/FHEM/11_FHT.pm +++ b/fhem/FHEM/11_FHT.pm @@ -506,7 +506,7 @@ FHT_Parse($$) $nc++; } - if(substr($msg,24,1) eq "7") { + if(substr($msg,24,1) eq "7") { # Do not store FHZ acks. $cmd = "FHZ:$cmd"; } else { $def->{READINGS}{$cmd}{TIME} = $tn; diff --git a/fhem/FHEM/16_CUL_RFR.pm b/fhem/FHEM/16_CUL_RFR.pm index 0cacc2829..d283929b3 100755 --- a/fhem/FHEM/16_CUL_RFR.pm +++ b/fhem/FHEM/16_CUL_RFR.pm @@ -4,9 +4,6 @@ package main; use strict; use warnings; -# Adjust TOTAL to you meter: -# {$defs{emwz}{READINGS}{basis}{VAL}=/- } - ##################################### sub CUL_RFR_Initialize($) @@ -96,6 +93,9 @@ CUL_RFR_Parse($$) elsif($smsg =~ m/^K/) { $hash->{NR_KMSG}++ } else { $hash->{NR_RMSG}++ } + $smsg = $1 if($smsg =~ m/^(E[0-9A-F]{20})[REFHKT]/); # Fixing a CUL/RFR bug + $smsg = $1 if($smsg =~ m/^(R[0-9A-F]{12})[REFHKT]/); + CUL_Parse($hash, $iohash, $hash->{NAME}, $smsg, "X21"); return ""; } diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm index 50619751e..a2b587381 100755 --- a/fhem/FHEM/92_FileLog.pm +++ b/fhem/FHEM/92_FileLog.pm @@ -347,6 +347,7 @@ FileLog_Get($@) $data{"min$j"} = $min[$i] == 999999 ? "undef" : $min[$i]; $data{"max$j"} = $max[$i] == -999999 ? "undef" : $max[$i]; $data{"avg$j"} = $cnt[$i] ? sprintf("%0.1f", $sum[$i]/$cnt[$i]) : "undef"; + $data{"sum$j"} = $sum[$i]; $data{"cnt$j"} = $cnt[$i] ? $cnt[$i] : "undef"; $data{"currval$j"} = $lastv[$i]; $data{"currdate$j"} = $lastd[$i]; diff --git a/fhem/FHEM/98_autocreate.pm b/fhem/FHEM/98_autocreate.pm index 1fb6f7f06..76d273e06 100644 --- a/fhem/FHEM/98_autocreate.pm +++ b/fhem/FHEM/98_autocreate.pm @@ -93,7 +93,7 @@ autocreate_Notify($$) my $flname = "FileLog_$name"; my ($gplot, $filter) = ("", $name); foreach my $k (keys %flogpar) { - next if("$type:$name" !~ m/^$k$/); + next if("$type:$name" !~ m/^$k$/); $gplot = $flogpar{$k}{GPLOT}; $filter = replace_wildcards($hash, $flogpar{$k}{FILTER}); } diff --git a/fhem/docs/fhem.html b/fhem/docs/fhem.html index 79539e0c4..06c468946 100644 --- a/fhem/docs/fhem.html +++ b/fhem/docs/fhem.html @@ -89,11 +89,10 @@ iPhone frontends: - fhemgw or + fhemgw, - dhs-computertechnik - - + dhs-computertechnik or + phyfhem diff --git a/fhem/webfrontend/pgm2/km271_1.gplot b/fhem/webfrontend/pgm2/km271_1.gplot index 5fee3012a..545dc9d76 100644 --- a/fhem/webfrontend/pgm2/km271_1.gplot +++ b/fhem/webfrontend/pgm2/km271_1.gplot @@ -20,7 +20,6 @@ set yrange [0:] #FileLog 4:Warmwasseristtemperatur:0: #FileLog 4:Brennerlaufzeit:0:delta-h -#FileLog 4:Brennerlaufzeit:0:delta-d plot "" using 1:4 axes x1y2 title 'WW-Temp' with lines lw 2,\ " | perl -ane '\ @@ -30,12 +29,4 @@ plot "" using 1:4 axes x1y2 title 'WW-Temp' with lines lw 2,\ if($lv) { $hv += ($F[3]-$lv); }\ $lh = $a[1]; $ld = $a[0]; $lv = $F[3];\ END { printf(\"${ld}_$lh:30:00 %f\n\", $hv) }'"\ - using 1:2 axes x1y1 title 'Runtime/h (Min)' with histeps,\ - " | perl -ane '\ - @a = split(\"[_]\", $F[0]);\ - if(defined($ld) && $ld ne $a[0]) {\ - printf(\"${ld}_12:00:00 %f\n\", $dv); $dv = 0; }\ - if($lv) { $dv += ($F[3]-$lv); }\ - $ld = $a[0]; $lv = $F[3];\ - END {printf(\"${ld}_12:00:00 %f\n\", $dv)}'"\ - using 1:2 axes x1y1 title 'Runtime/day (Min)' with histeps + using 1:2 axes x1y1 title 'Runtime/h (Min)' with histeps