[gelöst] Logic-Fehler in der If Verknüpfung

Begonnen von Schlafsack, 11 Dezember 2022, 18:04:36

Vorheriges Thema - Nächstes Thema

Schlafsack

Hallo, irgendwie finde ich meinen Fehler nicht. Das Eingangstor soll nur entweder durch "Eingangstor_Taster" oder durch die Zeit geschalten werden, wenn die Bedingungen erfüllt sind.
Leider wird das Tor im Moment zu jeder Zeit getriggert

"Eingangstor:POWER3" = Rückmeldung ob Tor offen ist damit falls das Tor schon offen ist nicht nocheinmal schaltet


defmod V_Eingangstor_Taster DOIF {\
  if\
    (([Eingangstor_Taster] eq "an")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Fruehschicht" && [?Eingangstor:POWER3] eq "off" && ([05:20] || [14:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Fruehschicht" && [05:40] && [?Eingangstor:POWER3] eq "on")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Spaetschicht"  && [?Eingangstor:POWER3] eq "off" && ([13:20] || [22:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Spaetschicht" && [13:40] && [?Eingangstor:POWER3] eq "on")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Nachtschicht" && [?Eingangstor:POWER3] eq "off" && ([21:20] || [06:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Nachtschicht" && [?Eingangstor:POWER3] eq "on" && [21:40]))\
      {fhem_set("Eingangstor_Taster on-for-timer 3")};;;;\
  {fhem"set Eingangstoransteuerung on-for-timer 2"}\
}
attr V_Eingangstor_Taster devStateIcon .*:edit_settings
attr V_Eingangstor_Taster group Eingangstor
attr V_Eingangstor_Taster icon edit_settings
attr V_Eingangstor_Taster room Verknüpfungen



DUMMY EINGANGSTOR


defmod Automatik_Eingangstor dummy
attr Automatik_Eingangstor devStateIcon an:general_an@darkgreen aus:control_x@#DB0000
attr Automatik_Eingangstor devStateStyle style="text-align:left";;;;"
attr Automatik_Eingangstor eventMap on:an off:aus
attr Automatik_Eingangstor group Status
attr Automatik_Eingangstor room Startseite
attr Automatik_Eingangstor setList on off
attr Automatik_Eingangstor webCmd :


DUMMY TASTER


defmod Eingangstor_Taster dummy
attr Eingangstor_Taster devStateIcon an:audio_play@darkgreen aus:general_aus
attr Eingangstor_Taster devStateStyle style="text-align:left";;;;"
attr Eingangstor_Taster eventMap on:an off:aus
attr Eingangstor_Taster group Eingangstor
attr Eingangstor_Taster icon taster
attr Eingangstor_Taster room Garage
attr Eingangstor_Taster setList on off
attr Eingangstor_Taster useSetExtensions 1
attr Eingangstor_Taster webCmd :

setstate Eingangstor_Taster aus
[code]


DUMMY KALENDER_SCHICHT

[code]
defmod Kalender_Schicht dummy
attr Kalender_Schicht devStateIcon .*:15px-blank
attr Kalender_Schicht group Kalender
attr Kalender_Schicht icon time_calendar
attr Kalender_Schicht room Verknüpfungen
attr Kalender_Schicht setList state:Fruehschicht,Spaetschicht,Nachtschicht,Frei,Urlaub,Feierabend
attr Kalender_Schicht webCmd state

setstate Kalender_Schicht Frei

Damian

Diese Anweisung:

{fhem"set Eingangstoransteuerung on-for-timer 2"}

steht außerhalb der if-Anweisung, daher wird sie immer ausgeführt.

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

Otto123

#2
Von mir wieder mal der Hinweis: Du redest über "DERL" - also DOIF im Perlmodus ;) - das ist mMn am Besten im DOIF Board aufgehoben!
es lohnt sich auch die angepinnten Beiträge in den Boards zu lesen: Wozu ist dieses Board usw.

Schau mal bei Deinen Dummies in die Hilfe (die kommt automatisch als Spickzettel wenn man das Attribute auswählt) :
devStateStyle
Für ein best. Gerät einen best. HTML-Style benutzen. Beispiel:
attr sensor devStateStyle style="text-align:left;;font-weight:bold;;"

Und vergleiche mit dem was Du draus gemacht hast  ::)
Zitatattr Automatik_Eingangstor devStateStyle style="text-align:left";;;;"
besser: laut Doku
attr Automatik_Eingangstor devStateStyle style="text-align:left;;"

Wenn in der Raw Definition 4 mal ; zu sehen ist sollte eine Glocke angehen! Meistens ist es unnütz doppelt so viele ;;;; zu schreiben, zwei genügen in der Raw Definition (meistens).

Warum einmal die (DOIF) Funktion fhem_set() und einmal die allgemeine Funktion fhem()?
Um einzelne Perl Befehle braucht es hier keine Blockklammer. Man schreibt (im DEF Editor -> nur ein Semikolon): { ... Befehl1;Befehl2}
      {fhem_set("Eingangstor_Taster on-for-timer 3")};;;;\
  {fhem"set Eingangstoransteuerung on-for-timer 2"}\
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

Schlafsack

Dankeschön Otto für die Erklärung

das mit dem devStateStyle ist verrückt, da habe ich irgendwann mal ein " zuviel gemacht. Ist mir leider aber nie aufgefallen  :(  Habe es schon geändert

