FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Schlafsack am 11 Dezember 2022, 18:04:36

Titel: [gelöst] Logic-Fehler in der If Verknüpfung
Beitrag von: Schlafsack am 11 Dezember 2022, 18:04:36
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
Titel: Antw:Logic-Fehler in der Perl Verknüpfung
Beitrag von: Damian am 12 Dezember 2022, 15:49:28
Diese Anweisung:

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

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

Titel: Antw:Logic-Fehler in der Perl Verknüpfung
Beitrag von: Otto123 am 12 Dezember 2022, 16:20:11
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 (https://forum.fhem.de/index.php/topic,122260.0.html) 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"}\
Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Schlafsack am 12 Dezember 2022, 17:24:40
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
Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Damian am 12 Dezember 2022, 17:41:22
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.
Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Otto123 am 12 Dezember 2022, 19:35:55
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 ;)
Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Damian am 12 Dezember 2022, 19:45:37
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.


Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Otto123 am 12 Dezember 2022, 19:57:32
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
Titel: Antw:Logic-Fehler in der If Verknüpfung
Beitrag von: Damian am 12 Dezember 2022, 20:02:03
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.