Hallo alle zusammen,
für das Frontend bin ich gerade am Umsteigen auf Home Assistant - was soweit auch super geht. Über die MQTT Generic Bridge habe ich auch schon die Kommunikation hinbekommen. Nur bei meinen ROLLO-Modulen geht was nicht:
Home Assistant erwartet einen Wert für den State "Stopped", also suche ich nun eine Möglichkeit, alle States (also drive-up etc) über MQTT weiterzugeben, nur statt state pct-40 oder half soll "stopped" übermittelt werden. Hat jemand da eine Idee? Ich hätte es über ein userReading und Regex gemacht, kenne mich da aber nicht so gut aus.
platform: mqtt
name: "Rolladen Speisekammer"
unique_id: cover.fhem_rolladen_speisekammer
command_topic: "mqttGenericBridge/set/rollo_Speisekammer/state"
position_topic: "mqttGenericBridge/rollo_Speisekammer/pct"
set_position_topic: "mqttGenericBridge/set/rollo_Speisekammer/pct"
state_topic: "mqttGenericBridge/rollo_Speisekammer/state"
availability_topic: "system/fhem/connection/status"
payload_available: "connected"
payload_not_available: "disconnected"
payload_open: "100"
payload_close: "0"
payload_stop: "stop"
position_open: 100
position_closed: 0
state_closing: "drive-down"
state_opening: "drive-up"
state_stopped: "stopped"
Internals:
FUUID 5e0238fb-f33f-4070-9f96-6ef239f9fa1286e6
LASTInputDev mqtt_io
MSGCNT 7
NAME rollo_Speisekammer
NR 37
STATE open
TYPE ROLLO
mqtt_io_MSGCNT 7
mqtt_io_TIME 2021-11-07 10:47:44
stoptime 1636277245
READINGS:
2021-11-07 10:47:44 command pct-0
2021-11-07 10:47:44 desired_pct 0
2021-11-07 10:26:49 drive-type modul
2021-11-07 10:26:49 last_drive drive-up
2021-11-07 10:27:25 pct 100
2021-11-07 10:27:25 state open
Attributes:
cmdIcon open:fts_shutter_up closed:fts_shutter_down stop:fts_shutter_manual half:fts_shutter_50
devStateIcon open:fts_shutter_10:closed closed:fts_shutter_100:open half:fts_shutter_50:closed drive-up:fts_shutter_up@red:stop drive-down:fts_shutter_down@red:stop pct-100:fts_shutter_10:open pct-90:fts_shutter_10:closed pct-80:fts_shutter_20:closed pct-70:fts_shutter_30:closed pct-60:fts_shutter_40:closed pct-50:fts_shutter_50:closed pct-40:fts_shutter_60:open pct-30:fts_shutter_70:open pct-20:fts_shutter_80:open pct-10:fts_shutter_90:open pct-0:fts_shutter_100:closed
mqttPublish pct|state:topic={"$base/$device/$name"}
mqttSubscribe pct|state:stopic={"$base/$device/$name"}
rl_autoStop 0
rl_commandDown set rollo_a3 AI
rl_commandStopDown set rollo_a3 AI
rl_commandStopUp set rollo_a3 A0
rl_commandUp set rollo_a3 A0
rl_excessBottom 7
rl_excessTop 0
rl_resetTime 8
rl_secondsDown 21
rl_secondsUp 21
rl_switchTime 10
rl_type HomeKit
room Rollos
webCmd open:closed:half:stop:pct
Vielen Dank im Voraus für Eure Hilfe!
Du kannst die Werte in HASS i.d.R. sehr flexibel anpassen, aber auch in FHEM vor dem Senden mittels 'expression' nach Wunsch 'umbiegen'.
Grobes Beispiel:
mqttPublish
state:topic={"$base/$device/$name"}
state:expression={($value eq 'WERT1')?'WERT2':$value}
Habe leider nicht ganz verstanden, was Dein Problem ist. Möchtest Du nur ausgewälte state-Ausprägungen weiterleiten und andere unterdrücken/ersetzen?
Ich würde auch die Topics für Hin- und Rückweg besser voneinander trennen.
Das mit dem Expression klingt gut. Mein Problem an sich ist folgendes:
Hass will nach Dokumentaton https://www.home-assistant.io/integrations/cover.mqtt/ zwei MQTT-Topics empfangen, um den Status des Rolladens zu erkennen. Eins für die Position in Prozent (position) und eins für den Status (state). Bei letzterem habe ich das Problem, dass das state Reading drive-up, drive-down, closed und open sinnvoll verwendet und HASS diese versteht. Lediglich wenn das Rollo auf einer Position stoppt, erhält das Reading State die Werte "pct-10" bis "pct-90" und "half". Hier hätte ich gerne, dass aber MQTT "stopped" pulished... Also möchte ich die eben gennanten states "ersetzen"...
Hin und Rückweg sind dahingehend schon getrennt, dass ../set/rollo... fürs empfangen von FHEM, sowie .../rollo... ohne Set fürs senden (so wie es in der Wiki empfohlen ist)
Grüße
Hm. Die publish und subscribe sind doch bei Dir gleich definiert:
mqttPublish pct|state:topic={"$base/$device/$name"}
mqttSubscribe pct|state:stopic={"$base/$device/$name"}
Aber ich verstehe das Problem. Das kannst Du gut mit expression machen.
Irgendwie so (ungetestet):
{($value=~/(pct-\d+)*(half)*/g)?'stopped':$value}
@hexenmeister: Im Wiki ist $base für sub und pub (global) unterschiedlich.
Ah, ok, stimmt. Habe ja selbst so ausgedacht ;D
Erstmal vielen Dank für Euer Engagement,
die vorgeschlagene Expression hat glücklickerweise genau die Wirkung, die ich auch haben will. Super!
Vielen Dank, dass ihr so schnell mein Problem gelöst habt!
Tatsächlich klappt es doch noch nicht ganz:
Im State-Topic werden jetzt zwar brav alle state = pct-XY als state = stopped übermittelt, aber state = open, closed, drive-up, drive-down nicht mehr... Wie muss ich das mqttPublish reading anpassen?
Aktuell steht es so:
pct|state:topic={"$base/$device/$name"} state:expression={($value=~/(pct-\d+)*(half)*/g)?'stopped':$value}
Liebe Grüße
Die regex finde ich komisch. Würde eher (ungetestet) sowas versuchen:
state:expression={$value=~m/^(pct-\d+|half)$/?'stopped':$value}
Ansonsten ist es immer etwas schwierig zu beurteilen, wenn man die Events dazu nicht kennt/sieht.
Danke dir, ich werde das testen und mich melden.