[gelöst] DOIF immer noch Probleme

Begonnen von Aladin222, 18 Januar 2016, 12:04:00

Vorheriges Thema - Nächstes Thema

Aladin222

Hi @all,

ich habe immer noch Probleme mit meiner Lichtsteuerung vom Aquarium :-(
Im großen und ganzen funktioniert es , aber leider gibt es sporadisch immer mal wieder Probleme und es wird falsch geschaltet !

Geschaltet werden zwei verschiedene Beleuchtungen ( TAG & MOND ) zu verschieden Tageszeiten .
Als weitere Bedingung habe ich einen dummy ( Automatik AN/AUS ).

define Aq_Tageslicht DOIF ([10:00-14:00] and [AQ_LichtAuto] eq "on" or [17:00-21:00] and [AQ_LichtAuto] eq "on") (set HM_AqLicht_Tag on) DOELSE (set HM_AqLicht_Tag off)
attr Aq_Tageslicht do always
define Aq_Mondlicht DOIF ([09:00-10:01] and [AQ_LichtAuto] eq "on" or [20:59-22:00] and [AQ_LichtAuto] eq "on") (set HM_AqLicht_Mond on) DOELSE (set HM_AqLicht_Mond off)
attr Aq_Mondlicht do always



heute passierte es wieder einmal, das Mondlicht schaltete ganz normal ( von 9:00 - 10:01 ) aber dann als das Tageslicht angehen sollte lieferte das DOIF ein :

CUL_HM set HM_AqLicht_Tag off

obwohl es ein  CUL_HM set HM_AqLicht_Tag on geben müsste :-(

Logfile:

2016.01.18 09:00:00 3: CUL_HM set HM_AqLicht_Mond on
2016.01.18 10:00:00 3: CUL_HM set HM_AqLicht_Tag off
2016.01.18 10:01:00 3: CUL_HM set HM_AqLicht_Mond off


jemand von Euch ne Idee das besser bzw sicherer zu lösen ?

 

Otto123

Keine Ahnung ob das was mit der Rangfolge zu tun hat:
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)

aber ich würde den Ausdruck mal sicherheitshalber klammern und vereinfachen:
(([10:00-14:00] or [17:00-21:00]) and ([AQ_LichtAuto] eq "on"))

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

Aladin222

#2
Danke Otto ,

für deine Rückmeldung !
So ganz verstanden hab ich es aber nicht :-) baue es aber mal so ein und beobachte dann das verhalten  ;D

grüße

Aladin222

(edit)

sorry , ja klar das mit dem vereinfachen ist soweit klar - hab ich nun auch umgesetzt , aber das sollte doch am eigentlichen ausführen des DOIF nix ändern , oder ?
Was meinst du mit Rangfolge ? stehe da auf dem Schlauch :-(

Otto123

#3
Naja Du willst doch:
Zeitbereich1 oder Zeitbereich2 und nur wenn dein Dummy an ist. Also haben wir drei Zustandsvariable mit jeweils 2 Zuständen
Das Ergebnis ist durch die Prio von 'and' schon anders wenn man klammert:

Z1 Z2 DO    | Z1 or (Z2 and D0)  | (Z1 or Z2) and D0  | (Z1 and DO) or (Z2 and DO)
0  0  0    |    0      0 = 0    |    0      0 = 0    |    0      0 = 0
0  0  1    |    0      0 = 0    |    0      0 = 0    |    0      0 = 0
0  1  0    |    0      0 = 0    |    1      0 = 0    |    0      0 = 0
0  1  1    |    0      1 = 1    |    1      1 = 1    |    0      1 = 1
1  0  0    |    1      0 = 1    |    1      0 = 0    |    0      0 = 0
1  0  1    |    1      0 = 1    |    1      1 = 1    |    1      0 = 1
1  1  0    |    1      0 = 1    |    1      0 = 0    |    0      0 = 0
1  1  1    |    1      1 = 1    |    1      1 = 1    |    1      1 = 1

Ich weiß der letzte kommt eigentlich nicht vor, da Deine Zeiten nicht überlappen.

Keine Ahnung ob jetzt noch was von Links nach rechts oder rechts nach links abgearbeitet wird.
Eigentlich hast Du es schon richtig geschrieben. das Ergebnis ist  mit meiner Klammer gleich, mein Ausdruck ist kürzer 8)
Der erste Teil  zeigt aber, dass das auch schief gehen kann. Deswegen setze ich lieber Klammern.

