FHEM Forum

FHEM => Sonstiges => Thema gestartet von: franky08 am 17 Oktober 2015, 23:10:02

Titel: [gelöst] Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 17 Oktober 2015, 23:10:02
Hallo, ich suche nach einer Möglichkeit, innerhalb einer sub, zu vergleichen ob innerhalb einer bestimmtem Zeit (15min) die Soll Temperatur erreicht wird oder wenn nicht die Leistung der Heizung (über AVNETIO DAC) zu erhöhen. Die sub für die Steuerung der Heizung ist bis jetzt so:

sub
HZ_Steuerung_Temp

{

my $soll = ReadingsVal("Wandthermostat","desired-temp",18);
my $th = ReadingsVal("TH_Sensor_WZ","temperature",18);
my $tc = ReadingsVal("Wandthermostat","measured-temp",18);
my $ta = ReadingsVal("Temperatur_Garten","temperature",0);

my $thtc = ( $th + $tc ) * 0.5;
my $stell = ( $soll - $thtc );
my ( $dac1 , $dac2 , $dac3 , $dac4 , $dac5 ) = ( "1470" , "1650" , "2100" , "2500" , "3500" );
my ( $tada1 , $tada2 ) = ( "180" , "630" );


if( $ta < 8.0 and $ta > 1.0 ) {
$dac1 = $dac1 + $tada1
}

if( $ta < 0.9 ) {
$dac1 = $dac1 + $tada2
}

if( $stell < 0.29 and $stell >= 0.05 ) {
fhem "set DAC setDAC $dac1";
fhem "set HZ_on_off_dummy2 on";
}

if( $stell < 0.49 and $stell > 0.29 ) {
fhem "set DAC setDAC $dac2";
fhem "set HZ_on_off_dummy2 on";
}

if( $stell < 0.9 and $stell > 0.49 ) {
fhem "set DAC setDAC $dac3";
fhem "set HZ_on_off_dummy2 on";
}

if( $stell < 1.49 and $stell > 0.9 ) {
fhem "set DAC setDAC $dac4";
fhem "set HZ_on_off_dummy2 on";
}

if( $stell > 1.49 ) {
fhem "set DAC setDAC $dac5";
fhem "set HZ_on_off_dummy2 on";
}



my $stellround = int(1000 * $stell + 0.5) / 1000;
if( $stellround < 0 ) {
fhem "attr DAC_test devStateStyle style=color:green";
}
if( $stellround > 0 ) {
fhem "attr DAC_test devStateStyle style=color:red";
}
fhem "setreading DAC_test state $stellround";

fhem "setreading DAC_test state_voll $stell";
fhem "set DAC_ist_soll $stellround";


if( $stell < 0 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 0";
}

if( $stell < 0.29 and $stell >= 0.05 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 40";

}

if( $stell < 0.49 and $stell > 0.29 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 50";

}

if( $stell < 0.9 and $stell > 0.49 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 60";

}

if( $stell < 1.49 and $stell > 0.9 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 72";

}

if( $stell > 1.49 ) {
fhem "setreading Diff_HZ_Regelung_dummy state 100";

}
fhem "setreading Durchschnitt_Temp_Treshold temperature $thtc";
fhem "set Durchschnitt_Temp_Treshold $thtc";

#Log 3, $stell;

}



dabei ist schon die Heizungsleistung abhängig von der Außentemperatur berücksichtigt, die Leistung wird über den Temperaturunterschied Ist/Soll bereit gestellt.
Da der Brenner sonst "ewig" auf niedriger Stufe arbeiten muss, suche ich nach einer Möglichkeit, dass die Leistung erhöht wird wenn die Solltemperatur nicht innerhalb 15 min erreicht wird.

Hat da jemand eine Idee?

P.S. es müssten die Soll Temperaturen vom Timestamp Old (vor 15 min) mit dem aktuellem Timestamp (jetzt) ausgewertet werden.

VG
Frank
Titel: Antw:Stellgröße Heizung
Beitrag von: franky08 am 18 Oktober 2015, 21:08:03
Keiner einen Tipp wie man den Temperaturwert von vor 15min in eine Variable schreiben kann? Irgendwie komme ich mit dem Problem nicht von der Stelle. Geloggt wird in FileLog:

2015-10-19_02:54:00 TH_TC_durchschn temperature: 24
2015-10-19_02:57:00 TH_TC_durchschn temperature: 23.95
2015-10-19_03:00:00 TH_TC_durchschn temperature: 23.9
2015-10-19_03:03:00 TH_TC_durchschn temperature: 23.9
2015-10-19_03:06:00 TH_TC_durchschn temperature: 23.8
2015-10-19_03:09:00 TH_TC_durchschn temperature: 23.8
2015-10-19_03:12:00 TH_TC_durchschn temperature: 23.75
2015-10-19_03:15:00 TH_TC_durchschn temperature: 23.7
2015-10-19_03:18:00 TH_TC_durchschn temperature: 23.65
2015-10-19_03:21:00 TH_TC_durchschn temperature: 23.65
2015-10-19_03:24:00 TH_TC_durchschn temperature: 23.6
2015-10-19_03:27:00 TH_TC_durchschn temperature: 23.55
2015-10-19_03:30:00 TH_TC_durchschn temperature: 23.55
2015-10-19_03:33:00 TH_TC_durchschn temperature: 23.45
2015-10-19_03:36:00 TH_TC_durchschn temperature: 23.45
2015-10-19_03:39:00 TH_TC_durchschn temperature: 23.35
2015-10-19_03:42:00 TH_TC_durchschn temperature: 23.35
2015-10-19_03:45:00 TH_TC_durchschn temperature: 23.3
2015-10-19_03:48:00 TH_TC_durchschn temperature: 23.3
2015-10-19_03:51:00 TH_TC_durchschn temperature: 23.3
2015-10-19_03:54:00 TH_TC_durchschn temperature: 23.3
2015-10-19_03:57:00 TH_TC_durchschn temperature: 23.3
2015-10-19_04:00:00 TH_TC_durchschn temperature: 23.35
2015-10-19_04:03:00 TH_TC_durchschn temperature: 23.45
2015-10-19_04:06:00 TH_TC_durchschn temperature: 23.45
2015-10-19_04:09:00 TH_TC_durchschn temperature: 23.45
2015-10-19_04:12:00 TH_TC_durchschn temperature: 23.6
2015-10-19_04:15:00 TH_TC_durchschn temperature: 23.7
2015-10-19_04:18:00 TH_TC_durchschn temperature: 23.8

VG
Frank
Titel: Antw:Stellgröße Heizung
Beitrag von: Wuppi68 am 18 Oktober 2015, 21:48:02
define Safe15Minutes at *00:15 setreading <Sensor> measuredTemp15m <getval ...>

sollte es tun

so aus dem Kopf und dann hast Du ein Neues Reading was alle 15 Minuten aktualisiert wird
Titel: Antw:Stellgröße Heizung, wie Timestamp auswerten?
Beitrag von: franky08 am 18 Oktober 2015, 21:56:30
Danke Wuppi68, muss ich mir mal ansehen, ich brauchte die beiden Werte old (vor 15min) und aktuell (dass ist kein Problem) in einer Variable. So in der Art:
my $tempold = ? <---- $thtc vor 15min
my $thtc = ( $th + $tc ) * 0.5; <-- das hab ich ja schon in der sub, siehe oben

VG
Frank
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 22 Oktober 2015, 22:10:31
Hallo Wuppi68,

Zitatdefine Safe15Minutes at *00:15 setreading <Sensor> measuredTemp15m <getval ...>

das funktioniert leider so nicht. Das Problem ist, dass wie oben schon gepostet ich ausgehend vom aktuellen Reading das gleiche Reading nur von vor 15 min brauche. Im Log hätte ich das aber da kann ich über get... ja nur auf einen bestimmten Timestamp nicht aber auf einen relativen Timestamp (- 15 min) zugreifen. Ich hab jetzt schon etwas in meinem Perl Büchern nachgeforscht aber bin noch nicht fündig geworden.

Ganz einfach wäre es, wenn sleep non blocking wäre. Dann könnte man a la

my $temp1 = ReadingsVal"Sensor","temperature",0;
sleep(900);
my $temp2 = ReadingsVal"Sensor","temperature",0;
my $tempdiff = $temp2 - $temp1;
if(..... {
}
was machen. Das geht aber leider nicht, da sleep dann fhem ja für 15min blockieren würde.

VG
Frank
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: Wuppi68 am 22 Oktober 2015, 23:50:31
dann rollier doch die letzten Readings

ein AT jedeMinute, was die Reading in eine eigene "History" schreibt...

so ungefähr

move measuredtemp14 measuredtemp15
move measuredtemp13 measuredtemp14
.
.
.
move measuredtemp1 measuredtemp2
measuredtemp1 = getreading ....

damit sollte es auf jeden Fall klappen

ja, keine Perl, kein FHEM, nur Logic zum selber umsetzen :-)
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: frank am 23 Oktober 2015, 13:40:24
ich mache soetwas immer "umgekehrt". also nicht in einer liste nach alten werten suchen, sondern zur rechten zeit ein wert für später zwischenspeichern.

