Hauptmenü

Variablen innerhalb von if

Begonnen von TWART016, 26 Juli 2018, 18:49:09

Vorheriges Thema - Nächstes Thema

TWART016

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

Otto123

Hi,

das geht nicht:
{fhem ("set Telegram msg " .$deviceName)}; das sollte gehen:
{fhem ("set Telegram msg $deviceName")};

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TWART016

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.

Otto123

Dann solltest Du klarer formulieren was nicht geht und die Fehlermeldungen posten  :-X
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TWART016

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.

roedert

#5
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.

TWART016

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?

roedert

$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)};
}

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TWART016

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 = '';

Otto123

#10
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TWART016

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?

Otto123

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 ");
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TWART016

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?

Otto123

#14
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....
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz