Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: knochenmuehle am 03 Februar 2015, 20:30:26
es kommt 2x sofort nacheinander, hatte ohne wait gestetet.
mit nem ? bei der Temp. klappts jetzt.
als Trigger nehme ich jetzt auch das Fenster_auf reading des Thermostaten

damit funktioniert das ganze jetzt aber nur wenn sich die Temp innerhalb der 900 sek nicht ändert, oder ?


([RT_BZ_1_WindowRec:trig_MK_Bad1] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")


A.

Das sind jetzt drei Änderungen auf einmal: ohne 900, anderes Reading und mein Vorschlag mit Fragezeichen. Wenn sich die Voraussetzung ändern, so kann ich keine konkreten Aussagen machen.

Man kann sagen, bei Fragezeichen würde beim Überschreiten der Temperatur von 16 Grad dennoch eine Meldung nach 900 Sekunden erfolgen, wenn Fenster nicht zwischendurch geschlossen wurde.

Auch das do always ist nicht unbedingt hier sinnvoll.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

knochenmuehle

Damian du hast natürlich Recht, hatte nur schnell eine funktionierende Lösung gesucht.

Ich habe aber den alten Zustand wieder hergestellt, das do always rausgenommen und es funktioniert jetzt auch so:


([MK_Bad1:state] eq "open" and [?THLP:temperature] < 16)(set Tablet ttsSay "Das Fenster im Badezimmer ist noch auf.")


keine Doppelmeldung mehr, ich schätze das do always war's

Ist mir auch lieber auf den Fensterkontakt zu triggern und nicht auf den Thermostaten, eine mögliche Fehlerquelle weniger.

Gruß
Andreas

Spartacus

Hallo,
so ganz glücklich bin ich noch nicht mit meiner Auswertung der Ferientage:
([cnt.OS.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.WE.start.Ferien.dum])
DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)

Der Kalender wird alle 6h aktualisiertund die Werte in der Tabelle (Screenshot) werden heruntergezählt.
Erreicht ein Wert die "10" wird das Dummy cnt.NRW.start.Ferien.dum auf den Wert des jeweiligen Ferienevents gesetzt(Countdown 10..0).

Muss ich nun das do always setzten? Aber dann würde m.E. das Dummy cnt.NRW.start.Ferien.dum immer wieder auf -deaktiv- gesetzt, da immer ein Ferienevent > als 10 Tage ist und somit immer das DOELSE zutrifft, oder?

Was ist nun richtig, damit meine Logik funktioniert, vor allen Ferien immer einen 10 Tages Countdown anzuzeigen!
Danke,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Hallo,
irgendwie funktioniert mein Konstrukt im vorherigen Post nicht! Egal ob mit DO ALWAYS oder ohne! Da sich alle Ferientypen beim Aktualisieren des Kalenders ändern und von allen Ferien ein Tage abgezogen wird, überschreibt das DOIF das dummy "cnt.NRW.start.Ferien.dum " immer wieder mit deaktiv!

Hat jemand eine Idee, wo ich ansetzten muss?
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Bartimaus

Guten Morgen,

ich teste gerade die Umstellung von "3 x (at*) IF" gegen ein "DOIF".
Dazu habe ich folgendes DOIF angelegt:
([06:00|0123456]
and [PoolPumpe_Master:state] eq "on"
and [Pool:state:d]>= 1
and [Pool:state:d]< 15 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/6,([Pool:state:d]/6-int([Pool:state:d]/6))*60)}))
DOELSEIF
([Pool:state:d]>= 15
and [Pool:state:d]< 24 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))
DOELSEIF ([Pool:state:d]>= 24
and [Pool:state:d]<= 45)
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/3,([Pool:state:d]/3-int([Pool:state:d]/3))*60)}))


Dieses DOIF dient dazu, unterschiedlich lange Pumpenlaufzeiten je Pooltemperatur zu generieren.
Im Log sehe ich, das die Pumpe zur definierten Zeit (06:00) eingeschaltet wurde, und zur errechneten Zeit ausgeschaltet wurde. Soweit so gut.
Jedoch sehe ich im Log auch folgenden Fehlerhinweis:

Poolsteuerung: perl error in condition: (DOIF_time_once($hash->{timer}{0},$wday,"0123456") and ReadingValDoIf('PoolPumpe_Master','state','') eq "on" and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')>= 10 and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')< 15 ) ((set PoolPumpe on-till {sprintf("%02d:%02d",6+ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6,(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6-int(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6))*60)})): syntax error at (eval 40587) line 1, near ") ("


Die Bedingung habe ich aus meiner alten IF-Bedingung kopiert, und dabei trat dieser Fehler im Log nicht auf.

Ich sehe, das im Logfile der Wert ...'(-?\d+(\.\d+)?)')>= 10 auftaucht, wobei in der Bedingung ...'(-?\d+(\.\d+)?)')>= 1 steht. Ist das der Grund ?
Hat jemand ne Idee ?
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Zitat von: Bartimaus am 06 Februar 2015, 09:30:37
Guten Morgen,

ich teste gerade die Umstellung von "3 x (at*) IF" gegen ein "DOIF".
Dazu habe ich folgendes DOIF angelegt:
([06:00|0123456]
and [PoolPumpe_Master:state] eq "on"
and [Pool:state:d]>= 1
and [Pool:state:d]< 15 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/6,([Pool:state:d]/6-int([Pool:state:d]/6))*60)}))
DOELSEIF
([Pool:state:d]>= 15
and [Pool:state:d]< 24 )
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/4,([Pool:state:d]/4-int([Pool:state:d]/4))*60)}))
DOELSEIF ([Pool:state:d]>= 24
and [Pool:state:d]<= 45)
((set PoolPumpe on-till {sprintf("%02d:%02d",6+[Pool:state:d]/3,([Pool:state:d]/3-int([Pool:state:d]/3))*60)}))


Dieses DOIF dient dazu, unterschiedlich lange Pumpenlaufzeiten je Pooltemperatur zu generieren.
Im Log sehe ich, das die Pumpe zur definierten Zeit (06:00) eingeschaltet wurde, und zur errechneten Zeit ausgeschaltet wurde. Soweit so gut.
Jedoch sehe ich im Log auch folgenden Fehlerhinweis:

Poolsteuerung: perl error in condition: (DOIF_time_once($hash->{timer}{0},$wday,"0123456") and ReadingValDoIf('PoolPumpe_Master','state','') eq "on" and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')>= 10 and ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')< 15 ) ((set PoolPumpe on-till {sprintf("%02d:%02d",6+ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6,(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6-int(ReadingValDoIf('Pool','state','(-?\d+(\.\d+)?)')/6))*60)})): syntax error at (eval 40587) line 1, near ") ("


Die Bedingung habe ich aus meiner alten IF-Bedingung kopiert, und dabei trat dieser Fehler im Log nicht auf.

Ich sehe, das im Logfile der Wert ...'(-?\d+(\.\d+)?)')>= 10 auftaucht, wobei in der Bedingung ...'(-?\d+(\.\d+)?)')>= 1 steht. Ist das der Grund ?
Hat jemand ne Idee ?

Perlberechnungen im Ausführungsteil müssen zusätzlich in runde Klammern, hier also:

{(sprintf.....)}

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Danke,

habe ich gemacht, gleicher Fehler im Log. Nur mit der Auswirkung, das jetzt nicht ein/aus geschaltet wurde.
Auch weist die Fehlermeldung im Log immer noch auf die Bedingung >= 10 statt der Bedingung >=1 im DEF hin.  :-\

LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Bartimaus

Arrgh, Fehler gefunden  ::)
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Spartacus

