NEWS
[gelöst] Bitte um Nachhilfe zur "on" Anweisung
-
Ich brauche bitte Hilfe. Ich möchte mithilfe der "On" Anweisung einige Befehle ausführen lassen, in diesem Falle meinen Saugrobotet starten, wenn die entsprechende Homematic Variable auf "start" steht:
//##############Aufruf über Start########################## var Variable = "hm-rega.0.51644"/*Xiaomi_Start*/ on(Variable, function (data) { var idStart="mihome-vacuum.0.start"/*Start vacuum*/; var wert = "true"; setState(idStart,wert); });
So, wie ich das Skript momentan eingerichtet habe, löst das Skript bei jeder Änderung der Variablen "hm-rega.0.51644" aus. Das will ich aber nicht. Es soll nur ausgelöst werden, wenn einer der beiden Zustände ("start" od. "stop", Logic Variable) erreicht ist, also in meinem Fall "start", aber nicht bei "stop".
Leider weiß ich nicht, wie die On Anweisung mit einer entsprechenden Anweisung versehen warden muß. Ich dachte an sowas wie
Variable == "start"
Aber das klappt nicht. Die Erklärung im Github hilft mir leider auch nicht weiter bzw. gibt es dort auch kein Beispiel.
Wie ware es richtig? Kann mir wer helfen?
-
So vielleicht: on({ID: variable, val: true}, Funktion()
Gesendet von meinem m8 mit Tapatalk
-
Ich nehme mal an, dass die Zuordnung in der SV vom Typ Logikwert so ist: falsch = "stop", wahr = "start" ? Der Datenpunkt mit dem Namen "Start vacuum" ist vom Typ 'boolean' ? Dann muss man auf true prüfen und mit true einschalten:
//##############Aufruf über Start########################## var idSV = getIdByName("Xiaomi_Start"); var idStart = getIdByName("Start vacuum"); on({id: idSV, val: true}, function () { setState(idStart, true); });
Will man mit der gleichen SV ein- und ausschalten, funktioniert das so:
//##############Aufruf über Start########################## var idSV = getIdByName("Xiaomi_Start"); var idStart = getIdByName("Start vacuum"); on(idSV, function (dp) { setState(idStart, dp.state.val); });
oder falls "Stop vacuum" ein extra Datenpunkt ist, dann so:
//##############Aufruf über Start########################## var idSV = getIdByName("Xiaomi_Start"); var idStart = getIdByName("Start vacuum"); var idStop = getIdByName("Stop vacuum"); on(idSV, function (dp) { if (dp.state.val) setState(idStart, true); else setState(idStop, true); });
-
Hallo,
deine Variante entspricht der Kurzform der Reaktion auf Änderung
change: 'ne' ````Daher wird bei jeder Änderung ausgelöst. Du willst aber nur auslösen, wenn der Inhalt der überwachten Variable "Variable" mit "Start" gefüllt ist. Das erreichst du durch die Abfrage des Inhalts nach der Änderung und durch das Vergleichen des Inhalts mit der Zeichenkette "Start". Ah, ich sehe gerade, die Homematic Variable ist eine Logic/Boolean Variable (false/true). Dazu noch ein wenig Kosmetik. __idStart__ lieber ganz oben deklarieren und __Variable__ nenne ich mal __idVariable__, weil es ein Objekt ist. Dazu noch ein Semikolon… :lol:
//##############Aufruf über Start##########################
var idVariable = "hm-rega.0.51644"/Xiaomi_Start/;
var idStart="mihome-vacuum.0.start"/Start vacuum/;on(idVariable, function (data) {
var wert = "false";
if (data.state.val === "start" || data.state.val /* === true */) {
wert = "true";
}
// und Erweiterung um STOP
if (data.state.val === "stop" || !data.state.val) {
wert = "false";
}
setState(idStart,wert);
});Probier mal! Gruß Pix EDIT: Paul war schneller, bei mir siehst du eher die Herleitung von deinem Code
-
Auf Euch ist Verlass, Männer! Vielen Dank. Jetzt geht es so, wie ich es will! Danke!
-
@pix,
ich habe es jetzt mit der ersten von paul53 geposteten Variante am laufen. Dennoch interessiert mich Dein Ansatz. Und da ich ja um Nachhilfe gebeten habe, würde ich die jetzt aus akademischem Interesse in Anspruch nehmen. Dein Skript:
//##############Aufruf über Start########################## var idVariable = "hm-rega.0.51644"/*Xiaomi_Start*/; var idStart="mihome-vacuum.0.start"/*Start vacuum*/; on(idVariable, function (data) { var wert = "false"; if (data.state.val === "start" || data.state.val /* === true */) { wert = "true"; } // und Erweiterung um STOP if (data.state.val === "stop" || !data.state.val) { wert = "false"; } setState(idStart,wert); });
verstehe ich bis zur on Anweisung. Dann verläßt mich des Sänger's Höflichkeit
Was bitte bedeutet:
` > if (data.state.val === "start" || data.state.val /* === true */) {wert = "true"; `
-
data wurde doch vorher nirgendwo definiert, nur idVariable und idStart?
-
was bedeutet "||" und warum "===", also dreimal =
-
und das verstehe ich auch nicht "data.state.val "
Was die if Anweisung macht, das verstehe ich: sie prüft, ob da "start" oder "stop" steht. Und setzt entsprechend die Variable wert auf true od. false. Aber die Syntax kapiere ich überhaupt nicht.
-
-
Bis der Profi die Details klärt, einige Infos vorab (soweit ich Ahnung hab)
on(idVariable, function (data) { ````reagiert auf Dein Objekt und startet die Funktion UND übergibt das Objekt in 'data'
||
===
data.state.val
-
- data wurde doch vorher nirgendwo definiert, nur idVariable und idStart? `
Doch, hier (als Funktionsargument):
on(idVariable, function (data) {
- was bedeutet "||" und warum "===", also dreimal = `
|| steht in JavaScript für "ODER", d.h. der Teil in geschweiften Klammern hinter if (…) wird ausgeführt, wenn mind. eine der Bedingungen erfüllt ist.
=== ist ein Vergleich auf Gleichheit. Oft sieht man auch "==", der Unterschied hierbei ist, dass "==" auch Werte unterschiedlicher Typen zulässt, "===" aber nicht. Vermeidet ein paar Probleme die auftreten könnten. So ist "1" == 1 wahr, aber nicht "1" === 1 (da sie unterschiedliche Variablentypen sind).
- und das verstehe ich auch nicht "data.state.val " `
data.state ist der State in ioBroker, den du in der on-Anweisung überwachst, in deinem Fall also "hm-rega.0.51644". Der wird dir bei der Überwachung mitgegeben, um auf den aktuellen (und alten) Wert ragieren zu können.
data.state.val ist der Wert, der aktuell in diesem State steht.
- data wurde doch vorher nirgendwo definiert, nur idVariable und idStart? `