Hallo,
ich brauche mal wieder Eure Hilfe.
Ich habe mir einen Parameter für meine Heizungssteuerung gebaut:
define Steuerung dummy
Diesem Parameter wird am Tag "TempTag" und Nachts "TempNacht" zugewiesen.
DOIF [06:00]
SET Steuerung "TempTag
DOELSEIF [22:00]
SET Steuerung "TempNacht"
Wie warm es am Tag bzw. in der Nacht sein soll habe ich dem Parameter "Steuerung" per
setreading Steuerung TempTag 21.0
setreading Steuerung TempNacht 18.0
mitgeteilt.
Ist es morgens beim wechsel von TempNacht auf TempTag bereits schon wärmer als 21.0C, so werden die Heizungen ausgeschaltet.
Wird es nun im laufe des Tages oder in der folgenden Nacht kälter als die jeweilige Temperatur (also bis 22:00Uhr < 21C bzw. ab 22:00Uhr bis 06:00Uhr < 18C), soll die Heizung wieder angestellt werden.
So und nun zu meiner Frage....
Ist es möglich die Abfrage wie folgt zu bauen?
Zitat
wenn die Temperatur < Steurung:[das was gerade in STEUERUNG:STATE steht]
dann Heizung AN
Bestimmt ist das möglich, oder?! Wie genau ist da die Syntax? Kann mir da einer von Euch helfen?
Vielen Dank!
Beste Grüße
Gonzolo
Möchtest du das mit einem DOIF lösen, so solltest du den Post in DOIF Board verschieben.
Und ja, was du möchtest ist möglich, aber ich steige noch nicht durch um dir Helfen zu können. Sry. Kannst du vielleicht mal ohne dein Dummy und dein DOIF beschreiben was du möchtest in der Form:
Wenn xxx und yyy dann zzz
Der Umweg über das DOIF und dein Dummy erscheint mir nicht nötig. Daher nochmal die Frage nach dem genauen Wunsch.
set Steuerung [TempTag]
So kann es gehen.
Danke für Deine Antwort....
Okay... ich versuche es mal genauer zu erklären was ich mache :)
Ich will an einer zentralen Stelle in FHEM eingeben, welche Temperatur in der Wohnung herschen soll. Für Tag und für Nacht will ich es natürlich nicht gleich warm haben. Jetzt möchte ich, wenn diese Temperatur auch ohne heizen erreicht wird, dass FHEM die Heizung aus macht. Wenn im laufe des Tages die Temperatur absinkt und unter die vorgegebene Tagestemperatur fällt, soll FHEM die Heizung wieder mit der Tagestemperatur an machen! Wenn das erst in der Nacht die Temperatur unter die vorgegebene Nachttemperatur fällt, dann soll FHEM die Heizung mit der Nachttempereratur an machen.
Da ich jetzt zwischen TagTemperatur und NachtTemperatur unterscheide, will ich das dynamisch machen. Also wenn es Tag ist, dann steht in dem Steurungs-Parameter "es ist Tag" und an einer anderen Stelle steht, wie warm es am Tag sein soll. Wenn es Nacht ist, dann steht im Steuerungs-Parameter, das es Nacht ist und an einer anderen Stelle wie warm es in der Nacht sein soll. ...
Ich will das so machen, weil ich noch viele andere Sachen abhängig von Tag- oder Nachtbetrieb steuern will.
ZitatWenn xxx und yyy dann zzz
Wenn Heizung aus UND
Temperatur < SollTemperatur
DANN
Setzte die Heiztemperatu auf die SollTemperatur
Ergänzung: Die SollTemperatur ist am Tag eine andere als in der Nacht
Hoffe jetzt ist es klarer??
Danke für die Hilfe!
Gruß
Gonzolo
Hi,
das könnte man jetzt mit einem notify oder einem DOIF machen, aber ich würde das mit einem at lösen. Dann muss man sich nicht überlegen, welche Events man überwachen muss (Änderung der Ist-Temperatur, Änderung der Soll-Temperatur, Änderung der Tag/Nacht Zeiten...). Außerdem ist es dann weniger nervös, wenn die Temperatur ungefähr die Soll-Temperatur ist.
Also in etwa...
define heizungsSchalter at +*00:05:00 ...
Im Kommandoteil (also die drei Punkte oben) müsste dann sowas stehen wie
IF ([Steuerung] eq "TempTag" and [Thermometer:Temperatur] < [Steuerung:TempTag] or [Steuerung] ne "TempTag" and [Thermometer:Temperatur] < [Steuerung:TempNacht]) (set Heizung on) ELSE (set Heizung off)
Du solltest außerdem bei "set Steuerung "Temp..." " die """ weglassen.
Gruß,
Thorsten
Hallo Thorsten,
danke für Deine ausführliche Antwort.
Mir geht es allerdings darum, wie man die Abfragen [Steuerung:TempTag]
dynamisieren kann.
also sowas wie [Steuerung:"Platzhalter"]
Ich will genau nicht
IF ([Steuerung] eq "TempTag" and [Thermometer:Temperatur] < [Steuerung:TempTag] or "TempNacht" and [Thermometer:Temperatur] < [Steuerung:TempNacht])
Ich will sowas wie
IF [Thermometer:Temperatur] < [Steuerung:"Platzhalter"] THEN set Heizung
Und in den Platzhalte kommt dann das rein, was zu dem Zeitpunkt in Steuerung:State seht (also entweder TempTag oder TempNacht)
Danke für Euere Geduld und Hilfe
Gruß
Gonzolo
Ich würde gern auch noch das threshold-Modul in den Raum werfen.
Zusammen mit einem at oder einem DOIF, welches desired_temp setzt, sollte das ruhiger laufen.
lg, Stefan
Hi,
achso. Ich glaube nicht, dass das mit "set magic" geht, da würde es dann so aussehen:
IF ([Thermometer:Temperatur] < [Steuerung:[Steuerung:state]]) (set Heizung ...
Aber wie gesagt, ich bezweifle, dass das geht. Da muss man dann auf die Perl-Ebene gehen, also
{ if(ReadingsVal("Thermometer","Temperatur",0) < ReadingsVal("Steuerung",ReadingsVal("Steuerung","state","blabla"),22)) { fhem("set Heizung on")} }
Gruß,
Thorsten
Zufällig weiß ich ;) , dass THRESHOLD sogar eine dynamische Komponente hat:
Auszug aus der Commandref zu THRESHOLD:
ZitatBerechnung der Solltemperatur für die Vorlauftemperatur für Fußbodenheizung mit Hilfe der 0,8-Heizkennlinie anhand der Außentemperatur :
define TH_heating THRESHOLD flow:temperature:2:outdoor:temperature heating
attr TH_heating target_func -0.578*_tv+33.56
Hier wird die Vorgabetemperatur aus dem Reading outdoor:temperature und der target_func dynamisch gebildet. _tv ist der Platzhalter für outdoor:temperature
Jetzt mal dumm gefragt... Warum setzt du dir nicht statt eines Dummies, der der sagt, ob Tag oder Nachsteuerung aktiv ist gleich die gewünschte Temperatur?
also:
DOIF [06:00]
setreading Steuerung desired_temp [Steuerung:tempTag]
DOELSEIF [22:00]
setreading Steuerung desired_temp [Steuerung:tempNacht]
und dann
IF ([Thermometer:Temperatur] < [Steuerung:desired_temp] ...
Edit: Irgendwie waren die Code Tags zerschossen...
Zitat von: KernSani am 10 Mai 2017, 21:29:14
Jetzt mal dumm gefragt... Warum setzt du dir nicht statt eines Dummies, der der sagt, ob Tag oder Nachsteuerung aktiv ist gleich die gewünschte Temperatur?
also:
[/code]
DOIF [06:00]
setreading Steuerung desired_temp [Steuerung:tempTag]
DOELSEIF [22:00]
setreading Steuerung desired_temp [Steuerung:tempNacht]
und dann
IF ([Thermometer:Temperatur] < [Steuerung:desired_temp] ...
ja, aber auch das ist der Standardfall beim THRESHOLD:
ZitatZeitgesteuertes Heizen mit Hilfe des DOIF-Moduls:
define TH_room THRESHOLD temp_room heating
define di_room DOIF ([05:30-23:00|8] or [07:00-23:00|7]) (set TH_room desired 20) DOELSE (set TH_room desired 18)
Da braucht mal noch nicht mal ein IF ;)
Edit: selbst die feste Vorgabe von 20 oder 18 kannst du als Reading angeben.
Zitat von: Damian am 10 Mai 2017, 21:41:20
ja, aber auch das ist der Standardfall beim THRESHOLD:
Da braucht mal noch nicht mal ein IF ;)
Edit: selbst die feste Vorgabe von 20 oder 18 kannst du als Reading angeben.
Um Missverständnissen vorzubeugen. Ich hatte mich bei meinem Post auf den Ursprungspost des TE bezogen, nicht auf deinen Threshold Vorschlag.
Zitat von: KernSani am 10 Mai 2017, 21:58:12
Um Missverständnissen vorzubeugen. Ich hatte mich bei meinem Post auf den Ursprungspost des TE bezogen, nicht auf deinen Threshold Vorschlag.
Das ist mir schon klar, nur, die ganzen IF-Vorschläge müssen ja noch in ein notify eingepackt werden (IF ist ja kein Modul), und das sollte bei zyklisch sendenden Sensoren ein ständiges Schalten unterbinden und genau das macht das THRESHOLD-Modul.
Edit: Als nächstes wird ihm auffallen, dass bei schwankender Temperatur um den Sollpunkt hin und her geschaltet wird, also braucht er eine Hysterese und schon sind wir wieder bei THRES....
Zitat von: Damian am 10 Mai 2017, 22:04:54
Edit: Als nächstes wird ihm auffallen, dass bei schwankender Temperatur um den Sollpunkt hin und her geschaltet wird, also braucht er eine Hysterese und schon sind wir wieder bei THRES....
nicht das sowas schonmal erwähnt wurde ::) --> https://forum.fhem.de/index.php/topic,63488.0.html
Hi,
deshalb ja mein Vorschlag, das mit einem at zu machen. Das ist einfach und wahrscheinlich wirkungsvoll.
Dann "schwankt" es auch, aber eben nur maximal alle 5 Minuten (oder welches Intervall auch immer eingestellt ist).
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 11 Mai 2017, 10:22:38
Hi,
deshalb ja mein Vorschlag, das mit einem at zu machen. Das ist einfach und wahrscheinlich wirkungsvoll.
Dann "schwankt" es auch, aber eben nur maximal alle 5 Minuten (oder welches Intervall auch immer eingestellt ist).
Gruß,
Thorsten
Dennoch musst du auch beim at das mehrfache Schalten unterbinden z. B. durch Filter. Abgesehen davon ist pollen immer ein schlechter Ansatz, wenn ein System Ereignissteuerung beherrscht.
Zitat von: Damian am 11 Mai 2017, 13:11:06
Dennoch musst du auch beim at das mehrfache Schalten unterbinden
Warum?
Zitat
Abgesehen davon ist pollen immer ein schlechter Ansatz, wenn ein System Ereignissteuerung beherrscht.
Naja, mal angenommen, ich habe ein Messwert, der naturgemäß schwankt. Temperaturen haben das z.B. so an sich. Dann bekomme ich ggf. alle paar Sekunden ein Ereignis. Ich muss dann irgendwas machen (Hysterese, event-min-interval oder so), damit ich diese Ereignisse nicht so oft bekomme. Warum dann nicht gleich ein Takt vorgeben, mit dem meine Regelung arbeitet?
Gruß,
Thorsten
PS: Aussagen mit "immer" sind immer falsch. ;)
Danke für Eure vielen Anregungen!
ABER... die Dynamisierung nach dem Muster
[Steuerung:"Platzhalter"]
wobei der "Platzhalter" gleich dem aktuellen Reading [Stuerung:State] ist, geht also nicht?! Habe ich das richtig verstanden?
Danke und Gruß
Gonzolo
Klar geht das. Aber da Du uns nicht verrätst welches Modul Du verwenden willst ist es schwer Dir da korrekte Tips zu geben.
Aber, JA
Zitat von: Gonzolo am 12 Mai 2017, 07:14:24
... die Dynamisierung nach dem Muster
[Steuerung:Platzhalter]
wobei der "Platzhalter" gleich dem aktuellen Reading [Stuerung:State]
geht definitiv.
Wenn Du uns sagst wie Du Dich nun entschieden hast, ob notify, DOIF oder at, können wir Dir sicherlich weiter helfen. Bis dahin schöne ich meine Nerven.
Zitat von: Gonzolo am 12 Mai 2017, 07:14:24ABER... die Dynamisierung nach dem Muster
Hast Du meinen Beitrag #7 gelesen?
Zitat von: CoolTux am 12 Mai 2017, 07:30:23
Klar geht das.
Da würde mich jetzt auch interessieren, wie das geht ohne auf Perl zu wechseln. Das müsste dann ja so aussehen, oder?
[Steuerung:[Steuerung:state]]
Gruß,
Thorsten
Ok habe das mal geändert. Bei den ganzen durcheinander kommt man selbst ins grübbeln.
Wenn ich das ganze richtig verstanden habe, will er doch einfach nur seine Tag und Nacht Temperatur in zwei Dummys oder besser noch ein Dummy mit Tag Nacht Reading setzen und beim schalten sollen diese Temperaturen dann einfach aus den Dummy Readings ausgelesen werden. So war zu mindest mein Verständnis bevor das hier ausgeufert ist.
Also.
Man(n) erstelle ein dummy. Gebe ihm ein setList und setReadings.
Danach nehme man at, notify oder DOIF und füge dort ein
set ThermostatWohnzimmer desired-temp [dummyName:dayTemp]
und alles ist schick.
So zu mindest war mal die Ausgangsfrage
In einem zweiten Thread geht es dem Kollegen dann noch um eine Berechnung oder Bedingung oder so. Ist immer schwer zu verstehen.
Zitat von: CoolTux am 12 Mai 2017, 07:48:12
Wenn ich das ganze richtig verstanden habe, will er doch einfach nur seine Tag und Nacht Temperatur in zwei Dummys oder besser noch ein Dummy mit Tag Nacht Reading setzen...
Tja, von dem, was die Leute schreiben, auf das zu kommen, was sie wirklich wollen, grenzt oft an Exegese. Ich wage nicht zu behaupten, dass mir bisher so viel Erleuchtung zu Teil wurde, dass mir das immer gelingt.
[/Geschwafelmodus]
Ich glaube, wir haben hier sozusagen zwei Ebenen. Einmal die Anwendung, also irgendwas mit einer Heizung, dass man wahrscheinlich auf 100 verschiedene Arten machen könnte. ...und daran aufgehängt eine allgemeine technische Frage. Die geht soweit ich das verstanden habe so:
Gegeben ein Device mit einem Reading "readingname". (Statt "readingname" kann man auch "state" nehmen, das macht's aber schwerer verständlich.) In diesem Reading steht der Name eines anderen Reading. Wie kann ich jetzt auf das Reading zugreifen, dessen Name im Reading "readingname" steht? (Ob man das wirklich braucht ist eine andere Frage.)
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 12 Mai 2017, 07:59:59
Frage. Die geht soweit ich das verstanden habe so:
Gegeben ein Device mit einem Reading "readingname". (Statt "readingname" kann man auch "state" nehmen, das macht's aber schwerer verständlich.) In diesem Reading steht der Name eines anderen Reading. Wie kann ich jetzt auf das Reading zugreifen, dessen Name im Reading "readingname" steht? (Ob man das wirklich braucht ist eine andere Frage.)
Soetwas braucht man nicht! Es muß/sollte anders gelöst werden.
Zitat von: CoolTux am 12 Mai 2017, 08:27:09
Soetwas braucht man nicht! Es muß/sollte anders gelöst werden.
Warum so dogmatisch? Zumal es doch eigentlich einfach ist:
ReadingsVal("device",ReadingsVal("device","readingname","blabla"),0)
Gruß,
Thorsten
Ja es geht. Aber nicht alles was geht sollte man einem Anfänger gleich zu muten. Oder magst Du ihm die Anwendung verschachtelter Funktionsaufrufe erklären ;). Zumal es sicherlich, mit reiflicher Überlegung verbunden, eine bessere und vor allem verständlichere Alternative gibt.
Zitat von: CoolTux am 12 Mai 2017, 08:57:53Oder magst Du ihm die Anwendung verschachtelter Funktionsaufrufe erklären
...zumindest lieber als DOIF oder THRESHOLD. :P
... ich würde es gerne mit DOIF machen! ;)
Zitat von: Gonzolo am 12 Mai 2017, 10:12:46
... ich würde es gerne mit DOIF machen! ;)
Dann bin ich raus, für DOIF bin ich zu blöd.
Gruß,
Thorsten
... schade denn DU hast mich verstanden.
ZitatIch glaube, wir haben hier sozusagen zwei Ebenen. Einmal die Anwendung, also irgendwas mit einer Heizung, dass man wahrscheinlich auf 100 verschiedene Arten machen könnte. ...und daran aufgehängt eine allgemeine technische Frage. Die geht soweit ich das verstanden habe so:
Gegeben ein Device mit einem Reading "readingname". (Statt "readingname" kann man auch "state" nehmen, das macht's aber schwerer verständlich.) In diesem Reading steht der Name eines anderen Reading. Wie kann ich jetzt auf das Reading zugreifen, dessen Name im Reading "readingname" steht? (Ob man das wirklich braucht ist eine andere Frage.)
ich wollte hier nicht meine komplette Steuerung erklären. Ich brauche dieses komplizierte Konstrukt, da es halt nicht nur die Heizung ist, die ich damit steuere (z.B. auch Rollladen).
Was muss ich schreiben, dass Ihr meine Frage versteht?! :-[ Drücke ich mich tatsächlich sooooo kompliziert aus? :o ... Schade!
Ich weiß nicht wo das Problem ist, bevor wir uns hier noch tagelang mit einer banalen Anforderung beschäftigen, hier eine Komplettlösung in zwei Zeilen:
define TH_Heizung THRESHOLD Temp Heizung
define di_room DOIF ([TagNacht] eq "es ist Tag") (set Heizung desired [Tagtemp]) DOELSE (set TH_Heizung desired [Nachttemp])
Voraussetzungen:
Heizung ist deine Heizung, geschaltet mit on/off
Dummy TagNacht mit "es ist Tag" bzw. "es ist Nacht" (wie gewünscht)
Dummy Tagtemp mit der Solltemperatur für Tag z. B. 20
Dummy Nachttemp mi der Solltemperatur für Nacht z. B. 18
Temperaturfühler namens Temp mit dem Reading temperature
Default-Hysterese beträgt 1 Grad.
Zitat von: Gonzolo am 12 Mai 2017, 10:29:45
... schade denn DU hast mich verstanden.
Warum willst Du es dann mit DOIF machen? Ich hatte Dir doch schon eine Lösung geliefert.
Gruß,
Thorsten
Danke für Eure Hilfe!! Und entschuldigt bitte das ich mich missverständlich ausdrücke!!
Ich Versuche es mal mit den genannten Vorschlägen. Ansonsten muss ich mir was anders überlegen! ;) Will nicht weiter durch meine unwissenheit Verwirrung stiften und Eure nerven strapazieren..... :-[
Ein ernst gemeintes VIELEN DANK an alle!!!!
Viele Grüße
Gonzolo
Vielleicht können wir es so machen. Du versuchst noch mal genau zu erklären und zu zeigen was Du willst. Daraufhin nimmt Dich EIN Helfender an die Hand und zeigt Dir Lösungswege. Alles andere führt nur zu noch mehr Verwirrung
Thorsten ... Vielen Dank! Ich mache es anders ... :)