[gelöst] Frage zum Code, Zuweisung neue Stellgröße

Begonnen von franky08, 08 September 2015, 19:27:34

Vorheriges Thema - Nächstes Thema

franky08

Hallo, ich hab für die Heizungssteuerung u.a. eine sub, welche je nach Differenztemperatur Soll/ist über AVNETIO einen DAC steuert und dieser dann die Steuerspannung für die Heizung liefert. Das funktioniert alles wunderbar. Jetzt habe ich mir aber überlegt die Außentemperatur in die Steuerung mit einzubeziehen. Zur Zeit fährt die Heizung bei einer Differenz Soll/ist von $stell < 0.29 and $stell > 0.12 auf ca. 30% Leistung, darunter bleibt die Heizung aus. Jetzt soll, wenn die Außentemperatur unter 10°C geht zu $stell 0.5 addiert werden um die Leistung auf ca. 50% anzuheben.
Soweit die Problemstellung. Anbei mal die verantwortliche sub.
Meine Frage ist kann ich die Zuweisung der neuen Variable $stell so machen:

my $stell = ( $soll - $thtc ); #differenz soll/ist
if( $ta < 10 ) $stell = ( $stell + 0.5 );  #das wäre dann neu, $ta Außentemperatur

if( $stell < 0.29 and $stell > 0.12 ) {
fhem "set DAC setDAC 1470";

}

hier der relevante Teil der Steuerung, mit DAC

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 $thtc = ( $th + $tc ) * 0.5;
my $ta = ReadingsVal("Temperatur_Garten","temperature",0);



my $stell = ( $soll - $thtc );
if( $ta < 10 ) $stell = ( $stell + 0.5 );

if( $stell < 0.29 and $stell > 0.12 ) {
fhem "set DAC setDAC 1470";

}

if( $stell < 0.49 and $stell > 0.29 ) {
fhem "set DAC setDAC 1650";

}

if( $stell < 0.9 and $stell > 0.49 ) {
fhem "set DAC setDAC 2100";

}

if( $stell < 1.49 and $stell > 0.9 ) {
fhem "set DAC setDAC 2500";

}

if( $stell > 1.49 ) {
fhem "set DAC setDAC 3500";

}


Ich möchte nur vorher wissen ob oben der rote Teil so funktionieren kann ohne das jetzt auf gut Glück umzubauen und die Nacht dann die Wohnung kalt wird <---- ganz schlechter WAF  ;)

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

frank

bau das if entweder so

if(...) {..}

oder so

a=b if(...);

deine version ist eher in c üblich. am besten einheitlich, so wie deine anderen if's. ansonsten bau zuerst eine log-ausgabe ein und beobachte die werte eine zeitlang, bevor du es in die harte waf-welt lässt.  ;)
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

franky08

Probier ich dann mal, wenn der Sprung auf $stell + 1.0 nicht zu groß wäre könnte ich auch gleich $stell = $stell++ setzen aber das wären fast 80% Leistung, mmh?
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

Die Klammerung hatte ich vollkommen übersehen. Na klar, dann:
my $stell = ( $soll - $thtc );
if( $ta < 10 ) {
$stell = ( $stell + 0.5 );

}


Kann ich aber erst morgen probieren, noch sind es über 10°C im Garten und falls was nicht stimmt, läuft in der Nacht die Heizung nicht an  :(

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Ellert

Du könntest Dir eine kleine Test-Sub erstellen

sub test {
my $ta = 9;
$stell += 0.5 if ( $ta < 10 );
return $stell;
}

und die im Frontend aufrufen mit:

{test}

dann hast Du die Antwort sofort  ;)

Probier doch mal

$stell = $stell + 0.5 if ( $ta < 10 );
oder so:
if ( $ta < 10 ) {$stell = $stell + 0.5;}

frank

Zitatnoch sind es über 10°C im Garten
if($ta < 50) geht immer  :)
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

franky08

#6
Ja, ja  :) :)
Ich hab´s jetzt mal so eingebaut, sooo kalt ist es nun auch noch nicht  ;)

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

#7
Sooo, jetzt muss ich das doch nochmal hochholen  :o
Auf dem Papier und in fhem funktioniert das wunderbar aber leider zickt die Heizung dann, was auch vollkommen logisch ist. Z.B. die Außentemperatur ist unter den festgelegten 10°C also wird zu $stell 0.5 addiert dadurch schaltet das Threshold Modul die Heizung ab, irgendwie komme ich iMo nicht drauf, wie ich es beschreiben soll, anbei mal die Plots der Leistung und Heizung on/off.

Die komplette sub:
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 $thtc = ( $th + $tc ) * 0.5;
my $ta = ReadingsVal("Temperatur_Garten","temperature",0);



my $stell = ( $soll - $thtc );

#if( $ta < 10.0 ) {
#$stell = $stell + 0.5;

#}

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

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

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

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

if( $stell > 1.49 ) {
fhem "set DAC setDAC 3500";
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.12 ) {
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;

}


Threshold:

define HZ_WZ_gesteuert THRESHOLD TH_TC_durchschn:temperature:0.1:Wandthermostat:desired-temp |set DAC setDAC 570; set HZ_on_off_dummy2 off|{HZ_Steuerung_Temp}


Irgendwie gehen mir die Ideen aus, an welcher Stelle ich die Erhöhung der Leistung einbauen könnte. Jeh nach Außentemperatur könnte mann den DAC Wert höher setzen oder eben der Heizung einen größeren Stellwert ($stell) vorgaukeln (das funktioniert, so wie ich es hatte leider nicht).

Hat da vlt. einer eine Idee???

P.S. Bis 10:00 Uhr hatte ich Änderung im Code noch drinn und wie mann sieht ist danach der Schaltvorgang der Heizung wieder "sauber"

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

Ich denke jetzt hab ich´s:

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" );

if( $ta < 10 ) {
$dac1 = $dac1 + 180
}

if( $stell < 0.29 and $stell > 0.12 ) {
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 4dac4";
fhem "set HZ_on_off_dummy2 on";
}

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


werde ich aber noch testen müssen  ;)

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

Nach ausführlichen Test´s:


.......
my $stell = ( $soll - $thtc );
my ( $dac1 , $dac2 , $dac3 , $dac4 , $dac5 ) = ( "1470" , "1650" , "2100" , "2500" , "3500" );

if( $ta < 10 ) {
$dac1 = $dac1 + 180
}

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


direkt den DAC Wert zu erhöhen, hat das gewünschte Verhalten der Heizung gebracht!

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...