Hallo zusammen,
ich versuche mich nun schon den ganzen Sonntag an dem einen DOIF mit dem ich zwei verschiedene Subs aus der 99_myUtils.pm aufrufen möchte.
sub ecomodeAll_T {
my (@Thermostate) = devspec2array("type=HeatingThermostat");
my $T_counter = 0;
Log 1, ("+++ ECO ANFANG +++");
foreach(@Thermostate)
{
my $aktT = ReadingsVal("$_", "desiredTemperature", "");
my $newTemp = $aktT -2;
Log 1, ("$_ aktuelle Temperatur: $aktT");
if (($newTemp > "16") && ($newTemp < "18"))
{
$newTemp = 18
}
if ($newTemp >= "18")
{
fhem("set $_ desiredTemperature $newTemp");
Log 1, ("Temperaturänderung: $_ auf $newTemp");
$T_counter ++
}
}
Log 1, ("$T_counter Thermostate abgesenkt");
Log 1, ("+++ ECO ENDE +++");
}
sub ecomodeAllPlus_T {
my (@ThermostatePlus) = devspec2array("type=HeatingThermostatPlus");
my $T_counter = 0;
Log 1, ("+++ ECO PLUS ANFANG +++");
foreach(@ThermostatePlus)
{
my $aktT = ReadingsVal("$_", "desiredTemperature", "");
my $newTemp = $aktT -2;
Log 1, ("$_ aktuelle Temperatur: $aktT");
if (($newTemp > "16") && ($newTemp < "18"))
{
$newTemp = 18
}
if ($newTemp >= "18")
{
fhem("set $_ desiredTemperature $newTemp");
Log 1, ("Temperaturänderung: $_ auf $newTemp");
$T_counter ++
}
}
Log 1, ("$T_counter Thermostate abgesenkt");
Log 1, ("+++ ECO PLUS ENDE +++");
}
1;
Das sind die beiden Subs, die eigentlich identisch sind, nur auf zwei verschiedene Thermostatetypen gehen.
Mein DOIF dazu sieht dann so aus:
define ECO.Mode.Aktivator DOIF ([Anwesenheit_Allgemein] eq "absent") ( XXXX ) DOELSE (set Heizung_Ecomode inaktiv)
Was muss bei den XXXX rein, wenn ich ecomodeAll_T, ecomodeAllPlus_T aufrufen und Heizung_Ecomode auf aktiv setzen möchte???
Gefühlt hab ich hier schon 100 verschiedene Varianten probiert, aber es funktioniert NIE!! :(
Gruß persching
Edit: Farbliche Formatierung der X hat nicht geklappt und darum wieder entfernt
Hallo,
Hast Du {ecomodeAll_TecomodeAll_T} probiert?
Gruß Otto
Ohne Komma? Nein hab ich nicht. Jetzt ist aber der PC schon aus... Aber ich probiers gleich morgen aus.
Ich weiß nicht wo Du ein Komma setzen willst, aber Aufrufe für subs aus 99_myUtils müssen wie so vieles in geschweifte Klammern gepackt werden. Steht unter anderem im Wiki.
Gruß Otto
Na ein Komma zwischen den beiden Sub-Namen.
Der Aufruf
define ECO.Mode.Aktivator DOIF ([Anwesenheit_Allgemein] eq "absent") ({ecomodeAllPlus_TecomodeAll_T}) DOELSE (set Heizung_Ecomode inaktiv)
Führt zu folgendem log:
2015.10.05 08:26:07 2: ECO.Mode.Aktivator: {ecomodeAllPlus_TecomodeAll_T}: Bareword "ecomodeAllPlus_TecomodeAll_T" not allowed while "strict subs" in use at (eval 57543) line 1.
Da Du 2 Aufrufe machen willst, die beide keine FHEM, sondern Perl-Befehle sind (es sind ja perl subs) würde vielleicht folgender Absatz aus der Doku helfen:
Zitat
Angaben im Ausführungsteil:
Der Ausführungsteil wird immer, wie die Bedingung, in runden Klammern angegeben. Es werden standardmäßig FHEM-Befehle angegeben, wie z. B.: ...(set lamp on)
Sollen mehrere FHEM-Befehle ausgeführt werden, so werden sie mit Komma statt mit Semikolon angegeben ... (set lamp1 on, set lamp2 off)
Falls ein Komma nicht als Trennzeichen zwischen FHEM-Befehlen gelten soll, so muss der FHEM-Ausdruck zusätzlich in runde Klammern gesetzt werden: ...((set lamp1,lamp2 on),set switch on)
Perlbefehle müssen zusätzlich in geschweifte Klammern gesetzt werden: ... ({system ("wmail Peter is at home")})
Mehrere Perlbefehle hintereinander werden im DEF-Editor mit zwei Semikolons angegeben: ...({system ("wmail Peter is at home");;system ("wmail Marry is at home")})
FHEM-Befehle lassen sich mit Perl-Befehlen kombinieren: ... ({system ("wmail Peter is at home")}, set lamp on)
Ich hoffe das hilft
normalerweise braucht man in dem Fall den system Befehl nicht. Könnte bei DOIF anders sein, habe ich so noch nicht probiert.
Du übergibst nichts an die subs, kann sein, dass Du dabei aber die Übergabeklammer schreiben aber leer lassen musst. Wie bei isday()
{ecomodeAllPlus_TecomodeAll_T()}
Ich weiß es aber nicht genau.
Gruß Otto
Danke viegener! Das hat mir die fehlenden Infos geliefert!
Der korrekte Aufruf ist:
define ECO.Mode.Aktivator DOIF ([Anwesenheit_Allgemein] eq "absent") ({ ecomodeAllPlus_T;;;;ecomodeAll_T },set Heizung_Ecomode aktiv) DOELSE (set Heizung_Ecomode inaktiv)
Wobei ich nur zwei ;; gesetzt hatte aber in der fhem.conf jetzt 4 ;;;; stehen...
Und warum schreibst Du die ganze Zeit ecomodeAllPlus_TecomodeAll_T wenn Deine Funktionen ganz anders heißen?!?
Ich meine wenn Du was in den Systemaufruf schreibst was es gar nicht gibt brauchst Du Dich nicht zu wundern! Denkst Du FHEM kann verstehendes Lesen?
Schönen Abend :o
Sorry Otto, aber wo schreibe ich das? Ich habe extra die myutils gepostet!
Naja Sorry, eigentlich war bei Deiner Fragestellung der Inhalt in 99_myUtils erstmal zweitrangig. Aber wie kommst Du darauf zwei Namen ohne jedes Trennzeichen aneinander hängen zu wollen? Ich wüsste nicht in welchem Falle das irgendwas sinnvolles ergeben sollte.
Ja am Ende habe ich deswegen Deine Frage mit den zwei Aufrufen hintereinander nicht so verstanden wie sie gemeint war. Und am Ende hattest Du zwei Probleme: Aufruf von Perl Subs im Allgemeinen und zwei hintereinander im Speziellen.
Na egal. Hauptsache es geht.
Gruß Otto
ich wundere mich eher, dass dies zu funktionieren scheint und es nicht "TYPE" heissen muss:
devspec2array("type=HeatingThermostat")
Zitat von: persching am 05 Oktober 2015, 17:47:04
Danke viegener! Das hat mir die fehlenden Infos geliefert!
gerne doch :D
Zitat von: frank am 05 Oktober 2015, 22:56:17
ich wundere mich eher, dass dies zu funktionieren scheint und es nicht "TYPE" heissen muss:
devspec2array("type=HeatingThermostat")
Bei den MAX Thermostaten ist TYPE=MAX und type=Heating Thermostat bzw HeatingThermostatPlus
Da ich aber auch noch die MAX Fensterkontakte habe kam ja TYPE als gemeinsames internal nicht in Frage.
ZitatBei den MAX Thermostaten ist TYPE=MAX und type=Heating Thermostat bzw HeatingThermostatPlus
merci, dann ist klar.