Bin gerade erst dabei mich mit Perl auseinander zusetzen. Ich sollte glaube ich mich erst einmal noch mehr informieren.
Was wäre deiner Meinung nach besser sich anzugewöhnen (DOIF) Funktion fhem_set() oder die allgemeine Funktion fhem()?

Ich soll/muss es quasi so machen: 


defmod V_Eingangstor_Taster DOIF {\
  if\
    (([Eingangstor_Taster] eq "an")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Fruehschicht" && [?Eingangstor:POWER3] eq "off" && ([05:20] || [14:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Fruehschicht" && [05:40] && [?Eingangstor:POWER3] eq "on")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Spaetschicht"  && [?Eingangstor:POWER3] eq "off" && ([13:20] || [22:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Spaetschicht" && [13:40] && [?Eingangstor:POWER3] eq "on")\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Nachtschicht" && [?Eingangstor:POWER3] eq "off" && ([21:20] || [06:30]))\
  ||\
    ([?Automatik_Eingangstor] eq "an" && [?Kalender_Schicht] eq "Nachtschicht" && [?Eingangstor:POWER3] eq "on" && [21:40]))\
      {fhem("set Eingangstoransteuerung on-for-timer 2; Eingangstor_Taster on-for-timer 3")}
}
attr V_Eingangstor_Taster devStateIcon .*:edit_settings
attr V_Eingangstor_Taster group Eingangstor
attr V_Eingangstor_Taster icon edit_settings
attr V_Eingangstor_Taster room Verknüpfungen


Gruß Schlafsack

Damian

Du kannst grundsätzlich fhem-Funktion nutzen, wenn du beliebige FHEM-Befehle ausführen willst - auch set.

fhem_set-Funktion hat allerdings den Vorteil gegenüber fhem "set...", dass sie im Gegensatz zu der fhem-Funktion nicht erst nach dem set-Befehl (suchen/parsen) muss, sondern direkt die Funktionalität des set-Befehl ausführt - das ist natürlich etwas performanter.

fhem_set ist eine Funktion aus dem DOIF-Package.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Zitat{fhem("set Eingangstoransteuerung on-for-timer 2; Eingangstor_Taster on-for-timer 3")}
Das wird im defmod nüscht ;) hier müssen es zwei sein ;;
Das einzelne ; ist der Befehlstrenner in FHEM und im Perl.
In der FHEM Kommandozeile (also im define bzw. defmod) muss man das Semikolon verdoppeln (schützen) damit es die DEF erreicht, ansonsten ist der Befehl dort zu Ende und der Rest wird als weitere Befehl interpretiert
In der DEF (also im DEF Editor) muss man nichts schützen.
Schreibt man FHEM oder Perlcode im define (oder defmod) muss man nochmal schützen / verdoppeln. Siehe auch hier https://fhem.de/commandref_modular_DE.html#command

Ich weiß, es ist nicht ganz einfach am Anfang mit den halben Punkten ;)
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

Damian

Zitat von: Otto123 am 12 Dezember 2022, 19:35:55
Das wird im defmod nüscht ;) hier müssen es zwei sein ;;
Das einzelne ; ist der Befehlstrenner in FHEM und im Perl.
In der FHEM Kommandozeile (also im define bzw. defmod) muss man das Semikolon verdoppeln (schützen) damit es die DEF erreicht, ansonsten ist der Befehl dort zu Ende und der Rest wird als weitere Befehl interpretiert
In der DEF (also im DEF Editor) muss man nichts schützen.
Schreibt man FHEM oder Perlcode im define (oder defmod) muss man nochmal schützen / verdoppeln. Siehe auch hier https://fhem.de/commandref_modular_DE.html#command

Ich weiß, es ist nicht ganz einfach am Anfang mit den halben Punkten ;)

All das wird nicht reichen ;)

Es muss noch ein set davor:

{fhem("set Eingangstoransteuerung on-for-timer 2;set Eingangstor_Taster on-for-timer 3")}

oder eben:

{fhem_set ("Eingangstoransteuerung on-for-timer 2");fhem_set ("Eingangstor_Taster on-for-timer 3")}

Runde Klammern kann man übrigens bei Funktionsaufrufen in Perl weglassen:

{fhem_set "Eingangstoransteuerung on-for-timer 2";fhem_set "Eingangstor_Taster on-for-timer 3"}

und wenn man immer alles im DEF-Editor eingibt, dann braucht man sich keine Gedanken über "Verdoppelung von Semikolons" machen.


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

Otto123

Zitat von: Damian am 12 Dezember 2022, 19:45:37
und wenn man immer alles im DEF-Editor eingibt, dann braucht man sich keine Gedanken über "Verdoppelung von Semikolons" machen.
Kann man glauben, muss man aber nicht  ;D Beispiel aus der Doku
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off
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

Damian

Zitat von: Otto123 am 12 Dezember 2022, 19:57:32
Kann man glauben, muss man aber nicht  ;D Beispiel aus der Doku
define onAt at 07:00 set Lamp1 on;;set Lamp2 on;; define offAt at +00:10 set Lamp1 off;;;;set Lamp2 off

Das mag ja sein, aber wir sind hier im DOIF-Unterforum und ich habe alles dafür getan, diesen Blödsinn auszumerzen :)

Ich wage zu behaupten, dass man beim Nutzen von DOIFs dieses Thema "vergessen" kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF