FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: djhans am 11 Februar 2014, 22:33:48

Titel: gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 11 Februar 2014, 22:33:48
Hallo,
ich möchte erreichen, dass der PlayWZ at +00:02:00 mit allen nachfolgenden set Kommandos angelegt wird. Geht das irgendwie? Derzeit wird nur "Volume 0" ausgeführt....

define define SchlafzimmerAlarmRunning Sonos_Schlafzimmer:AlarmRunning.*1
define PlayWZ at +00:02:00
set Sonos_Wohnzimmer Volume 0;
set Sonos Groups [Sonos_Schlafzimmer, Sonos_Wohnzimmer];
set Sonos_Wohnzimmer Volume 10 1;
set Sonos_Schlafzimmer SleepTimer 00:02:00;


soll bewirken, dass der 2. Aktionsblock  nach x-Minuten ausgeführt wird. Ein sleep kann wohl nur 999s dauern...
djhans
Titel: Antw:Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 11 Februar 2014, 22:42:36
Im DEF-Eingabeeditor die Semikolons doppeln.

Gruß

Damian
Titel: Antw:Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 09:51:28
Hallo,
danke für die Antwort, funktioniert aber nicht. Im Logfile steht "wrong timespec"
2014.02.12 09:30:05 5: Cmd: >define PlayWZ at +00:02:00
set Sonos_Wohnzimmer Volume 0;
set Sonos Groups [Sonos_Schlafzimmer, Sonos_Wohnzimmer];
set Sonos_Wohnzimmer Volume 10 1;
set Sonos_Schlafzimmer SleepTimer 00:02:00;<
2014.02.12 09:30:05 1: define: Wrong timespec, use "[+][*[{count}]]<time or func>"
2014.02.12 09:30:05 3: SchlafzimmerAlarmRunning return value: Wrong timespec, use "[+][*[{count}]]<time or func>"

aber wieso?

hier noch einmal der code aus dem def-Bereich:

Sonos_Schlafzimmer:AlarmRunning.*1
define PlayWZ at +00:02:00
set Sonos_Wohnzimmer Volume 0;;
set Sonos Groups [Sonos_Schlafzimmer, Sonos_Wohnzimmer];;
set Sonos_Wohnzimmer Volume 10 1;;
set Sonos_Schlafzimmer SleepTimer 00:02:00;;


djhans
Titel: Antw:Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 09:58:41
Hi,
hat sich erledigt. Es war das Leerzeichen hinter dem +00:02:00. Das ist aber auch ein Kack mit den blöden Leerzeichen in fhem...

Christian
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 16:18:06
Hi,
doch noch einmal ich! Wie mache ich das, wenn ich perl-Code verwenden muss?  Brauche ich dann 4 Semikolons?

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

djhans
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 12 Februar 2014, 16:52:54
Zitat von: djhans am 12 Februar 2014, 16:18:06
Hi,
doch noch einmal ich! Wie mache ich das, wenn ich perl-Code verwenden muss?  Brauche ich dann 4 Semikolons?

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

djhans

probiere einfach IF aus, dann hast du einige Probleme weniger:

Sonos_Schlafzimmer:AlarmRunning.*1
IF ([Sonos_Schlafzimmer:AlarmRunningID] == 90)
(
  sleep 120,
  set Sonos_Wohnzimmer Volume 0,
  set Sonos_Schlafzimmer AddMember Sonos_Wohnzimmer,
  set Sonos_Wohnzimmer Volume 5 1,
  set Sonos_Schlafzimmer SleepTimer 00:02:00
)


siehe http://forum.fhem.de/index.php/topic,17895.msg118503.html#msg118503

Gruß

Damian

Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 17:03:42
Hi,
danke für den Tipp, aber mit sleep kann ich nicht arbeiten, da mehr als 999s warten muss 8im Bsp halt nur 2min), deshalb dachte ich an den Define... aber dann klappt das mit den Semikolons wieder nicht....

Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Puschel74 am 12 Februar 2014, 17:05:27
Hallo,

wie wäre es wenn du aus dem zweiten Define ein Macro machst und nur dieses Macro per at triggern lässt?
Also sprich ein externes Define das aus dem at dann aufgerufen wird.

Grüße
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 12 Februar 2014, 17:17:03
Zitat von: djhans am 12 Februar 2014, 17:03:42
Hi,
danke für den Tipp, aber mit sleep kann ich nicht arbeiten, da mehr als 999s warten muss 8im Bsp halt nur 2min), deshalb dachte ich an den Define... aber dann klappt das mit den Semikolons wieder nicht....

Es ist ein FHEM-sleep; ob sleep 999 Sekunden wartet oder at, das ist FHEM Wurscht - FHEM läuft weiter. Bitte nicht mit einem System-sleep verwechseln.


Gruß

Damian
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 17:59:18
Hi Damian,
das habe ich schon verstanden, dass das System nicht anhält, aber 999s reichen manchmal einfach nicht. Größere Zeitspannen kann man mit sleep m.E. nicht überbrücken. Sicherlich kann man auch mehrer sleeps hintereinander setzten, dann wird es aber sehr unübersichtlich, vor allem dann, wenn man auf diese Art und Weise mehrere Abhängigkeiten steuern möchte.

