NEWS
Hilfe Umstellen CCU2 Programm zum ioBroker Skript
-
Hallo,
vorweg erstmal. Bin blutiger JavaScript Anfänger und dachte, das ich mit vorhandenen Beispielen es schaffe einen Teil meiner CCU2 Programme als ioBroker Scripte umzustellen.
Da kann ich erstmal sagen bin sowas von gescheitert.
Also hoffe ich das ich mit Eurer Hilfe es exemplarisch an einem Programm hinbekomme um dementsprechend zu lernen.
Mein Programm Abwesend Kurz:
Wenn die CCU2 Variable Abwesend kurz auf true gesetzt wird oder via Fernbedienung mit Tastendruck kurz die Wenn Funktion aktiv dann werden etliche Komponenten ausgeschaltet.
Mein erster Programm Ansatz war:
/* Programm Abwesend Kurz Ablösen des CCU2 Programms */ if ("hm-rega.0.2330" === true /*Abwesenheit kurz*/ && "hm-rega.0.950"/*Anwesenheit*/ === true) setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20");
Es ist mein ursprünliches Beispiel, habe verschiedene Sachen probiert, kam dann aber in eine endlosschleife etc.
Meine Probleme im Einzelnen.
Im CCU2 Programm sind zum Auslösen zwei Und Verknüpfungen. Die erste hatte ich versucht im Script mit dem if abzubilden, was nicht funktioniert. Wie ich die Oder Verknüpfung integriere weiß ich gar nicht.
Wie ich States setze klappt schon ganz gut, auch verzögert. Allerdings stelle ich mir die Frage ob ich das verändern der States nicht irgendwie globalisieren kann, da ich es in mehreren Programmen benötige.
Also wie gesagt, blutiger Anfänger der lernen möchte. Ich bin dankbar für jeden Vorschlag wie man es richtig macht oder wo ich noch was nachlesen kann. Auch ein macht keinen Sinn dafür fehlen dir die Voraussetzungen, also mache es besser so, ist hilfreich.
Nicht falsch verstehen, Ihr sollt mir nicht die Programme schreiben, dann lerne ich es nicht. Es wäre aber toll wenn Ihr mir an direkten Fragestellungen mit Beispielen und vielleicht kurzen Erklärungen auf diesem langen Weg helfen könntet.
Schonmal ganz herzlichen Dank
Gruß Zippolighter
-
Also dein Beispiel sieht richtig aus, was aber fehlt ist schlichtweg eine subscription auf dein Objekt damit das programm ausgeführt wird.
Code: on({id}, function(){dein Beispiel})
Hoffe das hilft. Bei JS allgemein hilft w3schools sehr gut.
Gesendet von meinem Jolla mit Tapatalk
-
Bin ein bischen weiter.
So klappt es mit dem ersten "Wenn" Wert
/* Programm Abwesend Kurz Ablösen des CCU2 Programms */ var idAbwesendKurz = 'hm-rega.0.2330', // if (getState("hm-rega.0.2330.STATE" === true /*Abwesenheit kurz*/ && "hm-rega.0.950"/*Anwesenheit*/ === true) on({ id: idAbwesendKurz, change: 'ne', val: true }, function (obj) { setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20"); });
Allerdings krieg ich den zweiten "Wenn" Wert (das prüfen ob Anwesend auf true ist), nicht hin.
Habe es so versucht
/* Programm Abwesend Kurz Ablösen des CCU2 Programms */ var idAbwesendKurz = 'hm-rega.0.2330', idAbwesend = 'hm-rega.0.950'; // if (getState("hm-rega.0.2330.STATE" === true /*Abwesenheit kurz*/ && "hm-rega.0.950"/*Anwesenheit*/ === true) on({ id: idAbwesendKurz, change: 'ne', val: true} && { id: idAbwesend, change: 'eq', ack: true }, function (obj) { setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20"); });
Bitte nochmal einen Tipp, wie ich das prüfen realisiere.
Danke Gruß Zippolighter
-
Hallo Zippolighter,
Jey Cee hat es schon richtig erklärt: Die subscription (on()) ist der Teil, der auf die Änderung einer Variable wartet. Wenn diese Änderung eintritt und der neue Wert ist wie gewünscht, kann man auf eine weitere Variable/weiteres Objekt prüfen. Damit der aktuellste Stand dieses zweiten Objektes verwendet wird, fragt man ihn innerhalb der subscription ab.
Der Dann-Bereich beider Abfragen ist hier identisch. Also brauchst du das nur einmal zu skripten. Du packst den Code in eine extra Funktion, die dann von beiden subscriptions aufgerufen wird.
// Abfrage der Abwesenheit Kurz: var idAbwesendKurzVariable = 'hm-rega.0.HIER DIE ID DER VARIABLE ABWESENHEIT KURZ'; // nicht die ID des Tasters der Fernbedienung, sondern der Variable // lange, ausführliche Schreibweise on({ id: idAbwesendKurzVariable, // Datenpunkt der Überwachung change: 'ne' // auf Änderung }, function (obj) { // den neuen Wert der Änderung checken if (obj.state.val === true) { // wenn neuer Wert true // aktuelle Abfrage der zweiten Variable - also nur prüfen var anwesenheit = getState("hm-rega.0.950"/*Anwesenheit*/).val; // zur besseren Übersicht in eine lokale Variable geschrieben if (anwesenheit === true) { // wenn Anwesenheit auch wahr ist starteAktion(); // Funktion aufrufen } } }); var idAbwesendKurzTaster = "hm-rega.0.2330.STATE" /*Abwesenheit kurz Taster*/; // STATE muss mit rein beim Taster, ist wohl eher ein hm-rpc.0.***.STATE Datenpunkt // zweite subscription auf die Fernbedienung in kurzer Schreibweise (change: 'ne' ist Standard, es kann "===true" weggelassen werden und einzeilige Anweisungen nach if brauchen keine geschweiften Klammern) on(idAbwesendKurzTaster, function (obj) { if (obj.state.val && getState(idAbwesendKurzVariable).val) starteAktion(); }); // Ausführung function starteAktion () { setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20"); // weitere Aktionen einfügen }
Der Taster der Fernbedienung sollte eigentlich ein RPC-Datenpunkt sein, kein REGA.
In deinem Screenshot des CCU Programms wird in der oberen Wenn-Bedingung die Variable "Anwesenheit" geprüft, ind er unteren "wenn-Bedingung" die Variable "Abwesenheit-kurz". Wenn das so korrekt ist, ist das obige Skript 1:1 übersetzt.
Gib mal Feedback 8-)
Gruß
Pix
-
Für jeden Auslöser wird eine on(…) benötigt. Nur prüfen wird durch getState(id).val ersetzt.
/* Programm Abwesend Kurz Ablösen des CCU2 Programms */ var idAbwesendKurz = 'hm-rega.0.2330', idAnwesend = 'hm-rega.0.950', idFB = "hm-rpc.0.MEQ0670647.2.PRESS_SHORT"; // Fernbedienung function allesaus() { setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20"); ... } on(idAbwesendKurz, function (dp) { // Auslösen bei Änderung if(dp.state.val && getState(idAnwesend).val) allesaus(); }); // Toggeln der SV mit Fernbedienung on({id: idFB,val: true}, function () { if(getState(idAbwesendKurz).val) setState(idAbwesendKurz, false); else setState(idAbwesendKurz, true); });
-
Erstmal danke an Jey Cee, Pix und Paul53. Super mit den Beispielen komme ich schonmal ein ganzes Stück weiter
Hatte mit der Erklärung von Jey Cee soweit weiter gemacht das ich bei einer if Variante war, die aber nicht funktioniert hat.
Habe dann Pix Vorschlag umgesetzt, muss mir das von Paul53 noch genauer anschauen.
Pix, hast natürlich recht, die Fernbedienung ist ein RPC Element (Ich muss auf Anwesend Kurz prüfen, da ich mit der Taste Short eine Toogle Funktion zwischen An und Aus realisiert habe). Allerdings verstehe ich gerade noch nicht den Punkt mit STATE, da ich ja PRESS_SHORT verwenden muss (denke ich zumindest, ansonsten Scheiss mich zusammen. Hihi)
Erster Teil Funktioniert und auch die Funktion starteAktion. Zweite Subscription funktioniert nicht (denke weil ich da was falsches eingegeben habe, werde ich noch weiter probieren)
` > /* Programm Abwesend Kurz
Ablösen des CCU2 Programms
Mit Hilfe von Jey Cee, Pix und Paul53
*/
// Abfrage der Abwesenheit Kurz:
var idAbwesendKurzVariable = 'hm-rega.0.2330'; // System Variable CCU2 Abwesend Kurz
// lange, ausführliche Schreibweise
on({
id: idAbwesendKurzVariable, // Datenpunkt der Überwachung
change: 'ne' // auf Änderung
}, function (obj) {
// den neuen Wert der Änderung checken
if (obj.state.val === true) { // wenn neuer Wert true
// aktuelle Abfrage der zweiten Variable - also nur prüfen
var anwesenheit = getState("hm-rega.0.950"/Anwesenheit/).val; // zur besseren Übersicht in eine lokale Variable geschrieben
if (anwesenheit === true) { // wenn Anwesenheit auch wahr ist
starteAktion(); // Funktion aufrufen
}
}
});
var idAbwesendKurzTaster = "hm-rpc.0.MEQ0670647.2.PRESS_SHORT" /Funk-Fernbedienung mit D. Abw.KurzAn/Aus:2.PRESS_SHORT/ /Abwesenheit kurz Taster/; // STATE muss mit rein beim Taster, ist wohl eher ein hm-rpc.0.***.STATE Datenpunkt
// zweite subscription auf die Fernbedienung in kurzer Schreibweise (change: 'ne' ist Standard, es kann "===true" weggelassen werden und einzeilige Anweisungen nach if brauchen keine geschweiften Klammern)
on(idAbwesendKurzTaster, function (obj) {
if (obj.state.val && getState(idAbwesendKurzVariable).val) starteAktion();
});
// Ausführung
function starteAktion () {
setState("hm-rpc.0.MEQ0484756.1.STATE", false); // Taster Deckenlicht Arbeitszimmer
setState("hm-rpc.0.NEQ0018993.2.SUBMIT","0.7,1,108000,20");
// weitere Aktionen einfügen
} `
nochmals danke
Gruß Zippolighter