irgendwann startet ja deine hzg mit einem startwert. zu diesem zeitpunkt speicherst du alles, was du in 15 minuten zum kontrollzeitpunkt benötigst. zu dieser zeit hast du nun aktuelle und 15 minuten alte daten. damit alles auswerten und entsprechend reagieren. zum schluss die aktuellen werte wieder für den nächsten kontrollzeitpunkt speichern.
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: Hans Franz am 23 Oktober 2015, 14:22:54
ZitatIm Log hätte ich das aber da kann ich über get... ja nur auf einen bestimmten Timestamp nicht aber auf einen relativen Timestamp (- 15 min) zugreifen. Ich hab jetzt schon etwas in meinem Perl Büchern nachgeforscht aber bin noch nicht fündig geworden.

DateTime bietet eine subtract-Möglichkeit:
use DateTime;
my $dt1   = DateTime->now;
$dt1->set_time_zone( 'Europe/Berlin' );

$dt1->subtract(minutes => 15);
my $str15 = $dt1->year."-".sprintf("%02d",$dt1->month)."-".sprintf("%02d",$dt1->day)."_".sprintf("%02d",$dt1->hour).":".sprintf("%02d",$dt1->minute);

Jetzt hast du aber das Problem, dass ein get FileLogName... genau treffen muss, da deine Logeinträge nur alle drei Minuten kommen. Also besser zweimal machen, um nicht nur from sondern auch to  mit min. drei Minuten Differenz im get zu haben.

Ich finde die anderen Vorschläge aber praktikabler.

Gruß
Hans
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 23 Oktober 2015, 15:33:43
Mmh, hab mich gerade mal drann gesetzt aber ein:

package main;
use strict;
use warnings;
use POSIX;
use File::Copy;

sub
myHZ_ZYCUtils_Initialize($$)
{
my ($hash) = @_;
}

sub
HZ_Zyclus

{

my $tempz1 = ReadingsVal("TH_TC_durchschn","temperature",0);
move($tempz1,$tempz2);
}


bringt mir eine Fehlermeldung, muss ich mal suchen was da nicht OK ist. $tempz2 ist nicht deklariert soweit ich das sehe.
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: Thorsten Pferdekaemper am 23 Oktober 2015, 16:50:56
Hi,
ist das nicht etwas für das Modul PID20?
Gruß,
   Thorsten
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 23 Oktober 2015, 17:09:18
Funktioniert leider nicht, der mv Befehl wird bemeckert:
PERL WARNING: Use of uninitialized value $from in stat at /usr/share/perl/5.14/File/Copy.pm line 277.

Muss ich mir irgendwas anderes ausdenken, im Moment platzt mir gleich der Kopf. Sonst bleibt die Steuerung so wie sie ist, dauert das Aufheizen nur etwas länger.
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 23 Oktober 2015, 19:56:39
So, ich hab mir das Ganze jetzt, in der Art wie frank schon schrieb, mittels notify und disable 1, disable 0 für ein at +*00:15 gebaut. Bin gerade beim testen, muss mal warten bis die Heizung anspringt  ;)
Beim Start de Heizung wird die Temperatur in ein dummy geschrieben und gleichzeitig ein 15min at gestartet, nach den 15 min wird die Temperatur gelesen und in ein zweites dummy geschrieben. Der Rest ist Mathe  8)

VG
Frank
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: Thorsten Pferdekaemper am 23 Oktober 2015, 20:52:31
...und warum nimmst Du nicht PID20? Das müsste Dir doch alles abnehmen, oder?
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 23 Oktober 2015, 21:13:41
Das PID20 Modul bringt mir für diesen Fall nicht´s. Hast du oben, in meinem ersten Post mal gelesen was ich erreichen will? Die Steuerung der Heizung läuft über ein AVR-NET-IO Board mit einem DAC und die Reglung funktioniert mit der sub auch ausgezeichnet nur die Leistungssteuerung wollte ich etwas anpassen d.h. wenn die Solltemperatur nicht innerhalb von 15 min erreicht wird, soll die Leistung erhöht werden. Jetzt erfolgt die Anpassung der Leistung über den Vergleich Ist/Soll wobei je nach Differenz und Außentemperatur die Leistung eingestellt wird, dass mit der 15min Zeit sollte nur zusätzlich eingebaut werden.

VG
Frank
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: Thorsten Pferdekaemper am 23 Oktober 2015, 21:23:42
Hi,
ich denke schon, dass man das mit einem PI-Regler machen kann. Du kannst ja den Außentemperatur-Offset immer noch draufaddieren.
Allerdings ist das mit der Außentemperatur meiner Meinung nach sowieso nicht optimal. Am besten macht man sowas nur mit einem PI-Regler.
Gruß,
   Thorsten
Titel: Antw:Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?
Beitrag von: franky08 am 23 Oktober 2015, 21:31:20
Die Aussentemperatur spielt bei mir nur eine untergeordnete Rolle, bei Aussentemperaturen
über 10 Grad Celsius startet die Heizung bei ca 30% Leistung und bei Temperaturen unter 5 Grad bei ca 50 %.
Sieh dir oben im ersten Post mal die sub an, ist selbsterklärend.

VG
Frank