Frage zur best practice bei einer Heizungsregelung unter versch. Bedingungen

Begonnen von dusti64, 20 Oktober 2018, 11:55:37

Vorheriges Thema - Nächstes Thema

Damian

Es ist alles mehr oder minder zu vernachlässigen, denn wir reden hier von Millisekunden. Dennoch kann es interessant sein zu wissen, wo es sich lohnt im Zweifelsfalle zu optimieren und wo nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dusti64

2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht+Rollläden, Alexa, Homebridge, Hue, Instar, Merros, Shelly

dusti64

Ich möchte nochmal Anlauf nehmen und das DOIF auf Perl umstellen und hab ein Syntax-Problem  :-\

Im FHEM Modus geht dies:
set TH_SZ_ClimRT_tr desired-temp [SZ_Heating_Control:currValue]
Wenn ich es im Perl Modus so schreibe:
fhem_set "TH_SZ_ClimRT_tr desired-temp {ReadingsVal("SZ_Heating_Control","currValue",0)}"
bekomme ich einen Fehler...Wie genau muss ich es umschreiben?
Wenn ich das eingebe in der Befehlseingabe:
{ReadingsVal("SZ_Heating_Control","currValue",0)} bekomme ich den korrekten Wert (16.0)
Im Log steht dazu folgendes:
2018.11.22 13:04:00 1: PERL WARNING: Bareword found where operator expected at (eval 303427) line 6, near ""TH_SZ_ClimRT_tr desired-temp {ReadingsVal("SZ_Heating_Control"
2018.11.22 13:04:00 3: eval: Push_FensterOffen_SZ_Test: warning in condition c01
2018.11.22 13:04:00 1: stacktrace:
2018.11.22 13:04:00 1:     main::__ANON__                      called by (eval 303427) (6)
2018.11.22 13:04:00 1:     (eval)                              called by ./FHEM/98_DOIF.pm (1873)
2018.11.22 13:04:00 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (2152)
2018.11.22 13:04:00 1:     main::DOIF_Perl_Trigger             called by ./FHEM/98_DOIF.pm (2466)
2018.11.22 13:04:00 1:     main::DOIF_TimerTrigger             called by fhem.pl (3146)
2018.11.22 13:04:00 1:     main::HandleTimeout                 called by fhem.pl (649)
2018.11.22 13:04:00 1: PERL WARNING: (Missing operator before SZ_Heating_Control?)
2018.11.22 13:04:00 3: eval: Push_FensterOffen_SZ_Test: warning in condition c01
2018.11.22 13:04:00 1: stacktrace:
2018.11.22 13:04:00 1:     main::__ANON__                      called by (eval 303427) (6)
2018.11.22 13:04:00 1:     (eval)                              called by ./FHEM/98_DOIF.pm (1873)
2018.11.22 13:04:00 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (2152)
2018.11.22 13:04:00 1:     main::DOIF_Perl_Trigger             called by ./FHEM/98_DOIF.pm (2466)
2018.11.22 13:04:00 1:     main::DOIF_TimerTrigger             called by fhem.pl (3146)
2018.11.22 13:04:00 1:     main::HandleTimeout                 called by fhem.pl (649)
2018.11.22 13:04:00 1: PERL WARNING: String found where operator expected at (eval 303427) line 6, near "SZ_Heating_Control",""
2018.11.22 13:04:00 3: eval: Push_FensterOffen_SZ_Test: warning in condition c01
2018.11.22 13:04:00 1: stacktrace:
2018.11.22 13:04:00 1:     main::__ANON__                      called by (eval 303427) (6)
2018.11.22 13:04:00 1:     (eval)                              called by ./FHEM/98_DOIF.pm (1873)
2018.11.22 13:04:00 1:     main::DOIF_CheckCond                called by ./FHEM/98_DOIF.pm (2152)
2018.11.22 13:04:00 1:     main::DOIF_Perl_Trigger             called by ./FHEM/98_DOIF.pm (2466)
2018.11.22 13:04:00 1:     main::DOIF_TimerTrigger             called by fhem.pl (3146)
2018.11.22 13:04:00 1:     main::HandleTimeout                 called by fhem.pl (649)

2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht+Rollläden, Alexa, Homebridge, Hue, Instar, Merros, Shelly

CoolTux


set TH_SZ_ClimRT_tr desired-temp [SZ_Heating_Control:currValue]



CommandSet(undef,'TH_SZ_ClimRT_tr desired-temp ' . ReadingsVal('SZ_Heating_Control','currValue','none') )
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 22 November 2018, 14:01:27

set TH_SZ_ClimRT_tr desired-temp [SZ_Heating_Control:currValue]



CommandSet(undef,'TH_SZ_ClimRT_tr desired-temp ' . ReadingsVal('SZ_Heating_Control','currValue','none') )


Im Perlmodus geht grundsätzlich auch:

fhem_set "TH_SZ_ClimRT_tr desired-temp ".ReadingsVal("SZ_Heating_Control","currValue",0);

In einem Perlblock (nicht in einer Funktion im subs-Block) geht auch:

fhem_set "TH_SZ_ClimRT_tr desired-temp ".[?SZ_Heating_Control:currValue];

Das Fragezeichen ist hier wichtig, es sei denn SZ_Heating_Control:currValue soll den set-Befehl triggern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

Ah ok, verstehe. Mit Perlmodus war DOIF Perlmodus gemeint. Sorry
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Damian

Zitat von: CoolTux am 22 November 2018, 15:09:58
Ah ok, verstehe. Mit Perlmodus war DOIF Perlmodus gemeint. Sorry

CommandSet ist im Namensraum main, daher würde es nur mit ::CommandSet(... funktionieren. Dafür wurde die vereinfachte Funktion fhem_set im Namensraum DOIF definiert, die wiederum ::CommandSet(... aufruft.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dusti64

Super...habt herzlichen Dank ihr Beiden!

Ja ich meinte den DOIF-Perl Modus und nein, der set-Befehl muss nicht getriggert werden, es soll nur die Solltemp. abgerufen und gesetzt werden. Loide, was hat mich das die letzten Tage umgetrieben  >:(

Eine Frage noch zu Timern, wenn ich eine Meldung dreimal alle 60 min. wiederholen möchte, setze ich dann den Timer so:

set_Exec("Timer3",3600,'fhem_set("telegramBot message Fenster SZ länger als eine Std. offen!")');
set_Exec("Timer4",7200,'fhem_set("telegramBot message Fenster SZ länger als zwei Std. offen!")');
set_Exec("Timer5",10800,'fhem_set("telegramBot message Fenster SZ länger als drei Std. offen!")');

Oder gibt es da eine elegantere/bessere Möglichkeit?
Als Vorlage habe ich hier aus dem Forum {set_Exec("Timer",60,'fhem_set("...")')} genommen...

Gruß Dusti o/
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht+Rollläden, Alexa, Homebridge, Hue, Instar, Merros, Shelly

Damian

Zitat von: dusti64 am 22 November 2018, 15:51:43
Super...habt herzlichen Dank ihr Beiden!

Ja ich meinte den DOIF-Perl Modus und nein, der set-Befehl muss nicht getriggert werden, es soll nur die Solltemp. abgerufen und gesetzt werden. Loide, was hat mich das die letzten Tage umgetrieben  >:(

Eine Frage noch zu Timern, wenn ich eine Meldung dreimal alle 60 min. wiederholen möchte, setze ich dann den Timer so:

set_Exec("Timer3",3600,'fhem_set("telegramBot message Fenster SZ länger als eine Std. offen!")');
set_Exec("Timer4",7200,'fhem_set("telegramBot message Fenster SZ länger als zwei Std. offen!")');
set_Exec("Timer5",10800,'fhem_set("telegramBot message Fenster SZ länger als drei Std. offen!")');

Oder gibt es da eine elegantere/bessere Möglichkeit?
Als Vorlage habe ich hier aus dem Forum {set_Exec("Timer",60,'fhem_set("...")')} genommen...

Gruß Dusti o/

Klar, es gibt fast immer eine bessere Möglichkeit. Thema: strukturiertes Programmieren. Wiederholungen in Funktionen auslagern. Siehe Commandref zum Perl-Modus. Hier z. B. fhem_set("telegramBot message Fenster SZ länger als eine Std. offen!")

Noch besser: eine Funktion definieren, der man nur die Zeit, die Anzahl der Wiederholungen und den set-Befehl übergibt und sie triggert sich dann selbst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dusti64

Danke @Damian, doch du holst wieder gleich das ganz große Kino raus. Da bin ich lange noch nicht bzw. komm nie hin...

Ich hab vorher "wait" und "repeatcmd/same" genutzt, aber das ist im Perl-Modus nicht verfügbar...gefunden habe ich auch:
{ if (["_window$:open"]) {set_Exec ("$DEVICE",600,'logwin',"$DEVICE")}} # wenn, Fenster geöffnet wird, dann setze Timer auf Funktion zum Loggen namens "logwin"
{ if (["_window$:closed"]) {del_Exec ("$DEVICE")}}                       # wenn, Fenster geschlossen wird, dann lösche Timer
aber das hab ich noch nicht wirklich verstanden  :-\  auch in Funktionen steck ich noch nicht drin, wie schon mal gesagt: aller Anfang ist schwer  ;) bis jetzt lief alles so, wie ich wollte und jetzt soll es nach Möglichkeit besser werden (y) ich wusel mch da mal rein und weiß, dass ihr Profis hier eine super Unterstützung gewährt - dafür mein Dank!

Gruß Dusti
2x Debian virtualisiert auf QNAP mit FHEM, 2x HMLAN, VCCU, Homatic Heizung+Licht+Rollläden, Alexa, Homebridge, Hue, Instar, Merros, Shelly

Damian

Zitat von: dusti64 am 22 November 2018, 19:01:36
Danke @Damian, doch du holst wieder gleich das ganz große Kino raus. Da bin ich lange noch nicht bzw. komm nie hin...

Ich hab vorher "wait" und "repeatcmd/same" genutzt, aber das ist im Perl-Modus nicht verfügbar...gefunden habe ich auch:
{ if (["_window$:open"]) {set_Exec ("$DEVICE",600,'logwin',"$DEVICE")}} # wenn, Fenster geöffnet wird, dann setze Timer auf Funktion zum Loggen namens "logwin"
{ if (["_window$:closed"]) {del_Exec ("$DEVICE")}}                       # wenn, Fenster geschlossen wird, dann lösche Timer
aber das hab ich noch nicht wirklich verstanden  :-\  auch in Funktionen steck ich noch nicht drin, wie schon mal gesagt: aller Anfang ist schwer  ;) bis jetzt lief alles so, wie ich wollte und jetzt soll es nach Möglichkeit besser werden (y) ich wusel mch da mal rein und weiß, dass ihr Profis hier eine super Unterstützung gewährt - dafür mein Dank!

Gruß Dusti

Naja, die meisten hier sind keine Softwareentwickler oder haben Programmieren nie richtig gelernt, daher ist es sicherlich normal, dass man etwas neues nicht einfach so programmiert. Viele Programmierkonzepte, muss man erst mal verstanden haben und durch Erfahrung verinnerlichen, da ist das Auslagern von Programmiercode in eine Funktion noch eine der einfachen Aufgaben.

Das Beispiel für Fenster-offen-Meldung ist schon ein guter Ausgangspunkt für dein Vorhaben, da muss man sich natürlich reinhängen, denn ein einfaches Übernehmen von Code reicht nicht aus. Immerhin ist es ausführlich kommentiert. Und wenn es einem über den Kopf wächst, dann lässt man es einfach in der Variante, die man verstanden hat und die funktioniert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF