Hauptmenü

if mit mehreren Kommandos

Begonnen von Wolfgang Hochweller, 02 April 2018, 11:21:45

Vorheriges Thema - Nächstes Thema

Wolfgang Hochweller

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 )

stefanpf

#1
https://wiki.fhem.de/wiki/If-condition letzter Absatz

bzw.
define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1 on;;set Steckdose2 on " } 

CoolTux

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');
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wolfgang Hochweller

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




Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux


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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wolfgang Hochweller

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




KölnSolar

#8
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.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

CoolTux

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');
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

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');
                                                                        }
                 }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wolfgang Hochweller

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.


CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

#14
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
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