Alarmanlage - Mehrere Alarmsirenen ansteuern

Moderator: seppy

Antworten
sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39

Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von sonic »

Guten Morgen Community,

ich habe ein Problem mit den Homematic IP Alarmsirenen. Die Ansteuerung von mehreren Sirenen funktioniert nicht.

Es handelt sich um OpenHAB 2.5 & PiVCCU3
Die Sirenen sind HmIP-ASIR-B1

Das Ansteuern von einer Sirene funktioniert folgendermaßen und sie löst auch wie gewollt aus:

Code: Alles auswählen

rule "Alarmsirene EIN"
when
	Item AlarmSirene received command ON
	//Item Dummy received command ON
then
	Alarmsirene3ACOUSTICALARMSELECTION.sendCommand("FREQUENCY_RISING")
   	Thread::sleep(3000)
	Alarmsirene3OPTICALALARMSELECTION.sendCommand("DISABLE_OPTICAL_SIGNAL")
    	Thread::sleep(3000)
    	Alarmsirene3DURATIONUNIT.sendCommand("S")
    	Thread::sleep(3000)
	Alarmsirene3DURATIONVALUE.sendCommand(10)
end
Ohne die "sleep" funktioniert es komischerweise nicht. Ich habe diese Info aus einer Community.

Wie gesagt, die Rule funktioniert so.

Sobald ich aber weitere Sirenen hinzufüge funktioniert keine mehr. (Einzeln schon)

Folgendes Beispiel geht NICHT:

Code: Alles auswählen

rule "Alarmsirene EIN"
when
	Item AlarmSirene received command ON
	//Item Dummy received command ON
then
	Alarmsirene3ACOUSTICALARMSELECTION.sendCommand("FREQUENCY_RISING")
	AlarmsireneWerkstatt3ACOUSTICALARMSELECTION.sendCommand("FREQUENCY_RISING")
	AlarmsirenePraxis3ACOUSTICALARMSELECTION.sendCommand("FREQUENCY_RISING")
   	Thread::sleep(3000)
	Alarmsirene3OPTICALALARMSELECTION.sendCommand("DISABLE_OPTICAL_SIGNAL")
	AlarmsireneWerkstatt3OPTICALALARMSELECTION.sendCommand("DISABLE_OPTICAL_SIGNAL")
	AlarmsirenePraxis3OPTICALALARMSELECTION.sendCommand("DISABLE_OPTICAL_SIGNAL")
    	Thread::sleep(3000)
    	Alarmsirene3DURATIONUNIT.sendCommand("S")
    	AlarmsireneWerkstatt3DURATIONUNIT.sendCommand("S")
    	AlarmsirenePraxis3DURATIONUNIT.sendCommand("S")
    	Thread::sleep(3000)
	Alarmsirene3DURATIONVALUE.sendCommand(10)
	AlarmsireneWerkstatt3DURATIONVALUE.sendCommand(10)
	AlarmsirenePraxis3DURATIONVALUE.sendCommand(10)
end
Auch wenn ich weitere "Sleep" einbaue führt es zu keinem Erfolg. Ich muss dazu sagen, dass ich diese ganzen Sleeps sowieso nicht wirklich gut finde, da es das ganze System verzögert.

In der events.log werden die richtigen Commands an die Sirenen gesendet.
Testalarme über die PiVCCU funktionieren ebenfalls. Also scheint hier irgendwas verschluckt zu werden.

Habt Ihr vielleicht eine Idee für eine Lösung?

Viele Grüße
Bernhard
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von udo1toni »

Eventuell ist das ein Problem auf dem Homematic Bus. Ich könnte mir vorstellen, dass die Befehle zum Auslösen der Sirene eben in einer ganz bestimmten Reihenfolge auf den Bus müssen, und zwar für jede Sirene einzeln.

Wegen der Thread::sleep() Anweisungen: das ist in der Tat eine sehr unglückliche Lösung, vor allem ob der Länge der Pause. Nun stellen sich mir ein paar Fragen, angefangen mit: Müssen es tatsächlich 3 Sekunden sein? Vielleicht reicht ja auch eine halbe Sekunde? Warum ist die Pause überhaupt notwendig, ist das eine Begrenzung des Busses (openHAB schickt zu viele Telegramme zu kurz hintereinander, so dass einzelne Telegramme verschluckt werden) oder verlangt das Gerät den Abstand zwischen den Telegrammen?
Dann: Kannst Du auf Homematic-Seite eventuell (zusätzlich) eine Gruppierung der Sirenen anlegen, so dass Du die Sirenen einzeln, aber auch alle gemeinsam steuern kannst?
Gibt es eventuell eine Möglichkeit, in der Sirene eine bestimmte Einstellung als Preset zu sichern?

Wenn Du die Itemnamen änderst, wird es einfacher, die Items als Gruppe über eine Rule anzusprechen. So:

Code: Alles auswählen

Group gSirenen
String Sirene_1_A   "Sirene Ton"               (gSirenen)
String Sirene_2_A   "Sirene Werkstatt Ton"     (gSirenen)
String Sirene_3_A   "Sirene Praxis Ton"        (gSirenen)
String Sirene_1_O   "Sirene Licht"             (gSirenen)
String Sirene_2_O   "Sirene Werkstatt Licht"   (gSirenen)
String Sirene_3_O   "Sirene Praxis Licht"      (gSirenen)
String Sirene_1_DU  "Sirene Einheit"           (gSirenen)
String Sirene_2_DU  "Sirene Werkstatt Einheit" (gSirenen)
String Sirene_3_DU  "Sirene Praxis Einheit"    (gSirenen)
Number Sirene_1_DUV "Sirene Dauer"             (gSirenen)
Number Sirene_2_DUV "Sirene Werkstatt Dauer"   (gSirenen)
Number Sirene_2_DUV "Sirene Praxis Dauer"      (gSirenen)
Angenommen, die Pause zwischen zwei Befehlen kann (sehr) viel kürzer ausfallen und die Ansteuerung muss einfach nur pro Gerät als Block erfolgen, wäre es dann sinnvoll, die Rule so zu erstellen:

Code: Alles auswählen

var Timer tSirene = null
var Number nSirene = 3

rule "Alarmsirene EIN"
when
    Item AlarmSirene received command ON
    //Item Dummy received command ON
then
    if(tSirene !== null)
        return;
    nSirene = 3
    tSirene = createTimer(now.plusMillis(10),[|
        nSirene = nSirene + 1
        val String strSirene = (nSirene/4).intValue.toString
        val giSirenen = gSirenen.members.filter[i|i.name.split("_").get(1) == strSirene]
        switch(nSirene % 4) {
            case 0 :giSirenen.filter[i|i.name.split("_").get(2) == "A"].head.sendCommand("FREQUENCY_RISING")
            case 1 :giSirenen.filter[i|i.name.split("_").get(2) == "O"].head.sendCommand("DISABLE_OPTICAL_SIGNAL")
            case 2 :giSirenen.filter[i|i.name.split("_").get(2) == "DU"].head.sendCommand("S")
            case 3 :giSirenen.filter[i|i.name.split("_").get(2) == "DUV"].head.sendCommand(10)
        }
        if(nSirene < 15)
            tSirene.reschedule(now.plusMillis(150))
        else
            tSirene = null
    ])
end
Der Code ist natürlich ungeprüft ;)

Die Idee dahinter: Die Rule legt bei Bedarf einen Timer an, der zwölf mal durchlaufen wird. Dabei wird eine Variable (nSirene) jeweils um 1 erhöht.
Es geht mit 4 los (deshalb ist der Initialwert 3)
Die Sirenen sind durchnummeriert (von 1 bis 3). Wenn man nun nSirene durch 4 teilt und den ganzzahligen Anteil nimmt, erhält man die Sirene (bei jedem vierten Durchlauf erhöht sich dieser Wert um 1).
Wir brauchen alle 4 Items, die gesteuert werden müssen, entsprechend wird die Gruppe der SirenenItems gefiltert, so dass nur noch diese Items übrig bleiben.
Anschließend kommt die switch-Anweisung zum Tragen, sie verwendet den Modulo Operator, um zu entscheiden, welcher Befehl gesendet werden muss.
Der case- Teil filtert also die Itemliste nochmals, diesmal nach dem letzten Teil des Itemnamens, nimmt das erste Item der Ergebnisliste und sendet den passenden Befehl.
Solange nSirene noch nicht die 15 erreicht hat, wird der Timer erneut ausgeführt, und zwar nach 150 Millisekunden.

Was kann schief gehen: Es könnte sein, dass der Modulo Operator nicht funktioniert. Dann müsste man mal etwas stöbern... Notfalls kann man das aber auch anders programmieren, mit einigen Zeilen zusätzlichem Code.
Es könnte sein, dass die Zweit zwischen den Befehlen länger sein muss, dann kann man an der entsprechenden Stelle eingreifen und den Wert erhöhen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

rbeudel
Beiträge: 225
Registriert: 6. Jun 2019 11:25
Answers: 1

Re: Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von rbeudel »

Hast Du schon mal versucht die Sirenen mit der Direktverknüpfung auf einen der 50 IP Kanäle der CCU zu legen und diesen dann über OH anzusteuern?
Viele Grüße,
Ralf


Debmatic und Openhab 4.1.0 in Proxmox 8 VM debian x86_64 auf Intel NUC mit influxdb und Grafana zur Visualisierung

sonic
Beiträge: 74
Registriert: 19. Jan 2020 10:39

Re: Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von sonic »

Guten Morgen ihr lieben,

sorry das ich erst jetzt antworte aber ich war beruflich derart eingespannt, dass ich garnicht zum testen kam.

Leider funktioniert es so nicht. Die Zeit für den Sleep kann man nicht kürzer definieren.

Ich habe die Items so definiert wie Udo vorgeschlagen hat.
Vielleicht doch ein Problem in der Rule?
Bildschirmfoto 2021-04-25 um 09.01.06.png
das % wird angemeckert.

Code: Alles auswählen

Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: Unknown variable or command '%'; line 52, column 16, length 11

Das interessante:

Code: Alles auswählen

Alarmsirene3ACOUSTICALARMSELECTION.sendCommand("FREQUENCY_RISING")
Thread::sleep(3000)
Alarmsirene3OPTICALALARMSELECTION.sendCommand("DISABLE_OPTICAL_SIGNAL")
Thread::sleep(3000)
Alarmsirene3DURATIONUNIT.sendCommand("S")
Thread::sleep(3000)
Alarmsirene3DURATIONVALUE.sendCommand(10)
Selbst wenn ich jetzt die Alarmsirene3DURATIONUNIT.sendCommand und Alarmsirene3DURATIONVALUE.sendCommand weglasse funktioniert es nicht, obwohl die Items ja bereits den entsprechenden Wert haben und garnicht verändert werden. Kurios

Ich habe dann versucht in meinem piVCCU3 unter "Programme und Zentralenverknüpfung" eine "Regel" zu definieren.
Bildschirmfoto 2021-04-25 um 08.50.07.png
Funktioniert auch nicht.

Irgendwie bin ich langsam ratlos.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
---------------------------------
OpenHAB 3 auf Dell ThinClient unter Debian Bullseye und ConBee II
RaspberryPi 4b 2GB in Din Rail Gehäuse mit PiVCCU3
Allerlei Sonoff, Shelly, NodeMCU, Sensoren, Aqara Krams und und und.

go1974
Beiträge: 14
Registriert: 20. Feb 2023 09:26

Re: Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von go1974 »

Moin, bin auch gerade mit Sirenen am testen. Ich habe eine HmIP-ASIR-2 und benötige keine Delays. Ich kann auch die Zeitdauer als ersten Wert absenden. Hat jemand eigentlich eine Idee wo man zu dem Thema eine gute/aktuelle Dokumentation finden kann?

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Alarmanlage - Mehrere Alarmsirenen ansteuern

Beitrag von udo1toni »

