Ich suche die richtige Schreibweise für Delta Funktionen wenn ich Explizit das state benötige.
Für eine herkömliche Delta Schreibweise wird diese Form verwendet.
[DL2_T12:DL2_T08] >= 10)
(set AB_SSP_ST_FKVA5D:FILTER=state!=on on)
Wie ist die Definition wenn ich den state Wert benötige bzw. welche Klammern werden benötigt?
Verstehe deine Frage nicht.
[DL2_T12:DL2_T08]
triggert auf Reading DL2_T08 vom Device DL2_T12.
[DL2_T12]
triggert auf dem state vom Device DL2_T12.
[DL2_T12] wertet das Internal STATE aus
[DL2_T12:state] wertet das Reading state aus.
Sorry Jungs!
Die Hitze dürfte mich ein bisschen weich in der Birne gemacht haben.
Das sollte nicht so heißen,
([DL2_T12:DL2_T08] >= 10)
(set AB_SSP_ST_FKVA5D:FILTER=state!=on on)
sondern so.
({([DL2_T12:state] - [DL2_T08:state])} >= 10)
(set AB_SSP_ST_FKVA5D:FILTER=state!=on on)
Und da wollte ich wissen ob die Schreibweise der Delta Berechnung richtig ist.
Es wird ein Vergleich der beiden Temperaturen gemacht. Ist diese höher als 10° erfolgt die Freigabe.
Warum der Umweg über Perl? Das geht auch direkt, also ohne die inneren runden und geschweiften Klammern.
Zitat von: Per am 26 Juni 2017, 17:11:38
Warum der Umweg über Perl? Das geht auch direkt, also ohne die inneren runden und geschweiften Klammern.
Die Bedingung ist ja bereits bis auf Angaben in eckigen Klammern Perl, daher reicht
(([DL2_T12:state] - [DL2_T08:state]) >= 10)
Die runden Klammern darfst du nicht weglassen, denn es soll zuerst die Differenz gebildet werden und dann der Vergleich stattfinden.
Das mit den runden Klammern ist mir schon klar.
Ich bin nur von dieser Berechnungsform ausgegangen.
([DL2_T09:state] >= 45.0)
(set AB_P_ST_DT12T08D {([DL2_T12:state] - [DL2_T08:state])})
Oder gibt es hierfür auch eine andere Berechnungsmöglichkeit.
Zitat von: Burny4600 am 26 Juni 2017, 21:05:27
Das mit den runden Klammern ist mir schon klar.
Ich bin nur von dieser Berechnungsform ausgegangen.
([DL2_T09:state] >= 45.0)
(set AB_P_ST_DT12T08D {([DL2_T12:state] - [DL2_T08:state])})
Oder gibt es hierfür auch eine andere Berechnungsmöglichkeit.
Du musst wissen, dass DOIF-Bedingung Perl ist mit etwas DOIF-Spezifischem, Ausführungsteil dagegen FHEM ist mit etwas DOIF-Spezifischem.
ZitatDu musst wissen, dass DOIF-Bedingung Perl ist mit etwas DOIF-Spezifischem, Ausführungsteil dagegen FHEM ist mit etwas DOIF-Spezifischem.
Ganz habe ich diesen Satz nicht verstanden, aber die Angelegenheit funktioniert.
define di DOIF (DOIF-Bedingung)
(Ausführungsteil)
DOELSEIF (DOIF-Bedingung)
(Ausführungsteil)
...
DOIF-Bedingung = Perl Befehle mit etwas DOIF-Spezifischem
Ausführungsteil = FHEM Befehle mit etwas DOIF-Spezifischem
Siehe https://fhem.de/commandref_DE.html#command für die Befehl Arten.
Ich würde hier gerne mal einsteigen.
lässt sich innerhalb vom DOIF noch ne Bedingung einfügen dass die Über-Unterschreitung des Schwellwertes eine Mindestdauer anliegen muss?
Will das DOIF für meine Pool-Solarheizung einsetzen.
Ist die Sonne weg gibt es keine Erwärmung mehr also Pumpe aus.
Problem ist beim einschalten, da schaltet das DOIF gleich wieder aus da noch kein warmes Wasser am Sensor ist.
Gibt es. Nennt sich wait. Aber viele Wege führen nach Rom. Ein weiterer wäre eine Hysterese. Oder DOELSEIF statt DOELSE fürs Ausschalten.
ich schalte manuell ein und der DOIF soll mit der Delta Funktion dann abschalten.
Attribut wait war ein gutes Stichwort! So läuft es jetzt bei mir:
defmod PoolHeizAUS DOIF ([IT_00FF0F0FFF:state] eq "on" and (([Pool_Temp_1:Temp_1] - [Pool_Temp_2:Temp_2]) <= 1)) (set IT_00FF0F0FFF off)
attr PoolHeizAUS do always
attr PoolHeizAUS wait 180
Danke Per!
DOIF ist so mächtig, da sieht man den Wald vor Bäumen nicht. ;)
attr PoolHeizAUS wait 600
Dann wartet das DOIF 10 min, bis dahin sollte am Sensor warmes Wasser sein. Allerdings pumpt bei dieser "Billiglösung" die Pumpe auch noch 10 min, nachdem die Temperatur wieder runter ist.
Du kannst aber auch das Alter des Einschaltbefehls abfragen (:sec > 600), da hast du das Problem nicht.
defibe PoolHeizAUS DOIF ([IT_00FF0F0FFF:state] eq "on" and [IT_00FF0F0FFF:state:sec] > 600 and (([Pool_Temp_1:Temp_1] - [Pool_Temp_2:Temp_2]) <= 1)) (set IT_00FF0F0FFF off)
attr PoolHeizAUS do always
Das mit dem Einschaltbefehl ist ja noch besser! :)
Danke! So wirds umgesetzt.
nur so als einwurf:
https://fhem.de/commandref_DE.html#THRESHOLD (für die hysterese)