Hauptmenü

if mit mehreren Kommandos

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

Vorheriges Thema - Nächstes Thema

Wolfgang Hochweller

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 ?

CoolTux

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


CoolTux

Poste mal bitte das ganze Notify. Also als list Befehl und in Codetags.
Dann schauen wir mal wegen dem sleep.
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

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

Wolfgang Hochweller

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.

CoolTux

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?
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

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

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.


Wolfgang Hochweller

Danke, ich probier das mal mit Subs.

CoolTux

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