DOIF Vergleich anstellen mit Operanden

Begonnen von sash.sc, 01 April 2016, 16:28:28

Vorheriges Thema - Nächstes Thema

Streba

Danke, yersinia!

Das Klammernproblem war's und im Nachhinein ist es auch logisch: Die Uhrzeit ist ja quasi eine weitere Bedingung, die mit "und" verknüpft werden muss.

Vielen Dank für die schnelle Hilfe!

fireball

Moinsen,

ich habe grad auch ein kleines Problem mit der Ausführung... und ich klemme fest...

mein DOIF
([11:00] and [Wetter_2:fc0_uv] >= 6 and [LAD7:ambientTemperature] >= 22) (set Rollladen_.*_S$ zu) (set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]") DOELSEIF
([15:00] and ([Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 26)) (set Rollladen_.*_S$ zu) (set Rollladen_.*_W$ zu)(set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]")


Was will ich...
1. um 11 Uhr wird überprüft ob der UV Wert >= 6 ist UND die Aussentemperatur >= 22, wenn ja... Rollanden zu <= das funktioniert alle Bedingungen müssen wahr sein.
2. um 15 Uhr wird überprüft ob der UV Wert >= 6 ist ODER die Aussentemperatur >= 26, wenn ja... Rollanden zu <= das funktioniert nicht

bei 2 wird doch erst überprüft, ob die ODER Bedingung wahr ist... entweder UV Wert oder Aussentemp, wenn eins in der Klammer wahr, dann wahr... UND dann noch die Uhrzeit...

Aber heute hatten wir UV von 7 um 15 Uhr und nix ist passiert...

Was ist falsch???
VG

Tueftler1983

#17
Ich bin mir nicht sicher aber ich glaube das und muss hinten stehen oder mit Klammern muss gestaffelt werden was zusammen gehört.
([Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 26 and ([15:00]))
Versuch es Mal so

Otto123

(Bedingung 1) and (Bedingung 2) or (Bedingung 3)

https://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity

Was Du willst ist (Bedingung 1) and ((Bedingung 2) or (Bedingung 3)) ?

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tueftler1983

Ahh okay so war es, wußte doch das man es mit den Klammern definiert!

fireball

Zitat von: Otto123 am 23 Juli 2020, 21:07:05


Was Du willst ist (Bedingung 1) and ((Bedingung 2) or (Bedingung 3)) ?

Gruß Otto

Hi Otto, ja genau... ich habe schon ein wenig in den FHEM https://wiki.fhem.de/wiki/DOIF/Operatorenrangfolge Seiten gelesen, da steht ja auch welche Reihenfolge gilt...
AND vor OR, () vor AND, || vor AND ... usw...

Daher sollte bei mir doch alles richtig sein...

([15:00] and ([Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 26))

Die Klammern werden zurerst überprüft... also das or und dann das and mit der Zeit...

VG
René

fireball

Hi Otto, danke das du mir zustimmst... aber wie im Eingangspost schon geschrieben, es funktioniert nicht...
Ich hatte UV von 7 und Temp von 24 oder so... jedenfalls hätte meiner Meinung nach um 15 Uhr die Bedingung in den Klammern wahr sein müssen und das (set...) ausgeführt werden müssen...
War aber nicht so... ich mach mal das verbose an und schau mir das die Tage nochmal an...
VG
René

Otto123

Hallo Rene,

in einem List würde man eventuell mehr sehen.
Außerdem musst Du aufpassen, Du hast eventuell redundante Abfragen in deinen Zweigen. Wenn einer zutrifft (wahr) dann werden die folgenden Zweige nicht mehr angeschaut.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

fireball

Hi Otto,

Internals:
   DEF        ([11:00] and [Wetter_2:fc0_uv] >= 6 and [LAD7:ambientTemperature] >= 22) (set Rollladen_.*_S$ zu) (set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]") DOELSEIF
([15:00] and ([Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 26)) (set Rollladen_.*_S$ zu) (set Rollladen_.*_W$ zu)(set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]")

   FUUID      5f0b4392-f33f-0804-e05d-d250d6f937145bfb
   MODEL      FHEM
   NAME       Alarm_UV_Temp
   NOTIFYDEV  LAD7,Wetter_2,global
   NR         546
   NTFY_ORDER 50-Alarm_UV_Temp
   STATE      cmd_2
   TYPE       DOIF
   VERSION    22428 2020-07-18 20:32:08
   READINGS:
     2020-07-25 13:38:41   Device          LAD7
     2020-07-20 15:00:00   cmd             2.3
     2020-07-20 15:00:00   cmd_event       timer_2
     2020-07-20 15:00:00   cmd_nr          2
     2020-07-20 15:00:00   cmd_seqnr       3
     2020-07-25 13:38:41   e_LAD7_ambientTemperature 23.5
     2020-07-25 13:29:36   e_Wetter_2_fc0_uv 5
     2020-07-19 15:22:04   mode            enabled
     2020-07-20 15:00:00   state           cmd_2
     2020-07-25 11:00:00   timer_01_c01    26.07.2020 11:00:00
     2020-07-24 15:00:00   timer_02_c02    25.07.2020 15:00:00
   Regex:
     accu:
     cond:
       LAD7:
         0:
           ambientTemperature ^LAD7$:^ambientTemperature:
         1:
           ambientTemperature ^LAD7$:^ambientTemperature:
       Wetter_2:
         0:
           fc0_uv     ^Wetter_2$:^fc0_uv:
         1:
           fc0_uv     ^Wetter_2$:^fc0_uv:
   attr:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'Wetter_2','fc0_uv') >= 6 and ::ReadingValDoIf($hash,'LAD7','ambientTemperature') >= 22
     1          ::DOIF_time_once($hash,1,$wday) and (::ReadingValDoIf($hash,'Wetter_2','fc0_uv') >= 6 or ::ReadingValDoIf($hash,'LAD7','ambientTemperature') >= 26)
   days:
   do:
     0:
       0          set Rollladen_.*_S$ zu
       1          set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
     1:
       0          set Rollladen_.*_S$ zu
       1          set Rollladen_.*_W$ zu
       2          set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
     2:
   helper:
     DEVFILTER  ^global$|^Wetter_2$|^LAD7$
     NOTIFYDEV  global|Wetter_2|LAD7
     event      heatPumpElectricalPowerEstimated: 0,opStateHeatPump1: Wärmepumpe steht,opStateHeatPump2: seit 03:54:28,opStateHeatPump3: Keine Anforderung,opModeHotWater: Automatik,opStateHotWater: Temp. OK,opModeHeating: Automatik,opStateHeating: Heizgrenze (Soll 15.0°C),deviceTimeCalc: 2020-07-25 14:20:07,delayDeviceTimeCalc: -2485,durationFetchReadings: 0.020,ambientTemperature: 23.5,averageAmbientTemperature: 18.9,heatingLimit: on,thresholdHeatingLimit: 14.0,thresholdTemperatureSetBack: -20.0,heatingCurveEndPoint: 35.0,heatingCurveOffset: 21.0,hotWaterTemperature: 46.9,hotWaterTemperatureTarget: 46.5,flowTemperature: 29.1,returnTemperature: 26.8,returnTemperatureTarget: 15.0,returnTemperatureHyst: 4.0,returnTemperatureSetBack: 0.0,returnTemperatureExtern: 28.5,heatSourceIN: 21.9,heatSourceOUT: -50.0,heatSourceMotor: off,compressor1: off,hotGasTemperature: 32.4,mixer1FlowTemperature: 27.5,mixer1TargetTemperature: 20.0,counterHours2ndHeatSource1: 451.5,counterHoursHeatPump: 8698.9,counterHoursHeating: 5764.7,counterHoursHotWater: 2932.8,counterHeatQHeating: 21408.3,counterHeatQHotWater: 25632.5,counterHeatQTotal: 47040.8,heatingSystemCircPump: off,hotWaterCircPumpExtern: off,hotWaterSwitchingValve: off,solarPump: off,2ndHeatSource1: off,hotWaterCircPumpDeaerate: off,heatingSystemCircPumpDeaerate: off,bivalentLevel: 1,firmware: V2.79,typeHeatpump: LD7,typeSerial: 2309/11-282,solarCollectorTemperature: 25.1,solarBufferTemperature: 27.3,Wärmepumpe steht seit 03:54:28 - Keine Anforderung
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev LAD7
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       heatPumpElectricalPowerEstimated: 0
       opStateHeatPump1: Wärmepumpe steht
       opStateHeatPump2: seit 03:54:28
       opStateHeatPump3: Keine Anforderung
       opModeHotWater: Automatik
       opStateHotWater: Temp. OK
       opModeHeating: Automatik
       opStateHeating: Heizgrenze (Soll 15.0°C)
       deviceTimeCalc: 2020-07-25 14:20:07
       delayDeviceTimeCalc: -2485
       durationFetchReadings: 0.020
       ambientTemperature: 23.5
       averageAmbientTemperature: 18.9
       heatingLimit: on
       thresholdHeatingLimit: 14.0
       thresholdTemperatureSetBack: -20.0
       heatingCurveEndPoint: 35.0
       heatingCurveOffset: 21.0
       hotWaterTemperature: 46.9
       hotWaterTemperatureTarget: 46.5
       flowTemperature: 29.1
       returnTemperature: 26.8
       returnTemperatureTarget: 15.0
       returnTemperatureHyst: 4.0
       returnTemperatureSetBack: 0.0
       returnTemperatureExtern: 28.5
       heatSourceIN: 21.9
       heatSourceOUT: -50.0
       heatSourceMotor: off
       compressor1: off
       hotGasTemperature: 32.4
       mixer1FlowTemperature: 27.5
       mixer1TargetTemperature: 20.0
       counterHours2ndHeatSource1: 451.5
       counterHoursHeatPump: 8698.9
       counterHoursHeating: 5764.7
       counterHoursHotWater: 2932.8
       counterHeatQHeating: 21408.3
       counterHeatQHotWater: 25632.5
       counterHeatQTotal: 47040.8
       heatingSystemCircPump: off
       hotWaterCircPumpExtern: off
       hotWaterSwitchingValve: off
       solarPump: off
       2ndHeatSource1: off
       hotWaterCircPumpDeaerate: off
       heatingSystemCircPumpDeaerate: off
       bivalentLevel: 1
       firmware: V2.79
       typeHeatpump: LD7
       typeSerial: 2309/11-282
       solarCollectorTemperature: 25.1
       solarBufferTemperature: 27.3
       Wärmepumpe steht seit 03:54:28 - Keine Anforderung
     triggerEventsState:
       heatPumpElectricalPowerEstimated: 0
       opStateHeatPump1: Wärmepumpe steht
       opStateHeatPump2: seit 03:54:28
       opStateHeatPump3: Keine Anforderung
       opModeHotWater: Automatik
       opStateHotWater: Temp. OK
       opModeHeating: Automatik
       opStateHeating: Heizgrenze (Soll 15.0°C)
       deviceTimeCalc: 2020-07-25 14:20:07
       delayDeviceTimeCalc: -2485
       durationFetchReadings: 0.020
       ambientTemperature: 23.5
       averageAmbientTemperature: 18.9
       heatingLimit: on
       thresholdHeatingLimit: 14.0
       thresholdTemperatureSetBack: -20.0
       heatingCurveEndPoint: 35.0
       heatingCurveOffset: 21.0
       hotWaterTemperature: 46.9
       hotWaterTemperatureTarget: 46.5
       flowTemperature: 29.1
       returnTemperature: 26.8
       returnTemperatureTarget: 15.0
       returnTemperatureHyst: 4.0
       returnTemperatureSetBack: 0.0
       returnTemperatureExtern: 28.5
       heatSourceIN: 21.9
       heatSourceOUT: -50.0
       heatSourceMotor: off
       compressor1: off
       hotGasTemperature: 32.4
       mixer1FlowTemperature: 27.5
       mixer1TargetTemperature: 20.0
       counterHours2ndHeatSource1: 451.5
       counterHoursHeatPump: 8698.9
       counterHoursHeating: 5764.7
       counterHoursHotWater: 2932.8
       counterHeatQHeating: 21408.3
       counterHeatQHotWater: 25632.5
       counterHeatQTotal: 47040.8
       heatingSystemCircPump: off
       hotWaterCircPumpExtern: off
       hotWaterSwitchingValve: off
       solarPump: off
       2ndHeatSource1: off
       hotWaterCircPumpDeaerate: off
       heatingSystemCircPumpDeaerate: off
       bivalentLevel: 1
       firmware: V2.79
       typeHeatpump: LD7
       typeSerial: 2309/11-282
       solarCollectorTemperature: 25.1
       solarBufferTemperature: 27.3
       state: Wärmepumpe steht seit 03:54:28 - Keine Anforderung
   internals:
   interval:
   intervalfunc:
   localtime:
     0          1595754000
     1          1595682000
   perlblock:
   readings:
     all         Wetter_2:fc0_uv LAD7:ambientTemperature
   realtime:
     0          11:00:00
     1          15:00:00
   time:
     0          11:00:00
     1          15:00:00
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   trigger:
   triggertime:
     1595682000:
       localtime  1595682000
       hash:
     1595754000:
       localtime  1595754000
       hash:
   uiTable:
Attributes:
   devStateIcon cmd_1:FS20.on cmd_2:FS20.off
   room       ALARM,FENSTER_TÜREN
   verbose    5


Das mit der Redundanz könnte evtl. sein... aber meine Überlegung war... wenn morgens um 11 schon zuviel UV UND eine gewisse Temperatur erreicht ist, dann Jalousien zu. (Das funktioniert alleine auch und DOIF deswegen weil nur einmal am Tag notwendig)
Wenn das nicht so ist, dann wollt ich halt um 15 Uhr nochmal überprüfen, da würde es aber schon reichen, wenn UV ODER Temperatur die Werte erreicht haben...

Mhhh

Sany

Hallo Fireball,

es fehlt das attribut do always. Laut dem list von deinem DOIF steht es auf cmd_2, und selbst wenn die Bedingungen am nächsten Tag um 15:00Uhr neu zutreffen wird sich nichts ändern. Ansonsten sind die Klammern so richtig. Wenn es wieder nicht schaltet dann liegt es eher an den Daten, die triggern sollen. Lass da mal den EventMonitor auf die beiden Devices mitlaufen, da sieht man das recht einfach.
Weiterhin würde ich Dir empfehlen:
- übersichtlicher schreiben, z.B. so:
([11:00] and [Wetter_2:fc0_uv] >= 6 and [LAD7:ambientTemperature] >= 22)
   (set Rollladen_.*_S$ zu)
   (set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]")
DOELSEIF
([15:00] and ([Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 26))
    (set Rollladen_.*_S$ zu)
    (set Rollladen_.*_W$ zu)
    (set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]")

ist leserlicher (...und nur 1 Vorschlag).

- Du kannst die Angaben im Ausführungsteil statt in eigene Klammern zu setzen mit Komma trennen, um das DOIF ressourcenschonender zu gestalten, außer Du möchtest da mit wait noch Verzögerungen einbauen.

- im Moment triggern alle Bedingungen, also jedesmal, wenn sich in den Devices Wetter_2 oder LAD7 etwas ändert, wird das DOIF getriggert. Du möchtest aber nur um 11:00 und um 15:00 schauen, wie die Werte der beiden Geräte sind, also genügt die Zeit als Trigger. Einfach ein ? bei den Devices eintragen, dann triggern diese nicht mehr [?Wetter_2:fc0_uv] und [?LAD7:ambientTemperature]


Viel Erfolg!

Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

fireball

#25
Hi, danke für die Tipps,
ja überschaubarer Code ist ne feine Sache und da steh ich eigentlich total drauf... in zwei drei Jahren fragt man sich nämlich wieder, warum hat man das gebaut oder wozu...

Gibts eigentlich ein Attribut "INFO" oder "Description", wo man freitext eingeben kann, damit man seine Fhem besser dokumentieren kann?

Also.. ich habs jetzt so umgestellt:


([11:00] and [?Wetter_2:fc0_uv] >= 6 and [?LAD7:ambientTemperature] >= 22) (
       set Rollladen_.*_S$ zu,
       set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
)
DOELSEIF
([15:00] and ([?Wetter_2:fc0_uv] >= 6 or [?LAD7:ambientTemperature] >= 26)) (
       set Rollladen_.*_S$ zu,
       set Rollladen_.*_W$ zu,
       set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
)


Sieht bedeutend besser aus...

Hab zwei neue Sachen dazu gelernt...
- Ressourcensparender zu Arbeiten...
- die ? kannte ich noch nicht, habe jetzt auf den RP4 gewechselt... damit das mit den Ressourcen auf dauer keine Probleme macht... daher wäre mir das fast egal gewesen, aber gut zu wissen.

Dann schau ich mal wie sich das DOIF nächste Woche verhält.
VG
René



PS: habs grad gefunden:
Zitatcomment

Hält einen freien Kommentar für das Gerät verfügbar

Sany

Zitat- die ? kannte ich noch nicht, habe jetzt auf den RP4 gewechselt... damit das mit den Ressourcen auf dauer keine Probleme macht... daher wäre mir das fast egal gewesen, aber gut zu wissen.

gucksu hier: https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger
nicht alles muss das DOIF triggern. Denn auch DOIF erzeugt seinerseits Events beim abarbeiten.

...und hier: https://fhem.de/commandref_DE.html#DOIF_wait
ist das mit den Klammern oder nicht beschrieben.

Zwar kommt der Hinweis auf die commandref recht häufig, oft auch als einziger (und damit nahezu überflüssiger) Hinweis, aber es empfiehlt sich doch immer wieder die commandref zu DOIF zu durchforsten, wenn etwas nicht geht. Die ist echt lang, weil DOIF so viel kann, es steht auch alles nur recht kurz beschrieben darin, aber es steht alles drin! Wären die Erklärungen und Beispiele ausführlicher, wäre der Text noch länger. Und wenn etwas nicht drinsteht kann man ja auch mal rumprobieren...

Gruß

Sany

P.S. das mit der Übersichtlichkeit steht auch so drin!
P.P.S. comment hast du ja gefunden, im DOIF kannst Du auch am Ende einer Zeile ## und dann dein text eintippen (alles ab ## wird ignoriert)
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

fireball

Puhhh, also ich erwische mich immer wieder, mit dem DOIF, notify usw... irgendwo hab ich immer einen Klemmer, aber glaub mir... ich bin, bevor ich hier was poste, immer stundenlang auf der Suche...

Jetzt wollte ich mein DOIF auf zwei Zeiträume umstellen...

([11:00]-[13:29] and [?Wetter_2:fc0_uv] >= 6 and [LAD7:ambientTemperature] >= 20) (
       set Rollladen_.*_S$ zu,
       set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
)
DOELSEIF
([13:30]-[15:00] and ([?Wetter_2:fc0_uv] >= 6 or [LAD7:ambientTemperature] >= 25)) (
       set Rollladen_.*_S$ zu,
       set Rollladen_.*_W$ zu,
       set Meine_TGBot message "UV-Werte und Temperatur übersteigen Grenzwerte. Ich schließe die Jalousien im Süden und Westen. UV=[Wetter_2:fc0_uv], TEMP=[LAD7:ambientTemperature]"
)


Irgendwie triggert er jetzt aber durch das doalways immerzu...

Was will ich denn erreichen... also eigentlich will ich nicht mehr nur zum Zeitpunkt X umstellen, sondern quasi beim Erreichen der UV/Tempwerte soll geschaltet werden...
Aber wenn ein Zustand greift, dann bleibt DOIF ja da drin... durch doalways, triggert er immerzu...

Ich steh grad aufen Schlauch, denke über ein notify nach, aber das löst mir ja auch nicht, das es nur einmal schalten soll... (pro Tag)

....
VG
René

Ellert

Lösche das Attribut do
und setze das DOIF um 0 Uhr zurück, dann wird jeder Zweig nur einmal pro Tag ausgeführt.

DOELSEIF ([00:00])


fireball

Danke, cool... dann wäre auch ein
DOELSE am Ende ohne etwas richtig?! Das mache ich bei einigen anderen DOIFs...
VG
René