IF Anweisung mit UND-Verknüpfung

Begonnen von Peterson, 05 Mai 2014, 22:06:10

Vorheriges Thema - Nächstes Thema

Peterson

Hallöchen,

ich versuche schon seit einiger Zeit eine IF Anweisung mit einer UND-Bedingung hinzubekommen, aber es will mir einfach nicht gelingen. Ich habe so ziemlich alles ausprobiert und habe im Wiki schon einiges nachgelesen und nachgestellt - leider ohne Erfolg. Ich finde einfach den Fehler nicht. Ich hoffe Ihr könnt mir weiterhelfen.

Hier mein Code-Schnipsel:

define TEST_DUMMY dummy
attr TEST_DUMMY setList state:on,off


define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) { my $r1 == $value{"Wohnz_Strasse_rechts_Tuerkontakt"};; my $r2 == $value{"Eingangstuer_Tuerschlosskontakt"};;if ($r1 eq "closed" && $r2 eq "closed") {fhem "set TEST_DUMMY on"} else {fhem "set TEST_DUMMY off"}}

Ergebnis ist, dass die DummyVariable "TEST_DUMMY" sich nicht unter "Everything"verändert, sprich sie ist auf off. Die Kontakte zeigen unter everything alles richtig an.

Kann jemand helfen?

Gruß,

Peterson
FHEM 5.5 auf RPI + HM-CFG-LAN

michaelfhem

ich würde es so schreiben:

define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) {\     if(Value("Wohnz_Strasse_rechts_Tuerkontakt") eq "closed" && Value("Eingangstuer_Tuerschlosskontakt") eq "closed") {\
   fhem("set TEST_DUMMY on");;\
} else {\
   fhem("set TEST_DUMMY off");;\
}\
}


DIe "\" sind nur der Übersicht halber eingefügt. Du kannst naatürlich alles in einer Zeile schreiben

Grüße Michi
raspberry Pi 3 + jessie + fhem
Devices: Fritz Dect 200, Homematic (HMLan-Gateway), FS20 (CUL-Stick), Hue-Gateay, Sonos

michaelfhem

define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) {\
   if(Value("Wohnz_Strasse_rechts_Tuerkontakt") eq "closed" && Value("Eingangstuer_Tuerschlosskontakt") eq "closed") {\
      fhem("set TEST_DUMMY on");;\
   } else {\
      fhem("set TEST_DUMMY off");;\
   }\
}


jetzt müsste es passen... Bin noch kein Profi beim posten...
raspberry Pi 3 + jessie + fhem
Devices: Fritz Dect 200, Homematic (HMLan-Gateway), FS20 (CUL-Stick), Hue-Gateay, Sonos

Wuppi68

Schreib IF und ELSE in großen Buchstaben

Gesendet von meinem iPad mit Tapatalk HD
FHEM unter Proxmox als VM

der-Lolo

Vorsicht wenn IF und ELSE in grossbuchstaben geschrieben werden wird das IF modul aktiv - bitte erst die comandref oder das wiki dazu lesen, sonst gibt es richtig Frust.

fhainz

Zitat von: der-Lolo am 06 Mai 2014, 07:29:56
Vorsicht wenn IF und ELSE in grossbuchstaben geschrieben werden wird das IF modul aktiv - bitte erst die comandref oder das wiki dazu lesen, sonst gibt es richtig Frust.
und zusätzlich steht dann IF / ELSE  nicht im Perl teil sondern vor den { }!
Aber warum es das IF Modul überhaupt gibt muss mir erst jemand erklären... Verursacht nur Probleme bei Anfängern und alles was das Modul kann, kann ich mit Perl genauso machen.

Just my 0.02 €

Peterson

Hi,

danke ersteinmal an michaelfhem für die Korrektur (auch natürlich vielen dank an die anderen). Es hat auf anhieb funktioniert. So wie ich das erkenne ist dies ja die Pearl Variante.
Jedoch habe ich das nicht so ganz verstanden warum meine Syntax nicht funktionierte. Ich habe diese von hier http://www.fhemwiki.de/wiki/Funktionsbeschreibung_zu_notify versucht nachzubauen. Dieses Beispiel ist, so habe ich es verstanden, so aufgebaut, dass auch die IF Geschichte im Pearl benutzt wird nur mit dem Unterschied, dass vorab die Werte der Kontakte in eine Variable geschrieben und diese in der IF Bedingung genutzt werden. Auch sehe ich, dass die FHEM( .. ) Anweisung in der IF Funktion nicht mit einem ";;" (für Pearl ja nur mit einem ";" interpretiert) abschließt.

Ist die Beschreibung in dem Weblink falsch oder habe ich da einen Denkfehler (man soll mir verzeihen, aber das Ganze ist für mich noch ein bischen Neuland und ich lerne dazu)?

Gruß,

Peterson
FHEM 5.5 auf RPI + HM-CFG-LAN

fhainz

#7
Nein das hast du schon richtig Verstanden.
Das "normale" Perl if wird oft mit dem IF Modul verwechselt was dann viel Verwirrung stiftet.


BTT:
Wird dein notify getriggert? Im STATE müsste ein Datum stehen falls dies geschehen ist.
Falls dein notify ausgeführt wird, dein dummy aber nicht schaltet könntest du das versuchen:


define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) {\
   if( ReadingsVal("Wohnz_Strasse_rechts_Tuerkontakt","state","0") eq "closed" && ReadingsVal("Eingangstuer_Tuerschlosskontakt","state","0") eq "closed") {\
      fhem("set TEST_DUMMY on");;\
   } else {\
      fhem("set TEST_DUMMY off");;\
   }\
}


Wenn dein notify nicht ausgeführt wird poste mal bitte die entsprechenden Ausgaben aus dem Event Monitor wenn du deine Türkontakte betätigst.


Sry, ich hab deinen Beitrag am Handy nur überflogen und überlesen das es nun funktioniert. ;)

Grüße

fhainz

Zitat von: Peterson am 06 Mai 2014, 18:49:05
Jedoch habe ich das nicht so ganz verstanden warum meine Syntax nicht funktionierte.

Zitat von: Peterson am 05 Mai 2014, 22:06:10
define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) { my $r1 == $value{"Wohnz_Strasse_rechts_Tuerkontakt"};; my $r2 == $value{"Eingangstuer_Tuerschlosskontakt"};;if ($r1 eq "closed" && $r2 eq "closed") {fhem "set TEST_DUMMY on"} else {fhem "set TEST_DUMMY off"}}

Dein notify ist vermutlich ausgeführt worden, aber ich denke mal das
$r1 == $value{"Wohnz_Strasse_rechts_Tuerkontakt"};;
nicht klappt. == wird mWn nur in if verwendet und vergleicht zB 2 variablen und
$value{"Wohnz_Strasse_rechts_Tuerkontakt"}
gibts denk ich auch nicht ;)

der-Lolo

Mit dem IF modul hätte es in etwa so funktioniert...

define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) IF (([Wohnz_Strasse_rechts_Tuerkontakt] eq "closed") and ([Eingangstuer_Tuerschlosskontakt] eq "closed")) (set TEST_DUMMY on)
ELSE (set TEST_DUMMY off)

Ich finde beides hat seine berechtigung - das IF modul macht für Einsteiger vieles einfacher...

Puschel74

Hallo,

a) Warum werden für Anfänger immer noch Codebeispiele gepostet die in die fhem.cfg gehören?
b) $value{"Wohnz_Strasse_rechts_Tuerkontakt"} bitte gegen my $r1 = Value("Wohnz_Strasse_rechts_Tuerkontakt");
tauschen.
c) 1 oder 2 Log(3,"hier bin ich"); können durchaus hilfreich sein um zu sehen wieweit (oder ob) das notify überhaupt was mitbekommt.

Grüße

P.S.: Wenn man die Finger von der fhem.cfg lässt und ab und zu mal ein paar Beispiele im Forum verfolgt sollten so Abfragen eigentlich kein Problem sein.
P.P.S.: Bitte in Zukunft die Code-Tags verwenden - Danke  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

der-Lolo

ok - der vollständigkeit halber dann nochmal kurz zur erklärung.

ich starte solche anweisungen mittlerweile immer so:
define test notify (bla|blub) IF ()
direkt in die Befehlszeile von FHEMWEB eingegeben.
Wenn enter gedrückt wird kommt man schon in die Detailansicht des notifys, hier geh ich meistens zuerst her und vergebe das room attribut develop. Einfach nur damit ich das notify wiederfinde ohne unter everything ewig scrollen zu müsen.

wenn man dann auf DEF klickt steht dort schon
(bla|blub) IF ()
das kann man nun nach belieben verändern und mit einem Klick auf modify wird es übernommen...

Puschel74

Hallo,

absolut richtiges vorgehen - wobei es ja richtig/flasch in FHEM nicht gibt  ;D

ZitatEinfach nur damit ich das notify wiederfinde ohne unter everything ewig scrollen zu müsen.
Wieso everything?
Ich schau immer erst unter unsorted.
Hat den Vorteil das nicht ALLES erscheint  8)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

der-Lolo

Der room develop hat sich für mich einfach etabliert, da kommt alles rein wo gerade dran gebastelt wird - somit hab ich alles auf einen blick wenn ich den raum öffne.

Peterson

nun bin ich zwischenzeitlich schon ein bischen weitergegangen und auf ein weiteres Hindernis gestoßen.
Ich würde gerne ein Linux Programm zeitverzögert starten wollen.
Hier erst einmal ohne Zeitverzögerung:

define test notify (Wohnz_Strasse_rechts_Tuerkontakt|Eingangstuer_Tuerschlosskontakt) {\
   if( ReadingsVal("Wohnz_Strasse_rechts_Tuerkontakt","state","0") eq "closed" && ReadingsVal("Eingangstuer_Tuerschlosskontakt","state","0") eq "closed") {\
      system("<linux Programm> &");;\
   } else {\
      fhem("set TEST_DUMMY off");;\
   }\
}

Ich habe eine einfache Version mal hinbekommen jedoch schaffe ich es nicht diese zusammenzubekommen. Ich komme irgendwie nicht weiter bzw. komme mit den Zuordnungen (fhem(), system() und dessen Verküpfungen) noch nicht ganz zurecht.
Vielleicht kann mir hier ja noch mal jemand unter die Arme greifen.

Hier die einfache Version (nichts besonderes, aber der Vollständigkeit halber):

define test notify STATUS:offen define a1 at +00:00:01 "<linux Programm> &"

Schon mal danke.

Gruß,

Peterson
FHEM 5.5 auf RPI + HM-CFG-LAN