FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Wolfgang Hochweller am 02 April 2018, 11:21:45

Titel: if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 11:21:45
Ich habe folgende Konstruktion als Teil eines Notify, die funktioniert :

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 )');;

Was muss ich tun, um neben

( set LichtKeller wcrgb 255 0 0 0 0 )

noch ein zweites Kommando auszufuehren  ( ausser einem 2. if ):

( set LichtKeller wcrgb 255 0 0 0 0 )    und   ( set LichtFlur wcrgb 255 0 0 0 0 )
Titel: Antw:if mit mehreren Kommandos
Beitrag von: stefanpf am 02 April 2018, 11:48:33
https://wiki.fhem.de/wiki/If-condition letzter Absatz

bzw.
define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1 on;;set Steckdose2 on " } 
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 11:55:47
Ich hege starke Zweifel daran das dieses

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 )');;

tatsächlich so funktioniert wie Du es Dir vor stellst


Dein ganzes Konstrukt sieht eher aus wie ein Misch Mashc aus DOIF und gutem Willen
Versuche mal so wenn es wirklich ein Notify ist. Und poste bitte mal ein
list NOTIFYNAME

fhem('set (LichtKeller|LichtFluer) wcrgb 255 0 0 0 0') if( Value('VerisureAlarm') eq 'Disarmed');
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 12:13:52
Ich verstehe die Zweifel, aber das hier funktioniert :

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 )');;

ich sehe ja , was die Lampe tut.

In der Komandozeile funktioniert das hier auch :

set LichtKeller wcrgb 255 0 0 0 0 ; set LichtFlur wcrgb 255 0 0 0 0

aber das hier geht nicht mehr :

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 ; set LichtFlur wcrgb 255 0 0 0 0 )');;

Das mit den DOIF ist schon korrekt,  allerdings machen die mir nix als Aerger, sprich, sind unzuverlaessig.
Ob das nun daran liegt, dass ich unter Windows arbeite, weiss ich nicht.
Ich habe jeden Versuch eines DOIF's am Ende wieder in ein Notify umgebaut

Hier ein  Listing des funkionierenden Notify :



Internals:
   DEF        VerisureAlarm:.* {
use JSON;;

if ( "$EVENT"  eq  "Arm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel22.." set alarm 545758 ARMED_AWAY ) }

elsif ( "$EVENT"  eq  "ArmHome" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel22.." set alarm 545758 ARMED_HOME ) }

elsif ( "$EVENT"  eq  "Disarm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel22.." set alarm 545758 DISARMED ) }

sleep ( 3 );;

my $alarm = qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel22.." armstate );;
my $perl = decode_json ( $alarm );;
fhem ( "setreading VerisureAlarm status $perl->{'statusType'}" );;
fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") (set LichtKeller wcrgb 255 0 0 0 0)');;
fhem ( 'if ( [VerisureAlarm:&STATE] eq "ArmedHome") (set LichtKeller wcrgb 0 0 0 0 255)');;
fhem ( 'if ( [VerisureAlarm:&STATE] eq "Armed") (set LichtKeller wcrgb 0 0 255 0 0)');;
  }
   NAME       VAlarm_check
   NOTIFYDEV  VerisureAlarm
   NR         139
   NTFY_ORDER 50-VAlarm_check
   REGEXP     VerisureAlarm:.*
   STATE      2018-04-02 12:10:18
   TYPE       notify
   READINGS:
     2018-04-02 12:10:11   state           active
Attributes:
   room       Alarm



Titel: Antw:if mit mehreren Kommandos
Beitrag von: Damian am 02 April 2018, 12:18:59
Zitat von: howi42 am 02 April 2018, 12:13:52
Ich verstehe die Zweifel, aber das hier funktioniert :

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 )');;

ich sehe ja , was die Lampe tut.

In der Komandozeile funktioniert das hier auch :

set LichtKeller wcrgb 255 0 0 0 0 ; set LichtFlur wcrgb 255 0 0 0 0

aber das hier geht nicht mehr :

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") ( set LichtKeller wcrgb 255 0 0 0 0 ; set LichtFlur wcrgb 255 0 0 0 0 )');;

Das mit den DOIF ist schon korrekt,  allerdings machen die mir nix als Aerger, sprich, sind unzuverlaessig.
Ob das nun daran liegt, dass ich unter Windows arbeite, weiss ich nicht.
Ich habe jeden Versuch eines DOIF's am Ende wieder in ein Notify umgebaut


