NEWS
Problem im Skript mit Variablen
-
Hallo Forum,
ich hab es tatsächlich geschafft, dass ich mit VIS meine GArtenbewässerung einschalten kann.
ich möchte da jetzt etwas automatik reinbringen, was auch teilweise klappt:
Die Pumpe geht an, der Trafo für die Ventile wird eingestellt und die Ventile gehen auf.7
Jetzt wollte ich noch über ein Feld im VIS die Dauer einstellen können und den Ausschaltzeitpunkt dann im Skript zum Ausschalten verwenden. Da scheint aber was nicht zu funktionieren - sobald ich statt einer Zahl im setStateDelayed die DAuer mit dieser Variable multipliziere, funktioniert der Befehl nicht mehr zeitversetzt.
Was mache ich da falsch? oder darf man bei SetStateDelayed nur Zahlen eingeben aber keine VErknüpüfungen mit Variablen?7
kann mir wer weiterhelfen, wie ich das verknüpft bekomme? Natürlich sind auch weitere Hinweise zur VErbesserung gerne gesehen. Ich bin mir sicher, ich hab das nicht auf die beste Art gemacht - aber halt so wie ich es verstehe und so, dass es tatsächlich funktioniert hat (zumindest großteils….).
(zur Info: die Dauern im Skript sind noch sehr kurz zum Testen, da ist mir schon klar ...).
// Script zum Starten der Gartenbewässerung // Datenpunkt-ID var idBewKreis_S1 = "hm-rpc.0.NEQ016828.1.STATE"; // Verknüpfung mit Aktor für S1 (Sprüher Ost) var idBewKreis_S2 = "hm-rpc.0.NEQ016828.2.STATE"; // Verknüpfung mit Aktor für S2 (MP-Rotatoren West) var idBewKreis_S3 = "hm-rpc.0.NEQ016828.3.STATE"; // Verknüpfung mit Aktor für S3 (Tröpfchenbewässerung Böschung West) var idBewKreis_S4 = "hm-rpc.0.NEQ016828.4.STATE"; // Verknüpfung mit Aktor für S4 (Tröpfchenbewässerung Ost) var idPumpe = "hm-rpc.0.NEQ0168283.1.STATE"; // Verknüpfung mit Aktor für Steckdose Pumpe var idVentilversorgung = "hm-rpc.0.NEQ016823.2.STATE"; // Verknüpfung mit Aktor für Steckdose Pumpe var idTasterS1 = "vis.0.idTasterS1" var idTasterS2 = "vis.0.idTasterS2" var idTasterS3 = "vis.0.idTasterS3" var idTasterS4 = "vis.0.idTasterS4" var BewDauer = "vis.0.Bewaesserungsdauer" var BewDauerKorr // Variablendeklaration //var Bodenfeuchte; on({id: idTasterS1, val: true}, Kreis_S1); // Aufruf der Funktion bei Änderung von false auf true function Kreis_S1() { BewDauerKorr = BewDauer * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe setState(idPumpe, true); // Pumpe einschalten setState(idVentilversorgung, true); // Ventil-Spannungsversorgung einschalten setStateDelayed(idBewKreis_S1, true, 1*6000); // Ventil einschalten setStateDelayed(idTasterS1, false, BewDauerKorr); } on({id: idTasterS1, val: false}, Kreis_S1_off); // Aufruf der Funktion bei Änderung von false auf true function Kreis_S1_off() { setState(idBewKreis_S1, false); // Ventil ausschalten setStateDelayed(idPumpe, false, 5000); // Pumpe ausschalten setStateDelayed(idVentilversorgung, false, 5000); // Ventil-Spannungsversorgung ausschalten } on({id: idTasterS2, val: true}, Kreis_S2); // Aufruf der Funktion bei Änderung von false auf true function Kreis_S2() { setState(idPumpe, true); // Pumpe einschalten setState(idVentilversorgung, true); // Ventil-Spannungsversorgung einschalten setStateDelayed(idBewKreis_S2, true, 2*60000); // Ventil einschalten setStateDelayed(idBewKreis_S2, false, Bewaesserungsdauer*60000); // Ventil ausschalten nach Bewässerungsdauer setState(idTasterS2, false); //setStateDelayed(idPumpe, false, 1*60000); // Pumpe ausschalten //setStateDelayed(idVentilversorgung, false, 1*60); // Ventil-Spannungsversorgung ausschalten }
-
Ein Fehler:
BewDauerKorr = getState(BewDauer).val * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe
Zweiter, dass die Variable Bewaesserungsdauer in
setStateDelayed(idBewKreis_S2, false, Bewaesserungsdauer*60000); // Ventil ausschalten nach Bewässerungsdauer
nirgendwo gesetzt ist.
-
die wichtigsten Teil hatte ich im Code weggelassen.
also hier nochmal, es geht um folgende Zeile:
setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000); // Ventil einschalten
Wenn ich wieder statt "BewDauerKirr" durch eine Zahl ersetzte, funktionierts wieder….
// Script zum Starten der Gartenbewässerung // Datenpunkt-ID var idBewKreis_S1 = "hm-rpc.0.NEQ016828.1.STATE"; // Verknüpfung mit Aktor für S1 (Sprüher Ost) var idBewKreis_S2 = "hm-rpc.0.NEQ016828.2.STATE"; // Verknüpfung mit Aktor für S2 (MP-Rotatoren West) var idBewKreis_S3 = "hm-rpc.0.NEQ016828.3.STATE"; // Verknüpfung mit Aktor für S3 (Tröpfchenbewässerung Böschung West) var idBewKreis_S4 = "hm-rpc.0.NEQ016828.4.STATE"; // Verknüpfung mit Aktor für S4 (Tröpfchenbewässerung Ost) var idPumpe = "hm-rpc.0.NEQ0168283.1.STATE"; // Verknüpfung mit Aktor für Steckdose Pumpe var idVentilversorgung = "hm-rpc.0.NEQ016823.2.STATE"; // Verknüpfung mit Aktor für Steckdose Pumpe var idTasterS1 = "vis.0.idTasterS1" var idTasterS2 = "vis.0.idTasterS2" var idTasterS3 = "vis.0.idTasterS3" var idTasterS4 = "vis.0.idTasterS4" var BewDauer = "vis.0.Bewaesserungsdauer" var BewDauerKorr // Variablendeklaration //var Bodenfeuchte; on({id: idTasterS1, val: true}, Kreis_S1); // Aufruf der Funktion bei Änderung von false auf true function Kreis_S1() { BewDauerKorr = BewDauer * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe setState(idPumpe, true); // Pumpe einschalten setState(idVentilversorgung, true); // Ventil-Spannungsversorgung einschalten setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000); // Ventil einschalten setStateDelayed(idTasterS1, false, BewDauerKorr); } on({id: idTasterS1, val: false}, Kreis_S1_off); // Aufruf der Funktion bei Änderung von false auf true function Kreis_S1_off() { setState(idBewKreis_S1, false); // Ventil ausschalten setStateDelayed(idPumpe, false, 5000); // Pumpe ausschalten setStateDelayed(idVentilversorgung, false, 5000); // Ventil-Spannungsversorgung ausschalten }
-
Hallo
Bluefox hat Dir eigentlich Dein Problem schon beantwortet, vielleicht etwas zu knapp formuliert. Aber für die "Blutigen" hier noch ein paar Worte:
Du hast Dein Problem lokalisiert:
setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000); // Ventil einschalten
Es hängt mit BewDauerKorr zusammen. Wie Du bereits festgestellt hat funktioniert alles, wenn Du "BewDauerKorr" durch eine Zahl ersetzt.
Die Frage ist, was "vis.0.Bewaesserungsdauer" * 1000 * 6000 ergibt? Bei den Simpsons müsste Bart 6.000.000 Mal "vis.0.Bewaesserungsdauer" an die Tafel schreiben. ioBroker wird Dir wohl nur einen Vogel zeigen. Einen String kann man nicht mit einer Variablen multiplizieren. Eigentlich möchtest DU den Wert von "vis.0.Bewaesserungsdauer" haben. Da "vis.0.Bewaesserungsdauer" keine Variable in Javascript ist, sondern ein State von ioBroker musst Du die den Wert holen:
getState("vis.0.Bewaesserungsdauer").val
Trotzdem wirst Du wohl kaum Glück haben. Ich bin mal so frech und wage zu behaupten, dass Du keinen State "vis.0.Bewaesserungsdauer" hast. Kannst Du ja mal mittels Objekte im Administrator vergleichen. Hintergrund ist, dass Vis in der Regel keine Daten direkt zur Verfügung stellt. Vielmehr musst Du dem Widget den State in Vis mitteilen, in den die Eingabe gespeichert werden soll. Am einfachsten Du erzeugst mittels Javascript einen State (siehe Javascript-Anleitung) und setzt auch einen Defaultwert. Dieses verhindert, dass Dein Programm abstürzt, wenn es den State abfragt. Nachdem das State erstmalig angelegt wurde, stellst Du die Verknüpfung zwischen Vis und dem State her (also entsprechend beidem Widget eintragen). Jetzt sollte es laufen. Dein Skript wirst Du sicherlich auch an anderer Stelle noch überarbeiten dürfen.
Eine Frage interessehalber: Wie ermittelst Du die Bodenfeuchtigkeit?
Gruß Gerhard
-
Danke an die Rückmeldungen!
@ Bluefox: ich hatte deine Antwort übersehen und wollte nur das Skript nochmal posten.
@ Steinwedel: Danke für die Erklärung - ohne hätte ich es nicht verstanden, und mit deiner Hintergrundinfo bekomme ich vielleicht auch eine Lösung hin.
Und zur Bodenfeuchte: von solchen Dingen bin ich noch seeeehr weit entfernt, ich hab mich zwar schon umgesehen, aber dafür muss ich noch einiges mehr an Übung mit Java bekommen…..
-
kleiner Nachtrag:
es funktioniert jetzt! und zwar mit folgender Zeile:
BewDauerKorr = getState("vis.0.Bewaesserungsdauer").val * 1 + 1;
Ich hab den Hinweis auf den State erst nicht verstanden - dann aber kapiert was gemeint war.
was ich nicht verstehe - warum ist das Ergebnis 4 wenn ich bei getState mit *1 multipliziere - aber 31 wenn ich nicht mit *1 multipliziere.
Danke nochmal!
-
Ich hab den Hinweis auf den State erst nicht verstanden - dann aber kapiert was gemeint war.
was ich nicht verstehe - warum ist das Ergebnis 4 wenn ich bei getState mit *1 multipliziere - aber 31 wenn ich nicht mit *1 multipliziere. `
"3" + 1 = "31" "3" * 1 = 3 "3" * 1 + 1 = 4
Weil deine Variable String ist.
Ganz richtig ist:
BewDauerKorr = parseFloat(getState("vis.0.Bewaesserungsdauer").val) + 1;