Wo liegt der Fehler? Kalkulation...

Begonnen von choetzu, 31 Mai 2018, 15:34:04

Vorheriges Thema - Nächstes Thema

choetzu

Hallo

ich habe folgendes DOIF


([?09:00-18:30]
and [?Abdeckung_Dummy] eq "closed"
and [?Pool_Winterzeit_Dummy] eq "off"
and (([PoolController:Pool_Aussen_Num]-[PoolController:Pool_Temp_Num]) > 0.1
or ([Netatmo_Aussen:temperature]-[PoolController:Pool_Temp_Num]) > 0.5)
and [?$SELF:cmd_nr] ne "1")
(set PoolController AUF_manuell on)
(set Pushover msg title="Pool AUF" message="Luft WÄRMER als Wasser! \n\n
Diff Palme/Wasser: [PoolController:Pool_Aussen_Num:d1]-[PoolController:Pool_Temp_Num:d1] = {([PoolController:Pool_Aussen_Num:d1]-[PoolController:Pool_Temp_Num:d1])}\n
Diff Gartenhaus/Wasser: [Netatmo_Aussen:temperature:d1]-[PoolController:Pool_Temp_Num:d1] = {([Netatmo_Aussen:temperature:d1]-[PoolController:Pool_Temp_Num:d1])}\n
Helligkeit: [Bewegungsmelder_L_Gartenhaus_XLED2:luminance]")


Die Poolabdeckung soll nur aufgehen, wenn die Temperatur vom Luftsensor Palme um min. 0.1 höher ist als das Wasser oder wenn der Luftsensor Aussen (Gartenhaus) höher ist als 0.5.. Mit einem wait 600 stelle ich sicher, dass es nicht nur kurzfristig schnell die Schwelle überschritten wurde.
Ich werde dann auch jeweils via push darüber informiert. Das klappt eigentlich soweit auch. Doch heute kam die Pushnachricht mit der Meldung und dem Temperaturunterschied. Und weder der Luftsensor Palme noch Aussen haben die Schwelle überschritten, sondern waren -1.3 und -0.5 darunter.

Warum ging die Abdeckung auf? Danke für die Hilfe.

zweite Frage: Ist es möglich ein Doif wie folgt zu machen ([16:00 - 20:00] and [Rolladen] ne "closed|stop")(set Rolladen closes)? Also closed und stop in einer Bedingung?

Lg c
Raspi3, EnOcean, Zwave, Homematic


choetzu

Raspi3, EnOcean, Zwave, Homematic

Per

Zitat von: choetzu am 31 Mai 2018, 15:34:04sondern waren -1.3 und -0.5 darunter
Auch wenn ich beim aktuellen Wetter nicht daran glaube, aber gewöhn dir doch ein Leerzeichen zwischen Minus und Wert an. Wenn du negative Werte hast, kann Perl mit "--" nix Sinnvolles anfangen.
Hast du mal geschaut, ob die gemeldeten Werte auch richtig errechnet sind?

Damian

Zitat von: choetzu am 31 Mai 2018, 20:20:01
danke ellert

so also?

[Rolladen] ne "^[closed|stop]$"

Nein, eckige Klammern haben bei Regex andere Bedeutung.
eher:
[Rolladen] ne "^(closed|stop)$"
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

turo

Ist wohl noch zu früh am Montag..

Ihr meint sicher:
[Rolladen] =~ /^(closed|stop)$/

Gruss,
Turo
3xRaspberry PI, Homematic, SELVE Rollos, 1-wire, Logitech Harmony, Alexa, Fussbodenheizung (ESP8266), Netatmo

Damian

Zitat von: turo am 04 Juni 2018, 12:27:17
Ist wohl noch zu früh am Montag..

Ihr meint sicher:
[Rolladen] =~ /^(closed|stop)$/

Gruss,
Turo

wahrscheinlich dann eher

[Rolladen] !~ /^(closed|stop)$/

oder

[Rolladen] !~ '^(closed|stop)$'

wenn Verneinung gemeint war. Doppelte Anführungszeichen funktionieren hier nicht wegen $ und ne wegen Regex sowieso nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

turo

Ups. Natürlich. Das war wohl die ursprüngliche Absicht.

Ich denke auch: Jetzt haben wir es!

Man sollte Montage einfach weglassen...

Turo
3xRaspberry PI, Homematic, SELVE Rollos, 1-wire, Logitech Harmony, Alexa, Fussbodenheizung (ESP8266), Netatmo

choetzu

#8
Zitat von: Damian am 04 Juni 2018, 12:53:18
wahrscheinlich dann eher

[Rolladen] !~ /^(closed|stop)$/

oder

[Rolladen] !~ '^(closed|stop)$'

wenn Verneinung gemeint war. Doppelte Anführungszeichen funktionieren hier nicht wegen $ und ne wegen Regex sowieso nicht.

hallo damian und turo, danke für die Hilfe. leider geht weder noch.

ich habe zu Testzwecken folgendes versucht:

([TEST] !~ /^(off|stop)$/)
(set TEST2 on)

DOELSE
(set TEST2 off)


wenn ich nun "set TEST off" mache kommt trotzdem ein on bei TEST2 an.

das gilt auch für "!~ '^(off|stop)$'"

Das komische ist, wenn ich set TEST on mache, dann geht TEST2 auf on, also cmd1. Wenn ich dann set TEST off mache, bleibt TEST2 auf on, und cmd1. Wenn ich anschliessend TEST2 auf off machen und dann set TEST off mache, geht TEST2 wieder auf on, cmd1...

war das verständlich? hoffe schon ;)


Zitat von: Per am 04 Juni 2018, 11:50:04
Auch wenn ich beim aktuellen Wetter nicht daran glaube, aber gewöhn dir doch ein Leerzeichen zwischen Minus und Wert an. Wenn du negative Werte hast, kann Perl mit "--" nix Sinnvolles anfangen.
Hast du mal geschaut, ob die gemeldeten Werte auch richtig errechnet sind?

das verstehe ich nicht ganz. Die Werte liefert -1.5 oder -0.3 werden aus der Kalkullation berechnet. Oder wo genau meinst du habe ich eine negative Zahl?
Raspi3, EnOcean, Zwave, Homematic

turo

Das muss aber eigentlich klappen... Da muss was anderes schief sein. Kannst Du mal ein list von dem DOIF posten? (Und zur Sicherheit auch von TEST und TEST2)?

Gruss,
Stefan
3xRaspberry PI, Homematic, SELVE Rollos, 1-wire, Logitech Harmony, Alexa, Fussbodenheizung (ESP8266), Netatmo

choetzu

sehr gerne, danke..

Internals:
   DEF        ([TEST] !~ '^(off|stop)$')
(set TEST2 on)

DOELSE
(set TEST2 off)

   MODEL      FHEM
   NAME       TEST_DOIF
   NR         366
   NTFY_ORDER 50-TEST_DOIF
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-06-04 18:11:48   Device          TEST
     2018-06-04 18:11:48   cmd             1
     2018-06-04 18:11:48   cmd_event       TEST
     2018-06-04 18:11:48   cmd_nr          1
     2018-06-04 18:11:48   e_TEST_STATE    Mo:18:11 off
     2018-06-04 18:05:46   mode            enabled
     2018-06-04 18:11:48   state           cmd_1
   Regex:
   condition:
     0          InternalDoIf($hash,'TEST','STATE') !~ '^(off|stop)$'
   devices:
     0           TEST
     all         TEST
   do:
     0:
       0          set TEST2 on
     1:
       0          set TEST2 off
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   TEST
     timerevent off
     triggerDev TEST
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     0           TEST:STATE
     all         TEST:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      TEST DOIF
   do         always
   group      00_Test
   icon       black/svg/flask
   room       01_Automatisierung
Raspi3, EnOcean, Zwave, Homematic

Per

Zitat von: choetzu am 04 Juni 2018, 18:08:51Wenn ich anschliessend TEST2 auf off machen und dann set TEST off mache
Das kannst du dir mit attr do always sparen.

Zitat von: choetzu am 04 Juni 2018, 18:08:51Oder wo genau meinst du habe ich eine negative Zahl?
Wie geschrieben: bei dem aktuellen Wetter eher nicht. Aber wenn PoolController:Pool_Temp_Num < 0 bekommst du nach Auflösung durch DOIF
(als Beispiel)
[PoolController:Pool_Aussen_Num:d1]-[PoolController:Pool_Temp_Num:d1]
-5--1
Und das wird nicht das von dir gewünschte Ergebnis bringen.
[PoolController:Pool_Aussen_Num:d1] - [PoolController:Pool_Temp_Num:d1]
-5 - -1
hingegen schon.

turo

ZitatDas kannst du dir mit attr do always sparen.
Ja, genau das meine ich auch. Damit ist auch klar, warum der Zustand immer auf "cmd1" bleibt. (Leider erklärt das nicht den letzten Teil Deines beschriebenen Verhaltens: "set TEST off" sollte trotzdem nicht "set TEST2 off" auslösen. War das wirklich genau so?)
Zitat[PoolController:Pool_Aussen_Num:d1]-[PoolController:Pool_Temp_Num:d1]
-5--1
Und das wird nicht das von dir gewünschte Ergebnis bringen.
Die Befürchtung teile ich nicht: Damian macht da ja keine textuelle Ersetzung und dann ein eval, sondern das wird ein Ausdruck:
ReadingValDoIf($hash,'PoolController','Pool_Aussen_Num','','d1')-ReadingValDoIf($hash,'PoolController','Pool_Temp_Num','','d1')
(kann man mit list sehen).

Und da ist es kein Problem, wenn der Wert negativ wird.

Gruss,
Turo
3xRaspberry PI, Homematic, SELVE Rollos, 1-wire, Logitech Harmony, Alexa, Fussbodenheizung (ESP8266), Netatmo

choetzu

danke damian, per und turo

Zitat
Das kannst du dir mit attr do always sparen.

Zitat
Ja, genau das meine ich auch. Damit ist auch klar, warum der Zustand immer auf "cmd1" bleibt. (Leider erklärt das nicht den letzten Teil Deines beschriebenen Verhaltens: "set TEST off" sollte trotzdem nicht "set TEST2 off" auslösen. War das wirklich genau so?

jep, das war genau so. und genau deshalb habe ich gestutzt.. ;) ohne do always gehts. Was ich aber nicht ganz verstehe, wieso er bei set TEST off nicht TEST2 auch off schaltet. Da kommt doch DOELSE zum tragen, oder etwa nicht?

Zitat
Die Befürchtung teile ich nicht: Damian macht da ja keine textuelle Ersetzung und dann ein eval, sondern das wird ein Ausdruck:
ReadingValDoIf($hash,'PoolController','Pool_Aussen_Num','','d1')-ReadingValDoIf($hash,'PoolController','Pool_Temp_Num','','d1')
(kann man mit list sehen).

danke, für die Erläuterungen. Ich habe dies auch überlegt, aber es kann gar NIE eintreffen, dass das Poolwasser in der Sommerzeit (Winterdummy = off) auf Minusgrad kommt. Ich wohne zwar in der Schweiz, aber nicht auf 4000m. ;) Im Winter hatte ich es übrigens auch noch nie 0.75 war das tiefste.. Aber danke trotzdem, ich habe da wieder was gelernt.

Ich habe bei in diesem Beitrag https://forum.fhem.de/index.php/topic,88403.msg808806.html#msg808806
[?$SELF:cmd_nr] !~ '^(1|2)$' gesetzt, da scheint es so zu funktionieren.
Raspi3, EnOcean, Zwave, Homematic