Egal ob DOIF oder notify oder if oder IF, du vermischt hier Sachen miteinander.

Du benutzt FHEM-IF mit if, was zufällig funktioniert, da FHEM nicht kontextsensitiv arbeitet (unterscheidet bei FHEM Befehlen nicht zwischen Groß- und Kleinschreibung).

Am besten genau auf die Syntax aus der Commandref achten, dann werden auch DOIFs zuverlässig funktionieren ;)
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 12:22:00
Na wenn Du es sagst. Dann ist ja alles schick.
Ich sage Dir Dein Code ist ausgemachter Mist und reiner Zufall das es geht. Vom Perl sleep mal ganz ab. Lasse mich aber gerne eines besseren belehren.


fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") (set LichtKeller wcrgb 255 0 0 0 0)');;

Würde mich ja mal interessieren wie so ein Unfug funktionieren kann.

Grüße
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 12:22:56

NAME       VAlarm_check
   NOTIFYDEV  VerisureAlarm
   NR         139
   NTFY_ORDER 50-VAlarm_check
   REGEXP     VerisureAlarm:.*
   STATE      2018-04-02 12:10:18
   TYPE       notify


TYPE sagt aber Notify, kein DOIF
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 12:41:36
Stimmt, ist ja auch ein Notify.

Wenn also

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") (set LichtKeller wcrgb 255 0 0 0 0)');;

Unfug ist , wie dann ?

Die Vorgabe ist ganz einfach :
Bei Ausfuehrung des Notify soll anhand von [Verisure:&STATE]  ein FHEM-Kommando ausgefuehrt werden ( bzw. gerne zwei )



Was ist an perl sleep verkehrt ?  Oder kennst du was besseres, die Ausfuehrung zu verzoegern ?
Die genannten vsure Kommandos brauchen eine gewisse Zeit.

Das passende DOIF sieht uebrigens so aus :


Internals:
   DEF        ([VerisureAlarm:&STATE] eq "Disarmed") ( set LichtFlur wcrgb 255 0 0 0 0 ) DOELSEIF ([VerisureAlarm:&STATE] eq "ArmedHome") (set LichtFlur wcrgb 0 0 0 0 255) DOELSEIF ([VerisureAlarm:&STATE] eq "Armed") (set LichtFlur wcrgb 0 0 255 0 0)

   MODEL      FHEM
   NAME       AlarmLight
   NR         249
   NTFY_ORDER 50-AlarmLight
   STATE      disabled
   TYPE       DOIF
   READINGS:
     2018-04-02 08:29:58   cmd             0
     2018-04-02 08:30:11   last_cmd        initialized
     2018-04-02 08:30:11   mode            disabled
     2018-04-02 08:30:11   state           disabled
   condition:
     0          InternalDoIf($hash,'VerisureAlarm','STATE') eq "Disarmed"
     1          InternalDoIf($hash,'VerisureAlarm','STATE') eq "ArmedHome"
     2          InternalDoIf($hash,'VerisureAlarm','STATE') eq "Armed"
   devices:
     0           VerisureAlarm
     1           VerisureAlarm
     2           VerisureAlarm
     all         VerisureAlarm
   do:
     0:
       0           set LichtFlur wcrgb 255 0 0 0 0
     1:
       0          set LichtFlur wcrgb 0 0 0 0 255
     2:
       0          set LichtFlur wcrgb 0 0 255 0 0
     3:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     0           VerisureAlarm:STATE
     1           VerisureAlarm:STATE
     2           VerisureAlarm:STATE
     all         VerisureAlarm:STATE
   itimer:
   perlblock:
   uiState:
   uiTable:
Attributes:
   disable    0
   room       Alarm,Security



Funktioniert aber nicht immer.
Die Notify-Konstruktion hingegen schon.



Titel: Antw:if mit mehreren Kommandos
Beitrag von: KölnSolar am 02 April 2018, 12:55:27
Du machst es Dir arg leicht. Damian u. Cooltux haben Dir mehrfach gesagt, dass Dein Code Unfug ist....  :o

1. ein notify impliziert quasi ein if über den RegEx. Warum dann noch das if ?
2. if ist Perl, also {if.....}
3. if ist nicht fhem, deshalb fhem ( 'if (......   ist Unfug
4. in Perl kann man mit fhem(Argument) FHEM-Befehle aufrufen, daher sieht die Befehlssequenz für Dich vielleicht so aus

{if ( [VerisureAlarm:&STATE] eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")}}


Edit:
Zitat
Was ist an perl sleep verkehrt ?  Oder kennst du was besseres, die Ausfuehrung zu verzoegern ?
Perl-sleep blockiert FHEM komplett. Evtl. mit nichtblockierendem FHEM-sleep lösen.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 13:02:34
Zitat von: howi42 am 02 April 2018, 12:41:36
Stimmt, ist ja auch ein Notify.

Wenn also

fhem ( 'if ( [VerisureAlarm:&STATE] eq "Disarmed") (set LichtKeller wcrgb 255 0 0 0 0)');;

Unfug ist , wie dann ?

Die Vorgabe ist ganz einfach :
Bei Ausfuehrung des Notify soll anhand von [Verisure:&STATE]  ein FHEM-Kommando ausgefuehrt werden ( bzw. gerne zwei )



Was ist an perl sleep verkehrt ?  Oder kennst du was besseres, die Ausfuehrung zu verzoegern ?
Die genannten vsure Kommandos brauchen eine gewisse Zeit.

Das passende DOIF sieht uebrigens so aus :


Internals:
   DEF        ([VerisureAlarm:&STATE] eq "Disarmed") ( set LichtFlur wcrgb 255 0 0 0 0 ) DOELSEIF ([VerisureAlarm:&STATE] eq "ArmedHome") (set LichtFlur wcrgb 0 0 0 0 255) DOELSEIF ([VerisureAlarm:&STATE] eq "Armed") (set LichtFlur wcrgb 0 0 255 0 0)

   MODEL      FHEM
   NAME       AlarmLight
   NR         249
   NTFY_ORDER 50-AlarmLight
   STATE      disabled
   TYPE       DOIF
   READINGS:
     2018-04-02 08:29:58   cmd             0
     2018-04-02 08:30:11   last_cmd        initialized
     2018-04-02 08:30:11   mode            disabled
     2018-04-02 08:30:11   state           disabled
   condition:
     0          InternalDoIf($hash,'VerisureAlarm','STATE') eq "Disarmed"
     1          InternalDoIf($hash,'VerisureAlarm','STATE') eq "ArmedHome"
     2          InternalDoIf($hash,'VerisureAlarm','STATE') eq "Armed"
   devices:
     0           VerisureAlarm
     1           VerisureAlarm
     2           VerisureAlarm
     all         VerisureAlarm
   do:
     0:
       0           set LichtFlur wcrgb 255 0 0 0 0
     1:
       0          set LichtFlur wcrgb 0 0 0 0 255
     2:
       0          set LichtFlur wcrgb 0 0 255 0 0
     3:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     0           VerisureAlarm:STATE
     1           VerisureAlarm:STATE
     2           VerisureAlarm:STATE
     all         VerisureAlarm:STATE
   itimer:
   perlblock:
   uiState:
   uiTable:
Attributes:
   disable    0
   room       Alarm,Security



Funktioniert aber nicht immer.
Die Notify-Konstruktion hingegen schon.

Das hier wären erstmal Deine 2 Devices schalten mit Abfrage des STATES vom Device VerisureAlarm

fhem('set (LichtKeller|LichtFluer) wcrgb 255 0 0 0 0') if( Value('VerisureAlarm') eq 'Disarmed');
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 13:10:38
Wenn ich jetzt nur mal Dein DOIF übersetze in ein Notify dann sollte das hier


define myNotify notify VerisureAlarm:(Disarmed|ArmedHome|Armed) { fhem('set LichtFlur wcrgb 255 0 0 0 0') if( $EVENT eq 'Disarmed');
                                                                           fhem('set LichtFlur wcrgb 0 0 0 0 255') if( $EVENT eq 'ArmedHome');
                                                                           fhem('set LichtFlur wcrgb 0 0 255 0 0') if( $EVENT eq 'Armed');
                 }

gehen.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 13:14:30
oder auch


define myNotify notify VerisureAlarm:(Disarmed|ArmedHome|Armed) {  if( $EVENT eq 'Disarmed') {
                                                                                fhem('set LichtFlur wcrgb 255 0 0 0 0');
                                                                        } elsif( $EVENT eq 'ArmedHome') {
                                                                                 fhem('set LichtFlur wcrgb 0 0 0 0 255');
                                                                        } elsif( $EVENT eq 'Armed') {
                                                                                 fhem('set LichtFlur wcrgb 0 0 255 0 0');
                                                                        }
                 }
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 13:53:41
Danke.
Eins der Probleme liegt in der Natur der Gegebenheiten.

1. ein notify impliziert quasi ein if über den RegEx. Warum dann noch das if ?

Weil das Notify zwei Aufgaben erledigt :
der erste Teil  setzt den Zustand der Alarmanlage ( Verisure ) ueber die vsure Routinen..
sprich, es wird en Kommando auf dem Verisure-server angestossen. Dabei gibt es
keine direkte Rueckmeldung, daher
-  ist das sleep absolut notwendig, denn die vsure-Kommandos brauchen ihre Zeit
-  ist es notwendig, den Zustand nach dem Absetzen des vsure-Kommandos erneut abzurufen

ob das Kommando erfolgreich war, prueft der zweite Teil des Notify and veranlasst erst dann
die graphische Darstellung des Zustandes in FHEM und soll halt noch weitere Aktionen ausloesen, z. B. eine Lampe schalten.

Ich befinde mich doch in dem Notify in Perl, richtig ? ( daher {} am Anfang und Ende )

if ( [VerisureAlarm:&STATE] eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")};;

fuehrt zu einem Syntax-Fehler.
Eigentlich muesste doch :

if ( [VerisureAlarm:&STATE] eq "Disarmed") fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0");;

auch funktionieren; tut es aber auch nicht.

In der Zeile vorher :
fhem ( "setreading VerisureAlarm status $perl->{'statusType'}" );;

geht es doch auch.

Meine Verwirrung ist komplett, sorry.

Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 14:11:54
Zitat von: howi42 am 02 April 2018, 13:53:41
Danke.
Eins der Probleme liegt in der Natur der Gegebenheiten.

1. ein notify impliziert quasi ein if über den RegEx. Warum dann noch das if ?

Weil das Notify zwei Aufgaben erledigt :
der erste Teil  setzt den Zustand der Alarmanlage ( Verisure ) ueber die vsure Routinen..
sprich, es wird en Kommando auf dem Verisure-server angestossen. Dabei gibt es
keine direkte Rueckmeldung, daher
-  ist das sleep absolut notwendig, denn die vsure-Kommandos brauchen ihre Zeit
-  ist es notwendig, den Zustand nach dem Absetzen des vsure-Kommandos erneut abzurufen

ob das Kommando erfolgreich war, prueft der zweite Teil des Notify and veranlasst erst dann
die graphische Darstellung des Zustandes in FHEM und soll halt noch weitere Aktionen ausloesen, z. B. eine Lampe schalten.

Ich befinde mich doch in dem Notify in Perl, richtig ? ( daher {} am Anfang und Ende )

if ( [VerisureAlarm:&STATE] eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")};;

fuehrt zu einem Syntax-Fehler.
Eigentlich muesste doch :

if ( [VerisureAlarm:&STATE] eq "Disarmed") fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0");;

auch funktionieren; tut es aber auch nicht.

In der Zeile vorher :
fhem ( "setreading VerisureAlarm status $perl->{'statusType'}" );;

geht es doch auch.

Meine Verwirrung ist komplett, sorry.

Darauf zu Antworten erfordert Zeit, Kraft und Geduld. Alles drei habe ich heute Abend wieder.


Grüße
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Otto123 am 02 April 2018, 14:31:58
ZitatIch befinde mich doch in dem Notify in Perl, richtig ? ( daher {} am Anfang und Ende )

if ( [VerisureAlarm:&STATE] eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")};;
Mit dem Code befindest Du Dich in der Alexa KI Ebene  ;D
1. Im notify befindest Du Dich im FHEM
2. Du kannst dort bleiben oder mit {} in die Perl Ebene wechseln.
3. In der FHEM Ebene geht sowas: [Device:reading] in der Perl Ebene geht sowas: ReadingsVal("Device","Reading", default) - Kreuzweise funktioniert das nicht, da kommen auch lesbare Fehlermeldungen.

FHEM Code
IF ( [VerisureAlarm:&STATE] eq "Disarmed") (set LichtKeller wcrgb 255 0 0 0 0,set LichtFlur wcrgb 255 0 0 0 0)
Perl Code
{if (InternalVal("VerisureAlarm","STATE","") eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")}

Ich will damit nur auf Deine Verwirrung reagieren, ich habe deinen Code nicht durchdacht und verstanden! Das haben die andere schon gemacht :)!

Gruß Otto
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 15:40:16
Danke fuer den Versuch .......
Jetzt bin ich wieder am Anfang, denn das funktioniert nicht :

wie in deinem Beispiel :

if (InternalVal("VerisureAlarm","STATE","") eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0;;set LichtFlur wcrgb 255 0 0 0 0")}

geht nicht !

Fehlermeldung :
set LichtKeller wcrgb 0 0 0 0 255;;set LichtKeller wcrgb 255 0 0 0 0 : set wcrgb needs 5 parameters

Das geht :

if (InternalVal("VerisureAlarm","STATE","") eq "Disarmed") {fhem ("set LichtKeller wcrgb 255 0 0 0 0")}

Wie bekomme ich also den zweiten set-Befehl da rein ?
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 16:03:07
Wenn Du auf STATE prüfen willst nimm Value nicht InternalVal.
Außerdem immer nur ein Semikolon

if ( Value("VerisureAlarm") eq "Disarmed") {fhem ("set (LichtKeller|LichtFlur) wcrgb 255 0 0 0 0")}


Und bitte gewöhne Dir an Code oder Logausgaben in Codetage zu machen.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 16:14:02
Danke, das geht jetzt.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 16:37:38
Poste mal bitte das ganze Notify. Also als list Befehl und in Codetags.
Dann schauen wir mal wegen dem sleep.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Otto123 am 02 April 2018, 17:16:46
ZitatJetzt bin ich wieder am Anfang, denn das funktioniert nicht :
Immerhin wäre das ein Fortschritt - am Anfang - bisher warst Du irgendwo im Loch  ::)

Ich mach nochmal den Erklärbär Einwurf:
ZitatWie bekomme ich also den zweiten set-Befehl da rein ?
Die exakte Schreibweise der Trennung hängt immer davon ab, "Wo" man sich befindet - leider ich kann auch nichts dafür!  :-X
In der DEF Befehl1;Befehl2
Im define Befehl1;;Befehl2
Im DOIF oder FHEM-IF Befehl1,Befehl2

Es gibt natürlich einige elegante Wege dies zu umgehen, wie das Beispiel von Cooltux  :D

Zum InternalVal: Ich habe das bewusst gewählt, weil Howi diese Schreibweise mit &STATE gewählt hat.
InternalVal("Device","STATE","") entspricht Value("Device")
[Device:&STATE] entspricht [Device]

Gruß Otto
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 22:01:14
Danke.
Hier das Listing .

Das sleep ist sicher nicht elegant, aber wenn ich es weglasse, ueberhole ich mich sozusagen selber.
Die Ausfuehrung des vsure-Befehls kann dauern, die 3 Sek sleep sind nur ein Erfahrungswert.




Internals:
   DEF        VerisureAlarm:.* {
use JSON;;

if ( "$EVENT"  eq  "Arm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_AWAY ) }

elsif ( "$EVENT"  eq  "ArmHome" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_HOME ) }

elsif ( "$EVENT"  eq  "Disarm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 DISARMED ) }

sleep ( 3 );;

my $alarm = qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," armstate );;
my $perl = decode_json ( $alarm );;
fhem ( "setreading VerisureAlarm status $perl->{'statusType'}" );;

if ( Value("VerisureAlarm") eq "Disarmed") { fhem ("set (LichtKeller|LichtFlur) wcrgb 255 0 0 0 0")};;
if ( Value("VerisureAlarm") eq "ArmedHome") { fhem ("set (LichtKeller|LichtFlur) wcrgb 0 0 0 0 255")};;
if ( Value("VerisureAlarm") eq "Armed") { fhem ("set (LichtKeller|LichtFlur) wcrgb 0 0 255 0 0")};;
  }
   NAME       VAlarm_check
   NOTIFYDEV  VerisureAlarm
   NR         139
   NTFY_ORDER 50-VAlarm_check
   REGEXP     VerisureAlarm:.*
   STATE      2018-04-02 21:46:47
   TYPE       notify
   READINGS:
     2018-04-02 16:12:27   state           active
Attributes:
   room       Alarm


Otto :
Trotzdem danke.
Die jetzt funktionierende Version geht natuerlich nur, wenn alle Lampen sich gleich verhalten sollen.
Wenn nicht oder wenn andere Devices ins Spiel kommen,   muss ich eine andere Version zum Laufen bringen.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 22:11:34
Ich vermute Mal das Du eine Pause brauchst weil

if ( "$EVENT"  eq  "Arm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_AWAY ) }

elsif ( "$EVENT"  eq  "ArmHome" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_HOME ) }

elsif ( "$EVENT"  eq  "Disarm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 DISARMED ) }

das hier etwas Zeit beansprucht, richtig?

Das wird dann aber doch etwas komplexer.

Du brauchst die Zeit damit

my $alarm = qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," armstate );;

den korrekten Wert der kurz vorher mit dem Code oben gesetzt wird aus liest. Richtig?
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 22:36:41
Zu Deinem sleep.
Da Dein Notify eh extrem groß ist empfehle ich ein Umbau in zwei Subs in eine 99_myUtils.
Die erste Sub wird vom Notify aufgerufen und geht bis zum sleep, sleep dabei weg lassen. Also bis eine Zeile vor dem Sleep.

Als letzte Zeile steht ein InternalTimer mit + 3s und den Aufruf der zweiten Sub welche alles nach dem Sleep beinhaltet.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 22:58:41
Das ist korrekt.
Wie lang die Ausfuehrung des ersten Kommandos auf dem Verisure-Server braucht, ist nicht vorherzusagen.
Die drei Sekunden sind nur ein empirischer Wert, kann auch mal schiefgehen.

Die Anbindung des Verisure-Alarmsystems an fhem ist nicht trivial :
- Poll waere moeglich, wird aber sehr schnell von Verisure unterbunden, was ich auch einsehe.
- Push vom Server geht nicht ohne groessere Kosten

Was geht und was ich auch verwende :
Der Verisure-Server sendet bei jeder Statusaenderung ( ausgeloest durch fhem, die Verisure-App oder das Bedienpanel ) eine EMail.
Diese wertet fhem aus und triggert das gelistete Notify.
Das notify erfuellt zwei Funktionen:
- Ich kann Kommandos an den Verisure-Server senden
- Ich kann  auch nur den Status abfragen

Email ist natuerlich eine zweischneidige Sache - man kann sich nicht wirklich darauf verlassen. Daher arbeitet man noch an einer besseren Anbindung.
Zur Zeit laesst sich die Alarmanlage aber nicht direkt einbinden.

Titel: Antw:if mit mehreren Kommandos
Beitrag von: Wolfgang Hochweller am 02 April 2018, 22:59:33
Danke, ich probier das mal mit Subs.
Titel: Antw:if mit mehreren Kommandos
Beitrag von: CoolTux am 02 April 2018, 22:59:47
99_myUtils_AlarmLight.pm


package main;

use strict;
use warnings;
use POSIX;
use JSON;


sub myUtils_AlarmLight_Initialize($$) {

  my ($hash) = @_;

}

sub setAlarmState($) {

    my $alarmState     = shift;

    if ( "$alarmState"  eq  "Arm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_AWAY ) }

elsif ( "$alarmState"  eq  "ArmHome" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 ARMED_HOME ) }

elsif ( "$alarmState"  eq  "Disarm" ) {qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," set alarm 545758 DISARMED ) }
    InternalTimer( gettimeofday() + 3, "getAlarmState",undef);
}

sub getAlarmState($) {

    my $alarm = qx(vsure "wolfgang.hochweller\@lyse.net" "Bummel21,," armstate );
my $perl = eval{decode_json ( $alarm )};
  if($@){
#   Log(1, "myUtils Sub getAlarmLight JSON - error while request: $@");
   }

fhem ( "setreading VerisureAlarm status $perl->{'statusType'}" );

if ( Value("VerisureAlarm") eq "Disarmed") { fhem ("set (LichtKeller|LichtFlur) wcrgb 255 0 0 0 0")};
if ( Value("VerisureAlarm") eq "ArmedHome") { fhem ("set (LichtKeller|LichtFlur) wcrgb 0 0 0 0 255")};
if ( Value("VerisureAlarm") eq "Armed") { fhem ("set (LichtKeller|LichtFlur) wcrgb 0 0 255 0 0")};
}


1;



Aus dem Kopf auf dem Tablet daher ohne Gewähr.