Ich werde mir mal die Sache mit dem Macro ansehen. Da ich Anfänger bin, muss ich erst mal gucken, wie das geht! Das kenne ich noch nicht.

@ all
Danke für Eure Geduld. Und eine Frage habe ich doch noch: Geht das nun mit dem 2. define, oder nicht! Ich will die Feinheiten von fhem ja auch irgendwann mal komplett durchblicken...

djhans.
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Puschel74 am 12 Februar 2014, 18:13:10
Hallo,

ZitatGeht das nun mit dem 2. define,
Klar - wie gesagt als Macro recht easy  ;)

Versuch mal so:

Notify1:
Sonos_Schlafzimmer:AlarmRunning.*1 {
  if (ReadingsVal("Sonos_Schlafzimmer","AlarmRunningID",0) == 90) {
    fhem("define notify2_spaeter at +01:00:00 trigger notify2") if (Value("notify2_spaeter") eq "");
  } else {
    fhem("delete notify2_spaeter") if (Value("notify2_spaeter") ne "");
  }
}


Und dann Notify2:
define notify2 notify notify2 {
  fhem("set Sonos_Wohnzimmer Volume 0");
  fhem("set Sonos_Schlafzimmer AddMember Sonos_Wohnzimmer");
  fhem("set Sonos_Wohnzimmer Volume 5 1");
  fhem("set Sonos_Schlafzimmer SleepTimer 00:02:00;;");
}


Im ersten Notify wird das at nur angelegt wenn es nicht bereits existiert - ich weiß ja nicht wie oft  if (ReadingsVal("Sonos_Schlafzimmer","AlarmRunningID",0) == 90) zutrifft.
Die eine Stunde im at habe ich nur mal beispielhaft genommen - das kannst du gerne auf deine Bedürfnisse anpassen  ;).
Wenn die Zeit abgelaufen ist wird trigger notify2 ausgelöst und damit das zweite Notify "gezündet".

Ich hoffe ich hab dein "Grundnotify" richtig zerpflückt.
Wenn nicht dann poste doch bitte getrennt das "Hauptnotify" und den Code der im Macro ausgeführt werden soll.

Grüße

Edith: Notify1 überarbeitet - es wird nun gelöscht wenn if (ReadingsVal("Sonos_Schlafzimmer","AlarmRunningID",0) != 90).
Ich weiß ja nicht ob das bei deiner Anforderung Sinn macht.
Wenn nicht dann den else-Zweig bitte  else {
    fhem("delete notify2_spaeter") if (Value("notify2_spaeter") ne "");
  }
löschen

Edith2: Grad gesehen - im notify2 unnötige { und } entfernt
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 12 Februar 2014, 18:32:39
Zitat von: djhans am 12 Februar 2014, 17:59:18
Hi Damian,
das habe ich schon verstanden, dass das System nicht anhält, aber 999s reichen manchmal einfach nicht. Größere Zeitspannen kann man mit sleep m.E. nicht überbrücken. Sicherlich kann man auch mehrer sleeps hintereinander setzten, dann wird es aber sehr unübersichtlich, vor allem dann, wenn man auf diese Art und Weise mehrere Abhängigkeiten steuern möchte.
djhans.

Ich weiß nicht, warum da nur drei Dezimalstellen steht. Ich sehe in der Source keine Beschränkung - kannst ja probieren. Und intern wird die gleiche Funktion benutzt, wie beim at.

Gruß

Damian

Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 12 Februar 2014, 19:13:12
Du kannst den Code auslagern, mehrere notifys definieren oder dir das Leben sonst wie kompliziert machen, aber selbst:

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")
}
}


wäre mir im Vergleich zu meinem ersten Vorschlag, für dieses banale Problem, schon zu aufwändig .

Gruß

Damian
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 12 Februar 2014, 19:37:58
Hallo,
@ Puschel:
danke, aber ist schon sehr kompliziert (für einen Anfänger..) Es gibt nur den Fall für einen bestimmten Wert (==90), da man speziell auf eine AlarmID des Sonos-Systems reagiert. Zumindest fällt mir kein Anwendungsfall dazu ein....

@Damian,
im Prinzip hast Du recht, aber hier geht es mir in erster Linie darum zu verstehen. Dein Vorschlag mit dem IF finde ich eigentlich am Besten, da am Einfachsten. Wie installiert man so ein Modul? Das steht in deinem Thread nicht drin, oder ich habe es überlesen...

das sleep finde ich aber trotzdem doof, da man erst rechnen muss. 35min sind halt besser zu lesen als 2100s.
Christian.

Christian
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Puschel74 am 12 Februar 2014, 19:54:02
Hallo,

Zitatdanke, aber ist schon sehr kompliziert (für einen Anfänger..)
Es hat nie jemand gesagt das FHEM einfach ist  ;)

Grüße
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 12 Februar 2014, 20:19:52
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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag 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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 13 Februar 2014, 12:36:34
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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag 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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 13 Februar 2014, 16:07:14
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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: djhans am 13 Februar 2014, 16:50:40
Hi Damian,
super! Danke für den schnellen Support, das klappt jetzt einwandfrei!


Gruß,
Christian
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 13 Februar 2014, 16:59:37
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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag 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
Titel: Antw:gelöst: Frage zu define innerhalb eines define .. Notify
Beitrag von: Damian am 13 Februar 2014, 21:56:04
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