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 )
https://wiki.fhem.de/wiki/If-condition letzter Absatz
bzw.
define SteckdoseWZein notify LichtWZ { fhem "set Steckdose1 on;;set Steckdose2 on " }
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');
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
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 ;)
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
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
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.
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.
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');
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.
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');
}
}
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.
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
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
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 ?
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.
Danke, das geht jetzt.
Poste mal bitte das ganze Notify. Also als list Befehl und in Codetags.
Dann schauen wir mal wegen dem sleep.
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
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.
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?
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.
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.
Danke, ich probier das mal mit Subs.
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.