Hallo,
ich habe eine if Abfrage, wo ich Variablen setzen möchte
Jetzt möchte ich innerhalb der if zusätzlich eine zweite Variable ($andereName) setzen. In dem Fall der andere Name.
z.B. Wenn $NAME enthält Name1, soll zusätzlich der Wert Name2 in die Variable $andereName geschrieben werden. Wie muss die Syntax aussehen? Ich bekomme immer einen Syntaxfehler. Oder gibt es noch eine einfachere Methode?
dummy_.*:.* {
my $target = '';
if ($NAME =~ /Name1/)
{$target = "Name1";}
elsif ($NAME =~ /Name2/) {
{$target = "Name2";}
};
my $deviceName = 'dummy_'.$target;
{fhem ("set Telegram msg " .$deviceName)};
}
Gruß
TWART016
Hi,
das geht nicht:
{fhem ("set Telegram msg " .$deviceName)};
das sollte gehen:
{fhem ("set Telegram msg $deviceName")};
Gruß Otto
Zitat von: Otto123 am 26 Juli 2018, 20:42:02
das geht nicht:
{fhem ("set Telegram msg " .$deviceName)};
das sollte gehen:
{fhem ("set Telegram msg $deviceName")};
Bei mir funktioniert das schon. Ist aktuell auch kein Problem, sondern die Variablen zu definieren.
Dann solltest Du klarer formulieren was nicht geht und die Fehlermeldungen posten :-X
Ich möchte innerhalb des IFs noch eine weitere Variable setzen. Das hatte ich ganz oben beschrieben:
if ($NAME =~ /Name1/)
{$target = "Name1";}
daher zusätzlich zu $target noch eine Variabe $andereName
Und ich weiß nicht, wie die Syntax dazu aussehen muss.
if ($NAME =~ /Name1/) {
$target = "Name1";
$andereVariable = "Name2";
}
Alles was in den geschweiften Klammern steht wird vom if ausgeführt.
In deinem anfangs geposteten Code warst du sehr "großzügig" mit geschweiften Klammern - da waren einige von unnötig.
Zitat von: roedert am 26 Juli 2018, 22:16:03
if ($NAME =~ /Name1/) {
$target = "Name1";
$andereVariable = "Name2";
}
Da kommt bei mir der Fehler:
syntax error at (eval 9918415) line 4, near ")
if"
Global symbol "$andereVariable" requires explicit package name (did you forget to declare "my $andereVariable"?) at (eval 9918415) line 6.
syntax error at (eval 9918415) line 8, near "}
elsif"
Global symbol "$target" requires explicit package name (did you forget to declare "my $target"?) at (eval 9918415) line 9.
syntax error at (eval 9918415) line 10, near "}
}"
Global symbol "$target" requires explicit package name (did you forget to declare "my $target"?) at (eval 9918415) line 11.
syntax error at (eval 9918415) line 13, near ";
}"
Zitat von: roedert am 26 Juli 2018, 22:16:03
Alles was in den geschweiften Klammern steht wird vom if ausgeführt.
In deinem anfangs geposteten Code warst du sehr "großzügig" mit geschweiften Klammern - da waren einige von unnötig.
Welche Klammern meinst du?
$andereVariable muss natürlich vorher deklariert werden ... das sagt ja auch die Fehlermeldung.
Zitat von: TWART016 am 26 Juli 2018, 22:51:22
Welche Klammern meinst du?
dummy_.*:.* {
my $target = '';
if ($NAME =~ /Name1/)
{$target = "Name1";}
elsif ($NAME =~ /Name2/) {
{$target = "Name2";}
};
my $deviceName = 'dummy_'.$target;
{fhem ("set Telegram msg " .$deviceName)};
}
Sorry, aber Du veranstaltest Ratespiele, das ist alles schwer zu verstehen.
So?
dummy_.*:.* {
my $target = '';
my $andererName = '';
if ($NAME =~ /Name1/) {
$target = "Name1";
$andererName = "Name2";
}
elsif ($NAME =~ /Name2/) {
$target = "Name2";
};
my $deviceName = 'dummy_'.$target;
fhem ("set Telegram msg ".$deviceName);
}
Gruß Otto
Hallo,
das mit den Variablen habe ich nun soweit hinbekommen. Allerdings bekomme ich im Log noch ein Fehler mit den Klammern. Leider weiß ich nicht, wo Klammern fehlen.
rr_.*:zuhause {
my $anderePerson = '';
if ($NAME =~ /Name1/)
{$anderePerson = "Name2";}
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
};
my $deviceNameAndere = 'rr_'.$anderePerson;
{if (Value("NichtSchalten") eq "off" and (ReadingsAge($NAME,"lastDeparture","") > 3600) and Value($deviceNameAndere) eq "abwesend")
{fhem ("set Wohnzimmer_Modi heimkommen")}
else
{fhem("set Telegram msg Name1AtHome heimkommen wurde nicht geschalten $deviceNameAndere ist " .Value($deviceNameAndere))}
}
};
defmod nur_Name2_daheim at +00:00:01 {if (("$NAME") =~ /Name2/ and Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}};
}"
syntax error at (eval 2249609) line 6, near "}
Unmatched right curly bracket at (eval 2249609) line 6, at end of line
Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 4.
Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 4.
Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 1.
Unknown command my, try help.
Unknown command }, try help.
, try help.
Unknown command }
IF: no left bracket: {$anderePerson = "Name2"
, try help.
2018.08.02 10:39:40 3: Name1AtHomeTest return value: Unknown command {
}"
syntax error at (eval 2249609) line 6, near "}
Unmatched right curly bracket at (eval 2249609) line 6, at end of line
Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 4.
Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 4.
}: Global symbol "$deviceNameAndere" requires explicit package name (did you forget to declare "my $deviceNameAndere"?) at (eval 2249609) line 1.
}
{fhem("set Telegram msg Name1AtHome heimkommen wurde nicht geschalten NEU $deviceNameAndere ist " .Value($deviceNameAndere))}
else
{fhem ("set Telegram msg Wohnzimmer_Modi heimkommen")}
2018.08.02 10:39:40 1: ERROR evaluating my $TYPE='ROOMMATE';my $SELF='Name1AtHomeTest';my $EVTPART0='zuhause';my $NAME='rr_Name1';my $EVENT='zuhause';{if (Value("NichtSchalten") eq "off" and (ReadingsAge($NAME,"lastDeparture","") > 3600) and Value($deviceNameAndere) eq "abwesend")
defmod nur_Name2_daheim at +00:00:01 {if (("$NAME") =~ /Name2/ and Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}};
};
}
{fhem("set Telegram msg Name1AtHome heimkommen wurde nicht geschalten NEU $deviceNameAndere ist " .Value($deviceNameAndere))}
else
{fhem ("set Telegram msg Wohnzimmer_Modi heimkommen")}
{if (Value("NichtSchalten") eq "off" and (ReadingsAge($NAME,"lastDeparture","") > 3600) and Value($deviceNameAndere) eq "abwesend")
my $deviceNameAndere = 'rr_'.$anderePerson;
};
$anderePerson = "Name1";
elsif ($NAME =~ /Name2/) {
{$anderePerson = "Name2";}
if ($NAME =~ /Name1/)
my $anderePerson = '';
Perl ist pingelig mit der Schreibweise, es muss so aussehen:
if () {} elseif () {}
Es müssen Leerzeichen nach der ) sein, nicht Zeilenumbrüche
Zeilen (Befehle) müssen mit ; abgeschlossen/getrennt werden. Aber ich bin auch unsicher, ich würde es mal konsequent so versuchen:
rr_.*:zuhause {
my $anderePerson = '';
if ($NAME =~ /Name1/) {
$anderePerson = "Name2";
}
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
}
my $deviceNameAndere = 'rr_'.$anderePerson;
if (Value("NichtSchalten") eq "off" and (ReadingsAge($NAME,"lastDeparture","") > 3600) and Value($deviceNameAndere) eq "abwesend") {
fhem ("set Wohnzimmer_Modi heimkommen");
}
else {
fhem("set Telegram msg Name1AtHome heimkommen wurde nicht geschalten $deviceNameAndere ist " .Value($deviceNameAndere));
}
}
Das defmod da am Ende?
defmod nur_Name2_daheim at +00:00:01 {if (("$NAME") =~ /Name2/ and Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}};
Das steht mit in der DEF vom notify? Das gehört so da überhaupt nicht hin! Soll das wirklich ins notify?
Gruß Otto
Zitat von: Otto123 am 02 August 2018, 13:00:48
rr_.*:zuhause {
my $anderePerson = '';
if ($NAME =~ /Name1/) {
$anderePerson = "Name2";
}
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
}
my $deviceNameAndere = 'rr_'.$anderePerson;
if (Value("NichtSchalten") eq "off" and (ReadingsAge($NAME,"lastDeparture","") > 3600) and Value($deviceNameAndere) eq "abwesend") {
fhem ("set Wohnzimmer_Modi heimkommen");
}
else {
fhem("set Telegram msg Name1AtHome heimkommen wurde nicht geschalten $deviceNameAndere ist " .Value($deviceNameAndere));
}
}
Damit funktioniert nun das notify.
defmod nur_Name2_daheim at +00:01:00 {if (("$NAME") =~ /Name2/ and Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}};
Das defmod hätte ich auch gerne in dem notify. Wie und wo muss ich das mit reinpacken?
Zitat von: TWART016 am 02 August 2018, 13:23:06
defmod nur_Name2_daheim at +00:01:00 {if (("$NAME") =~ /Name2/ and Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}};
Das defmod hätte ich auch gerne in dem notify. Wie und wo muss ich das mit reinpacken?
Würde ich nicht annähernd machen,
was willst Du erreichen?
Statt defmod kannst Du auch modify nehmen, je nach dem was werden soll.
Du kannst auch ein define nehmen weil das at eh nicht gespeichert wird.
Du fragst in dem at den Namen des at ab, der ist aber immer nur_Name2_daheim - ich bin nicht sicher ob das überhaupt je etwas ausführt.
Wann soll denn das at erzeugt werden? Immer oder in einem der if Abfragen?
ganz allgemein wäre der Syntax als Perl Aufruf so:
fhem ("defmod der Rest ");
Ich würde gerne eine Minute nach dem Event abfragen, ob die andere Person alleine daheim ist. Wenn dies der Fall ist, soll eine Nachricht per Telegram versendet werden.
Wie kann ich innerhalb von fhem ("") eine Abfrage machen?
Dann mach das doch an diese Stelle:
...
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
fhem('define nur_Name2_daheim at +00:01:00 {if Value("rr_Name1") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim " .(substr(FmtName1e(Name1e()),0,8)))}}');
}
...
Das ist jetzt noch schwierig mit der Codeschachtelung, bin nicht sicher ob das so funktioniert....
In dem Code scheint es Probleme mit der Uhrzeit zu geben. Auch mit selbst definierten Variablen wird keine Nachricht gesendet. $NAME zum Beispil geht aber.
my $uhrzeit = (substr(FmtTime(time()),0,8));
{fhem("set Telegram msg Name2 ist daheim $uhrzeit" )}
Global symbol "$uhrzeit" requires explicit package name (did you forget to declare "my $uhrzeit"?) at (eval 2782536) line 1
Moin,
Dein Fragment funktioniert testweise bei mir in der FHEM Kommandozeile einwandfrei.
{my $uhrzeit = (substr(FmtTime(time()),0,8));;{fhem("set wert $uhrzeit" )}}
Wird also vorher liegen. ::) :-X
Gruß Otto
An welche Stelle muss das?
{
my $anderePerson = '';
if ($NAME =~ /Name1/) {
$anderePerson = "Name2";
fhem('define nur_Name2_daheim at +00:00:01 {if (Value("rr_Name2") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim $uhrzeit " )}}');
}
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
}
}
Innerhalb vom fhem('define nur_Name2_daheim at +00:00:01 {if (Value("rr_Name2") ne "zuhause") {fhem("set Telegram msg Name2 ist daheim $uhrzeit " )}}');?
Der define code in dem if verwirrt mich ein wenig.
Dein eigener Code verwirrt Dich? Ich habe ihn nur als Vorschlag dorthin platziert wo er funktioniert und etwas Sinn macht. Du hattest Ihn dorthin geschrieben wo er außer Fehler nichts produziert. ;D
Zur Erklärung, was der Code von Dir jetzt tut:
In dem Moment wo Dein notify triggert wird:
- $Name gesetzt
- $anderePerson gesetzt
- Ein temporäres at in einer Sekunde erzeugt, welches abfragt ob der Inhalt von rr_Name2 zuhause ist und sendet dann eine Nachricht. In der soll jetzt noch die Uhrzeit stehen ::)
Also muss dein Wunsch nach Uhrzeit setzen in dieses at, woanders macht das überhaupt keinen Sinn! Jetzt hast Du aber nur die variable reingeschrieben - ohne Definition.
Gruß Otto
Auch wenn ich die Uhrzeit in einer Variablen definieren, wird die Nachricht nicht gesendet.
Die Eine Sekunde ich nur ein Test, im Betrieb werden ich das auf eine Minute erhöhen.
{
my $anderePerson = '';
my $uhrzeit = (substr(FmtName1e(Name1e()),0,8));
if ($NAME =~ /Name1/) {
$anderePerson = "Name2";
fhem('define nur_Name2_daheim at +00:00:01 {if (1 == 1) {fhem("set Telegram msg Name2 ist daheim $uhrzeit " )}}');
}
elsif ($NAME =~ /Name2/) {
$anderePerson = "Name1";
}
Nicht mein eigener Code verwirrt mich, sondern das if hinter dem define.
Verwirrt dich jetzt das if hinter dem define oder das define hinter dem if (#17)? :o
Das if hinter dem define entstammt doch deinem Wunsch aus dem Beitrag #11!?
Aber jetzt definierst Du my $uhrzeit in dem Programmabschnitt des notify. Das notify erzeugt ein völlig unabhängiges temporäres Programm at ... Welches irgendwann startet, dort brauchst Du dann die aktuelle Uhrzeit.
Also: Du fliegst von Hamburg nach New York und hast in Hamburg deine Uhr vergessen!
Gruß Otto
Warum erwartest du, dass irgendeine Variable von außerhalb der Quotes verwendet wird, wenn das ganze in einfachen Quotes steht?
'define nur_Name2_daheim at +00:00:01 {if (1 == 1) {fhem("set Telegram msg Name2 ist daheim $uhrzeit " )}}'
Ungetestet:
"define nur_Name2_daheim at +00:00:01 {if (1 == 1) {fhem(\"set Telegram msg Name2 ist daheim seit $uhrzeit \" )}}"
@Beta-User Du hast es jetzt gar nicht verstanden! ;D
Die Uhrzeit sollte in dem at bestimmt werden, sonst kann man auch Willi anstatt Uhrzeit reinschreiben. ;D ;D ;D
Oder ich habe es nicht verstanden und er will nicht die aktuelle Uhrzeit sondern die vom notify .... :-[ wird wohl so sein und ich habe mich gefragt warum man nach 1 sec nochmal die Uhrzeit braucht die sowieso schon in der Nachricht in den Eigenschaften drin steht.
Aber was im Code passieren soll, sollte der TE verstehen - nicht ich. :)
:o
OK, dann habe ich es wirklich nicht verstanden :'( :'( :'( .
Kann man so machen, aber ist des dann nicht so, dass man auch die Variable innerhalb der Quotes definieren müsste, oder liege ich da schon wieder falsch?
Genau das versuch ich ja in #20 zu erklären. ;) ich dachte man müsste es in dem at definieren.
Aber wie gesagt, vielleicht ist Dein Gedanke die richtigere Lösung :D
Zitat von: Beta-User am 03 August 2018, 12:21:54
'define nur_Name2_daheim at +00:00:01 {if (1 == 1) {fhem("set Telegram msg Name2 ist daheim $uhrzeit " )}}'
Ungetestet:
"define nur_Name2_daheim at +00:00:01 {if (1 == 1) {fhem(\"set Telegram msg Name2 ist daheim seit $uhrzeit \" )}}"
Das scheint zu funktionieren. " anstelle von ' und eskapen von " im fhem-Bereich.
Wie in #19 geschrieben, ist die eine Sekunde nur zum Testen. Im Endeffekt erhöhe ich das auf eine Minute.
Wenn ich jetzt in die If Abfrage ein Value nehme, funktioniert das vermutlich wegen den Anführungszeichen nicht.
fhem("define nur_Name2_daheim at +00:01:00 {if (Value("rr_Name2") ne "zuhause") {fhem(\"set Telegram msg Name2 ist daheim $uhrzeit \" )}}");
Wie muss ich das dort machen?
Vielleicht so:
fhem("define nur_Name2_daheim at +00:01:00 {if ('Value("rr_Name2") ne "zuhause"') {fhem(\"set Telegram msg Name2 ist daheim $uhrzeit \" )}}");
Oder wieder alle "späteren" " escapen:
fhem("define nur_Name2_daheim at +00:01:00 {if (Value(\"rr_Name2\") ne \"zuhause\") {fhem(\"set Telegram msg Name2 ist daheim $uhrzeit \" )}}");
innerhalb von fhem("...") immer das gleiche -> wenn " da stehen soll muss man \" schreiben ;)
Ich will Dir bewusst keinen Code mehr präsentieren - du musst versuchen zu verstehen, wo Du Dich mit dem Code befindest und welche "regel" dort gerade gilt!