Seite 1 von 2

Sirene ansteuern

Verfasst: 28. Aug 2023 18:25
von bngi
Ich wollte bei mir die Sirene Woox R7051 (https://www.zigbee2mqtt.io/devices/R7051.html) einbinden. Über die Zigbee2MQTT Webseite lässt sich der Alarm auch händisch aktivieren/deaktivieren.
Den Befehl muss man wohl als Payload schicken. Ehrlich gesagt weiß ich nicht wirklich wie ich das realisieren soll.
Ich habe eine Regel angelegt und versucht mit folgenden Befehl die Sirene zu aktivieren:

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
mqttAcions.publishMQTT("zigbee2mqtt/Sirene/set","{"warning": {"mode": burgular, "level": low, "strobe_level": low, "strobe": true, "strobe_duty_cycle": 5, "duration": 5}}")
Leider passiert gar nichts...
Habe ich hier einen Denkfehler?

Re: Sirene ansteuern

Verfasst: 28. Aug 2023 19:22
von udo1toni
Das Problem sind hier die vielen Anführungszeichen. :)
So sähe das JSON "lesbar formatiert" korrekt aus:

Code: Alles auswählen

{
   "warning": {
      "mode": "burgular",
      "level": "low",
      "strobe_level": "low",
      "strobe": true,
      "strobe_duty_cycle": 5,
      "duration": 5
   }
}
Wichtig: burgular und low sind Strings, die ebenfalls in Anführungszeichen stehen müssen. true hingegen ist ein Boolean Wert und Zahlen müssen auch nicht in Anführungszeichen gesetzt werden.

Es gibt nun im Grunde drei Möglichkeiten, die Du alle ausprobieren kannst.

1. einfache statt doppelter Anführungszeichen innerhalb der Payload

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
mqttActions.publishMQTT("zigbee2mqtt/Sirene/set","{'warning': {'mode': 'burgular', 'level': 'low', 'strobe_level': 'low', 'strobe': true, 'strobe_duty_cycle': 5, 'duration': 5}}")
2, Anführungszeichen andersrum verwenden:

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
mqttActions.publishMQTT('zigbee2mqtt/Sirene/set','{"warning": {"mode": "burgular", "level": "low", "strobe_level": "low", "strobe": true, "strobe_duty_cycle": 5, "duration": 5}}')
3. Als letzte Variante könnte man die Anführungszeichen innerhalb des JSON noch escapen:

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
mqttActions.publishMQTT("zigbee2mqtt/Sirene/set","{\"warning\": {\"mode\": \"burgular\", \"level\": \"low\", \"strobe_level\": \"low\", \"strobe\": true, \"strobe_duty_cycle\": 5, \"duration\": 5}}")
Die letzte Variante muss funktionieren, bei den anderen beiden möchte ich sagen, dass es jeweils funktionieren sollte, aber ja nach Implementierung auch scheitern kann - entweder an den inneren oder an den äußeren Anführungszeichen :) die Varianten 1 und 2 sind aber definitiv besser lesbar...

Übrigens ist es eleganter, ein String Item zu definieren, welches mit einem String Channel verknüpft ist, der zigbee2mqtt/Sirene/set als commandTopic eingetragen hat, dann kannst Du das JSON einfach per MeinStringItem.sendCommand(MeinJSON) verschicken.

EDIT: Tippfehler korrigiert...

Re: Sirene ansteuern

Verfasst: 28. Aug 2023 20:17
von bngi
Vielen Dank für die rasche und ausführliche Antwort.
Leider funktioniert keine der 3 Varianten.

