MQTT Topic in Rule auswerten ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

MQTT Topic in Rule auswerten ?

Beitrag von Steinspiel »

Moin,

Ich möchte mit einem MQTT Befehl einen Switch in OH3 schalten.

MQTT Broker (extern, Mosquitto) ist eingebunden und funktioniert schon "ewig" reibungslos mit anderen Topics...
Mein Testbefehl "blink" wird im passenden Topic (led/schaltung) veröffentlicht und ist in MQTT.fx zu sehen.
In OH3, im neu angelegten "Test Topic fuer MQTT" Channel und im "String Item" sind alle Befehle die auf "led/schaltung" veröffentlicht werden, auch zu sehen.

mqtt.jpg

Der Broker Name in der Rule (mosquitto_argon) ist auch richtig, denn eine andere Rule: Test_Schalter_A schaltet und veröffentlicht dadurch einen Befehl im entsprechenden Topic, funktioniert reibungslos!
Soweit scheint alles okay ... :D

Was ist an meiner Rule, die den Test_Schalter_B einschalten soll wenn der String "blink" empfangen wird, nicht richtig?

Code: Alles auswählen

rule "MQTT Schaltung empfangen"
when
    Channel 'mqtt:broker:mosquitto_argon:led/schaltung' triggered 
then
    val command = receivedEvent.getCommand.toString
    if(command == "blink") {
        Test_Schalter_B.sendCommand(ON)
    }
end
Danke und einen schönen Abend noch...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
bis dann, Steinspiel

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: MQTT Topic in Rule auswerten ?

Beitrag von EmptySoft »

mit Channels habe ich noch nicht gearbeitet, aber als erstes würde ich nachsehen, was das Log so sagt
BYe
Harald

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

Re: MQTT Topic in Rule auswerten ?

Beitrag von udo1toni »

Da stimmen mehrere Dinge nicht...

Es gibt grundsätzlich zwei Möglichkeiten, entweder über ein Item oder über einen Channel.

Wählst Du den Weg über ein Item, muss der Trigger der Rule auch Item xyz ... lauten.
Dann gibt es weitere zwei Möglichkeiten :) nämlich:
  • Entweder, Du verwendest einen Status, dann müsste der Trigger auf received update oder wahlweise auf changed lauten (bei Letzterem müsste die Payload sich dann ändern, damit die Rule triggert)
  • Oder Du setzt in den Advanced Options "is command", womit dann ein ankommender Status als Command gewertet wird. Dann muss die Rule auf received command triggern.
In beiden Fällen gibt es implizite Variablen, die den aktuellen Status (newState) bzw. das empfangene Command (receivedCommand) bereitstellen.

Wählst Du den Weg über einen Channel, musst Du als Channeltyp zwingend Trigger wählen. Diesen Channeltyp kannst Du dann mit genau zwei verschiedenen Itemtypen verlinken, nämlich String oder DateTime, in beiden Fällen musst Du aber ein passendes Profile setzen, für das String Item kannst Du nur Trigger Event String wählen, für DateTime nur den Zeitstempel bei Auslöser, was auch die einzigen erwartbar sinnvollen Optionen sind.
Allerdings benötigst Du die Items nicht unbedingt, der Witz eines Trigger Channels ist ja, dass man ohne Item auskommen kann.

In diesem Fall kannst Du dann den Channel als Triggerquelle nutzen. Weiterhin gibt es dann auch eine implizite Variable receivedEvent, die ist aber schon vom Typ String und enthält den Wert, der den Channel getriggert hat. Ein Konstrukt

Code: Alles auswählen

receivedEvent.getCommand
kann es nicht geben, denn ein Trigger ist nun mal kein Command. :)

So, also drei Möglichkeiten:

Code: Alles auswählen

rule "MQTT Schaltung empfangen"
when
    Item ArbeitszimmerGenericMQTT_TestTopicfuerMQTT received Update
then
    if(newState.toString == "blink") {
        Test_Schalter_B.sendCommand(ON)
    }
end
oder (Channel muss auf "Is command" konfiguriert werden):

Code: Alles auswählen

rule "MQTT Schaltung empfangen"
when
    Item ArbeitszimmerGenericMQTT_TestTopicfuerMQTT received command
then
    if(receivedCommand.toString == "blink") {
        Test_Schalter_B.sendCommand(ON)
    }
end
oder (Channel muss auf Typ Trigger geändert werden, das Item wird nicht benötigt)

Code: Alles auswählen

rule "MQTT Schaltung empfangen"
when
    Channel 'mqtt:topic:mosquitto_argon:arbeitszimmer:test_topic_mqtt_led' triggered 
then
    if(receivedEvent == "blink") {
        Test_Schalter_B.sendCommand(ON)
    }
end
Beachte bitte, dass Du nicht irgendwelche Phantasie-UIDs ;) angeben kannst. Es muss schon ein vorhandener Channel verwendet werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: MQTT Topic in Rule auswerten ?

Beitrag von Steinspiel »

udo1toni hat geschrieben: 26. Mär 2023 21:12 Da stimmen mehrere Dinge nicht...
Ich könnte ein Bildschirmvideo machen, so begeistert bin ich davon wie ich jetzt per MQTT hier OH-Schalter EIN und AUS schalte! :mrgreen:
Im Ernst: für mich ne gute Möglichkeit wie meine "ESP`s" Aktionen in OH auslösen können.

Habe mich für Deine dritte Methode entschieden, allerdings keine Möglichkeit gefunden den vorhandenen Channel nachträglich auf Trigger zu ändern. Beim neu anlegen erscheint die Auswahlbox, und wenn man weiß, wo man anhaken muss, ist das ganze nen Kinderspiel :!:

Danke für die ausführliche Erklärung und den Beispielcode

Hatte ich schon erwähnt wie das hier jetzt flutscht? :lol:
bis dann, Steinspiel

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

Re: MQTT Topic in Rule auswerten ?

Beitrag von udo1toni »

Ja, stimmt natürlich, den Channeltyp kann man nicht nachträglich ändern... Ich vergesse das immer wieder, ich konfiguriere ja ja per Textdateien, da ändere ich das entsprechende Schlüsselwort...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Homiehabbie
Beiträge: 17
Registriert: 27. Mär 2023 14:43
Answers: 0

Re: MQTT Topic in Rule auswerten ?

Beitrag von Homiehabbie »

Hallo zusammen,

ich habe mich an den dreitten Vorschlag von Udo gehalten aber leider klappt es bei mir noch nicht.

Channel:

Code: Alles auswählen

channels:
  - id: water_leak
    channelTypeUID: mqtt:switch
    label: LeakSwitch
    description: null
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: "%s"
      stateTopic: LeckageSensorWK/water_leak
      off: "false"
      on: "true"
Rule:

Code: Alles auswählen

// Triggers:
// - When channel mqtt:topic:Mosquitto:LeckageSensorWK:water_leak was triggered

// context: mqtt-1
logDebug("Timmernabben", "Leakage sensor triggered")
if(receivedEvent == "true") {
  logDebug("Received Event", receivedEvent)
  val actions = getActions("pushover", "pushover:pushover-account:***")
  // send priority message
  var receipt = actions.sendPriorityMessage("Water leakage noticed!", "BUMM", 2)

  // wait for your cancel condition

  if( receipt !== null ) {
      actions.cancelPriorityMessage(receipt)
      receipt = null
  }
}
Was mache ich falsch?

Danke
openHAB3.4.2 auf einem Raspi 4B mit openHABian, steuert Aqara Sensoren über Zigbee

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

Re: MQTT Topic in Rule auswerten ?

Beitrag von udo1toni »

Du hast meinen - zugegebenermaßen länglichen - Post nicht vollständig und aufmerksam gelesen :)

Wenn Du die Rule auf "Channel triggered" triggern lässt, muss der Channel zwingend vom Typ Trigger sein, er darf nicht vom Typ switch sein.
Es gibt dann auch keinerlei weitere Konfiguration, denn der Channel ist zwingend nur mit einem stateTopic verbunden. Er reicht die empfangene Payload weiter "as is", also exakt so, wie sie rein kommt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Homiehabbie
Beiträge: 17
Registriert: 27. Mär 2023 14:43
Answers: 0

Re: MQTT Topic in Rule auswerten ?

Beitrag von Homiehabbie »

Hm, ich habe nun den Channeltyp für das Thing auf `trigger` gesetzt:

Code: Alles auswählen

channels:
  - id: water_leak
    channelTypeUID: mqtt:trigger
    label: LeakSwitch
    description: null
    configuration:
      stateTopic: zigbee2mqtt/LeckageSensorWK
Aber die Regeln wird noch nicht ausgelöst, jedenfalls gehe ich davon aus, denn im Log steht nichts obwohl ich ja gleich zu Beginn `logDebug()` rufe. Aber stimmt denn der Channelname `mqtt:topic:Mosquitto:LeckageSensorWK:water_leak` in der Regel überhaupt? Der kam aus der Items-Datei aber dort habe ich den Eintrag

Code: Alles auswählen

Switch   LeckageSensorWKWaterLeak "Leak switch" {channel="mqtt:topic:Mosquitto:LeckageSensorWK:water_leak"}
gelöscht weil ein Trigger ja ohne Item auskommt, richtig?

:?
openHAB3.4.2 auf einem Raspi 4B mit openHABian, steuert Aqara Sensoren über Zigbee

Benutzeravatar
Homiehabbie
Beiträge: 17
Registriert: 27. Mär 2023 14:43
Answers: 0

Re: MQTT Topic in Rule auswerten ?

Beitrag von Homiehabbie »

Probiert habe ich auch

Code: Alles auswählen

channels:
  - id: click
    channelTypeUID: mqtt:trigger
    label: click
    description: null
    configuration:
      stateTopic: zigbee2mqtt/LeckageSensorWK/action
und dann die Regel

Code: Alles auswählen

// Triggers:
// - When channel mqtt:topic:Mosquitto:LeckageSensorWK:action was triggered

// context: mqtt-1
logInfo("Timmernabben", "Leakage sensor triggered")
logInfo("event", receivedEvent)
if(receivedEvent == "true") {
  logInfo("Received Event", receivedEvent)
aber ebenfalls ohne Erfolg....
openHAB3.4.2 auf einem Raspi 4B mit openHABian, steuert Aqara Sensoren über Zigbee

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

Re: MQTT Topic in Rule auswerten ?

Beitrag von udo1toni »

Stopp!
Es geht hier nicht um rumprobieren, bis es dann (durch Zufall) funktioniert.

Schritt 1:
Wenn Du MQTT.fx oder MQTT Explorer laufen lässt und mit diesem Tool zuschaust, was passiert, wenn der Sensor auslöst?
Welches Topic wird gesendet (exakt)? Welche Payload wird gesendet (exakt)?

Schritt 2:
In openHAB legst Du ein Generic MQTT Thing an und verbindest es mit der Bridge, die den Kontakt zum Broker etabliert.
In diesem Generic MQTT Thing erzeugst Du einen Trigger Channel.
In diesem Trigger Channel gibst Du als stateTopic das Topic an, welches Du im Schritt 1 ermittelt hast. Sonst nichts.

Schritt 3:
Zur Kontrolle löst Du den Sensor erneut aus.
Nun muss unmittelbar im events.log von openHAB eine Meldung der Form

Code: Alles auswählen

Channel mqtt:topic:<brokername>:<thingname>:<channelname> triggered <payload>
auftauchen.

Schritt 4:
Du legst eine Rule an, mit dem Trigger Channel <Channel-UID aus Schritt 3> triggered <Payload aus Schritt 3> und in dieser Rule legst Du eine Action an, die das erledigt, was Du dann erledigt haben willst.

Alternativ kannst Du in Schritt vier auch als Action ein Script ausführen lassen. Welche Art Script Du verwendest, ist Deine Entscheidung. Ich zeige hier (bis auf echt wenige Ausnahmen) immer nur DSL Code. Es ist einfach, den von mir gezeigten DSL Code (der ausschließlich in einer *.rules Datei unverändert funktioniert) auch über die UI einzugeben, aber mindestens muss dann die Rules DSL als Scriptsprache gewählt werden, außerdem muss der Rahmen weggelassen werden (der wird ja in der UI auf andere Weise bereitgestellt). Der Rahmen einer DSL Rule ist das hier:

Code: Alles auswählen

rule "Rulename"
when
    <irgendwelche Trigger"
then
end
Das alles darf nicht im Codeblock auftauchen, denn es ist Bestandteil des Rahmens einer Rule.
Alles zwischen then und end ist Bestandteil des Codes, das kannst Du so wie es ist auch über die UI einfügen, aber immer als Rules DSL Script.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten