FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: Alex_S am 13 Juli 2023, 07:47:54

Titel: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 13 Juli 2023, 07:47:54
Hi

ich möchte von einem Device Werte nach MQTT publishen, dass funktioniert auch soweit.

Aber wie bekomme ich es hin, dass die Nachrichten nur in dem Zeitraum zwischen Sonnenaufgang und Sonnenuntergang gesendet werden, auch wenn das Device in den Nachtstunden auch events generiert?

Ich habe schon über die SetExtensions gelesen, bin mir aber nicht sicher, ob ich es damit hinbekomme.
Es wäre super wenn mir jemand einen Tipp geben könnte, wie ich es am besten anstelle.

Edit:
Ich hab vergessen zu erwähnen, dass es sich um eine MQTT_DEVICE handelt.
Danke
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 13 Juli 2023, 10:34:35
Kannst du die Kette etwas näher beschreiben?

Jedenfalls mir ist nicht klar, WARUM Events gepublisht werden; automatisch passiert das ja nicht, es müßte ein notify, DOIF, MQTT_GENERIC_BRIDGE-Device o.ä geben, das das publish verursacht (oder den set-Befehl an das MQTT_DEVICE generiert)? notify kennt z.B. ein Attribut "disabledForIntervals" (oder so).
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 13 Juli 2023, 10:53:36
Ok vielleicht war "event" der falsche Begriff, wahrscheinlich meinte ich ein Reading.

Also ich hab ein MQTT Device dort wird per subscription ein Reading aktualisiert.
Dieses Reading gebe ich per publish an ein anderes Topic weiter.

Und das soll nur zwischen Sonnenaufgang und Sonnenuntergang passieren. 
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Otto123 am 13 Juli 2023, 10:58:07
Zitat von: Alex_S am 13 Juli 2023, 10:53:36Dieses Reading gebe ich per publish an ein anderes Topic weiter.
Wie genau tust Du das?
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 13 Juli 2023, 11:05:25
Ich hab einfach ein mqttPublish reingesetzt

define WMBUS_DEVICE MQTT_DEVICE
attr WMBUS_DEVICE IODev Mosquitto
attr WMBUS_DEVICE mqttPublish SEN_21363953_104_7_total_m3:topic=fhem/water/volume\

attr WMBUS_DEVICE stateFormat transmission-state
attr WMBUS_DEVICE subscribeReading_21363953 wmbusmeters/SEN_21363953_104_7
attr WMBUS_DEVICE subscribeReading_50007932 wmbusmeters/ZRI_50007932_10_55
attr WMBUS_DEVICE subscribeReading_Meter wmbusmeters/#

[...]

Oh habe gerade gesehn, dass das mqttPublish aus der MQTT_GENERIC_BRIDGE kommt.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 13 Juli 2023, 12:03:35
Zitat von: Alex_S am 13 Juli 2023, 11:05:25Oh habe gerade gesehn, dass das mqttPublish aus der MQTT_GENERIC_BRIDGE kommt.
QED...

Also: MGB kennt die Option, Perl-Code zur Vorverarbeitung des Versendens einzusetzen. Da könntest du ggf. eine isday()-Abfrage unterbringen (kann sein, dass du das nach main verweisen musst: "::isday()"). Die Hilfe zu MGB könnte ggf. weitergehende Infos enthalten, wie man das publish verhindert bzw. filtert.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 13 Juli 2023, 14:47:13
Man könnte auch einfach prüfen, ob das device, dessen readings gebridged werden, ein disabledForIntervals unterstützt. Setzt natürlich voraus, dass man die readings selbst nicht noch für andere Zwecke benötigt.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 13 Juli 2023, 15:10:24
Danke für die Hilfe, jetzt klappt es
attr WMBUS_DEVICE mqttPublish SEN_21363953_104_7_total_m3:topic=fhem/water/test SEN_21363953_104_7_total_m3:expression={(main::isday())?'OK':''}

mal schauen, ob die Nachrichten nach Sonnenuntergang ausbleiben und morgen früh wiederkommen.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 13 Juli 2023, 15:35:08
Zitat von: Alex_S am 13 Juli 2023, 15:10:24mal schauen, ob die Nachrichten nach Sonnenuntergang ausbleiben

da wette ich mal eine Tüte Popcorn dagegen...
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 13 Juli 2023, 15:38:11
Zitatda wette ich mal eine Tüte Popcorn dagegen...


Warum? hab ich offensichtliches übersehen?
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 13 Juli 2023, 15:53:18
Naja, ich habe noch nicht genau verstanden, welches Verhalten Du jetzt nach Sonnenuntergang erwartest.

Aber dass dann keine Nachricht kommt, erwarte ich eher nicht. Denn ich kann nicht erkennen, an welcher Stelle