Ich erhalte immer folgenden Fehler:
2023-08-28 20:13:04.663 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Sirene_ON' failed: <eval>:1:4 Expected ; but found mqttActions
val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
^ in <eval> at line number 1 at column number 4

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 15:12
von udo1toni
Dann nutzt Du JavaScript. Die von Dir angegebenen Befehle sind allerdings in der Schreibweise für die DSL.

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 16:01
von bngi
Als DSL Rule erscheint folgende Fehlermeldung:
2023-08-29 15:59:58.033 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'sireneDSL' failed: val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")
mqttAcions.publishMQTT("zigbee2mqtt/Sirene/set","{\"warning\": {\"mod ___ e\": \"burgular\", \"level\": \"low\", \"strobe_level\": \"low\", \"strobe\": true, \"strobe_duty_cycle\": 5, \"duration\": 5}}")
The method or field mqttAcions is undefined; line 2, column 69, length 10
Als Blockly habe ich es auch probiert, da kommt nur folgende Rückmeldung:
2023-08-29 16:04:13.127 [INFO ] [openhab.event.RuleUpdatedEvent ] - Rule 'sireneblockly' has been updated.

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 18:34
von udo1toni
Zeig bitte mal Deine komplette Rule (als Code eingefügt - bitte kein Screenshot!)

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 18:54
von bngi

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Sirene
      state: ON
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        val mqttActions = getActions("mqtt","mqtt:broker:Zigbee2MQTTBroker")

        mqttAcions.publishMQTT("zigbee2mqtt/Sirene/set","{\"warning\": {\"mode\": \"burgular\", \"level\": \"low\", \"strobe_level\": \"low\", \"strobe\": true, \"strobe_duty_cycle\": 5, \"duration\": 5}}")
    type: script.ScriptAction
Ich teste es momentan jedoch erstmal als normales Skript, ob es überhaupt funktioniert mit oben geposteten Befehl.

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 18:59
von udo1toni
Was meinst Du mit "normales Script"?
Hast Du mqtt installiert?
Hast Du einen Broker eingerichtet?

Ach so... Welche Version von openHAB läuft?

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 19:15
von bngi
Man hat doch die Möglichkeit unter settings rules oder scripts anzulegen. Da es mit der rule von Anfang an nicht geklappt hat, habe ich es erstmal mit einem script probiert und das manuell gestartet.
Zigbee2MQQT ist installiert ja. Über das Webinterface lässt sich die Sirene auch anschalten. Welcher MQTT Befehl dafür genutzt wird? Keine Ahnung...
Broker ist eingerichtet, Fensterkontakte funktionieren wunderbar.
Ich habe openHAB 3.4.4 auf einem raspberry installiert.

Re: Sirene ansteuern

Verfasst: 29. Aug 2023 19:41
von udo1toni
bngi hat geschrieben: 29. Aug 2023 19:15 Man hat doch die Möglichkeit unter settings rules oder scripts anzulegen.
Ja, aber nein.
bngi hat geschrieben: 29. Aug 2023 19:15 Zigbee2MQQT ist installiert ja.
Danach hatte ich gar nicht gefragt :) aber passt ja.
bngi hat geschrieben: 29. Aug 2023 19:15 Über das Webinterface lässt sich die Sirene auch anschalten. Welcher MQTT Befehl dafür genutzt wird? Keine Ahnung...
Ich gehe stark davon aus, dass Du das über die Dokumentation von zigbee2mqtt herausbekommst (es gibt kein MQQT...)
bngi hat geschrieben: 29. Aug 2023 19:15 Broker ist eingerichtet, Fensterkontakte funktionieren wunderbar.
Prima.
Hast Du einen MQTT Sniffer? (Mein Favorit ist MQTT Explorer, lässt sich direkt über den Microsoft Store installieren). Das ist ein wichtiges Werkzeug, damit kannst Du direkt verfolgen, welche Topics der Broker so empfängt (und natürlich die Payload dazu). Außerdem kannst Du gezielt selbst beliebige Payloads an beliebige Topics publishen, um z.B. den korrekten Befehl auszuprobieren.

Allerdings deutet die Fehlermeldung auf ein anderes Problem hin.
The method or field mqttAcions is undefined; line 2, column 69, length 10
Oh. Jetzt beim Einfügen sehe ich es... Tippfehler... mqttAcions vs. mqttActions :)