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

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

Vorheriges Thema - Nächstes Thema

djhans

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

Damian

Im DEF-Eingabeeditor die Semikolons doppeln.

Gruß

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

djhans

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

djhans

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

djhans

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

Damian

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

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

djhans

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


Puschel74

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

Damian

#8
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

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.

Puschel74

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

Damian

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

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

djhans

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

Puschel74

Hallo,

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

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.