NEWS
Widget zum setzen mehrerer States
-
Hi zusammen!
Ich hab n kleines Problem und hoffe mir kann hier jemand helfen!
Und zwar hab ich mir mehrere Hygrometer zur Bodenfeuchtemessung durch WeMos D1 minis gebaut!
diese setzen mir in HM die dementsprechenden Systemvariablen z.B. S1-Bodenfeuchte (bool) auf true für trocken und auf false für feucht!
Klappt auch wunderbar!
Der Abfragezyklus beträgt alle 8 Stunden und dann geht der WeMos wieder in den Tiefschlaf.
In Vis hab ich mir n extra View angelegt!
Jetzt ist nur folgendes Problem, wenn ich die Planzen bewässere dann kann es bis zu 8 Stunden dauern bis der WeMos mir den richtigen Wert wieder in VIS anzeigt!Jetzt wäre mein Gedanke nach dem Bewässern auf dem Tablet n buttom zu drücken das mir die Sensoren, die Trocken gemeldet haben, auf false für feucht setzen.
Aber leider bekomme ich das nicht hin!
Mein erster Ansatz mit m Script war folgender
var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; if (feuchtesensor1 === true) { setState(feuchtesensor1, false); } if (feuchtesensor2 === true) { setState(feuchtesensor2, false); } if (feuchtesensor3 === true) { setState(feuchtesensor3, false); } if (feuchtesensor4 === true) { setState(feuchtesensor4, false); } if (feuchtesensor5 === true) { setState(feuchtesensor5, false); }
Das ich dann mit einem Widget ansteuere aber das klappt mal gar nicht!
Kann mir da vielleicht jemand helfen?
Gruß Johnny
-
Ändere mal deine setState-Statements auf
if (feuchtesensor1 === true) { setState(feuchtesensor1, false, false); } if (feuchtesensor2 === true) { setState(feuchtesensor2, false, false); } if (feuchtesensor3 === true) { setState(feuchtesensor3, false, false); } if (feuchtesensor4 === true) { setState(feuchtesensor4, false, false); } if (feuchtesensor5 === true) { setState(feuchtesensor5, false, false); }
Die Werte werden nur an die CCU übertragen, wenn ACK == false
-
Schönes Projekt. Kannst du die Hardware (Akku?) und Software hier vorstellen (vielleicht in einem neuen Thread, wenn das aktuelle Problem gelöst ist).
Ich möchte auch in Zukunft WeMos D1 Minis einsetzen.
Gruß
Pix
-
Hi Pix!
Ja, kein Problem kann ich machen! laufen alle mit Akku 18650!
Leider klappt das mit dem zurücksetzen auf VIS mit dem Vorschlag von nobody nicht!
Ich hab jetzt das Skript mal so abgeändert aber ohne Erfolg
createState("Bodenfeuchtesensor", false, { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); on("javascript.0.Bodenfeuchtesensor", function(dp) { if(dp.state.val) { setState(dp.id, false); if ('hm-rega.0.28658' == "true") { setState('hm-rega.0.28658', false, false); } if ('hm-rega.0.28660' == "true") { setState('hm-rega.0.28660', false, false); } if ('hm-rega.0.28662' == "true") { setState('hm-rega.0.28662', false, false); } if ('hm-rega.0.28664' == "true") { setState('hm-rega.0.28664', false, false); } if ('hm-rega.0.28666' == "true") { setState('hm-rega.0.28666', false, false); } } });
-
klar,
im ersten Skript von dir wurden ja die Werte auch noch geholt und in Variablen geschrieben.
'hm-rega.0.28662' == "true" ist immer false also wird nie was ausgeführt
du musst die Werte schon mit getState holen um sie zu vergleichen oder du lässt die Abfrage gleich weg und überschreibst einfach alles. Dabei dürfte in diesem Fall auch nichts kaputt gehen.
-
Ist das so besser?
createState("Bodenfeuchtesensor", false, { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; on("javascript.0.Bodenfeuchtesensor", function(dp) { if(dp.state.val) { setState(dp.id, false); if (feuchtesensor1 === true) { setState(feuchtesensor1, false, false); } if (feuchtesensor2 === true) { setState(feuchtesensor2, false, false); } if (feuchtesensor3 === true) { setState(feuchtesensor3, false, false); } if (feuchtesensor4 === true) { setState(feuchtesensor4, false, false); } if (feuchtesensor5 === true) { setState(feuchtesensor5, false, false); } } });
-
geht das denn jetzt?
Der Operator === prüft auch den Datentypen. Dies klappt nur, wenn dieser bei der Übertragung von der CCU auch als Boolean übertragen wird.
Wenn du die Werte für die ids außerhalb des on-Statements holst, erfolgt dies einmal zum Start des Javascript-Adapters und danach nie wieder. Somit ergibt dies keinen Sinn.
Versuche mal einfach das:
createState("Bodenfeuchtesensor", false, { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; on("javascript.0.Bodenfeuchtesensor", function(dp) { if(dp.state.val) { setState(dp.id, false); setState(idSensor1 , false, false); setState(idSensor2 , false, false); setState(idSensor3 , false, false); setState(idSensor4 , false, false); setState(idSensor5 , false, false); } });
-
Nö, klappt leider nicht!
Hab es auch ohne if-Abfrage probiert. Auch kein Erfolg
createState("Bodenfeuchtesensor", false, { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; on("javascript.0.Bodenfeuchtesensor", function(dp) { if(dp.state.val) { setState(dp.id, false); setState(feuchtesensor1, false, false); setState(feuchtesensor2, false, false); setState(feuchtesensor3, false, false); setState(feuchtesensor4, false, false); setState(feuchtesensor5, false, false); } });
-
Die Variablen feuchtesensor1-5 werden nur beim Skriptstart mit den Werten gefüllt. Sie sollen aber bei Tastendruck (bzw Bodenfeuchtesensor ist wahr) abgefragt werden.
Dazu einige Abkürzungen und bei CreateState ist def dazu da, den Default-Wert zu setzen, dann kannst du ihn vor der geschweifetn Klammer weglassen.
createState("Bodenfeuchtesensor", { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; on("javascript.0.Bodenfeuchtesensor", function(dp) { var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; if(dp.state.val) { setState(dp.id, false); if (feuchtesensor1) setState(feuchtesensor1, false, false); if (feuchtesensor2) setState(feuchtesensor2, false, false); if (feuchtesensor3) setState(feuchtesensor3, false, false); if (feuchtesensor4) setState(feuchtesensor4, false, false); if (feuchtesensor5) setState(feuchtesensor5, false, false); } });
Gruß
Pix
-
var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; ... setState(feuchtesensor1, false, false); setState(feuchtesensor2, false, false); setState(feuchtesensor3, false, false); setState(feuchtesensor4, false, false); setState(feuchtesensor5, false, false); ```` `
setState(feuchtesensor2, false, false); kann auch nicht klappen weil feuchtesensor2 == true ist und nicht die id enthält.
-
Au man :oops: :oops: :oops: :oops:
@nobody:setState(feuchtesensor2, false, false); kann auch nicht klappen weil feuchtesensor2 == true ist und nicht die id enthält. `
createState("Bodenfeuchtesensor", { read: true, write: true, desc: "Zurücksetzen der Bodenfeuchtesensoren", type: "boolean", def: false }); var idSensor1 = "hm-rega.0.28658"; var idSensor2 = "hm-rega.0.28660"; var idSensor3 = "hm-rega.0.28662"; var idSensor4 = "hm-rega.0.28664"; var idSensor5 = "hm-rega.0.28666"; on("javascript.0.Bodenfeuchtesensor", function(dp) { var feuchtesensor1 = getState(idSensor1).val; var feuchtesensor2 = getState(idSensor2).val; var feuchtesensor3 = getState(idSensor3).val; var feuchtesensor4 = getState(idSensor4).val; var feuchtesensor5 = getState(idSensor5).val; if(dp.state.val) { setState(dp.id, false); if (feuchtesensor1) setState(idSensor1, false, false); if (feuchtesensor2) setState(idSensor2, false, false); if (feuchtesensor3) setState(idSensor3, false, false); if (feuchtesensor4) setState(idSensor4, false, false); if (feuchtesensor5) setState(idSensor5, false, false); } });
:lol:
-
Perfekt!
Jetzt geht es. Tausend Dank euch beiden!
Einen schönen noch euch beiden.
Gruß
Johnny