Leider habe ich keine Benachrichtigung erhalten, dass neue Posts eingegangen sind. Grundsätzlich sollte die Rule funktionieren, offensichtlich funktioniert aber der Modulo Operator nicht.

Also die Rule ganz leicht abändern:

Code: Alles auswählen

// Globale Variablen zu Beginn der datei definieren!
var Timer tSirene = null
var Integer iSirene = 3

rule "Alarmsirene EIN"
when
    tem AlarmSirene received command ON or
    Item Dummy received command ON
then
    if(tSirene !== null)
        return;
    iSirene = 3
    tSirene = createTimer(now.plusNanos(10000000), [|
        iSirene = iSirene + 1
        val String strSirene = (iSirene/4).intValue.toString
        val giSirenen = gSirenen.members.filter[i | i.name.split("_").get(1) == strSirene]
        switch(iSirene % 4) {
            case 0 :giSirenen.filter[i | i.name.split("_").get(2) == "A"].head.sendCommand("FREQUENCY_RISING")
            case 1 :giSirenen.filter[i | i.name.split("_").get(2) == "O"].head.sendCommand("DISABLE_OPTICAL_SIGNAL")
            case 2 :giSirenen.filter[i | i.name.split("_").get(2) == "DU"].head.sendCommand("S")
            case 3 :giSirenen.filter[i | i.name.split("_").get(2) == "DUV"].head.sendCommand(10)
        }
        if(iSirene < 15)
            tSirene.reschedule(now.plusSeconds(3))
        else
            tSirene = null
    ])
end
Log dazu:

Code: Alles auswählen

2024-02-05 21:47:30.417 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Dummy' received command ON
2024-02-05 21:47:30.420 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Dummy' changed from OFF to ON
2024-02-05 21:47:30.568 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_1_A' received command FREQUENCY_RISING
2024-02-05 21:47:30.572 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_1_A' changed from NULL to FREQUENCY_RISING
2024-02-05 21:47:33.575 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_1_O' received command DISABLE_OPTICAL_SIGNAL
2024-02-05 21:47:33.578 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_1_O' changed from NULL to DISABLE_OPTICAL_SIGNAL
2024-02-05 21:47:36.585 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_1_DU' received command S
2024-02-05 21:47:36.588 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_1_DU' changed from NULL to S
2024-02-05 21:47:39.596 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_1_DUV' received command 10
2024-02-05 21:47:39.599 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_1_DUV' changed from NULL to 10
2024-02-05 21:47:42.605 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_2_A' received command FREQUENCY_RISING
2024-02-05 21:47:42.608 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_2_A' changed from NULL to FREQUENCY_RISING
2024-02-05 21:47:45.615 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_2_O' received command DISABLE_OPTICAL_SIGNAL
2024-02-05 21:47:45.617 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_2_O' changed from NULL to DISABLE_OPTICAL_SIGNAL
2024-02-05 21:47:48.626 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_2_DU' received command S
2024-02-05 21:47:48.628 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_2_DU' changed from NULL to S
2024-02-05 21:47:51.639 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_2_DUV' received command 10
2024-02-05 21:47:51.642 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_2_DUV' changed from NULL to 10
2024-02-05 21:47:54.645 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_3_A' received command FREQUENCY_RISING
2024-02-05 21:47:54.648 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_3_A' changed from NULL to FREQUENCY_RISING
2024-02-05 21:47:57.650 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_3_O' received command DISABLE_OPTICAL_SIGNAL
2024-02-05 21:47:57.651 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_3_O' changed from NULL to DISABLE_OPTICAL_SIGNAL
2024-02-05 21:48:00.660 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_3_DU' received command S
2024-02-05 21:48:00.662 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_3_DU' changed from NULL to S
2024-02-05 21:48:03.667 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Sirene_3_DUV' received command 10
2024-02-05 21:48:03.669 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Sirene_3_DUV' changed from NULL to 10
Da ich die entsprechende Hardware nicht besitze, handelt es sihc bei den Items komplett um Dummy-Items ohne Verbindung zu einem Channel, aber die Steuerung sollte grundsätzlich funktionieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten