NEWS
[Gelöst] Steuerung und Visualisierung mit zwei MQTT Topics
-
Hallo,
ich habe meine Komponenten (Homematic und Enocean) an FHEM angebunden (soll auch erstmal so bleiben) und möchte nun ioBroker zur weiteren Steuerung (später auch mit Alexa) und Visualisierung nutzen. Als Schnittstelle nutze ich MQTT per Mosquitto und den mqtt-client Adapter. Dazu kommen noch einige Sonoffs mit Tasmota-Firmware.
Als Topics nutze ich z.B. "Haus/Kinderzimmer/Rollladen/set" und "Haus/Kinderzimmer/Rollladen/state" und habe nun Probleme diese richtig in vis mit einem Rollladen-Widget (hqwidgets), da (im gegensatz zum bulb-widget) keine Extrasteuerung möglich ist. Mit Alexa werde ich so sicherlich auch Probleme bekommen.
Ich habe daher mal testweise in der Javascript Instanz eine eigene State-Variable "Level" angelegt und versucht über Javascript die state/set zu "mappen". Aber ich schaffe es nicht beim MQTT-state per Event diese State-Variable zu setzen ohne das diese wiederum per Event den MQTT-Set auslöst.
Eine andere Lösung wäre wohl die Benutzung der subscript und publish Prefixe im mqtt-client Adapter, wobei ich dann passend zu Tasmota alle Topics in "cmnd/…" und "stat/..." ändern müsste.
Gibt es noch eine andere Lösung welche ich übersehen habe?
Danke, und viele Grüße
Norman
-
Hi,
Befohr wie jetzt kompliciert per mqtt einbinden, Geht das mit dem fhem adapter nicht leichter ?
~Dutch
-
Verstehe ich das richtig:
In ioBroker kommen zwei States an, einer der den Rolladenstatus darstellt und ein zweiter, welcher dazu da ist, den Rolladenstatus zu ändern?
Da das Rolladenwidget aber nur mit einem State umgehen kann, möchtest du diese beiden States zu einem einzigen verbinden?
In ioBroker geht das eigentlich in einem State: wenn ack=false, dann ist es ein Sollwert und wenn ack=true, dann ist es ein tatsächlicher Wert.
Im Prinzip läuft es so: Wert in VIS ändern -> State mit ack = false -> Rolladen wird bewegt -> State wird auf ack=true gesetzt.
Damit du nun solch einen State erhälst, welcher mit VIS kompatibel ist, könntest du dieses Skript nutzen (ungetestet):
var stateId = "zwave-client.0.Zimmer.Rolladen.state";//ändern! var setId = "zwave-client.0.Zimmer.Rolladen.set";//ändern! var newState = "level"; createState('level', {name: 'level', type: 'number', unit:'%', min: 0, max: 100, default: 0}); //stateId -> newState on({id: stateId, change: "ne"}, function (obj) { setState(newState, obj.state.val, true /* setze ack=true */); }); //newState -> setId on({id: newState, change: "ne", ack: false /* nur bei ack=false */}, function (obj) { setState(setId , obj.state.val); });
-
Danke, das Script macht genau was es soll.
Ciao,
Norman