Edit

Naja Rangfolge: zuerst kommt 'and' und dann 'or'.  Aber bei "and or and" dem 'eq' dazwischen - wäre ich mir nicht sicher.

Keine Ahnung ob es wirklich was anderes ist. Hoffentlich habe ich mich jetzt nicht selbst verzettelt  ???
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

Aladin222

Danke Otto ,

Ok das ( hoffe ich ) habe ich soweit verstanden  ;D
Sollte es nun trotzdem noch zu Fehlern kommen , werde ich den dummy anders nutzen und mal versuchen damit das DOIF zu enablen/disablen ... müsste ja den gleichen Effekt haben ...

Aber vielen Dank für deine Mühe

Dietmar63

alle in DOIF angegeben Ereignisse laufen durch
sub
DOIF_Notify($$)
{

oder besser gesagt, alle geänderten Readings werden über die obige Funktion allen DOIF gemeldet.
In DOIF_Notify($$) wird dann geprüft, ob die Änderung des Readings für das aktuelle Reading relevant ist.

Da die Logik mit Klammerung und AND, OR und ... in DOIF selbst gebastelt ist, gelten die Standardreihenfolgen aus Perl und anderen Programmiersprachen wahrscheinlich nicht. Dazu müsste man einen echten Parser mit Grammatik bauen - kompliziert, nur für (gute) Informatiker. Klammerung ist deshalb wahrscheinlich unbedingt notwenig.
Leider kann man in DOIF kein Logging einschalten und prüfen was so an Ereignissen ankommt und wie es dann ausgewertet wird.   

Ich habe mir am Anfang von notify folgendes eingebaut:

sub ..._notify($$) {
  my ($ziele, $quelle) = @_;
 
  my $events = deviceEvents($quelle,1);
  Log 3, $quelle->{NAME} . " ---> " . $ziele->{NAME} . " >>>>>>> " . join(" ", @{$events});


Damit kann man schon einmal sehen, welche events beispielsweise in welchem notify ankommen.

@Damian:
vielleicht kannst du ja nachholen Logging einzubauen, dann finden die Nutzer von DOIF viele Dinge vielleicht selbst heraus.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Damian

#7
Zitat von: Dietmar63 am 18 Januar 2016, 21:35:51
Da die Logik mit Klammerung und AND, OR und ... in DOIF selbst gebastelt ist, gelten die Standardreihenfolgen aus Perl und anderen Programmiersprachen wahrscheinlich nicht.

Doch. and, or und alle anderen Operatoren sind nicht vom DOIF-Modul, sondern von Perl, daher gelten alle Regeln von Perl. Die von Otto gepostete Rangstufe gilt also vollständig für eine DOIF-Bedingung, denn der Ausdruck wird nur über einen Preprozessor aufbereitet, die eigentliche Auswertung des Ausdrucks geschieht über Perl-eval-Funktion.

Alle wichtigen Ereignisse, die das jeweilige Modul betreffen, findet man in dazugehörigen Readings des Moduls, weitere Informationen zur Auswertung kann man über list des jeweiligen Moduls relativ gut nachvollziehen.

Gruß

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

Aladin222

Hmmmm, sorry ,bin gerade auf Nachtschicht und kann deshalb nichts großes testen :-(
Aber, leider hat das Aquarium Mondlicht gerade wieder fehlerhaft geschaltet ,snief .
Es hätte um 20:59 einschalten müssen - hat funktioniert ! Und um 22:00 ausschalten müssen ,im Logfile sehe ich aber das DOIF einen weiteres ON geschickt hat :-(
Mondlicht blieb also an !!!

Ich habe die gekürzte Form von Otto übernommen !

@Dietmar , danke für deinen Beitrag , aber auch wenn ich ihn noch so oft lese , ich verstehe es leider nicht !
Hoffe es liegt an der Nachtschicht und ich versuche es morgen Mittag nochmal aufs neue , aber ich glaube es ist ne Nummer zu hoch für mich ;-)
Kannste du mich vielleicht etwas schubsen ...

Dachte mit DOIF wäre die Aquariumbeleuchtung ganz easy zu realisieren ...

@Damian , hast du noch ne Idee wie ich das mit DOIF lösen könnte ?

Otto123

Moin,

ich sehe gerade, Du hast das attr do always gesetzt. Aus meiner Sicht ist das bei Deiner Zeitsteuerung nicht notwendig.

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

Ellert

Bist Du auf einem aktuellen Updatestand?

1. Du könntest Dein DOIF vereinfachen und etwas übersichtlicher darstellen:

DOIF (([10:00-14:00] or [17:00-21:00]) and [?AQ_LichtAuto] eq "on")
    (set HM_AqLicht_Tag on)
DOELSE
    (set HM_AqLicht_Tag off)


2. Du könntest die Ausschaltbedingung genauer beschreiben:

DOIF (([10:00-14:00] or [17:00-21:00]) and [AQ_LichtAuto] eq "on")
    (set HM_AqLicht_Tag on)
DOELSEIF (([14:00:01-16:59:59] or [21:00:01-09:59:59]) and [AQ_LichtAuto] eq "on")
    (set HM_AqLicht_Tag off)


Wenn das nicht reicht, kannst Du jeden Schaltvorgang mitloggen, z.B.

DOIF (([10:00-14:00] or [17:00-21:00]) and [AQ_LichtAuto] eq "on")
    (set HM_AqLicht_Tag on, ({Log 1, "AQ_LichtAuto ist: [AQ_LichtAuto]"}))
DOELSEIF (([14:00:01-16:59:59] or [21:00:01-09:59:59]) and [AQ_LichtAuto] eq "on")
    (set HM_AqLicht_Tag off, ({Log 1, "AQ_LichtAuto ist: [AQ_LichtAuto]"}))


Vielleicht fummelt jemand an [AQ_LichtAuto] herum oder Du hast vergessen den Dummy auf "on" zu setzen.

Aladin222

@Otto,

Hmmmm, und ich dachte gerade da brauche ich das do always !
Werde es mal rausnehmen und testen , danke  ;D

@Ellert,

Ja Fhem ist auf aktuellem Stand !
Das jemand an Aq_LichtAuto herumspielt ,kann ich definitiv ausschließen ! Den dummy habe ich nur dazugekommen um die Automatik in ganz seltenen Fällen ausschalten zu können .

Teilweise funktioniert Tagelang alles störungsfrei ,aber ab und an ist das Tag oder Mondlicht zu Zeiten an ,wo es eigentlich aus sein sollte .
Auch kommt es vor das ein Licht zur vorgegebenen Zeit nicht EIN schaltet :-)
Der dummy stand in diesen Fällen immer auf ON ( Aq_LichtAuto )

Im Logfile sehe ich dann auch, dass DOIF zur richtigen Zeit etwas tut ,nur dummerweise dann genau das falsche ,also statt ON wird ein OFF ausgeführt oder eben umgekehrt .

Werde aber Eure Vorschläge nun mal einbauen und testen ,ansonsten denke ich werde ich mal auf "at und IF " umbauen  :-[

Otto123

do always brauchst Du wenn Du keinen Zustandswechsel für DOIF hast. Du hast aber den DOELSE Zweig. Der wechselt den Zustand des DOIF und damit ist es beim nächsten Zeittrigger wieder bereit. Wenn Du DOELSE nicht hättest würde es nur einmal laufen und dann stehen bleiben.

Also so ungefähr 8)
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

Aladin222

Hi @all,

so , ich denke das Problem ist wohl gelöst ! Für Eure Tips und Hilfen hier nochmal vielen Dank ! Es lief bis heute sauber und es gab keine falschen EIN bzw AUS Schaltungen mehr  ;D

Tageslicht :

define Aq_Tageslicht DOIF (([10:00-14:00] or [17:00-21:00]) and ([AQ_LichtAuto] eq "on")) (set HM_AqLicht_Tag on) DOELSEIF (([14:00:01-16:59:59] or [21:00:01-09:59:59]) and [AQ_LichtAuto] eq "on") (set HM_AqLicht_Tag off)



Mondlicht:

define Aq_Mondlicht DOIF (([09:00-10:01] or [20:59-22:00]) and ([AQ_LichtAuto] eq "on")) (set HM_AqLicht_Mond on) DOELSEIF (([10:01:01-20:58:59] or [22:00:01-08:59:59]) and [AQ_LichtAuto] eq "on") (set HM_AqLicht_Mond off)