Hallo und guten Morgen :)
Ich habe zwei Räume (Bad und Gästezimmer) die nur sporadisch genutzt werden, abhängig davon, on Besuch da ist oder nicht...
Beide Räume sind mit Thermostaten HM-CC-RT-DN und Fenstersensoren HM-SEC-SCo ausgestattet.
Momentan arbeite ich mit verschiedenen HeatingControls (Besuch da oder nicht), die ich per Hand umstelle, wenn Besuch da ist, dazu kommt aber noch jeweils eine Fenster auf-Überwachung (DOIF) und eine Anwesenheitskontrolle sowie eine Abfrage, ob die Heizung (Dummy an/aus) generell an ist.
Es ist derzeit sehr unübersichtlich und ich möchte es ein wenig optimieren...dahin geht auch meine Frage. Was ist die beste Vorgehensweise aus eurer Sicht?
Mein Ansatz ist folgender:
Ich frage ab, ob die Heizung überhaupt an ist und ob ich da bin. Danach die Abfrage, ob Besuch anwesend ist.
Abhängig davon soll überwacht werden, ob vergessen wurde, wenn die Heizung an ist, das Fenster zu schließen...dazu soll über Telegram eine Meldung gepusht werden nach einer Stunde (wird zurzeit über ein DOIF realisiert)
Würdet ihr eher mit verschiedenen HeatingControl arbeiten oder mit setTempList aus einer myUtils heraus? Dann wäre ja auch noch die Möglichkeit, über HMInfo und TempLists zu arbeiten...
Letztendlich möchte ich nur drei Dummies schalten – Heizung an/aus, Anwesend ja/nein und Besuch ja/nein. Wenn Heizung nein – ist der Rest egal. Wenn Heizung an und Anwesend ja, die Frage, ist Besuch da – Anwesend nein, dann auch kein Besuch...der Rest soll mit DOIF realisiert werden.
Wenn ein Fenster auf ist bei Heizung an, soll der Thermostat generell auf 5° abgesenkt werden und wie gesagt, nach spätestens einer Stunde eine Meldung geschickt werden, wenn das Fenster wieder zu ist, soll in den normalen Regelzustand zurück gekehrt werden.
Wenn ich im Winter (Heizung an) nicht anwesend bin, soll eine abgesenkte Temperatur gelten, damit die Räume nicht so sehr auskühlen.
Vielen Dank im Voraus für eure Meinungen hierzu und eure Unterstützung!
Gruß Dusti
Das Thermostat senkt die Temperatur automatisch wenn Fenster auf geht und Du den Fensterkontakt und das Thermostat gepeert hast.
Es gibt hier im Forum eine Anleitung mit Script für eine Fenster offen nach x Minuten Meldung. Ich würde die Anwesenheit auf Residents mit Roommate und Guest aufbauen. Ansonsten musst du mit templisten doch gar nichts machen. Ist das Bad Teil des Gäste Bereiches. Wenn ja stellen einmalig Templisten ein und wenn kein Gast da ist stellst alles auf manuell und 17 Grad oder so.
Danke!
Vergessen habe ich ein stündliches Anstoßen der HC-Temperaturen, falls die Frau mal die Thermostate verdreht:
+*01:00:00 {if(ReadingsVal("TH_GZ_WindowRec", "trigLast", "") eq "Fenster_GZ:closed") {Heating_Control_SetTemp("GZ_Heating_Control")}}
Hebelt das manchmal das peering mit den Fensterkontakten und die Fensterauf-Temp. aus?! Jedenfalls stehen sie manchmal auf der Solltemp, obwohl das Fenster noch auf ist...
Die Meldung Fenster auf klappt und kommt, die Einrichtung von Residents usw. ist zu kompliziert, erstes weil nicht jeder ein eingerichtetes Device zur Erfassung mitbringt und nicht weiß, was er damit wo machen muss (meine Mutter ist 75). Es geht um ein Gästezimmer, welches durch die verschiedensten Besucher bewohnt wird, deswegen der Dummy Besuch und das Bad und das Gästezimmer sind verschiedene Lokalitäten.
Zitat von: dusti64 am 20 Oktober 2018, 13:01:09
Danke!
Vergessen habe ich ein stündliches Anstoßen der HC-Temperaturen, falls die Frau mal die Thermostate verdreht:
+*01:00:00 {if(ReadingsVal("TH_GZ_WindowRec", "trigLast", "") eq "Fenster_GZ:closed") {Heating_Control_SetTemp("GZ_Heating_Control")}}
Hebelt das manchmal das peering mit den Fensterkontakten und die Fensterauf-Temp. aus?! Jedenfalls stehen sie manchmal auf der Solltemp, obwohl das Fenster noch auf ist...
Die Meldung Fenster auf klappt und kommt, die Einrichtung von Residents usw. ist zu kompliziert, erstes weil nicht jeder ein eingerichtetes Device zur Erfassung mitbringt und nicht weiß, was er damit wo machen muss (meine Mutter ist 75). Es geht um ein Gästezimmer, welches durch die verschiedensten Besucher bewohnt wird, deswegen der Dummy Besuch und das Bad und das Gästezimmer sind verschiedene Lokalitäten.
Lokale Änderungen am Thermostat überschreiben Fenster offen Temperaturen.
Du solltest das Thermostat besser sperren.
Ansonsten wäre in der Tat Arbeit mit Dummys angesagt. Würde dann aber persönlich auf Notify und myUtils zurück greifen.
:D es ist nicht soooo einfach...mit dem Sperren hast du natürlich Recht, doch dann kann ein Gast ja auch nicht mehr selbst Einfluss nehmen bis zu einem gewissen Punkt, man will ja gastfreundlich sein, doch kann wohl nicht haben ::)
Ok, hab vielen Dank für den gedanklichen Ansatz, ich werde wohl doch eher in Richtung DOIF schauen, um es übersichtlicher und zusammenfassender als bisher zu gestalten und darüber die Dummies abfangen. Wird nur ein wenig tricky bei den vielen Abhängigkeiten :-\
Vielen Dank Dusti o/
Zitat von: dusti64 am 20 Oktober 2018, 13:53:21
:D es ist nicht soooo einfach...mit dem Sperren hast du natürlich Recht, doch dann kann ein Gast ja auch nicht mehr selbst Einfluss nehmen bis zu einem gewissen Punkt, man will ja gastfreundlich sein, doch kann wohl nicht haben ::)
Ok, hab vielen Dank für den gedanklichen Ansatz, ich werde wohl doch eher in Richtung DOIF schauen, um es übersichtlicher und zusammenfassender als bisher zu gestalten und darüber die Dummies abfangen. Wird nur ein wenig tricky bei den vielen Abhängigkeiten :-\
Vielen Dank Dusti o/
Wenn du mehrere Dinge zusammenfassen willst, dann würde ich dir DOIF-Perl empfehlen. Dort kannst du auch mehrere Blöcke definieren, die zwar logisch zusammenhängen, sich aber nicht beeinflussen sollen (im DOIF FHEM-Modus wird es schwierig sein, alles in eine if-elseif-Abfrage zu bringen, da muss man ein größeres Projekt auf mehrere DOIFs verteilen). Statt Dummys kannst du Readings im DOIF-Device ablegen, die kannst du elegant mit uiTable anzeigen und bedienen.
Das es ja um Best-Practice geht, hier mein Ansatz:
Über Resident/Roommate sind nur ich und meine Frau an FHEM "gekoppelt" (mit Handy/WLAN und Gtag/Bluetooth-LE über PRESENCE). Kinder (4 und 1,5 Jahre) macht (noch) keinen Sinn zu berücksichtigen.
Besucher, dazu zählen Übernachtungsgäste, Haushaltshilfe, Nanny, etc. werden über einen Besucher-Button auf der FTUI-Oberfläche an einem Tablet (das im Flur hängt) "angemeldet" - sollte das vergessen worden sein, kann ich das auch vom HAndy über VPN nachholen.
Noch nicht implementiert aber geplant: Anbindung eines Besucher-Kalenders.
Alles weitere (Alarmierung aus, ggfs. Thermostate hoch/runterfahren, "vergessene Lampen" ausschalten) erfolgt bei mir nur in Abhängigkeit davon, ob überhaupt jemand da ist. Dazu verwende ich HOMEMODE, über welches Aktionen bei An- und Abwesenheit gesteuert werden.
Alles andere ist mir zu kompliziert. Zur Not wird dadurch mal ein Zimmer ein paar Stunden aufgeheizt obwohl es gar nicht genutzt wird - damit kann ich leben.
Temperaturabsenkung bei "Fenster offen" Erkennung erfolgt bei nur über das Peering Fensterkontakt-Thermostat.
Was ich auch noch plane: minimale und maximale Temperatureinstellung "durchsetzen", d.h. wenn die Frau mal wieder den Thermostat auf 30°C stellt "damit es schneller warm wird", soll das per DOIF (oder alternativ MSwitch) auf z.B. 25°C zurückgedreht werden.
Habt vielen Dank für eurer Meinungen!
@dkreutz
ich möchte definitiv keine Anwesenheitserkennung nutzen, ich spiele zwar mit lan Pings auf die Handy MACs und es funktioniert auch soweit, aber zuverlässig nenne ich anderes...dies soll auch nicht das Thema werden. Ein FTUI nutze ich gar nicht bzw. noch nicht (hab auch mal mit rumgespielt und bin wieder von abgekommen). Auch die Geofancy App ist keine Alternative, weil ich in der Regel GPS aus habe auf den iPhones...
Ja du hast Recht, es ist/wird kompliziert - aus dem Grund hatte ich meine Frage gestellt und es gibt gefühlt tausende Herangehensweisen in FHEM (y)
Es soll nach der Programmierung auch durch die Frau bedienbar sein und die steckt in dem ganzen Kram so gar nicht drin...also App auf und einen Dummy einschalten werde ich ihr verklickern :D
@Damian
DOIFs als solche bekomme ich gut zum Laufen, vielleicht kannst du mich in die richtige Richtung schubsen mit der Kombination mit Perl...dazu muss ich wohl noch Hausaufgaben machen :-\ mal bitte ein grobes Gerüst erläutern?
Gruß Dusti
Hi!
Das Thema Lüften hab ich bei mir mit DOIF gelöst und den Fenstersensor mit dem Thermostat absichtlich nicht gepeert, weil man da noch weitere Logik einbauen kann :)
Wenn das Fenster geöffnet wird, dann wird die Soll-Temperatur auf Minimum reduziert und beim Schließen wieder auf den vorherigen Wert zurückgestellt:
define LueftungsLogik DOIF ([Fenster_Kinderzimmer_Nord] eq "open")\
(\
setreading $SELF lueften 1,\
setreading Heizung_Kinderzimmer_Nord last_state [Heizung_Kinderzimmer_Nord],\
set Heizung_Kinderzimmer_Nord control 4.5\
)\
DOELSEIF ([Fenster_Kinderzimmer_Nord] eq "closed")\
(\
setreading $SELF lueften 0,\
set Heizung_Kinderzimmer_Nord control [Heizung_Kinderzimmer_Nord:last_state],\
)
attr LueftungsLogik cmdState Absenkung_wg._Lüften|Heizen
attr LueftungsLogik room Heizung
attr LueftungsLogik group Steuerung
Wenn gerade gelüftet wird und im Thermostat der nächste planmäßige Schaltpunkt schaltet, dann wieder die Minimal-Temperatur erzwingen:
define LueftungsLogik2 DOIF \
(\
([LueftungsLogik:lueften] == 1) &&\
([Heizung_Kinderzimmer_Nord:control] > 4.5)\
)\
(\
set Heizung_Kinderzimmer_Nord control 4.5\
)\
DOELSE
attr LueftungsLogik2 cmdState AbsenkungErzwingen|Kein_Eingriff
attr LueftungsLogik2 room Heizung
attr LueftungsLogik2 group Steuerung
LG,
Stephan.
@loescher danke dafür...
Doch meine Frage sollte ergeben, welche Variante mit dem TempListen die beste wäre. Wenn ich es richtig verstehe, werden bei einem Aufruf aus den 99_Utils heraus alle Werte neu in den Thermostaten geschrieben, wie verhält es sich hier mit der Last?
Wenn man die Solltemp. über HeatungControl aufruft, wird doch nur der derzeitige, aktuelle Wert geändert, oder?
Ja und DOIF-perl ist echt komplettes Neuland für mich ::)
Zitat von: dusti64 am 24 Oktober 2018, 11:42:17
@loescher danke dafür...
Doch meine Frage sollte ergeben, welche Variante mit dem TempListen die beste wäre. Wenn ich es richtig verstehe, werden bei einem Aufruf aus den 99_Utils heraus alle Werte neu in den Thermostaten geschrieben, wie verhält es sich hier mit der Last?
Wenn man die Solltemp. über HeatungControl aufruft, wird doch nur der derzeitige, aktuelle Wert geändert, oder?
Ja und DOIF-perl ist echt komplettes Neuland für mich ::)
Ich habe meine Wandthermostate mit Aktoren gepeert, dann reicht das Setzen der Vorgabetemperatur siehe https://forum.fhem.de/index.php/topic,84969.msg848315.html#msg848315
Danke Damian (y) und dann braucht es gar keine Listen mehr oder? Und die Thermostaten sind dann gesperrt vor Ort, oder wie hinderst du den Rest der Gang am Verstellen?
Zitat von: dusti64 am 24 Oktober 2018, 15:34:13
Danke Damian (y) und dann braucht es gar keine Listen mehr oder? Und die Thermostaten sind dann gesperrt vor Ort, oder wie hinderst du den Rest der Gang am Verstellen?
na ja, bei mir ist es Fussbodenheizung, da sind die Aktoren eh nicht zugänglich, sonst dürfte es unabhängig davon sein, ob das Programm intern abgelegt wird oder ob die Vorgabetemperatur von außen zu bestimmten Zeiten vorgegeben wird, das Übersteuern am Thermostat kann gewünscht sein oder vom Anwender bewusst gesperrt werden.
Bei mir sind auch noch 1-wire Temperatursensoren im Einsatz, in diesem Fall übernimmt das THRESHOLD-Modul die Steuerung des Aktors, auch hier nach der Vorgabe der Soll-Temperatur.
FBH hab ich nur in der unteren Etage...da will ich eigentlich gar nicht bei wegen der Trägheit. Doch dazu gibt es ja auch Meinungen wie Sand am Meer.
Zitat von: dusti64 am 24 Oktober 2018, 18:04:52
FBH hab ich nur in der unteren Etage...da will ich eigentlich gar nicht bei wegen der Trägheit. Doch dazu gibt es ja auch Meinungen wie Sand am Meer.
Wenn sie gut abgeglichen ist, dann laufen lassen.
Bei mir gibt es ein "Haus-Dummy" (home-device), welches Stati wie
- Gäste anwesend (Gäste, die nicht über das RESIDENTS laufen)
- Party-Modus
-...
abbildet. Bei Änderungen informiert dieses die "Raum-Dummies" (room-devices).
Jeder Raum hat ein "Raum-Dummy", an dem Temperaturlisten und Feuchtigkeitsprofile für
- Leeres Haus
- Party
- Gäste
- verschiedene Tageszeiten
- offene Fenster bzw. Außentüren
- offene Innentüren
-...
hängen.
Je nach Zuständen der Arbeitspläne, Fenster, Türen, Residents, "Haus-Dummy", Außentemperaturen, Heizkreis, Solarkreis,... werden die Thermostate mit Soll-Temperaturen, High-/Low-Temperaturen und schlimmstenfalls mit neuen Tagesprofilen versehen.
Eine grobe Voreinstellung wird nachts entsprechend der Arbeitspläne und Terminkalender in mehreren Intervallen an die room-Devices verteilt. Abweichungen werden im Tagesverlauf über Presence und Geofencing ggf. nachgesteuert.
Bei Abweichungen wird über mehrere WebViewControls oder per Telegram mit den Residents kommuniziert.
@alanblack auch ein interessanter Ansatz! Danke dafür (y)
Ich habe eine Frage zum Aufruf der aktuellen Temperatur eines Heating_Control mit "fhem_set"
Im DOIF mache ich das mit
{Heating_Control_SetTemp("HeizungssteuerungSchlafzimmerAn");; return 0}
Wie bekomme ich diesen Aufruf mit DOIF-Perl hin?
fhem_set entspricht dem FHEM-set-Befehl.
Heating_Control_SetTemp ist doch kein FHEM-set-Befehl, sondern offenbar eine Perlfunktion.
Ja genau das ist mein Problem...in der Referenz zu "Heating Control" steht, dass man so das Setzen der derzeitige Temperatur aufruft...das geht auch in einem DOIF und ich weiß nicht, wie ich es nach DOIF-Perl verbogen bekomme.
Ich möchte nach Aktivierung des Dummys dem Thermostaten die aktuelle Temperatur aus dem HC als Soll-Wert übergeben...die wird ja sonst erst beim nächsten Schaltpunkt aufgerufen.
Hallo,
wie kann ich aus diesem Beispiel:
define di_gong DOIF ([+[2]:05]) (set pump on-for-timer 300)
die Befehle "alle 30 min + 5 min" ausführen?
Gruß Dusti
Zitat von: dusti64 am 01 November 2018, 18:27:43
Hallo,
wie kann ich aus diesem Beispiel:
define di_gong DOIF ([+[2]:05]) (set pump on-for-timer 300)
die Befehle "alle 30 min + 5 min" ausführen?
Gruß Dusti
define di_pump DOIF ([+1800]) (set pump on-for-timer 300)
Danke Damian...
aber dann bin ich doch wieder bei [+:30]
und wenn ich dann mehrere Befehle von unterschiedlichen devices mit [+:30]
habe, kommt wieder alles auf die volle oder halbe Std., oder?
Ich wollte erreichen, dass es ein wenig entzerrt wird, deswegen die +5, +10 usw... oder bin ich verkehrt? Ich möchte mehrere Thermostaten alle 30 min prüfen und die Solltemp. aus einem HC setzen...aber eben versetzt.
Gruß Dusti
Du kannst etwas Zufall einbauen: ;)
DOIF ([([+:30]+rand(300))]) (...
Stimmt... da war ja was ;D Danke
Zitat von: Damian am 20 Oktober 2018, 14:44:42
Statt Dummys kannst du Readings im DOIF-Device ablegen, die kannst du elegant mit uiTable anzeigen und bedienen.
Hi Damian,
also an DOIF-Perl bin ich gescheitert :( ich hab jetzt ein DOIF gebastelt, welches funktioniert und derzeit über die Dummies gesteuert wird, auch das regelmäßige Anstoßen der Sollwerte geht. Die jeweiligen Templisten habe ich über entspr. Bedingungen de- und aktiviert, funktioniert auch. Die Lüftung in jedem Raum über ein separates DOIF in Verbindung mit einer Pushmeldung.
Jetzt nochmal zu den Readings im DOIF. Werden die Dummies dafür trotzdem benötigt?
Oder meinst du beispielweise so etwas?
(setreading $SELF Heizung AUS)
Und diese Readings dann in uiTable darstellen?
Gruß Dusti
(setreading $SELF Heizung AUS)
Warum nicht. Ist wahrscheinlich Faktor 100 langsamer als set_Reading, aber was soll´s ;)
...böser Mann ;D Danke...
Irgendwann knie ich mich da mal rein...ganz bestimmt!
Ich wollte es genauer wissen und habe es mal nachgemessen. set_Reading ist tatsächlich ca. 100 mal schneller. Es liegt allerdings weniger an der Perlfunktion set_Reading. Es hängt viel mehr davon ab, ob man Events beim Setzen von Readings erzeugt oder nicht.
...und über welche realen Zeiträume reden wir hier?
Ja ich muss da generell mal bei, aber zur Zeit ist schlecht mit dieser ::)
Jedenfalls entfallen die Dummies wohl bei Verwendung von readingList und setList, das hab ich schon mal gefunden ;)
Und ich muss dir mal meinen großen Respekt aussprechen für das Modul, ich bin immer wieder faziniert, wie breit und vielfältig es einsetzbar ist und ich weiß bestimmt nicht mal ein Drittel davon! Bin ein Lernender :)
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.
Gut ;D dann muss ich ja nicht so dolle hetzen...
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)
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') )
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.
Ah ok, verstehe. Mit Perlmodus war DOIF Perlmodus gemeint. Sorry
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.
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/
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.
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
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.