Seite 1 von 2

MQTT 1.x: String verwerfen mit REGEX

Verfasst: 18. Aug 2019 21:25
von cammymyra
Hallo zusammen,

ich bekomme über einen und den gleichen Topic ("state" für Rollo) zwei Arten von Werten, Prozentwertangaben zur aktuellen Position und "STOP" wenn der Rollo hält.
Das "STOP" möchte ich verwerfen, da es mich nicht interessiert. Dazu hatte ich gehofft das Regex_filter von MQTT binding nutzen zu können. Allerdings komme ich nicht drauf, wie ich das hinbekommen soll. Hat jemand eine Idee?

Code: Alles auswählen

String Rollo1 "Wohnzimmer_1" { mqtt=" <[broker:stat/EG/RolloWohnzimmer_1:state:default]" }
Schon mal vielen Dank.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 18. Aug 2019 22:34
von udo1toni
Ich denke nicht, dass REGEX da helfen wird. Auf Anhieb fällt mir kein Weg ein, außer ein Proxy Item zu verwenden. Das Problem ist hier, dass Du ja den ursprünglichen Wert behalten willst. Wenn man z.B. ein Java Script (ginge auch als Transformation) dafür nutzt, hat das Script keine Kenntnis vom ursprünglichen Status.

Die Lösung mit Proxy Item sähe so aus, dass Du ein Item ohne Bindung erstellst (oder nur ausgehend...). dann legst Du eine Rule an, die bei Empfang das Item auswertet und nur bei Bedarf weiter leitet:

Code: Alles auswählen

rule "set state if number"
when
    Item mqttIncomingState changed
then
    if(mqttIncomingState.state instanceof Number)
        mqttProxyItem.postUpdate(mqttIncomingState.state as Number) 
end
Da Du den Laden wohl auch steuern möchtest, bietet es sich an, out und in einfach zu trennen und über zwei Items abzuhandeln. Falls Du mehrere solche Items hast, wäre es gut, die Itemnamen so zu gestalten, dass die Rule über ein Gruppenitem funktioniert, z.B. so:
Items:

Code: Alles auswählen

Group gMqttIncomingState
Group gMqttCommand

Rollershutter mqttIncomingState_Wohnzimmer1 "Status[%s]" (gMqttIncomingState) {mqtt="<[broker:stat/EG/RolloWohnzimmer_1:state:default]"}
Rollershutter mqttIncomingState_Wohnzimmer2 "Status[%s]" (gMqttIncomingState) {mqtt="<[broker:stat/EG/RolloWohnzimmer_2:state:default]"}
Rollershutter mqttCommand_Wohnzimmer1 "Rollo Schlafzimmer[%d %%]" (gMqttCommand) {mqtt=">[broker:cmnd/EG/RolloWohnzimmer_1:command:default]"}
Rollershutter mqttCommand_Wohnzimmer2 "Rollo Schlafzimmer[%d %%]" (gMqttCommand) {mqtt=">[broker:cmnd/EG/RolloWohnzimmer_2:command:default]"}

Man beachte, dass die Zahl bem Itemnamen nicht mit _ abgetrennt ist!

rule:

Code: Alles auswählen

rule "set state if number"
when
    Member of gMqttIncomingState changed
then
    if(triggeringItem.state instanceof Number) {
        val itemname = triggeringItem.name.split("_").get(1)
        gMqttCommand.members.filter[i | i.name.contains(itemname)].head.postUpdate(triggeringItem.state as Number) 
    }
end
Die Rule holt sich den Namen des Items, welches die Rule ausgelöst hat und trennt den vorderen Teil ab. Anschließend sucht sie in der anderen Gruppe das zugehörige Item (welches bis auf den ersten Teil einen identischen Namen hat) und setzt dessen Status.
Du brauchst also zwar zwei Items pro Rollladen, aber bis auf die zwei Gruppenitems trotzdem nur die eine (abgeänderte) Rule.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 20. Aug 2019 22:06
von cammymyra
Habe mal deinen Tip angewandt, leider bisher ohne Erfolg:

