Hauptmenü  

   

Elektronik  

   

Login  

   

Beitragsseiten

Irgendwann benötigt man für Alarm und Info Meldungen eine Ansage, dazu stehen verschiedene Möglichkeiten zu Auswahl.

Für mich war ein wichtiger Faktor, dass das ganze auch ohne Internet Verbindung funktioniert und deshalb viel die Wahl auf einen MP3 Lautsprecher von ELV. Der einzige Nachteil dabei: Die Texte (oder Musik) muss vorher auf einer SD-Karte gespeichert werden. Der Vorteil: Das ganze funktioniert "autark", und darauf sollte man ein Auge haben, viel zu oft wird das Internet als "permanent vorhanden" wahr genommen.

Zuerst wurden die Ausgaben ganz normal über das WEB-UI der HomeMatic programmiert. Das lief auch wunderbar, bis zu einem Tag X, an dem folgendes passierte:

  • Es trat ein ernst zu nehmender Zustand ein, der über Lautsprecher auch alarmiert werden sollte
  • Die HM hat dann auch den Lautsprecher korrekt angesteuert
  • Zeitgleich trat aber auch ein Zustand ein, der eine unwichtige Service Ansage auch auf den Lautsprecher ausgab
  • Dadurch wurde die Ausgabe des Alarmzustandes quasi durch die unwichtige Ansage überschrieben

Man sieht da wieder einmal, dass Murphy doch immer recht hat. Also musste eine Priorisierung der Ausgabe her, damit soetwas auf keinen Fall wieder passiert. Daraus entstand dann die hier beschriebe Anwendung für die HM, die natürlich noch einige andere Funktionalitäten erfüllen sollte.

  • Im Alarmfall nur Ausgabe von Alarmmeldungen
  • Zentral gesteuerte Lautstärke für Alarmmeldungen
  • Zentral gesteuerte Lautstärke für normale Meldungen
  • Tageszeitlich unterschiedliche Lautstärke getrennt regelbar

Wie immer werden dafür einige Systemvariable in der HM benötigt, die zuvor angelegt werden müssen:

Systemvariable Alarm

Diese Variable hat im Normalfall den Zustand "Ruhe", sollte jedoch irgendein Alarm im System auftreten, hat sie den Zustand "Alarm", sie ist vom Typ "Alarm", wenn ich mich noch richtig erinnere, ist diese Variable Standardmässig vorhanden, ich könnte mich da aber auch täuschen, ist lange her....

SysVar Alarm

 

Systemvariable MP3-Kueche-AL-SoundLevel

Diese Variable besteht aus einer Werte-Liste, mit der die Lautstärke einer "Alarm-Ansage" gesteuert werden kann. Dies kann zum Beispiel abhängig von der Uhrzeit auf verschiedene Werte gesetzt werden.

Achtung! Diese Variable sollte bei einem Neustart der HomeMatic bereits gesetzt werden, da bei einem Kaltstart diese den Wert 0 enthält und somit die Ausgabe nicht hörbar ist! (Siehe Beitrag über CCU_BOOT)

 SysVar MP3 Kueche AL SoundLevel

 

Systemvariable MP3-Kueche-MSG-SoundLevel

Diese Variable besteht aus einer Werte-Liste, mit der die Lautstärke einer "MSG-Ansage" gesteuert werden kann. Dies kann zum Beispiel abhängig von der Uhrzeit auf verschiedene Werte gesetzt werden.

Achtung! Diese Variable sollte bei einem Neustart der HomeMatic bereits gesetzt werden, da bei einem Kaltstart diese den Wert 0 enthält und somit die Ausgabe nicht hörbar ist! (Siehe Beitrag über CCU_BOOT)

 SysVar MP3 Kueche MSG SoundLevel

 

Systemvariable MP3-MsgText

Diese Zeichenkette Variable, enhält den Text in kodierter Form, der als normale Nachricht ausgegeben wird und zusätzlich bei Bedarf die Kodierung für die LED Ansteuerung.

 SysVar MP3 MsgText

 

Systemvariable MP3-AlarmText

Diese Zeichenkette Variable, enhält den Text in kodierter Form, der als Alarm Nachricht priorisiert ausgegeben wird und zusätzlich bei Bedarf die Kodierung für die LED Ansteuerung.

SysVar MP3 AlarmText

 

Kodierung der Ausgabetexte

