gelöst: Frage zu define innerhalb eines define .. Notify

Begonnen von djhans, 11 Februar 2014, 22:33:48

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: djhans am 12 Februar 2014, 19:37:58
Wie installiert man so ein Modul? Das steht in deinem Thread nicht drin, oder ich habe es überlesen...

Einfach 98_IF.pm downloaden, FHEM stoppen, in den Ordner FHEM kopieren, FHEM wieder starten.

So kannst du das "komplizierte" FHEM etwas einfacher machen. ;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

Hallo Damian,
ich habe das heute mal mit Deiner IF-Anweisung ausprobiert und muss sagen, es ist viel übersichtlicher. Ich denke, ich bleibe dabei.
Trotzdem noch mal die Frage, ob man ein define at +nn innerhalb der IF-Anweisung kapseln kann, ähnlich wie mit den 2 Semikolons. Oder wird es dann wieder so kompliziert.

Vielleicht auch in Verbindung mit dem Makro.
Christian

Damian

Zitat von: djhans am 13 Februar 2014, 10:50:43
Hallo Damian,
ich habe das heute mal mit Deiner IF-Anweisung ausprobiert und muss sagen, es ist viel übersichtlicher. Ich denke, ich bleibe dabei.
Trotzdem noch mal die Frage, ob man ein define at +nn innerhalb der IF-Anweisung kapseln kann, ähnlich wie mit den 2 Semikolons. Oder wird es dann wieder so kompliziert.

Vielleicht auch in Verbindung mit dem Makro.
Christian

Es freut mich, dass es dir das FHEM-Leben etwas leichter macht  :).

Natürlich kannst du jeden FHEM-Befehl in IF einbauen. Wenn du unbedingt den define ... at haben möchtest, dann kannst du den selbstverständlich einsetzen. Da die folgenden set-Kommandos zu deinem at gehören, müssen sie allerdings wieder mit den doppelten Semikolons getrennt werden und nicht einfach mit einem Komma. Denn für den define ... inklusive der set-Kommandos ist ja der FHEM-Interpreter zuständig und damit liegt die Syntax außerhalb der Einflussnahme des IF-Kommandos.

Die Sache würde dann so aussehen:

Sonos_Schlafzimmer:AlarmRunning.*1 
IF ([Sonos_Schlafzimmer:AlarmRunning] == 90)
(define PlayWZ at +00:02:00 set Sonos_Wohnzimmer Volume 0;;
            set Sonos_Schlafzimmer AddMember Sonos_Wohnzimmer;;
            set Sonos_Wohnzimmer Volume 5 1;;
            set Sonos_Schlafzimmer SleepTimer 00:02:00)


Ist allerdings immer noch kürzer und eleganter als mein zweiter Vorschlag mit perl-if, weil man nicht auf die Perl-Ebene runter muss.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

Hi,
hm! das geht aber nicht!
Die Befehle werden direkt ausgeführt und im Logfile steht:

2014.02.13 13:34:16 3: SchlafzimmerAlarmRunning return value: Unknown command {if(ReadingValIf('Sonos_Schlafzimmer','AlarmRunningID',''), try help.

Muss nicht zwischen Val und if ein Leerzeichen stehen? Oder wo ist hier der Fehler?

Christian

Damian

Zitat von: djhans am 13 Februar 2014, 13:41:48
Hi,
hm! das geht aber nicht!
Die Befehle werden direkt ausgeführt und im Logfile steht:

2014.02.13 13:34:16 3: SchlafzimmerAlarmRunning return value: Unknown command {if(ReadingValIf('Sonos_Schlafzimmer','AlarmRunningID',''), try help.

Muss nicht zwischen Val und if ein Leerzeichen stehen? Oder wo ist hier der Fehler?

Christian

Das hat was mit dem Verdoppeln von Semikolons zu tun. Lade noch mal die aktualisierte Version von IF - mit dieser sollte es gehen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

Hi Damian,
super! Danke für den schnellen Support, das klappt jetzt einwandfrei!


Gruß,
Christian

Damian

#21
Zitat von: djhans am 13 Februar 2014, 16:50:40
Hi Damian,
super! Danke für den schnellen Support, das klappt jetzt einwandfrei!


Gruß,
Christian


Übrigens, der zweite Vorschlag mit Perl-if würde so gar nicht funktionieren. Man muss sogar die Semikolons vervierfachen, damit beim define jeweils eins ankommt, also

Sonos_Schlafzimmer:AlarmRunning.*1 
{
if (ReadingsVal  ("Sonos_Schlafzimmer","AlarmRunningID",0) == 90)
{
   fhem("define PlayWZ at +00:02:00 set Sonos_Wohnzimmer Volume 0;;;;
            set Sonos_Schlafzimmer AddMember Sonos_Wohnzimmer;;;;
            set Sonos_Wohnzimmer Volume 5 1;;;;
            set Sonos_Schlafzimmer SleepTimer 00:02:00")
}
}


Die fehlende Klammernhierarchie in FHEM schlägt hier voll zu >:(. Ich glaube da bist du mit IF besser bedient, denn die Vervierfachung regele ich jetzt in IF.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

Hi,
ich noch mal.
Kann man mit Deinem IF auch so etwas behandeln?

define Geburtstag holiday
wenn ich nun auf den Geburtstag von morgen reagieren möchte, müsste ich den Wert vergleichen. Den wert kriege ich mit:
get Geburtstag tomorrow

IF Value(get Geburtstag tomorrow) eq "Laura"
......


wie müsste die Syntax aussehen? Das habe ich noch nicht geblickt!
djhans

Damian

Zitat von: djhans am 13 Februar 2014, 21:32:46
Hi,
ich noch mal.
Kann man mit Deinem IF auch so etwas behandeln?

define Geburtstag holiday
wenn ich nun auf den Geburtstag von morgen reagieren möchte, müsste ich den Wert vergleichen. Den wert kriege ich mit:
get Geburtstag tomorrow

IF Value(get Geburtstag tomorrow) eq "Laura"
......


wie müsste die Syntax aussehen? Das habe ich noch nicht geblickt!
djhans

Z. Zt. ist IF auf Readings spezialisiert. holiday-Modul hat keine Readings. Was du jedoch machen kannst ist:

IF (fhem("get Geburtstag tomorrow") eq "Laura") (FHEM-Befehle...

Vielleicht werde ich mir zukünftig noch eine einfachere Syntax für FHEM-Befehlsaufrufe in der Bedingung überlegen. Jedoch, selbst in diesem Fall ist Perl-if nicht kürzer oder einfacher.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF