Solltemperatur für Zeitraum/bis Uhrzeit setzen

Begonnen von DeusDeorum, 01 Oktober 2017, 13:56:58

Vorheriges Thema - Nächstes Thema

DeusDeorum

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.

viegener

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)



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Wzut

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.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeusDeorum

#4
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

viegener

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.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeusDeorum

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

viegener

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.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Wzut

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/time
mit : 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.   
 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

viegener

@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...
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeusDeorum

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


Wzut

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
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

viegener

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,
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DeusDeorum

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 :)

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können