temperatursprungerkennung für heizung - z.B. Log Kaminofen oder abschalten

Begonnen von epsrw1, 30 Mai 2014, 01:18:53

Vorheriges Thema - Nächstes Thema

epsrw1

hier nochmal ein schnipsel für die allgemeinheit: sub erkennt einen temperatursprung nach oben mit einstellbaren parametern. ich verwende es um zu erkennen wann mein kaminofen im wohnzimmer feuert, um damit frühzeitig die heizung herunterzufahren. (über ventilpositionen würde ich noch ca. 1 stunde weiterheizen und habe dann überall zu warm wenn die die holzofenwärme langsam verteilt).
sobald der temperatursprung in den meßwerten des sensors erkannt wird geht state auf 1 und bleibt es so lange bis die soll-temp des raums wieder unterschritten wird. sie soll-temp wird versucht aus einem fhem device auszulesen, klappt das nicht (fehler oder kein device vorhanden) wird ein über attr voreingestellter wert verwendet.
an den threshold und alpha parametern muß man etwas spielen, je nachdem wie genau der verwendete temp.sensor ist, wo dieser positioniert ist, und wieviel leistung der ofen im verhältnis zum raumvolumen bringt.
es deaktiviert sich selbst wenn der dummy (oder device) zhkHolzofenIgnoreTempIfFhemDev state !=0 hat, so kann man es manuell abschalten.
der praxistest muß leider noch warten bis es mal wieder kalt ist, aber mit testdaten tut es genau was es soll.
code:
sub HolzofenRegler($){
#WZ ist > soll
#WZ alpha positive && >x
#->VL desired temp = min (PID20)
my $hash = $_[0];
my $name = $hash->{NAME};
#if ignore=true, set state=0 and return
my $zhkHolzofenIgnoreTempIfFhemDev = AttrVal($name, "zhkHolzofenIgnoreTempIfFhemDev", "dummyDisableHolzofen");
if(ReadingsVal($name, $zhkHolzofenIgnoreTempIfFhemDev, 0)){
readingsSingleUpdate($hash, "zhkHolzofenState", "0", 1);
#send command to VL, unset VL zero
return;
}
#parse cache data from reading
my($zhkHolzofenTempHistoryCache0,$zhkHolzofenTempHistoryCache1) = (split(/ /,ReadingsVal($name, "zhkHolzofenTempHistoryCache", "20=11111111 20=2222222")));
my ($HolzofenRegler_lTemp0,$HolzofenRegler_lEpoch0) = split(/=/,$zhkHolzofenTempHistoryCache1); #split 1 in varset0 for later calc after change
my $zhkHolzofenTempSensorFhemDev = AttrVal($name, "zhkHolzofenTempSensorFhemDev", "83_WohnZi_9554CD040000");
my $zhkHolzofenTempSensorReading = AttrVal($name, "zhkHolzofenTempSensorReading", "temperature");
#check if new temp reading available
my $zhkHolzofenTempSensorTimestamp = ReadingsTimestamp($zhkHolzofenTempSensorFhemDev,$zhkHolzofenTempSensorReading,0);
$zhkHolzofenTempSensorTimestamp = time_str2num($zhkHolzofenTempSensorTimestamp);
my $zhkHolzofenTempSensorMinAge = AttrVal($name, "zhkHolzofenTempSensorMinAge", 300);
#trigger log entry if temp sensor reading not present for double delay setting
if((gettimeofday()-$zhkHolzofenTempSensorTimestamp)>($zhkHolzofenTempSensorMinAge*2)){
Log3($name, 3, "ZHK $name HolzofenRegler: Error: Temp sensor reading not present for ".($zhkHolzofenTempSensorMinAge*2)." seconds. Error");
}
#no new temp. reading present, nothing to do
if($zhkHolzofenTempSensorTimestamp<($HolzofenRegler_lEpoch0+$zhkHolzofenTempSensorMinAge)){
return;
}
#update old readings array: move @cache=(r0,r1) to @cache=(r1,newdata)
$zhkHolzofenTempHistoryCache0=$zhkHolzofenTempHistoryCache1;
my $zhkHolzofenTempSensorDefaultOnFailure = AttrVal($name, "zhkHolzofenTempSensorDefaultOnFailure", 20);
my $zhkHolzofenTempSensorActValue=ReadingsVal($zhkHolzofenTempSensorFhemDev, $zhkHolzofenTempSensorReading, $zhkHolzofenTempSensorDefaultOnFailure);
readingsSingleUpdate($hash, "zhkHolzofenTempSensorActValue", $zhkHolzofenTempSensorActValue, 1); #(actual temp.sensor reading)
$zhkHolzofenTempHistoryCache1 = $zhkHolzofenTempSensorActValue."=".$zhkHolzofenTempSensorTimestamp;
my ($HolzofenRegler_lTemp1,$HolzofenRegler_lEpoch1) = split(/=/,$zhkHolzofenTempHistoryCache1);#split (new) 1 in varset1
readingsSingleUpdate($hash, "zhkHolzofenTempHistoryCache", $zhkHolzofenTempHistoryCache0." ".$zhkHolzofenTempHistoryCache1, 1); #(TT=epoch_old TT=epoch_new)
my $HolzofenRegler_timediff=$HolzofenRegler_lEpoch1-$HolzofenRegler_lEpoch0;
my $HolzofenRegler_tempdiff=$HolzofenRegler_lTemp1-$HolzofenRegler_lTemp0;
my $zhkHolzofenAlphaActualVal=$HolzofenRegler_tempdiff/$HolzofenRegler_timediff*$zhkHolzofenTempSensorMinAge;
#update frontend reading of actual alpha
readingsSingleUpdate($hash, "zhkHolzofenAlphaActualVal", $zhkHolzofenAlphaActualVal, 1); #(TT=epoch_old TT=epoch_new)
Log3($name, 3, "ZHK $name zhkHolzofenAlphaActualVal: $zhkHolzofenAlphaActualVal");
#small value or temp sensor accuracy prob at rising temp -> do nothing and return
my $zhkHolzofenAlphaThreshold=AttrVal($name, "zhkHolzofenAlphaThreshold", 1);
if(($zhkHolzofenAlphaActualVal>0) and ($zhkHolzofenAlphaActualVal<$zhkHolzofenAlphaThreshold)){ return; }
#if raising temp, set Holzofen state and
my $zhkHolzofenAlphaUpAlarmDiffDeg = AttrVal($name, "zhkHolzofenAlphaUpAlarmDiffDeg", 3);
if(($zhkHolzofenAlphaActualVal>0) and ($zhkHolzofenAlphaActualVal>=$zhkHolzofenAlphaUpAlarmDiffDeg)){
#send command to VL, set VL zero
readingsSingleUpdate($hash, "zhkHolzofenState", "1", 1);
Log3($name, 3, "ZHK $name zhkHolzofenAlphaActualVal: $zhkHolzofenAlphaActualVal zhkHolzofenState: 1");
}
#high falling temp still above ResetLowTemp
#if(($zhkHolzofenAlphaActualVal<0) and (abs($zhkHolzofenAlphaActualVal)>=$zhkHolzofenAlphaThreshold) ){
##send command to VL, unset VL zero
# readingsSingleUpdate($hash, "zhkHolzofenState", "0", 1);
# }
#disabled: threshold fine tuning required first
#try to get low temp from heatingThermostat, or fallback to LowTemp attr value
my $zhkHolzofenResetLowTemp = AttrVal($name, "zhkHolzofenResetLowTemp", 18);
my $zhkHolzofenResetLowFhemDev = AttrVal($name, "zhkHolzofenResetLowFhemDev", "Heizg_Wohnzimmer1");
my $zhkHolzofenResetLowFhemDevreading = AttrVal($name, "zhkHolzofenResetLowFhemDevreading", "desiredTemperature");
$zhkHolzofenResetLowTemp=ReadingsVal($zhkHolzofenResetLowFhemDev, $zhkHolzofenResetLowFhemDevreading, $zhkHolzofenResetLowTemp);
readingsSingleUpdate($hash, "zhkHolzofenResetLowTemp", $zhkHolzofenResetLowTemp, 0);
#low  temp still below ResetLowTemp
if($zhkHolzofenResetLowTemp>$HolzofenRegler_lTemp1){
#send command to VL, unset VL zero
readingsSingleUpdate($hash, "zhkHolzofenState", "0", 1);
}
my $zhkHolzofenState = ReadingsVal($name, "zhkHolzofenState", 0);
Log3($name, 3, "ZHK $name zhkHolzofenState: $zhkHolzofenState");
return;
}

