[gelöst] Heizung, wie Timestamp (old, vor 15min/aktuell) vergleichen?

Begonnen von franky08, 17 Oktober 2015, 23:10:02

Vorheriges Thema - Nächstes Thema

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

franky08

#1
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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Wuppi68

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
FHEM unter Proxmox als VM

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Wuppi68

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 :-)
FHEM unter Proxmox als VM

frank

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.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Hans Franz

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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

franky08

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.
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Thorsten Pferdekaemper

Hi,
ist das nicht etwas für das Modul PID20?
Gruß,
   Thorsten
FUIP

franky08

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.
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Thorsten Pferdekaemper

...und warum nimmst Du nicht PID20? Das müsste Dir doch alles abnehmen, oder?
FUIP

franky08

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
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Thorsten Pferdekaemper

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
FUIP