Das Item aus der Gruppe sieht folgendermaßen aus:

Code: Alles auswählen

String RolloIN_SchlafzimmerDG3 (GrSTOPCutterIN) { mqtt="<[broker:stat/DG/RolloSchlafzimmer:state:default]" }
String RolloOUT_SchlafzimmerDG3 (GrSTOPCutterOUT)
Die Rule sieht konkret so aus:

Code: Alles auswählen

var boolean log = true
rule "MQTT STOP Filter" // --> only for percentages of Group GrSTOPCutter"
when Member of GrSTOPCutterIN changed
then
    if(triggeringItem.state instanceof Number) {
        if (log) logInfo('Item out of GrSTOPCutterOUT get Number-Update')
        val itemname = triggeringItem.name.split("_").get(1)
        GrSTOPCutterOUT.members.filter[i | i.name.contains(itemname)].head.postUpdate(triggeringItem.state as Number) 
    }
end
Leider greift die Regel nicht. Eine Idee?

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 21. Aug 2019 14:15
von peter-pan
Ich bin zwar kein Experte in MQTT, aber meine Channels sehen etwas anders aus:

Code: Alles auswählen

String    Sonoff_Pow_02_State       "Stehlampe Status [%s]"      <standard_lamp> (Chart_Sys_Temp)  { mqtt="<[broker:stat/stehlampe/POWER:state:default]" }   // meine Schreibweise
String    Sonoff_Pow_02_State_test  "Stehlampe Status test[%s]"  <standard_lamp> (Chart_Sys_Temp)  { mqtt="<[broker:stat/stehlampe:state:default]" }         // deine Schreibweise
Das Ergebnis hieraus sieht so aus:
status.jpg
Wie sieht denn dass in der Web-Ui des Rollos aus ?

Wie gesagt ich bin kein Experte und habe nur geflashte Sonoffs.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 21. Aug 2019 15:13
von udo1toni
Hast Du die Gruppen auch als Item angelegt?

Was die MQTT-Seite betrifft, gehe ich davon aus, dass das einzelne Item schon funktioniert. Ansonsten empfehle ich MQTTspy um alle relevanten Informationen zu erhalten bzw. auszuprobieren.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 21. Aug 2019 21:14
von cammymyra
@peter-pan: Du verwendest zwei verschiedene Topics. Entferne deinen Topic um "Power" an deiner Lampe, dann wird die "Test" Lampe funktionieren, und die andere nicht.

Jupp, Gruppen habe ich natürlich angelegt:

Code: Alles auswählen

Group GrSTOPCutterIN //Gruppe, inkl. String "STOP"
Group GrSTOPCutterOUT //Gruppe, exkl. "STOP", also nur Prozentwert
Einen Blick ins MQTT.fx ist nicht notwendig, da die Werte vom Broker übernommen werden bei Änderung:

Code: Alles auswählen

2019-08-21 21:10:44.194 [ome.event.ItemCommandEvent] - Item 'Rollo_SchlafzimmerDG2' received command 50

2019-08-21 21:10:44.217 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG2 changed from 25 to 50

2019-08-21 21:10:44.399 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG2 changed from 50 to 25

2019-08-21 21:10:44.404 [vent.ItemStateChangedEvent] - RolloIN_SchlafzimmerDG3 changed from STOP to 25

2019-08-21 21:10:44.407 [vent.ItemStateChangedEvent] - RolloSchlafzimmerDG_state changed from STOP to 25

2019-08-21 21:10:45.384 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG changed from 25 to 34

2019-08-21 21:10:45.388 [vent.ItemStateChangedEvent] - RolloIN_SchlafzimmerDG3 changed from 25 to 34

2019-08-21 21:10:45.391 [vent.ItemStateChangedEvent] - RolloSchlafzimmerDG_state changed from 25 to 34

2019-08-21 21:10:46.377 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG changed from 34 to 44

2019-08-21 21:10:46.382 [vent.ItemStateChangedEvent] - RolloIN_SchlafzimmerDG3 changed from 34 to 44

2019-08-21 21:10:46.391 [vent.ItemStateChangedEvent] - RolloSchlafzimmerDG_state changed from 34 to 44

2019-08-21 21:10:46.893 [WARN ] [b.core.events.EventPublisherDelegate] - given new state is NULL, couldn't post update for 'Rollo_SchlafzimmerDG'

2019-08-21 21:10:46.906 [vent.ItemStateChangedEvent] - Rollos_DG2 changed from 25 to 50

2019-08-21 21:10:46.932 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG changed from 44 to 50

2019-08-21 21:10:46.937 [vent.ItemStateChangedEvent] - Rollo_SchlafzimmerDG2 changed from 25 to 50

2019-08-21 21:10:46.940 [vent.ItemStateChangedEvent] - RolloIN_SchlafzimmerDG3 changed from 44 to 50

2019-08-21 21:10:46.945 [vent.ItemStateChangedEvent] - RolloSchlafzimmerDG_state changed from 44 to 50

2019-08-21 21:10:46.950 [vent.ItemStateChangedEvent] - RolloIN_SchlafzimmerDG3 changed from 50 to STOP

2019-08-21 21:10:46.953 [vent.ItemStateChangedEvent] - RolloSchlafzimmerDG_state changed from 50 to STOP
Ich kapiers nicht, ist bestimmt nur eine Kleinigkeit die ich übersehe, aber ich komme einfach nicht drauf.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 21. Aug 2019 23:12
von peter-pan
Da haben wir uns wohl missverstanden. Das Item mit "POWER" zeigt den Status an und funktioniert bei mir schon seit einiger Zeit.
Das Item ohne "Power" zeigt keinen Status an. Ich hab das zweite Item nur angelegt um dein Codierung zu testen. Das kannst du auf dem Screenshot (gelb markiert) gut erkennen. Ich nehme an du hast einen Shelly !? (ungeflasht?!) .´, ich nur Sonoffs (Tasmota) in diversen Ausprägungen. Wahrscheinlich geht das da ein bisschen anders.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 22. Aug 2019 17:15
von udo1toni
Das hier

Code: Alles auswählen

if (log) logInfo('Item out of GrSTOPCutterOUT get Number-Update')
ist falsch.
  1. Der Befehl lautet logInfo(String,String). Der erste String ist der Name des Loggers (genauer der letzte Teil). Der zweite String ist die zu loggende Meldung.
  2. Einfache Anführungszeichen sind nicht in jedem Kontext erlaubt. Es mag aber sein, dass sie an dieser Stelle funktionieren.
  3. Du kannst natürlich das Logging mit einem if(log) schaltbar machen, aber wozu denn bitte? Der in openHAB verwendete Logger kann selbstverständlich das Logging selbst ein- und ausschalten, und dafür muss keine rules Datei neu eingelesen werden.
Betreffend Punkt 3 lies bitte mal hier: viewtopic.php?f=15&t=2381#p10853 da habe ich das Ganze mal aufgeschrieben.

Wird die Rule nicht getriggert?

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 22. Aug 2019 22:16
von cammymyra
Ok, das mit dem Logging hatte ich aus Not versucht anzuwenden ohne es verstanden zu haben. Werde ich korrigieren. Allerdings wurde die Regel auch so nicht ausgelöst.
Ansonsten müsste ich auf die Gruppentriggerung verzichten und pro Rollo eine Regel erstellen, das wäre lästig.

Re: MQTT 1.x: String verwerfen mit REGEX

Verfasst: 23. Aug 2019 13:54
von udo1toni
Wenn die Rule nicht triggert gibt es irgendwo einen Fehler.

Wenn Du die Rule Datei neu speicherst, siehst Du außer der Meldung Loading model 'test.rules' etwas? (meine rules-Datei heißt hier test.rules)