Zitat von: Spartacus am 04 Februar 2015, 21:09:34
Hallo,
so ganz glücklich bin ich noch nicht mit meiner Auswertung der Ferientage:
([cnt.OS.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.OS.start.Ferien.dum])
DOELSEIF
([cnt.PG.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.PG.start.Ferien.dum])
DOELSEIF
([cnt.SO.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.SO.start.Ferien.dum])
DOELSEIF
([cnt.HB.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.HB.start.Ferien.dum])
DOELSEIF
([cnt.WE.start.Ferien.dum] <= 10) (set cnt.NRW.start.Ferien.dum [cnt.WE.start.Ferien.dum])
DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)

Der Kalender wird alle 6h aktualisiertund die Werte in der Tabelle (Screenshot) werden heruntergezählt.
Erreicht ein Wert die "10" wird das Dummy cnt.NRW.start.Ferien.dum auf den Wert des jeweiligen Ferienevents gesetzt(Countdown 10..0).

Muss ich nun das do always setzten? Aber dann würde m.E. das Dummy cnt.NRW.start.Ferien.dum immer wieder auf -deaktiv- gesetzt, da immer ein Ferienevent > als 10 Tage ist und somit immer das DOELSE zutrifft, oder?

Was ist nun richtig, damit meine Logik funktioniert, vor allen Ferien immer einen 10 Tages Countdown anzuzeigen!
Danke,
Christian

Hallo,
ich habe jetzt mehrere Versuche unternommen indem ich die Reihenfolge der DOIFELSEs umgestellt habe, aber irgendwie kommt am Ende immer das gleiche falsche Ergebnis raus! Ist DOIF hier der falsche Ansatz?

Gruß,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 06 Februar 2015, 16:20:04
Hallo,
ich habe jetzt mehrere Versuche unternommen indem ich die Reihenfolge der DOIFELSEs umgestellt habe, aber irgendwie kommt am Ende immer das gleiche falsche Ergebnis raus! Ist DOIF hier der falsche Ansatz?

Gruß,
Christian

statt:

DOELSE (set cnt.NRW.start.Ferien.dum -deaktiv-)


angeben:

DOELSEIF ([cnt.OS.start.Ferien.dum] > 10 and [cnt.PG.start.Ferien.dum] > 10 and ...) (set cnt.NRW.start.Ferien.dum -deaktiv-)

do always muss bleiben

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Spartacus

Hallo Damian,
zunächst habe ich Deine Antwort nicht ganz nachvollziehen können, aber nach längerem "Drübernachdenken", kann ich es nachvollziehen.

Vielen Dank für Deine Hilfe,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

MadCat

Hallo, ich habe mich Heute mal an das DOIF gewagt und habe irgendwo einen Fehler drin, denn es arbeitet nicht so wie ich es möchte.

Steuern möchte ich darüber ein 3 Wege Ventil, welches zwischen meinen beiden Pufferspeichern umschalten soll.

Geregelt werden soll so:

Kesselpumpe on und Temperatur im Puffer2 unten <40°C Ventil on
Heizkreispumpe on und Puffer1 oben Tempereatur <40 Ventil on
ansonsten Ventil zu

meine Definition sieht so aus.

define Puffersteuerung_DI DOIF ([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40 or [Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 ) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)

aber wenn ich das so eingebe, bleibt DOIF bei cmd_nr 3 stehen und das Ventil ist off

Irgendwo habe ich da wohl einen Denkfehler drin.

Währe schön wenn mir dabei jemand auf die Sprünge helfen könnte.


Puschel74

Und selbst die deutsche commandref kann dir nicht helfen??
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Invers

Ich denke mal, ich würde vor und nach dem or Klammern setzen, damit die Prüfung korrekt stattfinden kann.

define Puffersteuerung_DI DOIF (([Kesselpumpe:?on] and [Puffer2_100:temperature] < 40) or ([Heizkreispumpe:?on] and [Puffer1_25:temperature] < 40 )) (set Heizkreisventil on) DOELSE (set Heizkreisventil off)
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

MadCat

Zitat von: Puschel74 am 08 Februar 2015, 01:28:23
Und selbst die deutsche commandref kann dir nicht helfen??

Nein, leider nicht, sonst hätte ich hier nicht um Hilfe gebeten