attr WMBUS_DEVICE mqttPublish SEN_21363953_104_7_total_m3:topic=fhem/water/test SEN_21363953_104_7_total_m3:expression={(main::isday())?'OK':''}
Du das unterbunden haben möchtest.
Nur mal interessehalber: welche Nachricht wird denn aktuell verschickt?
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 13 Juli 2023, 16:11:51
Zitat von: Alex_S am 13 Juli 2023, 15:38:11
Zitatda wette ich mal eine Tüte Popcorn dagegen...


Warum? hab ich offensichtliches übersehen?
commandref sagt:
ZitatThe return value is used as a new message value, the changed variables have priority.
 If the return value is undef, setting / execution is suppressed.
In deinem Code sehe ich kein "echtes undef", das zurückgegeben werden würde....
Und wenn was "tagsüber" zurückkommt, dann nicht der geänderte Wert, sondern ein "OK".

Und dann scheint mir zu guter letzt noch eine Klammer zuviel zu sein; es könnte sein, dass ein leeres Array (wenn das undef korrekt an der richtigen Stelle stünde) zurückgegeben wird, und das ist auch "was" (also kein echtes undef!)....
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 13 Juli 2023, 16:31:57
Spaßbremse... 8)
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 13 Juli 2023, 16:36:52
Zitat von: betateilchen am 13 Juli 2023, 16:31:57Spaßbremse... 8)
....gelernt ist halt gelernt...

Im Ernst: Für diesen Anwendungfall gibt es m.E. keine wirklich guten (anfängertauglichen) Beispiele, und mir war klar, nach was man in der commandref suchen muss....

Von daher galt hier noch "Welpenschutz" ;) .
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Alex_S am 14 Juli 2023, 08:59:09
So ...
hat geklappt - zumindest fast alles ;)

Eine sache musste ich noch ändern. Ich habe expression={(main::isday())?'OK':''} durch expression={(main::isday())?'OK':undef} ersetzt.

Da nach Sonnenuntergang ein "(Null)" beim Broker ankam.

Dass ein OK statt eines Wertes gesendet wird ist Absicht. Das OK ist nur ein Trigger für ein anderes Gerät, was dann Daten pollt.

Nochmals Danke für den Hinweis mit den expressions
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 14 Juli 2023, 11:20:59
Mach bitte noch die äußeren Klammern weg. Scheint hier zwar nicht falsch zu sein, ist m.E. aber unsauber und daher in der jetzigen Form (noch) kein gutes Beispiel.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 14 Juli 2023, 13:54:43
Die Klammern sind an dieser Stelle völlig in Ordnung.

Hör doch mal auf, die Leute unnötig zu verwirren, insbesondere, wenn Du oben noch mit "Welpenschutz" argumentierst.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: Beta-User am 14 Juli 2023, 14:29:47
expression={::isday()?'OK':undef}....damit keine Verwirrung entsteht zur Klarstellung, welches Klammerpaar m.E. unnötig ist.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 14 Juli 2023, 15:42:04
Das habe ich schon verstanden, aber Du hast trotzdem nicht grundsätzlich Recht.

Der Ausdruck

(main::isday())?'OK':''

ist lediglich eine Kurzform von

(main::isday() == 1)?'OK':''

was wiederum eine Kurzform ist von

if (main::isday() == 1) {
return 'OK';
} else {
return '';
}

Weder in der zweiten oder in der dritten Variante würde man auf die Klammern verzichten.

Dass man in der ersten Variante die Klammern (ausnahmsweise) weglassen darf (!), macht ihre Verwendung noch lange nicht falsch.

Für Anfänger ist es eine einfache Regel, sich zu merken, dass man logische Vergleiche in eine Klammer packt. Wenn man das konsequent tut, hat man es an vielen weiteren Stellen, wo man vielleicht komplexere Vergleiche hat, erheblich einfacher.

Soviel von meiner Seite zum Thema "Welpenschutz".
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: rudolfkoenig am 14 Juli 2023, 16:23:54
ZitatDass man in der ersten Variante die Klammern (ausnahmsweise) weglassen darf (!), macht ihre Verwendung noch lange nicht falsch.
Es ist nicht "ausnahmsweise", es hat was mit der Auswertereihenfolge der Operatoren zu tun: https://www.mathe2.uni-bayreuth.de/perl/GK/skalareDaten.htm#Rangfolge_der_Operatoren
Ob man zusaetziche Klammer verwendet, weil man unsicher ist, ist mAn Geschmacksache.
Man sollte es mit den Klammern nur nicht uebertreiben, weil es dann unleserlich wird.
Und sowas haben wir hier in etlichen Beispielen gesehen, z.Bsp. Perl-Anweisungen jeweils in {} einzuschliessen, statt sie durch ; zu trennen.
Titel: Aw: MQTT publish nur nach Sonnenaufgang bis Sonnenuntergang
Beitrag von: betateilchen am 14 Juli 2023, 16:40:58
omg