parameter:

zhkHolzofenResetLowTemp attr temp für reset des state auf 0 (if no FhemDev)
zhkHolzofenResetLowFhemDev attr fhem device to read reset-low temp from
zhkHolzofenResetLowFhemDevreading attr fhem device reading to read reset-low temp from
zhkHolzofenAlphaUpAlarmDiffDeg attr min.diff für abschaltung hot
zhkHolzofenAlphaThreshold attr Meßtoleranz temp °C
zhkHolzofenAlphaActualVal cache zuletzt berechneter wert für alpha (./zhkHolzofenTempSensorMinAge
zhkHolzofenTempSensorFhemDev attr fhem device to read the temperature from
zhkHolzofenTempSensorReading attr name of reading with float temp value
zhkHolzofenTempSensorTimestamp cache timestamp last OW update
zhkHolzofenTempSensorActValue cache
zhkHolzofenTempSensorMinAge attr recalc alpha after seconds
zhkHolzofenTempSensorDefaultOnFailure attr temp.default if sensor fail
zhkHolzofenTempHistoryCache cache cached last 2 temp readings
zhkHolzofenState cache actual calc result 0|1
zhkHolzofenIgnoreTempIfFhemDev attr zb. Window shutter, do not trigger if FhemDev state is true

viel spaß damit :)
LG, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel

epsrw1

praxistest erfolgreich :) die parameter:
zhkHolzofenAlphaUpAlarmDiffDeg
zhkHolzofenAlphaThreshold
müssen _SEHR_ niedrig eintgestellt sein, evtl ändere ich das bei gelegenheit damit es besser lesbar wird. ich habe im test 0.3 (gemessen max. 0,46 während anheizphase ofen) und 0.07 (meßtoleranz ds8b20) verwendet.
grüße, florian
Ich habe keine Ahnung, aber davon wenigstens ganz viel