Mehrere defines hintereinander

Begonnen von heikoh81, 02 Mai 2014, 21:51:13

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo,

trotz intensiver Forums- und  Google-Suche bin ich nicht fündig geworden.
Ich möchte mit einem define um xx:xx ein weiteres define aufrufen, das fortan alle 15 Sekunden den Status eines Dummies prüft.

Dies klappt einfach nicht (Code kopiert aus der DEF-Editier-Funktion, also nicht aus der fhem.cfg):


*22:21:30 {
  fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:15 {
    if (Value('Zufall1ChkBox') eq 'on') {
      if (Value('Zufall1Zustand') eq 'on') {
        Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
      }
      else {
        set Zufall1Zustand on
      }
    }
    else {
      Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
    }
    };;
    attr ZufallWatchdogAlle5Min room Zufallslicht")
}


Und das steht im Log:

2014.05.02 22:20:00 3: ZufallWatchdog: syntax error at (eval 2102) line 8, near "set Zufall1Zustand "


Danke für eure Antworten.
Viele Grüße,
Heiko

mi.ke

ich vermute das:

elsif {
        set Zufall1Zustand on
      }


Cheers


FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

heikoh81

#2
elsif (ohne e!) kannte ich noch nicht - funktioniert aber auch nicht oder ich verwende es falsch.


*10:47:00 {
  fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:05 {
    if (Value('Zufall1ChkBox') eq 'on') {
      if (Value('Zufall1Zustand') eq 'on') {
        Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
      }
      elsif {
        set Zufall1Zustand on;;
        Log 1, 'Zufall1 wurde eingeschaltet';;
      }
    }
    else {
      Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
    }
    };;
    attr ZufallWatchdogAlle5Min room Zufallslicht")
}


Eigentlich ist es doch auch egal, wie wieviele ifs ich ineinander schachtele, wenn ich diese wieder korrekt zu mache?
Es ist auch nicht das Problem, weil wenn ich
set Zufall1Zustand on
austausche mit
Log 1, 'Test'
==> Dann wird das Log geschrieben.

Ich vermute eher, dass es mit dem Wrapping von Perl-Code bzw. FHEM-Befehlen zusammenhängt, wenn man ein define innerhalb eines defines aufruft.
Aber wie macht man es richtig?



Viele Grüße,
Heiko

heikoh81

So funktioniert es jetzt!
Es hing glaube ich tatsächlich mit dem Wrapping und Verdopplung von ; zusammen etc.


*10:57:40 {
  fhem("define ZufallWatchdogAlle5Min at +*{3}00:00:05 {
    if (Value('Zufall1ChkBox') eq 'on') {
      if (Value('Zufall1Zustand') eq 'on') {
        Log 1, 'Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig'
      }
      else {
        Log 1, 'Zufall1 wurde eingeschaltet';;;;
        Log 1, 'Noch eine Zeile für die Log-Datei';;;;
        fhem('set Zufall1Zustand on');;;;
      }
    }
    else {
      Log 1, 'Zufall1ChkBox ist AUS, daher kein Zufallslicht'
    }
    };;
    attr ZufallWatchdogAlle5Min room Zufallslicht")
}

Damian

Oder so, und du brauchst ein paar Semikolons weniger  ;)

*10:57:40 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq "on") (
      IF ([Zufall1Zustand]  eq "on") ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
      ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},{Log 1, "Noch eine Zeile für die Log-Datei"},set Zufall1Zustand on)
    ) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
   ;;attr ZufallWatchdogAlle5Min room Zufallslicht


Gruß

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

heikoh81

#5
Zitat von: Damian am 03 Mai 2014, 11:53:53
Oder so, und du brauchst ein paar Semikolons weniger  ;)

Danke schön!!
Das ist sehr schön und übersichtlich!

Was bei mir noch immer für Verwirrung sorgt:
Erstelle ich mit einem define ein weiteres define, dann muss man statt Anführungsstrichen "" nur noch Hochkommata verwenden ' '.
Dies wäre ja auch in deinem Codebeispiel nötig.

heikoh81

Also das funktioniert, aber ein echtes Problem habe ich noch.
Ich habe deinen Vorschlag einmal selbst eingegeben und einmal kopiert, bearbeitet jeweils mit Notepad++.

Deine Version funktioniert:

*13:49:50 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq "on") (
      IF ([Zufall1Zustand]  eq "on") ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
      ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},set Zufall1Zustand on)
    ) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
   ;;attr ZufallWatchdogAlle5Min room Zufallslicht


Und meine geht nicht:

*13:53:20 define ZufallWatchdogAlle5Min at +*{3}00:00:05 IF ([Zufall1ChkBox] eq 'on') (
IF ([Zufall1Zustand]  eq 'on') ({Log 1, "Zufall1ChkBox UND Zufall1Zustand ist AN, Zufallslicht1 laeuft bereits, keine Handlung notwendig"})
ELSE ({Log 1, "Zufall1 wurde eingeschaltet"},set Zufall1Zustand on)
    ) ELSE ({Log 1, "Zufall1ChkBox ist AUS, daher kein Zufallslicht"})
  ;;attr ZufallWatchdogAlle5Min room Zufallslicht


Im Log steht folgendes:


2014.05.03 13:51:30 3: ZufallWatchdogAlle5Min: Bad name after on' at (eval 2327) line 1.


Für mich sind beide absolut identisch, auch die Einrückung wird von Notepad++ identisch markiert.
Habe mit TAB eingerückt.

Muss man hier bei PERL noch irgendwas spezielles beachten?
Bislang habe ich einfach mit 2 Leerzeichen für jeden neuen Absatz eingerückt...


Viele Grüße,
Heiko

fhainz

Ich würde dir empfehlen deine at's im DEF Editor zu bearbeiten. Dann sparst du dir das gemurkse mit den zu beachtenden \ und ;;

heikoh81

Das mache ich bereits.
Trotzdem gilt für das define innerhalb des defines, dass nicht mehr Anführungszeichen zu verwenden sind, sondern nur noch Hochkomma.
Das wusste ich nicht.

Damian

Zitat von: heikoh81 am 03 Mai 2014, 14:15:19
Das mache ich bereits.
Trotzdem gilt für das define innerhalb des defines, dass nicht mehr Anführungszeichen zu verwenden sind, sondern nur noch Hochkomma.
Das wusste ich nicht.

Beim IF-Befehl kannst du nur Anführungszeichen angeben, weil Hochkomma intern benutzt wird - das hat weniger etwas mit defines zu tun.

Gruß

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