Um eine Ausgabe zu erzeugen, muss nur ein Text in eine der MP3-xxxxText Variablen geschrieben werden, der Rest wird dann je nach Alarm Zustand der HM, automatisch abgearbeitet.

Eine Ausgabe kann aus zwei Text Segmenten bestehen, wobei das erste Segment die Ausgabe der Soundfiles veranlasst und das zweite Segment zur Ansteuerung der LED am Lautsprecher dient. Die Segmente sind durch das "+" Zeichen voneinander getrennt. Damit die Zusammenstellung der abzuspielenden MP3's auch über die Bedienoberfläche der HM gemacht werden kann, habe ich das Format übernommen. Als Beispiel soll nun mal folgende Ausgabe dienen:

MP3-MsgText = "1,5,108000,17,12+1,20,108000,18,2,18,2,18,2,18,2,18,2"

Erstes Segment (MP3) = "1,5,108000,17,12"

Index Wert Bedeutung
1 1 Lautstärke, ist aber ohne Belang, da als Lautstärke der Wert aus "SoundLevel" genommen wird
2 5 Anzahl der Wiederholungen (5x Ausgabe wiederholen)
3 108000 Keine Ahnung für was dieser Wert steht, muss aber immer gleich sein
4 17 Spiele Sounddatei Nr. 17 ab
5 12 Spiele Sounddatei Nr. 12 ab

 

Optional Zweites Segment (LED) durch "+" Zeichen getrennt:

Index Wert Bedeutung
1 1 Kanal ist aktiv, bei 0 keine Aktivierung der LED Ausgabe
2 20 Anzahl der Wiederholunge (20x LED Sequenz wiederholen)
3 108000 Keine Ahnung für was dieser Wert steht, muss aber immer gleich sein
ff   LED Sequenz, siehe HM-UI)


Programm MP3-Alarm-ausgeben

Dieses Programm reagiert auf eine Aktualisierung der Systemvariable "MP3-AlarmText" und bedient einen MP3-Lautsprecher. Sollten mehrere Lautsprecher vorhanden sein, können hier zeitversetzt zusätzliche Scripte aufgerufen werden. Die Erfahrung hat aber gezeigt, daß dies nur sinnvoll ist, wenn wirklich alle Ausgaben auf alle Lautsprecher erfolgen sollen. Sobald es nötig wird, die Ausgaben zu differenzieren, sollten für die zusätzlichen Lautsprecher jeweils eigene Systemvariable mit eigenen Ausgabeprogrammen erstellt werden.

Möchte man eine zeitversetzte Ausgabe löschen, kann man einfach den Text der Systemvariablen auf "" setzen und somit die Ausgabe verhindern.

 

Name Beschreibung Bedingung (Wenn...) Aktivität (Dann.., Sonst..) Aktion
MP3-Alarm-ausgeben Message ausgeben, sofern Anlage Alarmfrei Systemzustand: MP3-AlarmText bei im Wertebereich von Stop bis kleiner bei Aktualisierung auslösen Skript: ... sofort ausführen
Bedingung: Wenn...
Systemzustand MP3-AlarmTextbeiStop bei Aktualisierung auslösen
ODER
Systemzustand CCU_BOOT bei nein nur prüfen
UND
Systemzustand CCU_BOOT bei nein nur prüfen
 
Aktivität: Dann...
Skript
! Message Ausgabe auf MP-Player veranlassen, Text wird aus der Systemvariable "MP3-AlarmText" ausgelesen
! Der Text kann einen Lautstärke Anteil haben, dieser wird aber durch die Vorgabe ersetzt
! Lautstärke wird von der Systemvariable "MP3-Kueche-AL-SoundLevel" abgeleitet
! Beispiel: 1,108000,1,2,4,1,4+1,4,108000,50,17,18,34,81,97,0,0,0,0
! MP3 Anteil und LED Anteil wird durch "+" getrennt

string textAll;
string mpText;
string ledText;
string mpLeft;
string mpTitle;
string repeat;
string textOut;
string mark = ",108000,";
var index;
var list;
var loud;
var mp;
var mp3;

! Ausgabeinformation aus SysVar holen
string textAll = dom.GetObject("MP3-AlarmText").Value();

!Text in MP3 Anteil und LED Anteil splitten
mpText = textAll.StrValueByIndex("+",0);
ledText = textAll.StrValueByIndex("+",1);

!MP Text in Lautstärke Anteil/Wiederholungen und Titelliste splitten
integer cut = mpText.Find(mark);
mpLeft = mpText.Substr(0, cut);
mpTitle = mpText.Substr(cut + 8, mpText.Length());
repeat = mpLeft.StrValueByIndex(",",1);
if(!repeat) {repeat = mpLeft;}

! Index der Lautstärke auswahl aus Systemvariable holen
index = dom.GetObject("MP3-Kueche-AL-SoundLevel").Value();

! Liste der Lautstärke Indexe holen
list = dom.GetObject("MP3-Kueche-AL-SoundLevel").ValueList();

! Lautstärke aus der Liste holen
loud = list.StrValueByIndex(";",index);
! Textzeile für MP3 Steuerung neu bilden
mpText = loud #"," #repeat #mark #mpTitle;

if (mpText) {
!Ausgabe auf MP3 Küche generieren
mp = dom.GetObject("MP3-Kueche-Sound");
mp3 = mp.DPByHssDP("SUBMIT");
mp3.State(mpText);
}


sofort
Skript


! LED Ausgabe auf MP-Player veranlassen, Text wird aus der Systemvariable "MP3-AlarmText" ausgelesen
! Der Text kann einen Lautstärke Anteil haben, dieser wird aber durch die Vorgabe ersetzt
! Lautstärke wird von der Systemvariable "MP3-Kueche-AL-SoundLevel" abgeleitet
! Beispiel: 1,108000,1,2,4,1,4+1,4,108000,50,17,18,34,81,97,0,0,0,0
! MP3 Anteil und LED Anteil wird durch "+" getrennt

string textAll;
string mpText;
string ledText;
string mpLeft;
string mpTitle;
string repeat;
string textOut;
string mark = ",108000,";
var index;
var list;
var loud;
var mp;
var mp3;

! Ausgabeinformation aus SysVar holen
string textAll = dom.GetObject("MP3-AlarmText").Value();

!Text in MP3 Anteil und LED Anteil splitten
mpText = textAll.StrValueByIndex("+",0);
ledText = textAll.StrValueByIndex("+",1);

!MP Text in Lautstärke Anteil/Wiederholungen und Titelliste splitten
integer cut = mpText.Find(mark);
mpLeft = mpText.Substr(0, cut);
mpTitle = mpText.Substr(cut + 8, mpText.Length());
repeat = mpLeft.StrValueByIndex(",",1);
if(!repeat) {repeat = mpLeft;}

! Index der Lautstärke auswahl aus Systemvariable holen
index = dom.GetObject("MP3-Kueche-AL-SoundLevel").Value();

! Liste der Lautstärke Indexe holen
list = dom.GetObject("MP3-Kueche-AL-SoundLevel").ValueList();

! Lautstärke aus der Liste holen
loud = list.StrValueByIndex(";",index);
! Textzeile für MP3 Steuerung neu bilden
mpText = loud #"," #repeat #mark #mpTitle;

if (ledText) {
! Text für LED Ansteuerung ist vorhanden, dann ausgeben
mp = dom.GetObject("MP3-Kueche-LED");
mp3 = mp.DPByHssDP("SUBMIT");
mp3.State(ledText);
}

verzögert um 1 Sekunden
Skript
Aktivität:Sonst...


Programm MP3-Message-ausgeben

Dieses Programm reagiert auf eine Aktualisierung der Systemvariable "MP3-MsgText" und bedient einen MP3-Lautsprecher. Das Programme wird nur ausgeführt, wenn aktuell kein Alarm ansteht, ansonsten wird die Ausgabe verworfen.

Sollten mehrere Lautsprecher vorhanden sein, können hier zeitversetzt zusätzliche Scripte aufgerufen werden. Die Erfahrung hat aber gezeigt, daß dies nur sinnvoll ist, wenn wirklich alle Ausgaben auf alle Lautsprecher erfolgen sollen. Sobald es nötig wird, die Ausgaben zu differenzieren, sollten für die zusätzlichen Lautsprecher jeweils eigene Systemvariable mit eigenen Ausgabeprogrammen erstellt werden.

Möchte man eine zeitversetzte Ausgabe löschen, kann man einfach den Text der Systemvariablen auf "" setzen und somit die Ausgabe verhindern.

 

Name Beschreibung Bedingung (Wenn...) Aktivität (Dann.., Sonst..) Aktion
MP3-Message-ausgeben Message ausgeben, sofern Anlage Alarmfrei Systemzustand: MP3-MsgText bei im Wertebereich von Stop bis kleiner bei Aktualisierung auslösen Skript: ... sofort ausführen
Bedingung: Wenn...
Systemzustand MP3-MsgTextbeiStop bei Aktualisierung auslösen
ODER
Systemzustand CCU_BOOT bei nein nur prüfen
UND
Systemzustand Alarm bei Ruhe nur prüfen
UND
Systemzustand CCU_BOOT bei nein nur prüfen
 
Aktivität: Dann...
Skript
! Message Ausgabe auf MP-Player veranlassen, Text wird aus der Systemvariable "MP3-MsgText" ausgelesen
! Der Text kann einen Lautstärke Anteil haben, dieser wird aber durch die Vorgabe ersetzt
! Lautstärke wird von der Systemvariable "MP3-Kueche-MSG-SoundLevel" abgeleitet
! Beispiel: 1,108000,1,2,4,1,4+1,4,108000,50,17,18,34,81,97,0,0,0,0
! MP3 Anteil und LED Anteil wird durch "+" getrennt

string textAll;
string mpText;
string ledText;
string mpLeft;
string mpTitle;
string repeat;
string textOut;
string mark = ",108000,";
var index;
var list;
var loud;
var mp;
var mp3;

! Ausgabeinformation aus SysVar holen
string textAll = dom.GetObject("MP3-MsgText").Value();

!Text in MP3 Anteil und LED Anteil splitten
mpText = textAll.StrValueByIndex("+",0);
ledText = textAll.StrValueByIndex("+",1);

!MP Text in Lautstärke Anteil/Wiederholungen und Titelliste splitten
integer cut = mpText.Find(mark);
mpLeft = mpText.Substr(0, cut);
mpTitle = mpText.Substr(cut + 8, mpText.Length());
repeat = mpLeft.StrValueByIndex(",",1);
if(!repeat) {repeat = mpLeft;}

! Index der Lautstärke auswahl aus Systemvariable holen
index = dom.GetObject("MP3-Kueche-MSG-SoundLevel").Value();

! Liste der Lautstärke Indexe holen
list = dom.GetObject("MP3-Kueche-MSG-SoundLevel").ValueList();

! Lautstärke aus der Liste holen
loud = list.StrValueByIndex(";",index);
! Textzeile für MP3 Steuerung neu bilden
mpText = loud #"," #repeat #mark #mpTitle;


