Hauptmenü

DOIF Verständnisfrage

Begonnen von satprofi, 06 Januar 2024, 10:01:33

Vorheriges Thema - Nächstes Thema

satprofi

Hallo.
Möchte gerne etwas schalten wenn zustand kleiner als "lock_5" ist.
Und erst dann abschalten wenn Zustand grösser als "lock_5" ist.

DEF        (([lock_1] - [lock_2]) >3 and [lock_3] < [lock_4]
  or (([lock_1] - [lock_2]) <3 and [lock_5] <20)) (set test_3 on)
DOELSEIF (([lock_3] < [lock_1] and [lock_3] > [lock_4])
  or (([lock_1] - [lock_2]) <3 and [lock_5] >50)
  or [lock_3] < [lock_6]) (set test_3 off)
DOELSE


Die erste Funktion passt , aber sobald sich der mindestwert ändert schaltet sich cmd1 aus.
warum? müsste doch auf >50 warten. oder?

Internals:
   DEF        (([lock_1] - [lock_2]) >3 and [lock_3] < [lock_4]
  or (([lock_1] - [lock_2]) <3 and [lock_5] <20)) (set test_3 on)
DOELSEIF (([lock_3] < [lock_1] and [lock_3] > [lock_4])
  or (([lock_1] - [lock_2]) <3 and [lock_5] >50)
  or [lock_3] < [lock_6]) (set test_3 off)
DOELSE






   NAME       DI_test
   NR         136
   NTFY_ORDER 50-DI_test
   STATE      off
   TYPE       DOIF
   READINGS:
     2024-01-06 09:51:49   Device          lock_2
     2024-01-06 09:51:49   cmd             2
     2024-01-06 09:51:49   cmd_event       lock_2
     2024-01-06 09:51:49   cmd_nr          2
     2024-01-06 09:51:49   e_lock_2_STATE  97
     2024-01-06 09:51:25   mode            enabled
     2024-01-06 09:51:49   state           off
   Regex:
   condition:
     0          (InternalDoIf($hash,'lock_1','STATE') - InternalDoIf($hash,'lock_2','STATE')) >3 and InternalDoIf($hash,'lock_3','STATE') < InternalDoIf($hash,'lock_4','STATE')    or ((InternalDoIf($hash,'lock_1','STATE') - InternalDoIf($hash,'lock_2','STATE')) <3 and InternalDoIf($hash,'lock_5','STATE') <20)
     1          (InternalDoIf($hash,'lock_3','STATE') < InternalDoIf($hash,'lock_1','STATE') and InternalDoIf($hash,'lock_3','STATE') > InternalDoIf($hash,'lock_4','STATE'))   or ((InternalDoIf($hash,'lock_1','STATE') - InternalDoIf($hash,'lock_2','STATE')) <3 and InternalDoIf($hash,'lock_5','STATE') >50)   or InternalDoIf($hash,'lock_3','STATE') < InternalDoIf($hash,'lock_6','STATE')
   devices:
     0           lock_1 lock_2 lock_3 lock_4 lock_5
     1           lock_3 lock_1 lock_4 lock_2 lock_5 lock_6
     all         lock_1 lock_2 lock_3 lock_4 lock_5 lock_6
   do:
     0:
       0          set test_3 on
     1:
       0          set test_3 off
     2:
       0
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      97
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   lock_2
     timerevent 97
     triggerDev lock_2
     timerevents:
       97
     timereventsState:
       state: 97
     triggerEvents:
       97
     triggerEventsState:
       state: 97
   internals:
     0           lock_1:STATE lock_2:STATE lock_3:STATE lock_4:STATE lock_5:STATE
     1           lock_3:STATE lock_1:STATE lock_4:STATE lock_2:STATE lock_5:STATE lock_6:STATE
     all         lock_1:STATE lock_2:STATE lock_3:STATE lock_4:STATE lock_5:STATE lock_6:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   on|off|3
   room       dummy,test
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Per

Wegen des DOELSE. Trifft keine der Bedingungen zu, tritt "ansonsten" in Kraft.

satprofi

Zitat von: Per am 06 Januar 2024, 10:28:20Wegen des DOELSE. Trifft keine der Bedingungen zu, tritt "ansonsten" in Kraft.

Hallo.
Nein, cmd2 schlägt zu. lock_5 mit 21 genügt. warum aber? soll doch erst >50 zuschlagen.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Per

Du hast 3 durch or verbundene Terme, einer reicht, es muss nicht der mit Lock_5 sein.

satprofi

glaube Lösung gefunden

DEF        (([lock_1] - [lock_2]) >3 and [lock_3] < [lock_4]
  or (([lock_1] - [lock_2]) <3 and [lock_5] <20)) (set test_3 on)
DOELSEIF (([lock_3] < [lock_1] and [lock_3] > [lock_4])
  or [lock_3] < [lock_6]) (set test_3 off)
DOELSEIF ([lock_1] - [lock_2] <3 and [lock_5] >50) (set test_3 off)
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Per

Das wird außer dir keiner beurteilen können, denn deine "Prosa" entspricht nicht annähernd dem Code und die Namen der Variablen sind nicht sprechend. Aber wenn es passt, dann ist es ok.

satprofi

#6
sooo, jetzt passt das ganze.
Hintergrund:
Wenn Strompreis gewissen Wert hat und mind. 3cent Unterschied als soll geschalten werden. Wenn aber Akku unter definiertem-SOC gefallen ist, und der Strompreis weniger als 3 cent Unterschied hat, soll nachgeladen werden bis zu 50%.
dürfte so klappen.
minimum = Ø mindestpreis + mittlerer Preis
mindest = minimum heute/morgen
Durchschnitt = mittlerer Preis

((([Strompreis:minimum] - [Strompreis:min]) >3 and [Strompreis:now] < ([Strompreis:minimum] and [mindest]))
   or ([Strompreis:minimum] - [Strompreis:min] <3 and [PylonTech_mSOC] <19 and [Strompreis:now] < [mindest])) (set Strom_billig on,set laden_billig on)
DOELSEIF ((([Strompreis:minimum] - [Strompreis:min]) <3 and [Strompreis:now] < ([Strompreis:minimum] and [mindest]))
   or (([Strompreis:now] > [Strompreis:minimum] or [Strompreis:now] > [mindest]) and [Strompreis:now] < [Strompreis:Durchschnitt])) (set Strom_billig on,set laden_billig off)
DOELSEIF (([Strompreis:minimum] - [Strompreis:min]) <3 and [PylonTech_mSOC] >50) (set Strom_billig on, set laden_billig off)
DOELSEIF ([Strompreis:now] > [mindest]) (set Strom_billig off, set laden_billig off)


bin so nicht der Meister im DOIF, ginge evt. spärlicher.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

[Strompreis:now] < ([Strompreis:minimum] and [mindest])
diese Angabe macht in der Informatik keinen richtigen Sinn, du meinst vermutlich das hier:

[Strompreis:now] < [Strompreis:minimum] and [Strompreis:now] < [mindest]
vielleicht aber mit oder statt mit and.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF