FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: sash.sc am 01 April 2016, 16:28:28

Titel: DOIF Vergleich anstellen mit Operanden
Beitrag von: sash.sc am 01 April 2016, 16:28:28
Hallo leute.

Muss mal was fragen.  Kurz vorweg, bin aus der Zeit mit Basic und den Commodore Brotkasten gross geworden.
Dort konnte man Vergleiche mit Operanden (= < > <>)  durchführen.
Im DOIF steht immer "eq"  oder "ne" oder.......
Wäre es nicht "angenehmer" mit Operanden zu arbeiten.
Dies würde vielleicht auf dem Verständnis für DOIF helfen.

Ist nur so ne Idee.

Gruß
Sascha

Gesendet von meinem SM-T560 mit Tapatalk

Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Damian am 01 April 2016, 16:37:58
Zitat von: sash.sc am 01 April 2016, 16:28:28
Hallo leute.

Muss mal was fragen.  Kurz vorweg, bin aus der Zeit mit Basic und den Commodore Brotkasten gross geworden.
Dort konnte man Vergleiche mit Operanden (= < > <>)  durchführen.
Im DOIF steht immer "eq"  oder "ne" oder.......
Wäre es nicht "angenehmer" mit Operanden zu arbeiten.
Dies würde vielleicht auf dem Verständnis für DOIF helfen.

Ist nur so ne Idee.

Gruß
Sascha

Gesendet von meinem SM-T560 mit Tapatalk


Das DOIF-Modul hat selbst keine Ahnung von Operatoren. Alle Operatoren, die man in der Bedingung angibt sind Perl-Operatoren. Hier findest du alles, was du auch beim DOIF angeben kannst:
https://wiki.selfhtml.org/wiki/Perl/Operatoren

Hier ein Auszug:

ZitatRangstufe: ++ -- (Inkrementieren, Dekrementieren)
Rangstufe: ** (Potenzierung)
Rangstufe: ! ~ (logische und bitweise Negation)
Rangstufe: =~ !~ (Bindung an reguläre Ausdrücke)
Rangstufe: * / % x (Multiplikation, Division, Modulo-Operation, Zeichenkettenwiederholung)
Rangstufe: + - . (Addition, Subtraktion, Zeichenkettenaddition)
Rangstufe: << >> (Verschieben von Bits)
Rangstufe: < > <= >= lt gt le ge (Vergleich größer/kleiner)
Rangstufe: == != <=> eq ne cmp ~~ (Gleichheit/Ungleichheit)
Rangstufe: & (bitweises UND)
Rangstufe: | ^ (bitweises ODER - inklusiv/exklusiv)
Rangstufe: && (logisches UND)
Rangstufe: || (logisches ODER)
Rangstufe: .. (Bereichsdefinition in Listen)
Rangstufe: ?: (Entweder-Oder-Bedingung)
Rangstufe: = += -= ~*= /= %= &= ^= |= (Zuweisung)
Rangstufe: , => (Aneinanderreihung)
Rangstufe: not (logische Negation)
Rangstufe: and (logisches UND)
Rangstufe: or xor (logisches ODER (inklusiv/exklusiv)

Gruß

Damian

Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: sash.sc am 01 April 2016, 16:47:25
Danke für die Antwort. Hänge wohl noch zu sehr in der Basic welt fest!
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Damian am 01 April 2016, 16:54:56
Zitat von: sash.sc am 01 April 2016, 16:47:25
Danke für die Antwort. Hänge wohl noch zu sehr in der Basic welt fest!

Wie du der Liste entnehmen kannst, kannst du ebenfalls Operatoren ><=nehmen, aber nur bei Zahlen. Bei Zeichenketten hätte auch Basic mit > Probleme bekommen ;)

Ich habe auch mal mit Basic angefangen und ich kenne auch den Brotkasten (sogar den Vorgänger vom C64). Es lohnt sich aber mal in die Feature-Liste von Perl reinzuschauen - da hat sich in den letzten 30 Jahren etwas getan.

Gruß

Damian
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: sash.sc am 01 April 2016, 17:02:29
Coole nummer, dass noch jemand den Brotkasten und seine Varianten (C16/116/plus 4/vc20/.....)kennt .
Im Basic ging das auch nur über Umwege (String umwandeln).
Werde mir die Liste mal bei Zeiten anschauen!
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: chq am 05 März 2019, 11:49:41
Nur weil es hierher passt:

Darf man gt auch in folgendem Fall verwenden, oder muss es > sein?

([speisekammerluefter:AM2301_Humidity] gt [Wetterstation:indoorHumidity])

Und gleich noch eine Frage hinterher:

Ist die folgende Abfrage aufgrund der Gänsefüßchen schlichtweg falsch?

([twilight:elevation:d1] <= "13.8")

Gruß Chris
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Otto123 am 05 März 2019, 13:09:37
Hallo Chris,
perldoc  (https://perldoc.perl.org/perlop.html#Relational%20Operators)sagt dazu
ZitatBinary "<" returns true if the left argument is numerically less than the right argument.
Binary ">" returns true if the left argument is numerically greater than the right argument.
Binary "<=" returns true if the left argument is numerically less than or equal to the right argument.
Binary ">=" returns true if the left argument is numerically greater than or equal to the right argument.
Binary "lt" returns true if the left argument is stringwise less than the right argument.
Binary "gt" returns true if the left argument is stringwise greater than the right argument.
Binary "le" returns true if the left argument is stringwise less than or equal to the right argument.
Binary "ge" returns true if the left argument is stringwise greater than or equal to the right argument.

Wobei irgendwo auch stand, dass Perl versucht immer erst mal den Ausdruck zu "interpretieren" also falls es geht wird der String auch als Zahl behandelt. Achtung, das ist eventuell gefährliches Halbwissen  ;D

Gruß Otto
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: chq am 05 März 2019, 14:17:38
Ah, ok. Jetzt wird mir einiges klarer.

Hab mir grad testweise so Mühe gegeben, die Funktion eines funktionierendes DOIFs zu stören.

Egal welche Kombination aus "mit Gänsefüßchen"/"ohne Gänsefüßchen" und "gt/>" ich gewählt habe, das DOIF hat immer funktioniert.

Kann man sagen, dass die "ausgeschriebene Schreibweise" (sprich gt, eq, lt,..) ausschließlich für Strings gilt, wenn es um Texte wie "open" usw. geht?

Angenommen folgendes Event wird erzeugt:

2019-03-05 14:15:21 HP1000 Wetterstation wind_speed: 22.7

Ist das dann ein String mit dem Inhalt 22.7?

Anders gefragt: Wann ist ein Event denn kein String?

Gruß Chris
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Otto123 am 05 März 2019, 14:37:00
Perldoc  (https://perldoc.perl.org/perldata.html#Context)sagt dazu:
ZitatAll data in Perl is a scalar, an array of scalars, or a hash of scalars. A scalar may contain one single value in any of three different flavors: a number, a string, or a reference. In general, conversion from one form to another is transparent.
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Damian am 05 März 2019, 14:59:44
Um ein wenig Klarheit in die Sache zu bringen:

Es ist ziemlich egal, ob man Zahlen in Anführungszeichen angibt oder nicht, es kommt auf den Vergleichsoperator an.

Stringvergleiche mit lt, gt, le, ge, eq, ne vergleichen lexikografisch (wie im Telefonbuch), dh.

"09"  lt  "1" ist wahr, weil Null kleiner ist als eins (Stringvergleich wegen lt)

"09" < "1" ist nicht wahr, weil die Zahl neun nicht kleiner ist als 1, hier wird intern verglichen 9 < 1 (Zahlenvergleich wegen <)

Zahlenvergleiche sollten am besten ohne Anführungszeichen gemacht werden.




Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Tueftler1983 am 03 Mai 2019, 00:12:56
hallo,
darf ich mich hier mal mir rein werfen?

ich habe dieses doif

([+30] and [Pool:Luft]>40) (set FHEMBOT message Achtung Pool Heizung zu hoch [Pool:luft_corr])
der Wert von Pool:Luft ist 11.4

und bekomme diese meldung im DOIF und log

condition c01: Argument "" isn't numeric in numeric gt (>)


wo ist da mein fehler??
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Ellert am 03 Mai 2019, 06:22:43
Du lässt zu, dass in [Pool:Luft] eine leere Zeichenkette ("") steht und das ist kein numerischer Wert. Da Du einen Vergleichsoperator für numerische Werte verwendest, erhältst Du eine Warnung. Das kannst Du abfangen mit  ...[Pool:Luft] and [Pool:Luft]>40
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Streba am 15 November 2019, 10:08:56
Sorry, dass ich mich hier mit einem anderen, aber vielleicht ähnlichen Problem einmische.
Ich habe folgendes DOIF, dass Probleme macht:


([06:00|8])
([netatmo_M02_00_00_XX_XX_XX:temperature] <= 2.0 and [netatmo_M02_00_00_XX_XX_XX:humidity] >= 88)
(set Heizluefter_Auto on)


"netatmo_M02_00_00_XX_XX_XX:temperature" hat einen Wert von 3.3

Dies führt bei mir zu der Fehlermeldung:  di_Heizluefter_Auto_ein: 3.3 <= 2.0 and 92 >= 88: Unknown command 3.3, try help.

Ich bin leider noch immer blutiger Anfänger. Weshalb wird der gelieferte Wert aus dem Reading offenbar als Befehl interpretiert?

Vielen Dank vorab für Eure Hilfe!
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Frank_Huber am 15 November 2019, 10:14:52
poste doch mal bitte ein komplettes list des DOIF im Fehlerstatus.
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: yersinia am 15 November 2019, 10:16:39
Für mich sieht das nach einem Klamemrproblem aus; du scheinst den Befehlsteil bereits in der ersten Zeile (nach dem ([06:00|8])) beendet zu haben. Versuche mal sowas:
(([06:00|8])
       and ([netatmo_M02_00_00_XX_XX_XX:temperature] <= 2.0)
       and ([netatmo_M02_00_00_XX_XX_XX:humidity] >= 88))
(set Heizluefter_Auto on)
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Streba am 15 November 2019, 11:50:11
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!
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 23 Juli 2020, 18:20:47
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Tueftler1983 am 23 Juli 2020, 19:04:14
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Otto123 am 23 Juli 2020, 21:07:05
(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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Tueftler1983 am 23 Juli 2020, 21:39:20
Ahh okay so war es, wußte doch das man es mit den Klammern definiert!
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 23 Juli 2020, 21:56:31
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 (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é
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 25 Juli 2020, 13:28:03
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é
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Otto123 am 25 Juli 2020, 13:35:41
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 25 Juli 2020, 13:44:12
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Sany am 26 Juli 2020, 10:06:45
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 26 Juli 2020, 12:48:08
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
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Sany am 26 Juli 2020, 15:30:18
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 (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 (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)
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 14 August 2020, 16:49:03
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é
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Ellert am 14 August 2020, 18:37:04
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])

Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 14 August 2020, 20:06:04
Danke, cool... dann wäre auch ein
DOELSE am Ende ohne etwas richtig?! Das mache ich bei einigen anderen DOIFs...
VG
René
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Ellert am 15 August 2020, 19:54:08
Ja, wenn das dadurch Möglicherweise andere Verhalten, für Dich o.k. ist.
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: fireball am 15 August 2020, 20:11:29
Was meinst du?
Titel: Antw:DOIF Vergleich anstellen mit Operanden
Beitrag von: Ellert am 16 August 2020, 10:16:12
Ich meine, wenn ein Reset bei DOELSE durchgeführt wird, statt bei [00:00].