FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Peterson am 05 Mai 2014, 22:06:10

Titel: IF Anweisung mit UND-Verknüpfung
Beitrag von: Peterson am 05 Mai 2014, 22:06:10
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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: michaelfhem am 05 Mai 2014, 22:57:30
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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: michaelfhem am 05 Mai 2014, 23:03:01
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...
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Wuppi68 am 06 Mai 2014, 07:16:27
Schreib IF und ELSE in großen Buchstaben

Gesendet von meinem iPad mit Tapatalk HD
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag 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.
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: fhainz am 06 Mai 2014, 12:31:20
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 €
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Peterson am 06 Mai 2014, 18:49:05
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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: fhainz am 06 Mai 2014, 18:59:53
Nein das hast du schon richtig Verstanden.
Das "normale" Perl if wird oft mit dem IF Modul (http://fhem.de/commandref_DE.html#IF) 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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: fhainz am 06 Mai 2014, 19:04:22
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 ;)
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: der-Lolo am 06 Mai 2014, 19:19:58
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...
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Puschel74 am 06 Mai 2014, 19:25:22
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  ;)
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: der-Lolo am 06 Mai 2014, 19:32:58
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...
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Puschel74 am 06 Mai 2014, 19:36:01
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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: der-Lolo am 06 Mai 2014, 19:38:53
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.
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Peterson am 06 Mai 2014, 22:41:14
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
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Peterson am 07 Mai 2014, 21:38:11
hat keiner eine Idee? Ich bin leider zwischenzeitlich auch nicht weitergekommen.

Gruß,

Peterson
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Dietmar63 am 07 Mai 2014, 23:06:59
Ein paar Tipps, wie du zum Ziel kommst.

Du bist schon auf dem richtigen Weg. Ich würde es so machen:

1) fhem.cfg
define test notify STATUS:offen define a1 at +00:00:01  { meineVerzoegerteRoutine() }

2) in 99_myUtils.pm

sub meineVerzoegerteRoutine() {
   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")
   }
}


übersichtlicher:

sub meineVerzoegerteRoutine() {

   my $fensterAufWohnzimmer = ReadingsVal("Wohnz_Strasse_rechts_Tuerkontakt","state","0");
   my $fensterAufTuer       = ReadingsVal("Eingangstuer_Tuerschlosskontakt", "state","0");
   
   if(  $fensterAufWohnzimmer eq "closed" &&  $fensterAufTuer eq "closed") {
      system("<linux Programm> &")
   } else {
      fhem("set TEST_DUMMY off")
   }
}   


Das Ganze hat den Vorteil, dass du dich nicht mit den / am Ende herumschlagen musst, und dass du mit Perl die volle Kontrolle über das ganze fhem hast, und alle umfangreicheren Perlkonstrukte landen in einer Datei 99_myUtiuls(du musst eine eingen anlegen).

Die IF und UND Geräte verwirren meiner Meinung nach mehr als sie helfen. Zu if(Perl) gibt es mit Netze dicke Bücher, zu IF ... nur den Thread hier.

Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Damian am 08 Mai 2014, 22:35:34
Zitat von: Dietmar63 am 07 Mai 2014, 23:06:59
Zu if(Perl) gibt es mit Netze dicke Bücher
ja, die aber hier nicht weiter helfen.
Zitat
zu IF ... nur den Thread hier.

falsch, dafür gibt es die Commandref: http://fhem.de/commandref_DE.html#IF immerhin mit 11 vergleichbaren Beispielen.

Um es kurz zu machen:

define test notify STATUS:offen define a1 at +00:00:01  IF ([Wohnz_Strasse_rechts_Tuerkontakt] eq "closed" and [Eingangstuer_Tuerschlosskontakt] eq "closed") ({system("<linux Programm> &")}) ELSE (set TEST_DUMMY off)

Welcher Code für dich einfacher oder intuitiver erscheint, solltest du selbst beurteilen.

Gruß

Damian
Titel: Antw:IF Anweisung mit UND-Verknüpfung
Beitrag von: Peterson am 11 Mai 2014, 11:47:02
Hallo,

ich habe es geschafft.

Ich habe Dietmars Anregungen umgesetzt, weil ich auch interessiert war undes auprobieren wollte wie das mit der 99_MyUtils.pm funktioniert. Ich habe es nun zum laufen bekommen.
Jedoch ist dies eine neue Herausforderung und für einen nicht Perl Anwender (wie ich es bin) nicht so leicht gewesen es zu verstehen. Selbst jetzt bezweifel ich ob ich das richtig verstanden habe. Aber man lernt dazu und wird Step bei Step immer besser.

Ich habe die Version von Damian, auch vielen dank an Dich, auch ausprobiert. Diese funktioniert auch super.
Ich denke für Einsteiger ist diese wohl einfacher zum Ziel zu kommen.

Vielen Dank nochmal.

Gruß,

Peterson