FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: heikoh81 am 02 Mai 2014, 21:51:13

Titel: Mehrere defines hintereinander
Beitrag von: heikoh81 am 02 Mai 2014, 21:51:13
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
Titel: Antw:Mehrere defines hintereinander
Beitrag von: mi.ke am 02 Mai 2014, 23:00:16
ich vermute das:

elsif {
        set Zufall1Zustand on
      }


Cheers


Titel: Antw:Mehrere defines hintereinander
Beitrag von: heikoh81 am 03 Mai 2014, 10:38:10
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
Titel: Antw:Mehrere defines hintereinander
Beitrag von: heikoh81 am 03 Mai 2014, 10:58:38
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")
}
Titel: Antw:Mehrere defines hintereinander
Beitrag von: Damian am 03 Mai 2014, 11:53:53
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
Titel: Antw:Mehrere defines hintereinander
Beitrag von: heikoh81 am 03 Mai 2014, 12:58:18
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.
Titel: Antw:Mehrere defines hintereinander
Beitrag von: heikoh81 am 03 Mai 2014, 13:55:36
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
Titel: Antw:Mehrere defines hintereinander
Beitrag von: fhainz am 03 Mai 2014, 14:14:17
Ich würde dir empfehlen deine at's im DEF Editor zu bearbeiten. Dann sparst du dir das gemurkse mit den zu beachtenden \ und ;;
Titel: Antw:Mehrere defines hintereinander
Beitrag 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.
Titel: Antw:Mehrere defines hintereinander
Beitrag von: Damian am 03 Mai 2014, 18:14:44
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