Hauptmenü

$we - Syntaxfehler ?

Begonnen von WotSefak, 20 März 2013, 14:59:10

Vorheriges Thema - Nächstes Thema

WotSefak

Ich fahre mit fhem (auf FB7390) seit einigen Monaten auf niedrigstem Niveau: Rollladen, ein wenig Licht, sonstiges. Zeitsteuerung, auch mit sunset etc, klappt soweit. Jetzt will ich mich endlich mal um etwas mehr Komfort bemühen, und scheitere an der Wochenend-Steuerung: zwar werden die zukünftigen Events korrekt angekündigt, aber das Ereignis findet dann nicht statt; der Aktor wird nicht geschaltet. Hier die Schreibweise (Ausschnitt in Sachen Zirk-Pumpe):

define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_ANwe at *07:00:00 {if($we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}
define A_WW_AUS at *22:00:45 set FS20_Warmwasser off

Auf einen Hinweis hin hatte ich es auch schon mit zwei Semikola versucht (... {if(!$we) {fhem("set FS20_Warmwasser off");;}} aber auch das hat nicht zum Erfolg geführt.

Was ist falsch ? Für Hinweise dankbar:
Michael

Groby

Hi,

M.E. fehlt Dir das Semikolon am Ende jeder Zeile:


define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}};


Gruss Groby

WotSefak

Danke Groby,

aber: in meiner fhem.cfg wird keine einzige Zeile mit Semikolon abgeschlossen; sollte ich das besser tun, bzw. muss ich es tun, sobald ich Perl in geschweiften Klammern verwende ?

Michael

MisterEltako

Hi!


Am Semikolon dahinter kann es doch nicht liegen, das wir doch da gar nicht gebraucht...

Ich habe momentan allerdings ein ähnliches Problem, jedoch nur wenn ich 2 Schaltbefehle in eine Anweisung bringe:

z.B.
in FHEM.cfg:
eine if-Schleife ruft bei mir eines der nachfolgendes define auf:
if (!$we) {\
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}\
}

....
oder auch schon getestet:
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;; set Rollladen_Flur 100)}}
oder ebenfalls getestet:
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100, set Rollladen_Flur 100)}}

Alle 3 führen nur dazu, dass Rollladen_EG im at als Event angekündigt werden. Der Befehl Rollladen_Flur 100 fehlt und wird stattdessen beim Abspeichern der Fhem.cfg sofort ausgeführt!

Im Log steht dann: "Rollladen_Flur 100)}" Arument isnt numeric .... (oder so ähnlich)

Eigentlich müsste das 1. genannte doch wenigstens funktionieren wie gewünscht....????

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Reinerlein

Hi MisterEltako,

ist dir das Anführungszeichen am Ende der Fhem-Anweisung beim Kopieren hierher abhanden gekommen, oder fehlt es in deinem Original auch?

Grüße Reinerlein

Groby

mmhhhh in der Tat. Das liegt wohl daran, wie die cfg editiert wurde (per GUI oder zu Fuss)...

Dann versuche es mal so:


define M_WW_AN at *05:00:00 {fhem("set FS20_Warmwasser on") if(!$we)}



MisterEltako

HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Reinerlein

Hi MisterEltako,

dann fällt mir nur auf, dass du wohl auf "Perl-Ebene" bist (erkennbar an "if (!$we)"), und dann aber direkt Fhem-Kommandos hinschreibst (define...).

Um diese Defines musst du noch ein "fhem()" drumschreiben, und dann noch mit den Klammern Spaß haben :-)

Grüße Reinerlein

Zrrronggg!



Zitatdefine M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}


Das muss so heissen:


define M_WW_AN at *05:00:00 {if (!($we)) {fhem ("set FS20_Warmwasser on")}}


Zitatif (!$we) {\
define Sonnenaufgang at 07:00:00 {fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}\
}

1. meine ich dass das

if (!($we)) {define Sonnenaufgang at 07:00:00...

heissen muss.

2. meine ich das hier
{fhem("set Rollladen_EG 100;;;; set Rollladen_Flur 100)}
zu viele Semikolons sind, 2 reichen, es muss nur 1x escaped werden:
{fhem("set Rollladen_EG 100 ;; set Rollladen_Flur 100)}
und es fehlen die Anführungstriche am Ende.
{fhem("set Rollladen_EG 100 ;; set Rollladen_Flur 100")}

Und dann: ich kenne mich mit Rolladen nicht aus, aber reicht "100" oder muss das nicht "100%" heissen?


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

MisterEltako

@Zrrronggg!

Ich möchte nicht vom eigentlichen Problem des Threadbesitzers abweichen, nur zum Verständnis für für deinen vorherigen Tip.

Eigentlich lautet die Routine bei mir so (o.g. war nur zur Vereinfachung des Problems gedacht":

define Rollladen_Yahoo notify Local_Wetter:(sunset*.|sunrise*.) {\
   if (defined($defs{Sonnenaufgang})) {fhem('delete Sonnenaufgang')}\
   if (defined($defs{Sonnenuntergang})) {fhem('delete Sonnenuntergang')}\
   if (defined($defs{Aussenlicht_Yahoo})) {fhem('delete Aussenlicht_Yahoo')}\
  my $SA = Offset('sunrise','00:00:00','07:00:00','10:00:00');;\    
  my $SU = Offset('sunset','00:00:00','17:00:00','20:00:00');;\
  my $AL = Offset('sunset','00:30:00','17:00:00','20:00:00');;\
  fhem("define Sonnenaufgang at $SA {fhem(' set Rollladen_EG 100;;;; set Rollladen_Flur 100;;;;' )}");;\
  fhem("define Sonnenuntergang at $SU {fhem(' set Rollladen_EG 1;;;; set Rollladen_Flur 1;;;; ')}");;\
  fhem("define Aussenlicht_Yahoo at $AL {fhem('set Licht_all on')}");;\
}

Wobei die Funktion Offset eine Subroutine aufruft, die mir von YahooWetter den Sonnenaufgang und Untergang liefert und dabei den 2. übergebenen Parameter addiert oder subtrahiert. Diese Subroutine funktioniert auch Dank Unterstützung aus dem Forum nun Fehlerfrei.
Aber wie bei WotSefak stimmt das define nicht.

";;;;" funktioniert noch am ehesten. ";;" lässt im angelegten at den 2. set-Befehl weg.
Der Befehl "set Rollladen_EG 100" funktioniert bei Homematic ohne "%"-Zeichen.
Wo ist nur der Denkfehler????  *grübel*
MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Groby

Hi,

ich habe es in der Sub so gelöst:


sub MyTimer
{
my $cmd ="set lampe_1 on;;;;set Lampe_2 off";

{fhem("define MyTimer at +00:15:00 {fhem(".$cmd.")}")};
}


Je nachdem wieviele Semikolon gebraucht werden entweder ";;" oder ";;;;"...

Gruss, Groby

MisterEltako

Hi!

Daran hatte ich auch schon gedacht, aber noch nicht ausprobiert. Jedoch müsste doch das die von genannten einfachen Varianten auch gehen....

define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}
define M_WW_ANwe at *07:00:00 {if($we) {fhem("set FS20_Warmwasser on")}}
define M_WW_AUS at *09:30:00 {if(!$we) {fhem("set FS20_Warmwasser off")}}
define A_WW_AUS at *22:00:45 set FS20_Warmwasser off


Aber auch dort gibt es wohl Probleme.

Zudem finde ich das nicht gut, wenn es nur über Definition mit $cmd eine Aneinanderreihung mehrerer Befehle gäbe.
Ist das einfach noch nicht vorgekommen oder einfach nicht implementiert?

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Reinerlein

Hi,

das mit den Semikolons ist im Prinzip einfach:
Jedesmal, wenn der Befehl "fhem" (bzw. eine fhem-Anweisung) verwendet wird, muss ein Semikolon verdoppelt werden.
Wenn der Code in einer 99_MyUtils.pm ausgelagert ist, dann steht dort nur noch "echter" Perl-Code, der natürlich diese Verdoppelung erstmal nicht braucht (es sei denn, man schreibt eine Anweisung in der Form "fhem()"). Desweiteren werden dort die Zeilenende-Maskierungen (\) nicht benötigt.

Wenn man also in einer cfg-Datei eine Perl-Anweisung (mit {} eingeschlossen) schreibt, dann muss dort jedes Semikolon verdoppelt werden, damit der fhem-Parser diese nicht "verschluckt". Wenn man dort eine verschachtelte Anweisung schreibt, dann muss dort das Semikolon entsprechend vervierfacht werden, da es von der ersten Stufe auf eine Verdoppelung "runtergeparst" wird. Es stehen dort also nur noch zwei Semikolons, die dann später wieder korrekt geparst werden können.
Spätestens an dieser Stelle wird es dann interessant, den Code in eine MyUtils auszulagern, und nur die "echten" fhem Anweisungen (z.B. "set Licht on") mittels fhem() auszuführen.

Grüße Reinerlein

P.S.: Perl hat natürlich kein Problem mit zuvielen Semikolons, sondern nur mit zuwenig. Der Sequenzoperator ";" trennt Befehlsequenzen. Eine Befehlssequenz darf in Perl aber auch leer sein...

WotSefak

Hi Groby,

nein, die Umstellung hat's nicht gebracht:

define M_WW_AN at *05:00:00 {fhem("set FS20_Warmwasser on") if(!$we)}
ergibt den gleichen Misserfolg wie das ursprüngliche
define M_WW_AN at *05:00:00 {if(!$we) {fhem("set FS20_Warmwasser on")}}

Michael

WotSefak

Hi Zrrronggg!,

define M_WW_AN at *05:00:00 {if (!($we)) {fhem ("set FS20_Warmwasser on")}} ist's auch nicht; das Abklammern des ($we) von der Umkehrung (!)
entspricht auch nicht Ulrich Maaß's Einsteiger-Einweisung define WeckenMitLicht at *08:00 { if (!$we) { fhem("set sz_Lampe on") } }

Ich bin weiter ratlos.

Michael