NEWS
MQTT-Befehl und Status in demselben Objekt
-
Hallo alle,
Bitte brauche ich deine Hilfe mit einem MQTT-Objekt, wo ich nicht in der Lage bin ein Objekt mit Befehls- und Statusthemen zu erstellen.
Zum Beispiel habe ich ein Thema für ein Relais: Cmnd/Relais und ich habe die Zustände dieses Relais, das ist Stat/Relais. Ich bin in der Lage, das Relais über iobroker zu steuern, normalerweise unter Verwendung des Befehls topic (cmnd/relay), und den Status dieses Relais in einem anderen Objekt (stat/relay) zu sehen. aber wie ich beide Themen in einem Objekt zusammenführen kann, damit ich den Status dieses Objekts senden und abrufen kann.
Vielen Dank im Voraus.
-
aber wie ich beide Themen in einem Objekt zusammenführen kann, damit ich den Status dieses Objekts senden und abrufen kann.
Dafür kann ein zusätzlicher Datenpunkt (unter javascript.0) dienen, der Senden und Empfangen zusammenführt und ein Script.
const idCmd = '...'; // Datenpunkt-ID für Kommando const idStat = '...'; // Datenpunkt-ID für Status const idVis = 'MQTT.Relais1'; // Datenpunkt für gleichzeitige Anzeige / Bedienung const js = 'system.adapter.javascript.' + instance; createState(idVis, getState(idStat).val, {type: 'boolean'}); // Datenpunkt erzeugen on({id: idVis, change: 'ne', fromNe: js}, function(dp) { setState(idCmd, dp.state.val); }); on(idStat, function(dp) { setState(idVis, dp.state.val, true); });
-
Danke Paul.
Und in diesem Fall welches Objekt sollte ich in der iobroker vis Taste zuweisen?
-
welches Objekt sollte ich in der iobroker vis Taste zuweisen? `
Wenn du den Namen so übernimmst: "javascript.0.MQTT.Relais1". -
Ich bin neu hier und noch blutiger IOBroker Anfänger. Programmierkenntnisse habe ich aber ausreichend.
Ich habe dein Skript ausprobiert und zuerst hat es auch wunderbar funktioniert.
Als ich nun eine neue ioBroker Installation aufsetzen musste bringe ich es dort einfach nicht mehr ans laufen.
Irgendwie scheint der Subscribe auf den erstellten Datenpunkt nicht zu funktionieren. Selbst ein einfaches Log oder ein Subscribe ohne Pattern funktioniert nicht.
Das Skript sieht wie folgt aus:
const idCmd = 'MQTT.Mobil.Sonoff-Socket.PowerCmnd'; // Datenpunkt-ID für Kommando
const idStat = 'MQTT.Mobil.Sonoff-Socket.PowerStatus'; // Datenpunkt-ID für Status
const idVis = 'MQTT.Sonoff-Socket.Power'; // Datenpunkt für gleichzeitige Anzeige / Bedienung
const js = 'system.adapter.javascript.' + instance;
createState(idVis, getState(idStat).val=="ON"?true:false, {type: 'boolean'}); // Datenpunkt erzeugen
on({id: idVis, change: 'ne', fromNe: js}, function(dp) {
console.log("Send command");
setState(idCmd, dp.state.val?"ON":"OFF");
});
on(idStat, function(dp) {
console.log("Status changed");
setState(idVis, dp.state.val=="ON"?true:false, true);
});
Das ändern des Datenpunktes über den MQTT Status funktioniert, nur wenn ich den Wert des Datenpunktes ändere, tut sich gar nichts.
Eine Idee woran das liegen könnte?
Danke im Voraus.
-
Probiere es damit:
const idCmd = 'MQTT.Mobil.Sonoff-Socket.PowerCmnd'; // Datenpunkt-ID für Kommando const idStat = 'MQTT.Mobil.Sonoff-Socket.PowerStatus'; // Datenpunkt-ID für Status const id = 'MQTT.Sonoff-Socket.Power'; // Datenpunkt für gleichzeitige Anzeige / Bedienung const js = 'javascript.' + instance; const idVis = js + '.' + id; var state = (getState(idStat).val == "ON"); createState(id, state, {type: 'boolean'}); // Datenpunkt erzeugen setState(idVis, state, true); // beim starten setzen ...