Hallo zusammen,
ich würde gerne die Möglichkeit haben, die Solltemperatur für eine gewissen Zeitraum (z.B. 1h) bzw. bis zu einer vorzugebenen Uhrzeit über das fhem-UI zu ändern. Nach Ablauf soll die Solltemperatur wieder vom Wochenprogramm automatisch bezogen werden.
Am liebsten wäre mir ein oder mehrere Felder neben der Solltemperatur, um einen Uhrzeit oder eine Zeitdauer in min/std anzugeben (siehe Screenshot).
Der Sinn ist, dass ich einen Raum nur sporadisch nutze und ein Steuern über Wochenprogramm deshalb nicht sinnvoll ist. Ich möchte allerdings vermeiden, dass die Heizung weiterläuft, weil ich beim Herausgehen vergessen habe, sie wieder auf Automatic zu stellen. So möchte ich die Möglichkeit bereits beim Einstellen des Thermostats haben, den Zeitpunkt festzulegen, bis wann geheizt werden soll.
Leider fehlen mir zurzeit noch die Anknüpfungspunkte, wie man so etwas am besten umsetzt.
Wie erstelle ich ein neues Inputfeld im fhem-ui, um die Uhrzeit/Zeitraum entgegen zu nehmen und wie reiche ich dies dann an ein notify? weiter, um die Solltemperatur zu setzen? Brauche ich dann zwei Notify, einmal zum Setzen der Temperatur und dann zum Reaktivieren des Wochenprogramms?
Gibt es vielleicht für das Problem bereits eine andere BestPractice-Lösung, die ich übernehmen könnte?
Vielen Dank.
Also wenn ich es richtig verstehe möchtest Du qausi ein Bedienfeld haben bei dem Du sagen kannst - setze Solltemperatur für einen Thermostat für x Stunden auf Temperatur y.
Also willst Du
- bei Aktivierung den Thermostat auf die manuelle solltemperatur y stellen
- bei Aktivierung ein at Befehl erzeugen, der nach x Stunden den Thermostat auf automatic zurückstellt
Das Bedienfeld könnte ein Dummy sein, der ein Setting (setList) für die Stunden und eines für die Temperatur hat und einen Befehl um das zu aktivieren. Dazu gibt es einen Notify, der den Wert für x und y nimmt, wenn der Dummy aktiviert wurde und die zwei Befehle von oben ausführt (also temperatur einstellen und at anlegen)
Zitat von: viegener am 01 Oktober 2017, 16:29:08
- bei Aktivierung ein at Befehl erzeugen, der nach x Stunden den Thermostat auf automatic zurückstellt
Denke das ist nicht nötig MAX! Geräte haben dafür das Attribut keepAuto
Zitat von: commandrefkeepAuto
Default: 0. If set to 1, it will stay in the auto mode when you set a desiredTemperature while the auto (=weekly program) mode is active.
Zitat von: Wzut am 01 Oktober 2017, 17:28:07
Denke das ist nicht nötig MAX! Geräte haben dafür das Attribut keepAuto
Wenn es reicht, beim nächsten Umschalten des Autoprogramms im Wochenprogramm wieder zu wechseln ja, dann wäre aber eine Einstellung für eine bestimmte Anzahl von Stunden nicht nötig.
Wenn es für eine definierte Zeit sein soll, dann muss wohl ein at her
Zitat von: viegener am 01 Oktober 2017, 16:29:08
Also wenn ich es richtig verstehe möchtest Du qausi ein Bedienfeld haben bei dem Du sagen kannst - setze Solltemperatur für einen Thermostat für x Stunden auf Temperatur y.
Also willst Du
- bei Aktivierung den Thermostat auf die manuelle solltemperatur y stellen
- bei Aktivierung ein at Befehl erzeugen, der nach x Stunden den Thermostat auf automatic zurückstellt
Das Bedienfeld könnte ein Dummy sein, der ein Setting (setList) für die Stunden und eines für die Temperatur hat und einen Befehl um das zu aktivieren. Dazu gibt es einen Notify, der den Wert für x und y nimmt, wenn der Dummy aktiviert wurde und die zwei Befehle von oben ausführt (also temperatur einstellen und at anlegen)
vielen Dank.
Ich habe jetzt ein Dummy erstellt mit zwei Inputfeldern. Leider scheinen diese nicht unabhängig zu sein, teilweise wird das Label auch mehrfach dupliziert. Was muss ich ändern, damit ich jeweils ein Inputfeld für T und Uhr erhalte?
Kann ich dann im Notify auf genau die Variablen, hier Uhr und T zugreifen?
Vielen Dank.
Ich denke ich brauche den Schalter auf auto trotzdem, es soll ja nicht erst beim nächsten Wochenpunkt zurückgeschaltet werden, sondern zum vorgegebenen Zeitpunkt.
edit: Bild vergessen
Du solltest auch das Attribut readingList auf die beiden Werte setzen also (T Uhr), dann hast Du jedesmal wenn Du T oder Uhr setzt den Wert im Reading. Dann hast Du getrennte Readings, die Du ohne Umstände per ReadingsVal auslesen kannst und im notify verwenden.
Dann sollte in setList noch einen weitere Einstellung angeben also zum Beispiel "setzen" um die einstellung auszulösen nach Einstellung Temp und Uhr.
Zitat von: viegener am 02 Oktober 2017, 09:35:29
Du solltest auch das Attribut readingList auf die beiden Werte setzen also (T Uhr), dann hast Du jedesmal wenn Du T oder Uhr setzt den Wert im Reading. Dann hast Du getrennte Readings, die Du ohne Umstände per ReadingsVal auslesen kannst und im notify verwenden.
Dann sollte in setList noch einen weitere Einstellung angeben also zum Beispiel "setzen" um die einstellung auszulösen nach Einstellung Temp und Uhr.
vielen Dank. Ich bin wieder einen Schritt weiter.
Auch das Triggern des Hochsetzens der Temperatur mit Triggern des Notify DennisBueroBoost klappt. Nur wie trigger ich das zweite Notify DennisBueroAuto zu einer Uhrzeit? Und wie sieht dann die Variable zur Uhrzeit aus, wenn ich die hartcodierte rausnehme? [d_DennisBuero:Uhr] ?
Bisherige Definition: d_DennisBuero* trigger DennisBueroBoost; trigger DennisBueroAuto at 21:24
Mit variabler Uhrzeit?: d_DennisBuero* trigger DennisBueroBoost; trigger DennisBueroAuto at [d_DennisBuero:Uhr]
Vielen Dank für weitere Tipps
Mach doch einmal ein list von dem dummy, den Du bisher erstellt hast, sonst ist das schwer weiter zu helfen.
Ansonsten nochmal zurück zum Anfang: Das Konzept ist im Dummy erst die Einstellungen vorzunehmen. Dann noch einen set-Befehl am Dummy vorzusehen, der die Aktivierung triggert. Das kann am einfachsten wohl über ein notify, das auf den state reagiert gemacht werden.
Im notify steht dann so etwas wie
define notify_boost notify DennisBueroBoost:.*active.* { fhem("set DennisBuero [DennisBueroBoost:temp]");; fhem("set DennisBueroBoost done");; fhem("define dbbat at +".ReadingsVal('DennisBueroBoost','Uhr','1').":00:00 set DennisBuero automatic");; }
Das habe ich jetzt aber nur so runtergeschrieben und nicht geprüft.
Also mich stört immernoch das temporäre at um so wieder in den Auto Modus zu kommen.
In der commandref seht doch
ZitatdesiredTemperature [manual] <value> [until <date>]
For devices of type HeatingThermostat only. <value> maybe one of
degree celcius between 4.5 and 30.5 in 0.5 degree steps
"on" or "off" set the thermostat to full or no heating, respectively
"eco" or "comfort" using the eco/comfort temperature set on the device (just as the right-most physical button on the device itself does)
The optional "until" clause, with <data> in format "dd.mm.yyyy HH:MM" (minutes may only be "30" or "00"!), sets the temperature until that date/time. Make sure that the cube/device has a correct system time. If the keepAuto attribute is 1 and the device is currently in auto mode, 'desiredTemperature <value>' behaves as 'desiredTemperature auto <value>'. If the 'manual' keyword is used, the keepAuto attribute is ignored and the device goes into manual mode.
also ich mit meinem schlechten Englisch übersetze den Abschnitt
The optional "until" clause, with <data> in format "dd.mm.yyyy HH:MM" (minutes may only be "30" or "00"!), sets the temperature until that date/timemit :
verwendet man das Schlüsselwort "until" und einem passenden Datum/Zeit String benötigt man kein späteres Kommando um wieder in den normalen Auto Modus zu kommen.
Aber anyway , machen und zusammenbasteln kann mit FHEM viel ..... aber schön und elegant ist etwas anderes, vor allem wenn ich mir die simple Vorstellung desv TE im ersten Post anschaue.
@DeusDeorum, wenn du noch bis zum WE warten kannst:
Ich habe mir da was überlegt bzw. zusammenkopiert das deinem ursprünglichen Wunsch wesentlich näher kommt und keinen zusätzlichen Ballast in Form irgendwelcher Dummys, ats oder notifys erfordert. Da das jetzt hier OT wird habe die Tage ein Auge auf das MAX! Unterforum.
@Wzut: Ja das wäre wirklich ein Weg über die until Ergänzung, allerdings muss man dann noch Code hinzufügen um die Endezeit aus aktueller Uhrzeit und Offset im Format für das Kommando zu berechnen. Das fand ich jetzt wenig Anfängergeeignet, aber ich habe ja sowieso ein Faible dafür Dinge mit existierenden Meachnismen - Dummys etc zu lösen...
vielen Dank für die Anregungen. Ich steige so langsam durch und mache kleine Fortschritte.
Ich merke, dass ich hier am Beginn einer sehr steilen Lernkurve bin. Perl-Code lesen verhält sich wohl zu Python wie Latein zu Englisch.
Ich habe es mittlerweile geschafft die Readings für den Dummy zu definieren und auch das Setzen des States verstanden.
Meine Attribute am Dummy:
readingList T, Uhr
room Heizung
setList T:textField Uhr:textField state
webCmd T:Uhr:<button>Go</button>
Dazu habe ich folgendes Notify:
d_DennisBuero:.*Go.* { fhem("set DennisBuero desiredTemperature [d_DennisBuero:T]");; fhem("set d_DennisBuero done");; fhem("define dbbat at +[d_DennisBuero:Uhr]:00 set DennisBuero desiredTemperature auto");; }
Bisher verstanden habe ich:
Sobald der Dummy einen State, der "Go" beinhaltet, erreicht, wird das Notify ausgeführt. Es setzt den fhem-Befehl für die Temperatur und den Status done. Danach definiert es dbbat, welches dann zum Zeitpunkt schaltet.
Allerdings erhalte ich hier noch eine Fehlermeldung "define dbbat at +[d_DennisBuero:Uhr]:00 set DennisBuero desiredTemperature auto: Wrong timespec [d_DennisBuero:Uhr]:00: either HH:MM:SS or {perlcode}".
Er scheint hier irgendwie die Variable nicht zu erkennen, hat jemand noch einen Tipp?
Vielen Dank.
@Wzut für eine elegante Lösung bin ich immer zu haben, bin also definitiv interessiert, wenn ich gleichzeitig auch lernen kann, was passiert.
Dazu habe ich auch das hier gefunden: https://wiki.fhem.de/wiki/FTUI_Beispiel_Datetimepicker_f%C3%BCr_Timer
Allerdings steige ich hier noch nicht wirklich durch, wie ich so etwas implementieren kann
Dein Wiki Beispiel ist aber für Tablet UI , für fhemweb gibt es auch ein date/time picker widget ( liegt unter contrib )
der Code für das untere Beispiel im Screenshot :
define desTemp.timepicker dummy
attr desTemp.timepicker readingList destemp,time
attr desTemp.timepicker room 0_test
attr desTemp.timepicker setList dev:uzsuSelect,300,600,1800,3600 destemp:knob,min:5,max:30,step:.5,linecap:round,angleOffset:-125,angleArc:250 time:datetime,inline:true,step:30
attr desTemp.timepicker stateFormat destemp °C bis time
attr desTemp.timepicker webCmd destemp:time
wird aber wenn das Datum dabei ist recht groß. Im Screenshot in der Mitte ein Beispiel wie ich es mir vorstelle mit zwei einfachen DropDown Listen
Ich hatte es schon vermutet, der define untersstützt keine []-Logik zur Definition, deshalb hatte ich es in meinem Code als perl-Ausdruck geschrieben, der den define Befehl zusammensetzt,
Zitat von: viegener am 06 Oktober 2017, 22:07:13
Ich hatte es schon vermutet, der define untersstützt keine []-Logik zur Definition, deshalb hatte ich es in meinem Code als perl-Ausdruck geschrieben, der den define Befehl zusammensetzt,
Danke. ich habe es jetzt auf folgendes korrigiert:
d_DennisBuero:.*Go.* { fhem("set DennisBuero desiredTemperature [d_DennisBuero:T]");; fhem("set d_DennisBuero done");; fhem("define dbbat at +".ReadingsVal('d_DennisBuero','Uhr','1').":00 set DennisBuero automatic");; }
Jetzt wird dbbat mit einer Zeit erzeugt, aber die scheint irgendwie nicht richtig zu sein. Jedenfalls wird es nicht ausgeführt und unter Next steht eine falsche Uhrzeit. Hat jemand noch einen Tipp für mich? Danke
@Wzut danke, das werde ich mal ausprobieren, wenn das andere läuft :)
Mach doch mal ein list von d_DennisBuero bevor Du die Ausführung anstösst.
Es sieht so aus, also ob Du in Deinem Dummy nicht Stunden hast, sondern ein vollständiges Datum mit Uhrzeit -> das funktioniert so nicht.
Aber irgendwie ist das alles Raterei, es wäre besser keine Screenshots sondern lists der devices zu machen. Ich weiss ja nicht, was Du in Deinem Dummy einträgst ich hatte vorgeschlagen da einfach die Anzahl der Stunden einzutragen
Zitat von: viegener am 06 Oktober 2017, 23:23:19
Mach doch mal ein list von d_DennisBuero bevor Du die Ausführung anstösst.
Es sieht so aus, also ob Du in Deinem Dummy nicht Stunden hast, sondern ein vollständiges Datum mit Uhrzeit -> das funktioniert so nicht.
Aber irgendwie ist das alles Raterei, es wäre besser keine Screenshots sondern lists der devices zu machen. Ich weiss ja nicht, was Du in Deinem Dummy einträgst ich hatte vorgeschlagen da einfach die Anzahl der Stunden einzutragen
Ah, danke, ich habe mich schon gewundert, wie man solche Einträge am besten im Forum postet. Ich hoffe, es ist so richtig.
Internals:
CFGFN
NAME d_DennisBuero
NR 818
STATE done
TYPE dummy
Readings:
2017-10-06 22:26:37 T 24
2017-10-06 22:26:37 Uhr 22:28
2017-10-06 22:26:37 state done
Attributes:
readingList T, Uhr
room Heizung
setList T:textField Uhr:textField state
webCmd T:Uhr:<button>Go</button>
Internals:
CFGFN
DEF d_DennisBuero:.*Go.* { fhem("set DennisBuero desiredTemperature [d_DennisBuero:T]");; fhem("set d_DennisBuero done");; fhem("define dbbat at +".ReadingsVal('d_DennisBuero','Uhr','1').":00 set DennisBuero automatic");; }
NAME DennisBueroStart
NOTIFYDEV d_DennisBuero
NR 1033
NTFY_ORDER 50-DennisBueroStart
REGEXP d_DennisBuero:.*Go.*
STATE 2017-10-06 22:26:37
TYPE notify
Readings:
2017-10-06 22:17:35 state active
Attributes:
room Heizung
Jetzt ist klar was passiert, Du legst ein relatives at an (+ vor der Zeitangabe) und gibst aber im dummy eine absolute Zeitangabe an (22:28).
Daraus wird dann von jetzt an in 22 Stunden und 28 Minuten wieder auf Automatik.
Mein Vorschlag war deshalb eine Anzahl Stunden auszuwählen und diese als relative Angabe zu füllen.
Ich kann aber nur den Ratschlag geben, dass Du dich mit mehr von den Grundlagen vertraut machst, denn momentan fühlt es sich etwas an, als ob ich eine Lösung entwickle und dann anfange die Fehler, die Du durch Veränderungen vorgenommen hast zu finden. Das ist irgendwie suboptimal
Zitat von: DeusDeorum am 06 Oktober 2017, 21:18:09
@Wzut für eine elegante Lösung bin ich immer zu haben, bin also definitiv interessiert, wenn ich gleichzeitig auch lernen kann, was passiert.
schau dir doch mal https://forum.fhem.de/index.php/topic,77678.0.html an
Zitat von: viegener am 07 Oktober 2017, 10:44:12
Jetzt ist klar was passiert, Du legst ein relatives at an (+ vor der Zeitangabe) und gibst aber im dummy eine absolute Zeitangabe an (22:28).
Daraus wird dann von jetzt an in 22 Stunden und 28 Minuten wieder auf Automatik.
Mein Vorschlag war deshalb eine Anzahl Stunden auszuwählen und diese als relative Angabe zu füllen.
Ich kann aber nur den Ratschlag geben, dass Du dich mit mehr von den Grundlagen vertraut machst, denn momentan fühlt es sich etwas an, als ob ich eine Lösung entwickle und dann anfange die Fehler, die Du durch Veränderungen vorgenommen hast zu finden. Das ist irgendwie suboptimal
vielen Dank für deine Unterstützung. Ich verstehe immer mehr und das ist auch mein Ziel - die Haussteuerung selbst nach meinen Bedürfnissen anpassen zu können.
Was bringt es bei neuen Sachen immer hier im Forum nachfragen zu müssen, dass es mir jemand nachprogrammiert? Insofern sehe ich deine Bemühungen alles andere als suboptimal an, danke dafür!
Insofern auch danke Wzut für das auf meine Bedürfnisse zugeschnittene Addon. Ich habe es installiert und es funktioniert einwandfrei :) Damit sehe ich mein ursprüngliches Problem als vollumfänglich gelöst an, danke :)