!WriteLine("Lautstärke: " #loud);
!WriteLine("Repeats: " #repeat);
!WriteLine("Titelliste: " #mpTitle);
!WriteLine("MP3 Ausgabe: " #mpText);
!WriteLine("LED Text: " #ledText);

if (mpText) {
!Ausgabe auf MP3 Küche generieren
mp = dom.GetObject("MP3-Kueche-Sound");
mp3 = mp.DPByHssDP("SUBMIT");
mp3.State(mpText);
}

!if (ledText) {
! ! Text für LED Ansteuerung ist vorhanden, dann ausgeben
! mp = dom.GetObject("MP3-Kueche-LED");
! mp3 = mp.DPByHssDP("SUBMIT");
! mp3.State(ledText);
!}

sofort
Skript
! LED Ausgabe auf MP-Player veranlassen, Text wird aus der Systemvariable "MP3-MsgText" ausgelesen
! Der Text kann einen Lautstärke Anteil haben, dieser wird aber durch die Vorgabe ersetzt
! Lautstärke wird von der Systemvariable "MP3-Kueche-MSG-SoundLevel" abgeleitet
! Beispiel: 1,108000,1,2,4,1,4+1,4,108000,50,17,18,34,81,97,0,0,0,0
! MP3 Anteil und LED Anteil wird durch "+" getrennt

string textAll;
string mpText;
string ledText;
string mpLeft;
string mpTitle;
string repeat;
string textOut;
string mark = ",108000,";
var index;
var list;
var loud;
var mp;
var mp3;

! Ausgabeinformation aus SysVar holen
string textAll = dom.GetObject("MP3-MsgText").Value();

!Text in MP3 Anteil und LED Anteil splitten
mpText = textAll.StrValueByIndex("+",0);
ledText = textAll.StrValueByIndex("+",1);

!MP Text in Lautstärke Anteil/Wiederholungen und Titelliste splitten
integer cut = mpText.Find(mark);
mpLeft = mpText.Substr(0, cut);
mpTitle = mpText.Substr(cut + 8, mpText.Length());
repeat = mpLeft.StrValueByIndex(",",1);
if(!repeat) {repeat = mpLeft;}

! Index der Lautstärke auswahl aus Systemvariable holen
index = dom.GetObject("MP3-Kueche-MSG-SoundLevel").Value();

! Liste der Lautstärke Indexe holen
list = dom.GetObject("MP3-Kueche-MSG-SoundLevel").ValueList();

! Lautstärke aus der Liste holen
loud = list.StrValueByIndex(";",index);
! Textzeile für MP3 Steuerung neu bilden
mpText = loud #"," #repeat #mark #mpTitle;


!WriteLine("Lautstärke: " #loud);
!WriteLine("Repeats: " #repeat);
!WriteLine("Titelliste: " #mpTitle);
!WriteLine("MP3 Ausgabe: " #mpText);
!WriteLine("LED Text: " #ledText);

!if (mpText) {
! !Ausgabe auf MP3 Küche generieren
! mp = dom.GetObject("MP3-Kueche-Sound");
! mp3 = mp.DPByHssDP("SUBMIT");
! mp3.State(mpText);
!}

if (ledText) {
! Text für LED Ansteuerung ist vorhanden, dann ausgeben
mp = dom.GetObject("MP3-Kueche-LED");
mp3 = mp.DPByHssDP("SUBMIT");
mp3.State(ledText);
}

verzögert um 1 Sekunden
Aktivität:Sonst...

Programm Nachtschaltung

Mit diesem Programm wird die Lautstärke von Ausgaben auf den MP3 Lautsprecher abhängig von der Tageszeit gesteuert. Sind mehr als ein Lautsprecher vorhanden, sind diese hier mit den zugehörigen Systemvariable einzutragen.

 

Name Beschreibung Bedingung (Wenn...) Aktivität (Dann.., Sonst..) Aktion
Nachtschaltung Soundlevel für MP3 Tageszeitabhängig Zeit: Täglich von 06:30 Uhr beginnend am 25.06.2016 zu Zeitpunkten auslösen Systemzustand: MP3-Kueche-AL-SoundLevel sofort auf 1 setzen
Bedingung: Wenn...
Zeitsteuerung
    Zeit: Zeitbereich von 06:30 Uhr bis 21:59 Uhr
Serienmuster: täglich, jeden Tag
Gültigkeitsdauer: Beginn: 25.06.2016, kein Enddatum

 zu Zeitpunkten auslösen
ODER
Aktivität: Dann...
Systemzustand MP3-Kueche-AL-SoundLevel sofort 1
Systemzustand MP3-Kueche-MSG-SoundLevel sofort 0.5

Bedingung: Sonst, wenn...
Zeitsteuerung
    Zeit: Zeitbereich von 22:00 Uhr bis 22:59 Uhr
Serienmuster: täglich, jeden Tag
Gültigkeitsdauer: Beginn: 28.06.2016, kein Enddatum

 zu Zeitpunkten auslösen
ODER
Aktivität: Dann...
Systemzustand MP3-Kueche-AL-SoundLevel sofort 0.9
Systemzustand MP3-Kueche-MSG-SoundLevel sofort 0.4

Aktivität: Sonst...
Systemzustand MP3-Kueche-AL-SoundLevel sofort 0.9
Systemzustand MP3-Kueche-MSG-SoundLevel sofort 0.3

 


 Limits der priorisierten Ausgabe:

Natürlich hat auch diese Art der Ansteuerung ein paar Nachteile. Werden im Alarmzustand mehrere Meldungen kurz nacheinander ausgebenen, kann es sein, dass sich die Ansagen gegenseitig abbrechen. Bei normalen Ansagen kann das gleiche passieren. Ich habe mir überlegt, dass ich vielleicht nochmal eine etwas andere Funktionsweise erstelle, so eine Art "Pipeline", in der die Ausgaben zwischengespeichert werden und dann nach und nach an die Lautsprecher übergeben werden, sobald sie frei sind. Dabei müssen dann aber nach wie vor Alarmmeldungen priorisiert werden.

Oder vielleicht hat der eine oder andere "die Idee", wie sich das zuverlässig regeln lässt. Ich hatte in der Entwicklungsphase des öfteren das Problem, dass die Lautsprecher auf einmal nicht mehr ansprechbar waren. Ob das jetzt durch die schnelle wiederholte Ausgabe geschehen ist, oder ob da irgendwo ein DutyCycle zugeschlagen hat.....??

 

   
© WagoTec.de