Ich kann gern mal aufzeigen, was ich umgesetzt habe. Für Anregungen bin ich immer offen.
Ich lasse bestimmte Fenster, die gern mal vergessen werden geschlossen zu werden, überwachen und dann soll eine Gong-Ansage darauf hinweisen.
Im EG sind es derzeit 3 Fenster, die überwacht werden:
Hier sieht man auch, dass die Fenster jeweils eine Variable haben für die Dauer, seit sie offen sind, und dafür, ob sie geschlossen werden müssen (die offen.seit-Variable hat einen bestimmten, vom jeweiligen Fenster abhängigen Schwellwert überstiegen).
Wie diese Variablen gesetzt werden, spar ich mir an dieser Stelle.
Hier soll es darum gehen, wie der Gong ausgelöst wird:
Wenn eine der Fenster-Variablen Fenster.<Raum>.Schliessen.EG.<#> sich auf "Fenster SCHLIESSEN" ändert, dann wird ein Script ausgeführt, das den Gong steuert (siehe unten), ansonsten wird der Gong inkl. LED ausgemacht:
Hier das Script, das den Gong ansteuert. Auf der SD-Karte des Gongs sind Ansagen für jedes Fenster gespeichert, z.B. "Das Fenster im Arbeitszimmer ist offen". Zusätzlich gibt es noch die pauschale Ansage "Bitte schliessen". Das Script bastelt in Abhängigkeit der Varaiblen einen String für den Datenpunkt SUBMIT des Gongs zusammen. In Endergebnis ertönt zuerst das interne Signal des Gongs (Datei 0), gefolgt von einer oder mehreren Ansagen für jedes Fenster, das geschlossen werden muss und zum Abschluss die Aufforderung "Bitte schließen". Diese Ansage wiederholt sich, bis das letzte Fenster geschlossen ist.
Code: Alles auswählen
! Alarm Gong EG - DANN-Zweig
!
! Steuert Gong-Ansage im EG
!
! offene Fenster:
! Prüft, ob im EG ein Fenster geschlossen werden muss. Dazu werden alle Geräte
! und Kanäle aus dem Gewerk "Verschluss" überprüft
!
! Voraussetzung:
! Den überwachten Fenstern muss eine Systemvariable zugeordnet werden mit
! folgender Nomenklatur:
! Fenster.<Raum>.Schliessen.<Etage>.<#Sound>
!
! * Es werden nur die Kanäle/Geräte berücksichtigt, denen eine entsprechende
! Variable zugeordnet ist
! * Filter: <Etage> = "EG"
! * <#Sound> = Nummer zwischen 1 und 254; bestimmt das MP3-File auf SD-Karte
! * Der Wert der Variable gibt an, ob das zugehörige Fenster geschlossen
! werden muss.
!
! Syntax MP3 Gong Sound-String
!
! vol, count, sec, file#1, file#2, ..., file#10
! vol = Lautstärke 0-100% als Dezimalzahl (z.B. 1.0 oder 0.8)
! count = Wiederholungen (max. 255)
! sec = Abspiellänge in Sekunden oder 108000 für Dateilänge
! file#1 = 1. von max 10 mp3 Files als Nummer
!
! Beispiel:
! 0.8,255,108000,8, 8, 8, 8, 6, 7, 6, 7, 6, 7
! 0.4,255,108000,1,1,4,3,2
!
! 80% Lautstärke bei 255 Wiederholungen und Abspieldauer = Dateilänge
! gespielt werden 4x File #8 gefolgt von 3x File #6 und #7
!
! v0.1 01-01-2017
! - Gong-Ansage: offene Fenster
var meineFenster = dom.GetObject("Verschluss");
string itemId;
string dpId;
string dpName;
string kanalAktion = "0.4,255,108000,0,"; ! Lautstärke = 40%, 255 Wiederholungen, maximale Abspiellänge, Sound 0 = interner Gong
boolean ringTheBell = false;
foreach(itemId, meineFenster.EnumUsedIDs())
{
var item = dom.GetObject(itemId);
if (item.IsTypeOf(OT_CHANNEL))
{
var device = dom.GetObject(item.Device());
var channel = item;
! Gültige Geräte
! HM-Sec-SC-2 Tür-/Fensterkontakt
! HM-Sec-RHS Fenster-Drehgriffkontakt
! HM-Sec-SCo Tür-/Fensterkontakt optisch
!
! Ungültige Geräte
! HM-CC-VG-1 virtuelles Gerät bei Heizgruppen
if ((device.HssType() == "HM-Sec-SC-2") || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-Sec-SCo"))
{
var dp_state = item.DPByHssDP("STATE");
foreach(dpId, channel.DPs().EnumUsedIDs())
{
var dp = dom.GetObject(dpId);
if (dp.IsTypeOf(OT_VARDP))
{
! Variable gefunden
! Prüfen, ob Variable den Namenskonventionen entspricht:
! Fenster.<Raum>.Schliessen.EG.<#Sound>
dpName = dp.Name();
if((dpName.StrValueByIndex(".", 0) == "Fenster") && (dpName.StrValueByIndex(".", 2) == "Schliessen") && (dpName.StrValueByIndex(".", 3) == "EG"))
{
! Richtige Variable gefunden
if (dp.Value())
{
! Das Fenster muss geschlossen werden
kanalAktion = kanalAktion # dpName.StrValueByIndex(".", 4) # ","; ! Der letzte Abschnitt des Variablen-Namen bestimmt das spezielle MP3-File
ringTheBell = true;
}
}
}
}
}
}
}
var kanalGongSound = dom.GetObject("Gong EG:Sound");
var kanalGongLED = dom.GetObject("Gong EG:LED");
var dp_Sound_WORKING = kanalGongSound.DPByHssDP("WORKING");
var dp_Sound_SUBMIT = kanalGongSound.DPByHssDP("SUBMIT");
var dp_LED_WORKING = kanalGongLED.DPByHssDP("WORKING");
! Die if-Abfrage ist eigentlich überflüssig, weil dieses Script sowieso nur ausgeführt wird,
! wenn mindestens 1 überwachtes Fenster geschlossen werden muss.
! Aber sicher ist sicher ;-)
if (ringTheBell)
{
! Zum Abschluss das File#3 "Bitte schliessen" und #2 Stille (1,5sec) anfügen
kanalAktion = kanalAktion # "3,2";
! LED und Sound mit eigentlicher Aktion starten
dp_Sound_SUBMIT.State(kanalAktion);
kanalGongLED.State(true);
}
Schön an dem Script ist, dass es dyanmisch ist. Wenn ich ein zusätzliches Fenster in die Überwachung mit integrieren will, dann muss ich es nur mit einer entsprechenden Variablen Fenster.<Raum>.Schliessen.<Etage>.<#> versehen. Und in die WENN-Abfrage muss ich die neue Variabel natürlich integrieren.