Zeitabhängige Sprachausgabe mit MP3-Modul CFM-PL

Begonnen von SGi, 08 August 2013, 23:23:54

Vorheriges Thema - Nächstes Thema

SGi

Hallo zusammen,

ich versuche gerade, beim Öffnen der Haustür je nach Uhrzeit verschiedene Ansagen abzuspielen. Technisch geht alles - ein notify mit einem einzelnen play-Befehl geht problemlos.
Bei der Zeitsteuerung kommt aber gar nix. Hier der Auszug aus der cfg:

define EingangsVZ notify Haustuer:offen.*\
{\
  my $hm = sprintf("%02d:%02d", $hour, $min);;\
  if ((Value("hm") gt "02:00") && (Value("hm") lt "11:01")) {fhem("set Gong_MP3 playTone 003")}\
  elsif((Value("hm") gt "11:00" && (Value("hm") lt "17:01")) {fhem("set Gong_MP3 playTone 004")}\
  elsif((Value("hm") gt "17:00" && (Value("hm") lt "02:01")) {fhem("set Gong_MP3 playTone 005")}\
  else {fhem("set Gong_MP3 playTone 001")};;\
  sleep 1;;\
  if (Value("Alarmanlage") eq "scharf") { fhem("set Gong_MP3 playTone 110") };;\
}


Selbst wenn keine der Bedingungen erfüllt wäre (z.B. wegen falscher Formatierung etc) wird noch nicht mal Sound 001 abgespielt. Und der darauffolgende 110 auch nicht.

Apropos Formatierung: Ich sehe übrigens gerade, daß in der cfg nur noch ein % in der Zahlen Formatierung enthalten ist. Ist das geändert worden ?  Ich habe die DEF ursprünglich über die notify-Eigenschaften editiert und hatte in der cfg dann auch richtigerweise jeweils %% stehen, genau wie auch zwei ;;.  Mit zwei %% gings aber auch nicht... Wo ist mein Fehler ?

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

fiedel

Hi Sven,

wenn schon abschreiben, dann richtig! Ich mach es ja auch nicht anders... ;o)

Teste erst mal die Funktion des Notify an sich und der Zeitvariablen:


define EingangsVZ notify Haustuer:offen.* {\
\
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());;\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
\
Log 1, "EingangsVZ- Notify Inhalt der Zeitvariablen: $hm";;\
}


Wenn du jetzt die Tür öffnest, müsste im Log die Zeile erscheinen:
2013.08.09 07:46:59 1: EingangsVZ- Notify Inhalt der Zeitvariablen: 07:46
Nur mit der entsprechenden Uhrzeit.
Falls nichts erscheint, stimmt dein "Haustuer:offen.*" noch nicht ganz.

Dann muss sich natürlich der Sound direkt abspielen lassen.
Im FHEM- Eingabefeld:


set Gong_MP3 playTone 001


Wenn das alles geht, probiere mal zuerst mit einer if- Auswertung. Statt der elsif würde ich auch nur if nehmen. Nur das else unten sollte passen. Allerdings danach kein neues if mehr anfangen! Das ist glaub ich bei Strafe verboten. ;o)

Viel Erfolg

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

martinp876

Zitatmy $hm = sprintf("%02d:%02d", $hour, $min);;\
if ((Value("hm") gt "02:00") && (Value("hm") lt "11:01")) {fhem("set Gong_MP3 playTone 003")}\

warum
if ((Value("hm") gt "02:00")
und nicht
if ($hm gt "02:00")
?
Du willst eine Variable abfragen. Value sucht den "state" einer FHEM entity. Die gibt es nicht und - nehmen ich an - wird die Abfrage mit "Fehler" Terminieren. Daher kommen auch keine anderen Töne mehr.


SGi

Hallo Frank & Martin,

@Frank: Das notify ging an sich und die Zeitvariable hatte ich auch überprüft. Das waren genau die Teile die ich mir schon angesehen hate.

Aber:

@Martin: Du hast natürlich recht... da es sich nicht um eine FHEM-Struktur sondern eine Variable handelt, werden hier Äpfel mit Birnen ... oder so. :-)
Ich bin mir ziemlich sicher, daß ich am Anfang (vor Wochen) auch mal richtig irgendwo mit $hm abgeschrieben habe, das hat aber auch nicht funktioniert. Da ich nun glaube, daß das damals an der Formatierung (%%) lag, habe ich da wohl in der "Ursachenforschung der Nichtfunktion" den einen Fehler korrigiert und den anderen eingebaut. Man gönnt sich ja sonst nix.
Ist der Einwand von Frank bezüglich "elsif" denn berechtigt ? Macht es irgendeinen Unterschied, ob es mehrere einzelne ifs sind oder eine elsif-Konstruktion wird ? Eine richtig schöne "case $hm of"-Abfrage ohne mehr Tipperei gibt es ja wohl leider nicht.


Vielen Dank Euch beiden !

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

fiedel

Zitat@Frank: Das notify ging an sich und die Zeitvariable hatte ich auch überprüft. Das waren genau die Teile die ich mir schon angesehen hate.

Hm, na probier mal das aus, was du gepostet hast (mit nur einer Variablenzeile):



define EingangsVZ notify Haustuer:offen.* {\
\
my $hm = sprintf("%%02d:%%02d", $hour, $min);;\
\
Log 1, "EingangsVZ- Notify Inhalt der Zeitvariablen: $hm";;\
}



und dann probier mal "meine" ;oP Variante...

Das mit dem "if ((Value("hm")" hatte ich noch gar nicht bemerkt.
Nochmal zum elseif / else: In deinem Fall kannst du elseif weiter verwenden, musst es aber nicht, da ohnehin immer nur eine der Bedingungen zutrifft. Aber wenn du elseif verwendest, ist die Verarbeitung sogar schneller, da die anderen Bedingungen unter dem zutreffenden dann nicht mehr abgeprüft werden. Vermutlich auch nicht das "if" ganz unten. Aber ich bin nicht völlig sicher, deshalb - testen. ;o)

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

SGi

Hopsa, schon ein bisschen her, aber schließlich wollte ich noch mal posten, wie es nun bei mir dann doch funktioniert.

Das folgende Konstrukt liefert tageszeitabhängig beim Öffnen der Haustür - und nur falls die Alarmanlage noch scharfgeschaltet ist - eine Begrüßung "Guten Morgen/Tag/Abend ! Bitte identifizieren Sie sich", und erinnert damit freundlich daran, diese doch spätestestens jetzt zu deaktivieren...:

(Achtung, Code kopiert aus DEF, nicht direkt aus der cfg  !)

define Eingangsansage notify Haustuer:offen.* {
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
  my $hm = sprintf("%%02d:%%02d", $hour, $min);
  if (Value("Alarmanlage") eq "scharf") {
    if ($hm > "02:00" && $hm < "11:01") {
      fhem("set Gong_MP3 playTone 003,110");
    }
    elsif ($hm gt "11:00" && $hm lt "17:01") {
      fhem("set Gong_MP3 playTone 004,110");
    }
    else {
      fhem("set Gong_MP3 playTone 005,110");
    }
  }
}


Schöne Grüße,

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic