NEWS
Geht das überhaupt mit iobroker??
-
Hi,
*** Sorry, vorab, ist vielmehr Text geworden als beabsichtig ***
ich versuche weiterhin meinen Lightmanager inklusive Logik, soweit möglich an iobroker anzubinden.
Daher beschreibe ich zuerst die Logik dahinter, vielleicht kann mir ein erfahrener IOBroker helfen.
LIGHTMANAGER:
Eingangs möchte ich auf die Funktionsweise des Lightmanager eingehen:
Das auslösen einer Szene/ Aktion auf dem Lightmanager erfolgt mit nachfolgendem Befehl
http://192.168.10.71/control?key=1 (254 Befehle stehen zur Verfügung)
key=1
definiert ein Lightmanager Szene, dahinter können sich einfach Befehle wie "ein" /"aus" oder "Toggle" befinden.
Es sind aber umfangreiche Szenen möglich, sodass mehrere Lampen mit einer Szene gruppiert angesprochen werden können.
Es sind oft separater ein/aus Befehl erforderlich.
Beispiel:
Lampe ein: http://192.168.10.71/control?key=%5Bb%5D1
Lampe aus: http://192.168.10.71/control?key=%5Bb%5D2
Visualisierung:
Der Lightmanager nutzt für die Visualisierung der Schalt oder Szenenzustände Marker.
Die Marker werden je nach Szene auf true/false gesetzt
In den Szenen schalte ich also neben Lampen auch die Marker ein/ aus.
IOBROKER
Den Import der Markerzustände habe ich als Datenpunkte bereits hier im Forum finden können. Das Script ruft alle xx sekunden die Werte ab.
javascript.0.lmair.marker.01
javascript.0.lmair.marker.02
javascript.0.lmair.marker.03
etc. Werte sind true/ false
Abhängig meiner Licht und Szenensteuerung welche via Lightmanager ausgelöst werden sind die Datenpunkte in diesem Pfad auf true/false gesetzt.
GEHT DAS:
jetzt wird es in meinen Augen kompliziert - ich bin kein Coder - mein Gehirn hat Schwierigkeiten so denken
Für die Steuerung aus VIS habe ich weitere Datenpunkte angelegt
javascript.0.lmair.szenenr.01
javascript.0.lmair.szenenr.02
javascript.0.lmair.szenenr.03
etc. Werte sind true/ false und sind an die VIS Buttons gekoppelt (Fancy Switch)
Ich brauche ein Script welches mir die ein/aus Befehle auf die Datenpunkte den Datenpunkt schreibt. Diese Befehle dürfen nur erfolgen wenn der Button in VIS gedrückt wird. also einmal wird true false geschrieben/ einmal wird false/ true geschrieben…
javascript.0.lmair.szenenr.01 - Lampe ein: http://192.168.10.71/control?key=%5Bb%5D1
javascript.0.lmair.szenenr.01 - Lampe aus: http://192.168.10.71/control?key=%5Bb%5D2
Das 2 script kopiert die echten Marker Zustände (alle xxsekunden) - aus die VIS Steuerung für die Visualisierung
javascript.0.lmair.marker.01 ->>> javascript.0.lmair.szenenr.01
aber hier dürfen dann keine Befehle (http://192.168.10.71/control?key) ausgeführt werden, da diese bereits durch den Lightmanager ausgeführt wurden, sonst lande ich in einer "Disco" …
vielleicht denke ich einfach zu kompliziert, ich bin für Ideen oder Anregungen offen.
Ich habe das Forum hoch und runter gelesen, such falsch oder was auch immer.
Das Script zu erstelle, falls das überhaupt geht - scheint für mich derzeit ausgeschlossen.
-
Es geht (fast) alles. Mit fromNe kann man Javascript als Trigger-Quelle ausschließen.
const idVis = 'javascript.0.lmair.szenenr.01'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.01'; const request = require('request'); const url = 'http://192.168.10.71/control?key='; const js = 'system.adapter.javascript.' + instance; on({id: idVis, change: 'ne', fromNe: js}, function(dp) { // Triggern bei Wertänderung durch Vis var key = '2'; // aus if(dp.state.val) key = '1'; //ein request(url + key, function(error, response, body) { if(error) log('Fehler Request Steckdose', 'error'); }); }); on(idMarker, function(dp) { // Triggern bei Wertänderung setState(idVis, dp.state.val, true); });
-
wow, das ging aber schnell - dafür dass ich gefühlt eine stunde für den Text gebraucht habe :lol:
Muss das script an einer bestimmten stelle liegen? also irgendwo in
global/common
-
Muss das script an einer bestimmten stelle liegen? also irgendwo in
global/common `
Überall, nur <u>nicht unter global</u> ! -
Nee, klappt nicht
ich sehe nur wenn ich die Lampe ausserhalb iobroker schaltet, dann wechselt der wert auf true/false
javascript.0.lmair.marker.04
aber da mein Vis Button auf die Werte
javascript.0.lmair.szenenr.04 - hört ändert sich der Vis Button nicht… der steht weiterhin auf false
das script habe ich so ergänzt
const idVis = 'javascript.0.lmair.szenenr.04'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.04'; const request = require('request'); const url = 'http://192.168.10.71/control?key=12'; const js = 'system.adapter.javascript.' + instance; on({id: idVis, change: 'ne', fromNe: js}, function(dp) { // Triggern bei Wertänderung durch Vis var key = 'false'; // aus if(dp.state.val) key = 'true'; //ein request(url + key, function(error, response, body) { if(error) log('Fehler Request Steckdose', 'error'); }); });
*edit, hatte die DP vertauscht jetzt ists richtig
-
In dem Skript fehlt der Trigger auf idMarker (unten in meinem Skript).
var key = 'false'; // aus if(dp.state.val) key = 'true'; //ein
Bist Du sicher das dies richtig ist ? Es widerspricht den Angaben in Deinem ersten Beitrag.
-
:oops:
?? kann dir nicht folgen
-
Ich möchte nicht anzweifeln, dass ich nicht alles richtig bedenke/ beschreibe …
javascript.0.lmair.marker.04
wird von aussen geschaltet - das zeigt den wirklichen Status an
javascript.0.lmair.szenenr.04
Ist auf mein Vis Button gemappt.
wenn dieser Status sich verändert
javascript.0.lmair.marker.04
dann soll dieser Status den Wert annehmen
javascript.0.lmair.szenenr.04
und dabei aber dann keine Befehle
http://192.168.10.71/control?key=xx
ausführen, das soll nur passieren dmit der VIS Button in der Oberfläche eben als "ein" angezeigt wird (oder aus, was eben vom Marker kommt)
Der weg soll sein
LM->javascript.0.lmair.marker.04 -> javascript.0.lmair.szenenr.04 -> VIS Buttun ändern nur Darstellung, keine Aktion
Aus IOBroker
VISButton -> javascript.0.lmair.szenenr.04 - http://192.168.10.71/control?key=xx ( ab hier übernimmt der LM die Funktion licht ein und Visualisierung der Schaltzustände
*Edit
diese beiden müssen synchron sein,
javascript.0.lmair.marker.04
javascript.0.lmair.szenenr.04
ausgehen nur von javascript.0.lmair.marker.04 , der gibt den zustand vor.
-
Der weg soll sein
LM->javascript.0.lmair.marker.04 -> javascript.0.lmair.szenenr.04 -> VIS Buttun ändern nur Darstellung, keine Aktion
Aus IOBroker
VISButton -> javascript.0.lmair.szenenr.04 - http://192.168.10.71/control?key=xx ( ab hier übernimmt der LM die Funktion licht ein und Visualisierung der Schaltzustände `
Genau das macht das Skript in meinem ersten Post (mit Szene 01). Du musst also nur in den ersten zwei Zeilen .01 –> .04 ändern.EDIT: Und vermutlich den Key für aus und ein anpassen, z.B. (die richtigen Werte kenne ich nicht)
var key = '12'; // aus if(dp.state.val) key = '11'; //ein
-
ich probiere das morgen Abend sofort aus…
und poste dann wieder.
-
klappt zum Teil,
ich kann über den VIS Button Lampen ein und ausschalten.
-
Der Schalter zeigt ON an
-
Durch die ausgeführte Szene zeigt auch der Lightmanager ON an
Abschalten der gleiche weg - funktioniert.
Was geht nicht.
Beispiel: ich schalte via VIS das Licht ein, alle Visualisierung sind gesetzt.
= beide DP haben den gleichen Wert (TRUE)
const idVis = 'javascript.0.lmair.szenenr.xx';
const idMarker = 'javascript.0.lmair.marker.x'
jezt schalte das Licht am <u>Lightmanager</u> aus - und das bekommt Vis nicht mehr mit.
jetzt steht "const idMarker = 'javascript.0.lmair.marker.x" auf "FALSE" weil Lampe aus
der DP
const idVis = 'javascript.0.lmair.szenenr.xx'; steht weiterhin auf TRUE
hier fehlt ein Sync der beiden Werte und immer nur ausgehend aus Richtung des DP "javascript.0.lmair.marker.x""
wie bereits gesagt, wenn auf diese Art der DP umgesetzt wird, dann darf nicht der Szenenaufruf kommen (http://192.168.10.71/control?key=xx)
da sonst eine Dauerschleife aufkommt …
ich hoffe es ist einigermaßen verständlich
-
-
Poste bitte das Skript, so wie Du es jetzt verwendest.
-
const idVis = 'javascript.0.lmair.szenenr.03'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.03'; const request = require('request'); const url = 'http://192.168.10.71/control?key='; const js = 'system.adapter.javascript.' + instance; on({id: idVis, change: 'ne', fromNe: js}, function(dp) { // Triggern bei Wertänderung durch Vis var key = '5'; // aus if(dp.state.val) key = '4'; //ein request(url + key, function(error, response, body) { if(error) log('Fehler Request Steckdose', 'error'); }); });
noch ein Hinweis - eine Szene und eine Marker haben keine 1:1 Beziehung.
d.h ich kann in einer Szene z.b 1 Lampe schalte und x Marker ein/auschalten. oder auch mixen, zB 3 marker ein/ und 3 marker aus…
daher ist es mir wichtig die Szenen via "lmair.szenenr" auszulösen, Aber die VIS Darstellung der On/off zustände via "lmair.marker" abzubilden.
-
hier fehlt ein Sync der beiden Werte `
Ja, der fehlt immer noch, obwohl ich geschrieben habe
@paul53:In dem Skript fehlt der Trigger auf idMarker (unten in meinem Skript). `
Richtig:const idVis = 'javascript.0.lmair.szenenr.03'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.03'; const request = require('request'); const url = 'http://192.168.10.71/control?key='; const js = 'system.adapter.javascript.' + instance; on(idMarker, function(dp) { // Triggern bei Wertänderung setState(idVis, dp.state.val, true); }); on({id: idVis, change: 'ne', fromNe: js}, function(dp) { // Triggern bei Wertänderung durch Vis var key = '5'; // aus if(dp.state.val) key = '4'; //ein request(url + key, function(error, response, body) { if(error) log('Fehler Request Steckdose', 'error'); }); });
-
ach du Schande, ich habe ja das halbe Script vergessen… war das schon die ganze Zeit da :lol:
Aber hey, es sieht gut aus... ich muss zugeben, es sieht sehr sehr gut aus. :mrgreen:
ich konnte jetzt in meinen ersten Tests keinen Fehler finden. ich habe sogar, mit einer Szene mehrer Lampen und Marker aktualisiert.
auch der auf LM einschalten und auf Vis abschalten hat funktioniert.(das synchrone
ich muss jetzt die nächsten Tage mal etwas komplexere Szenen einbinden.
Am Wochenende werde ich leider nicht dazu kommen, aber ich gebe auf jedenfalls nochmals Feedback, spät. Anfang nächster Woche.
Bis hierher erstmal ein Riesen Dankeschön, habe um ehrlich zu sein nicht dran geglaubt... :oops:
-
Hallo,
ich habe getestet und auch etwas verändert.
ich spare mir den DP: 'javascript.0.lmair.szenenr.01'
Fazit:bisher läuft gut
const idVis = 'javascript.0.lmair.marker.01'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.01'; const request = require('request'); const url = 'http://192.168.10.71/control?key='; const js = 'system.adapter.javascript.' + instance; on({id: idVis, change: 'ne', fromNe: js}, function(dp) { // Triggern bei Wertänderung durch Vis var key = '08'; // aus if(dp.state.val) key = '07'; //ein request(url + key, function(error, response, body) { if(error) log('Fehler Request Steckdose', 'error'); }); });
ich reagiere jetzt nur auf den Markerpunkt, für den VIS Button und die Visualisierung
const idVis = 'javascript.0.lmair.marker.01'; // ID des Datenpunktes, der auf Vis reagiert (false/true) const idMarker = 'javascript.0.lmair.marker.01';
das brauche ich nicht mehr (glaube ich)
/*on(idMarker, function(dp) { // Triggern bei Wertänderung setState(idMarker, dp.state.val, true); });*/
MARKER HOL Script
Um den Lightmanager nicht unnötig zu belasten, gibt es denn die Möglichkeit, dass Script welches sich die Marker zustände holt nicht permanent laufe zu lassen, sondern nur wenn die VIS Button gedrückt werden, bzw. nur alle Minute etc.
Das Script holt sich alle Marker Daten
javascript.0.scriptEnabled.Lightmanager.params_json
aktuell steht das im Script
// Start und Intervall:sekunden // -------------------------------------------------------------------------- setTimeout(DatenAuslesen, 1000); // schedule('*/15 * * * * *', DatenAuslesen); //
das scheint für den LM schon etwas viel, oder was bedeutet das - ich interpretiere 15 Sekunden. wenn es weniger wird, dann dauert es zu lange bis die buttons ihre status ändern.