Frage zu Perl-Syntax

Begonnen von Guest, 16 April 2012, 14:13:16

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo fhem-Gemeinde,

ich als Perlanfänger habe ein Verständnisproblem bzgl. folgender
Syntax:

define notify

Ich nutze einen Bewegungsmelder um zwei Lichter zu schalten:

define Tuer_Licht notify BM_Eingang:motion.*on.* {if (!isday)
{fhem("set EINGANG_LICHT on;; set FLUR_LICHT on")}}

Ausschalten über einen Timer bekomme ich nur einen Befehl abgesetzt,
weshalb ich mir eine Structure erstellt habe:

define Flur structure room EINGANG_LICHT FLUR_LICHT
define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 set Flur off

Diese Varianten funktionieren alle nicht:

define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 set EINGANG_LICHT off;; set FLUR_LICHT off

define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 {fhem("set EINGANG_LICHT off;; set FLUR_LICHT off")}}

define EingangAn notify EINGANG_LICHT:on {fhem("define aus_in2min at
+00:02:00 set EINGANG_LICHT off;; set FLUR_LICHT off")}}

Müssten nicht alle diese Varianten auch funktionieren? Wo ist mein
Verständnisproblem?

Vielen Dank für die Unterstützung!
Grüße,
Merhan

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Es handelt sich eben bei der äußeren Schicht nicht um perl - sondern um die
fhem-eigene Skriptsprache. Außerdem sollte man immer nur so viele Klammern
schließen, wie man geöffnet hat.

LG
pah

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Zrrronggg!

                                                     

define Tuer_Licht notify BM_Eingang:motion.*on.* {if (!isday)
{fhem("set EINGANG_LICHT on ;; set FLUR_LICHT on ;; define at
+00:02:00 set EINGANG_LICHT off ;;;; set FLUR_LICHT off ")}}


Achte auf die Anzahl der Semikolons.






On 16 Apr., 19:32, "Prof. Dr. Peter A. Henning"
wrote:
> Es handelt sich eben bei der äußeren Schicht nicht um perl - sondern um die
> fhem-eigene Skriptsprache. Außerdem sollte man immer nur so viele Klammern
> schließen, wie man geöffnet hat.
>
> LG
> pah

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Guest

Originally posted by: <email address deleted>

Hi Merhan,
hab's jetzt nicht getestet, aber 2 Hinweise:
1. m.W. darf nach den zwei Semikola keine Leerstelle kommen, also: set
EINGANG_LICHT off;;set FLUR_LICHT off
2. einfacher ist eine direkte Aufzählung, also: set
EINGANG_LICHT,FLUR_LICHT off  (wiederum ohne Leerstelle zwischen den
devices)

define EingangAn notify EINGANG_LICHT:on define aus_in2min at +00:02:00 set
EINGANG_LICHT,FLUR_LICHT off

Gruß, Uli

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Zrrronggg!

                                                     

>define EingangAn notify EINGANG_LICHT:on define aus_in2min at
>+00:02:00 set EINGANG_LICHT off;; set FLUR_LICHT off

Ich weiss offen gestanden nicht, ob das ne Rolle spielt aber ich mach
immer Leerzeichen VOR dem Semikolon.  Vor allem aber ist hier ja keine
Perl involviert, sodass man das Semikolon nicht escapen (verdoppeln)
muss.

Gehen müsste meiner Meinung nach:
define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 set EINGANG_LICHT off ; set FLUR_LICHT off



>define EingangAn notify EINGANG_LICHT:on define aus_in2min at
>+00:02:00 {fhem("set EINGANG_LICHT off;; set FLUR_LICHT off")}}

Ich weiss offen gestanden nicht ob das ne Rolle spielt aber ich mach
immer Leerzeichen VOR dem Semikolon.  Ansonsten ist hier eine
schliessende Klammer zu viel.

Gehen müsste meiner Meinung nach:
define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 {fhem("set EINGANG_LICHT off ;; set FLUR_LICHT off")}


>define EingangAn notify EINGANG_LICHT:on {fhem("define aus_in2min at
>+00:02:00 set EINGANG_LICHT off;; set FLUR_LICHT off")}}

Ich weiss offen gestanden nicht... lalala.
Ansonsten: auch hier eine Klammer zu viel und vermutlich 2 Semikolons
zu wenig.

Gehen müsste meiner Auffassung nach:
define EingangAn notify EINGANG_LICHT:on {fhem("define aus_in2min at
+00:02:00 set EINGANG_LICHT off ;;;; set FLUR_LICHT off")}

Es geht vermutlich auch:
define EingangAn notify EINGANG_LICHT:on {fhem("define aus_in2min at
+00:02:00 set EINGANG_LICHT off ;; set FLUR_LICHT off")}

Macht aber was anderes, nämlich zuerst den Timer setzen, der in 2
Minuten EINGANG_LICHT auf off setzt und dann SOFORT set FLUR_LICHT off

>...Ausschalten über einen Timer bekomme ich nur einen Befehl abgesetzt...
Um das Ziel das du vermutlich hast direkt zu erreichen, sie meine
vorheriges Post/Mail. Man bekommt durchaus mehrere Kommandos in
Define, muss aber Fhem irgendwie sagen, dass die Auflistung der
folgenden Kommandos zum neuen define gehören, also quasi "eine Ebne
tiefer" sind. Man könnte erwarten, das man das mit Klammern macht,
tatsächlich muss man aber die Semikolons doppelt escapen.

Also

{fhem("mach a ;; define aus_in2min at +00:02:00 mach x ;; mach y")}

macht sofort a, und y, und legt ausserdem sofort aus_in2min an, das
dann später noch x macht.

{fhem("mach a ;; define aus_in2min at +00:02:00 mach x ;;;; mach y")}

hingegen macht sofort a, und legt ausserdem sofort aus_in2min an, das
dann später noch x und y macht.















--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Zrrronggg!

                                                     

>1. m.W. darf nach den zwei Semikola keine Leerstelle kommen, also: set
>EINGANG_LICHT off;;set FLUR_LICHT off

Doch, darf.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Guest

Originally posted by: <email address deleted>

genau wegen sowas mache ich keine inlin-Perls die länger als das sind, was
ich mir an Klammern und ; an einem Finger abzählen kann sondern packe alles
in externe pm-Dateien.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> genau wegen sowas mache ich keine inlin-Perls die länger als das sind, was
> ich mir an Klammern und ; an einem Finger abzählen kann sondern packe alles
> in externe pm-Dateien.

Finde ich auch besser. Um das im Frontend etwas besser zu unterstuetzen, wird
ab jetzt beim Speichern einer .pm Datei automatisch ein reload durchgefuehrt,
und etwaige Syntax-Fehler werden direkt in FHEMWEB angezeigt.

Am einfachsten oeffnet man 99_Utils.pm, man bennennt Utils_Initialize in
MyUtils_Initialize, man loescht alle anderen Funktionen (bis auf die letzte
Zeile: 1; muss erhalten bleiben), und man speichert die Datei unter (Save as)
99_MyUtils.pm. Wg. dem 99 wird sie beim fhem-start automatisch geladen.

Danach baut man hier die benoetigte Logik als Funktion rein, und man ruft diese
z.Bsp. mit
  define n1 notify Lampe:.* { MeinUntoggle("@", "%") }
auf. Ist uebersichtlicher, und motiviert zum schreiben von wiederverwendbaren
Code :)

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Vielen Dank für die zahlreichen Antworten und die Unterstützung!

Die Anzahl der Semikolons war das Problem. Folgendes funktioniert:

define EingangAn notify EINGANG_LICHT:on define aus_in2min at
+00:02:00 set EINGANG_LICHT off;;;;set FLUR_LICHT off

On 17 Apr., 13:25, Rudolf Koenig wrote:
> Am einfachsten oeffnet man 99_Utils.pm, man bennennt Utils_Initialize in
> MyUtils_Initialize, man loescht alle anderen Funktionen (bis auf die letzte
> Zeile: 1; muss erhalten bleiben), und man speichert die Datei unter (Save as)
> 99_MyUtils.pm. Wg. dem 99 wird sie beim fhem-start automatisch geladen.
>
> Danach baut man hier die benoetigte Logik als Funktion rein, und man ruft diese
> z.Bsp. mit
>   define n1 notify Lampe:.* { MeinUntoggle("@", "%") }

Wofür stehen die Tokens @ und % genau?

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Am Mittwoch, 18. April 2012 09:29:21 UTC+2 schrieb Merhan Öztürk:
>
> Wofür stehen die Tokens @ und % genau?

 
http://fhem.de/commandref.html#perl
http://fhem.de/Heimautomatisierung-mit-fhem-V2.pdf
 
Gruß, Uli

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Am Dienstag, 17. April 2012 13:25:04 UTC+2 schrieb Rudolf Koenig:
>
> > genau wegen sowas mache ich keine inlin-Perls die l�nger als das sind,
> was
> > ich mir an Klammern und ; an einem Finger abz�hlen kann sondern packe
> alles
> > in externe pm-Dateien.
>
> Finde ich auch besser. Um das im Frontend etwas besser zu unterstuetzen,
> wird
> ab jetzt beim Speichern einer .pm Datei automatisch ein reload
> durchgefuehrt,
> und etwaige Syntax-Fehler werden direkt in FHEMWEB angezeigt.
>
@Rudi: Vielen Dank für diese Erweiterung!  Auch nach einem über das
Kommandofeld abgesetzten reload werden Syntax-Fehler nun gleich in fhemweb
angezeigt (war glaub ich vorher nicht so) - das erspart das ständige
Wechseln ins Log.
Seeehr praktisch :)
Gruß, Uli

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com