Hallo,
habe ein kleines Problem mit Perl, bekomme folgende Fehlermeldung wenn ich meine m99_myUtils abspeichern will
und weiß nicht so recht was ich an der letzten Zeile "if ( $settemp>23 ) { fhem("set $device desired-temp 21"); " falsch mache.
sub CheckThermo()
{
my $brauche_waerme=0;
my $ventile_im_leerlauf=0;
my $ventil=0;
my $ventile_zu=0;
my $ventile_auf=0;
my $boosttime=0;
my $settemp=0;
my $heizung_status=ReadingsVal("HK1_Ein","state","off ok");
my $heizung_boost=ReadingsVal("HK1_Ein_Boost","state","off ok");
my @devices = devspec2array('Thermostat_\w*_Clima');
foreach my $device (@devices)
{
$ventil=ReadingsVal($device, "ValvePosition", "999");
$settemp=ReadingsVal($device, "desired-temp", "999");
$boosttime=ReadingsVal($device, "boostTime", "999");
$boosttime=~s/\D//g;
###$boosttime=(substr($boosttime, 0, (length($boosttime)-4)));
Log(3,"Ventil ".$device.": ".int($boosttime));
if ($ventil > 50) { $brauche_waerme=1 }
if ($ventil < 40) { $ventile_im_leerlauf++ }
if ($ventil == 0) { $ventile_zu++ }
if ($boosttime > 0) { $ventile_auf=1 }
}
### für einige Minuten heizen
if ($ventile_auf > 0)
{
if ($heizung_boost ne "on ok") { fhem ("set HK1_Ein_Boost on");}
}else{
if ($heizung_boost eq "on ok") { fhem ("set HK1_Ein_Boost off");}
}
### Wärmeanforderung Pumpe HK1 ein, wenn Thermostate offen
if ($brauche_waerme != 0)
{
Log(3,"Wärme benoetigt, Status vorher: ".$heizung_status);
if ($heizung_status ne "on ok")
{
fhem ("set HK1_Ein on");
}
} else {
if ($ventile_im_leerlauf == @devices)
{
if ($heizung_status eq "on ok")
{
Log(3,"Keine Wärme benoetigt, Status vorher: ".$heizung_status." ".$ventile_zu." von ".@devices." Ventile zu");
fhem ("set HK1_Ein off");
} else {
Log(3,"Heizbedarf: ".$ventile_im_leerlauf." of ".@devices." actuators are idle.")
}
}
}
if ( $settemp>23 ) { fhem("set $device desired-temp 21"); }
}
Die Deklaration einer Variablen innerhalb einer Schleife verbleibt auch nur in dieser gültig.
my $device;
ausserhalb der Schleife sollte Abschaffung bringen. Und natürlich das my raus nehmen nach foreach
Versuchs mal so:
sub CheckThermo()
{
my $brauche_waerme=0;
my $ventile_im_leerlauf=0;
my $ventil=0;
my $ventile_zu=0;
my $ventile_auf=0;
my $boosttime=0;
my $settemp=0;
my $device;
my $heizung_status=ReadingsVal("HK1_Ein","state","off ok");
my $heizung_boost=ReadingsVal("HK1_Ein_Boost","state","off ok");
my @devices = devspec2array('Thermostat_\w*_Clima');
foreach $device (@devices)
{
$ventil=ReadingsVal($device, "ValvePosition", "999");
$settemp=ReadingsVal($device, "desired-temp", "999");
$boosttime=ReadingsVal($device, "boostTime", "999");
$boosttime=~s/\D//g;
###$boosttime=(substr($boosttime, 0, (length($boosttime)-4)));
Log(3,"Ventil ".$device.": ".int($boosttime));
if ($ventil > 50) { $brauche_waerme=1 }
if ($ventil < 40) { $ventile_im_leerlauf++ }
if ($ventil == 0) { $ventile_zu++ }
if ($boosttime > 0) { $ventile_auf=1 }
}
### für einige Minuten heizen
if ($ventile_auf > 0)
{
if ($heizung_boost ne "on ok") { fhem ("set HK1_Ein_Boost on");}
}else{
if ($heizung_boost eq "on ok") { fhem ("set HK1_Ein_Boost off");}
}
### Wärmeanforderung Pumpe HK1 ein, wenn Thermostate offen
if ($brauche_waerme != 0)
{
Log(3,"Wärme benoetigt, Status vorher: ".$heizung_status);
if ($heizung_status ne "on ok")
{
fhem ("set HK1_Ein on");
}
} else {
if ($ventile_im_leerlauf == @devices)
{
if ($heizung_status eq "on ok")
{
Log(3,"Keine Wärme benoetigt, Status vorher: ".$heizung_status." ".$ventile_zu." von ".@devices." Ventile zu");
fhem ("set HK1_Ein off");
} else {
Log(3,"Heizbedarf: ".$ventile_im_leerlauf." of ".@devices." actuators are idle.")
}
}
}
if ( $settemp>23 ) { fhem("set $device desired-temp 21"); }
}
Grüße,
Heiko
Ups .... schönen Abend noch Cooltux :)
Danke Dir Heiko. Wünsche ich Dir auch.
Grüße
Leon
Hallo,
danke für die schnelle Hilfe, das "my" hat funktioniert, bin kein so großer PERL Guru ;-)
aber mit dem Befehl
if ( $settemp>23 ) { fhem("set $device desired-temp 21.0"); }
kommt schon wider ein Fehler im Logfile, es wir das desired-temp nicht erkannt
Wärme benoetigt, Status vorher: on ok
2016.12.30 22:22:09.729 5: Cmd: >set desired-temp 21.0<
2016.12.30 22:22:09.742 3: set desired-temp 21.0 : Please define desired-temp first
2016.12.30 22:22:09.743 3: mycall: Please define desired-temp first
2016.12.30 22:22:09.743 5: redefine at command mycall as +*00:01:30 { CheckThermo() }
2016.12.30 22:22:09.745 5: Triggering mycall (1 changes)
2016.12.30 22:22:09.746 5: Starting notify loop for mycall, first event Next: 22:23:39
eigentich will ich nur die Maximaltemp. begrenzen wenn jemand auf 30°C dreht.
set $device regSet tempMax 23
kein if, nix. Das Device passt selbst auf.
Eleganter (auch hier) mit einem Template. Bei interesse kann ich eines bauen.
Hallo,
ZitatEleganter (auch hier) mit einem Template. Bei interesse kann ich eines bauen.
Ich finde kein hier :(
ZitatIch finde kein hier
das ist kein Link.
Was ich sagen will: Wenn du templates nutzen willst UND die einstellung in diesem Fall über das Device generieren willst kann ich dir ein Template zu Verfügung stellen.
Beispiel (use-case)
Ich habe ein template welches ich auf alle meine RTs anwende. Mein Ziel: Alle RTs arbeiten mit den gleichen Einstellungen. Alle gleich? nein. Ich will alle gleich, allerdings will ich die Boottime und die Valvemax einstellung indivituell steuern. Aber der Rest soll gleich sein.
Bei der Erstellung eines Templates muss man wissen was man will:
- welchen devicetyp will ich steuern? => RTs
- Welche Register will ich vereinheitlichen? => i.A. alle. man kann auch beliebige weglassen.
- welche Register (Funktionen) will ich individuell einstellen? => bei dir evtl maxtemp. Bei mir z.B. boost time
dann kann ich eines erstellen und hier posten.
Die allgemeine Anwendung kannst du in Wiki nachlesen.
Hallo Martin,
danke gern, vielleicht könntest du mir dein RT template zu Verfügung stellen,
umtippen auf meine Bedürfnisse denke werde ich schon schaffen. Bei mir hapert
es nur immer an einen aussagekräftigen Beispiel.
Gruß
Mario
https://wiki.fhem.de/wiki/HomeMatic_HmInfo_Templates_erstellen#Heizung_RT_Templates
Hilft das?
Schon den template Editor getestet?
Define HT HMtemplate
Der soll beim erstellen oder editieren helfen