NEWS
[gelöst] JSON-Tabelle mit js.script triggern
-
Ich habe mir aus dem Scripten von @Meistertr für seinen Mährobotor ein Script für meine Bewässerung
gebastelt. Jetzt würde ich gern die JSON-Tabelle triggern um die Bewässerung zu starten.
[{"Tag":"Mo","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"Di","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"Mi","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"Do","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"Fr","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"Sa","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}, {"Tag":"So","Bew1":"05:25","Bew1_time":60,"Bew2":"00:00","Bew2_time":0,"Active":"x"}]
Im Grunde soll immer bewässert werden wenn, wenn Active=true ist und die Bew1_time bzw Bew2_time größer als null ist.
-
Es ist nicht klar, was Du bewirken willst:
a) Den JSON-String auswerten, um die Bewässerung entsprechend den Einträgen zu steuern ?
b) Aus Werten in Datenpunkten den JSON-String erzeugen ?
-
ich dachte mir schon, das ich mich etwas kompliziert ausgedrückt habe…
Antwort: a)
-
Da Du keine Angabe dazu gemacht hast, gehe ich davon aus, dass Du weißt, wie der JSON-String in das Script gelangt und er nur noch ausgewertet werden muss. Vielleicht so
const idJSON = '...'; // Datenpunkt mit JSON-String ? const idBew = '...'; // Aktor Bewässerung var sched1 = null; var sched2 = null; var json = getState(idJSON).val; function zeiten() { var arr = JSON.parse(json); // Array aus 7 Elementen (Wochentage) var now = new Date(); var wd = now.getDay() - 1; // Wochentag (0 = Montag) if(wd < 0) wd = 6; // Sonntag var obj = arr[wd]; if(sched1) clearSchedule(sched1); if(obj.Active == "x" && obj.Bew1_time) { // ist Active ein String ? var t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, true); setStateDelayed(idBew, false, 60000 * obj.Bew1_time); }); } if(sched2) clearSchedule(sched2); if(obj.Active == "x" && obj.Bew2_time) { t = obj.Bew2.split(':'); sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, true); setStateDelayed(idBew, false, 60000 * obj.Bew2_time); }); } } zeiten(); // Skriptstart schedule('1 0 * * *', zeiten); // kurz nach Mitternacht // Änderung des JSON-Strings on(idJSON, function(dp) { json = dp.state.val; zeiten(); });
EDIT: korrigiert ) –> , und "true" --> "x"
-
Da Du keine Angabe dazu gemacht hast, gehe ich davon aus, dass Du weißt, wie der JSON-String in das Script gelangt und er nur noch ausgewertet werden muss. Vielleicht so `
der JSON-String wird vorher in in ein Objekt javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan geschrieben.
Kann also so ausgelesen werden, richtig?
const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan' const idBew = 'javascript.0.Bewässerung.Ventil1.LaufzeitVentil1'
die idBew wäre schon die Laufzeit javascript.0.Bewässerung.Ventil1.LaufzeitVentil1
also müsste das in deinem script dann wie folgt heißen, richtig?
if(obj.Active == "true" && obj.Bew1_time) { // ist Aktive ein String ? var t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *') function() { setState(idBew, obj.Bew1_time);
das Abschalten wird dann über einen coundown erledigt…
-
der JSON-String wird vorher in in ein Objekt javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan geschrieben.
Kann also so ausgelesen werden, richtig? `
Ja. Semikolon am Zeilenende nicht vergessen !
@sveni_lee:also müsste das in deinem script dann wie folgt heißen, richtig?
setState(idBew, obj.Bew1_time);
das Abschalten wird dann über einen coundown erledigt… `
Ja, wenn der Countdown im Minutentakt erfolgt. -
vielen Dank…
werde ich dann mal testen
-
ich hab jetzt 2 Fehlermeldungen.
Leider ist mein Javascript nicht besonders gut…
~~![](</s><URL url=)https://i.imgur.com/4YAGH7u.jpg" />
![](</s><URL url=)https://i.imgur.com/kQXMgy0.jpg" />~~ -
Sorry, vor function() muss ein Komma anstelle der schließenden Klammer.
sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
-
kein Problem,
Danke für die schnelle Hilfe…
Ich habe das Script jetzt mal getestet aber irgendwie wird die Bewässerungszeit nicht gesetzt.
Ich habe gestern abend einen Terminn für heute früh gesetzt, weil ich gesehen hatte das Du einen Schedule
täglich kurz nach 0:00Uhr gesetzt hast. Aber auch das hat nichts bewirkt.
ich hätte auch noch eine anderen JSON-String...
{"0":{"Bew1":{"wecken":false,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":false,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"1":{"Bew1":{"wecken":true,"nachricht":1,"dauer":90,"stunde":5,"minute":30},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"2":{"Bew1":{"wecken":true,"dauer":90,"nachricht":1,"stunde":5,"minute":"25"},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"3":{"Bew1":{"wecken":true,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"4":{"Bew1":{"wecken":true,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"5":{"Bew1":{"wecken":false,"nachricht":2,"dauer":5,"stunde":23,"minute":10},"Bew2":{"wecken":false,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"6":{"Bew1":{"wecken":true,"nachricht":2,"dauer":90,"stunde":9,"minute":0},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}}}
in diesem Fall sind keine Wochentage worhanden sondern nur 0-6…
eventuell ist der ja leichter zu händeln...
-
Ich habe das Script jetzt mal getestet aber irgendwie wird die Bewässerungszeit nicht gesetzt. `
Dann füge mal Logs ein, um zu sehen, woran es hakt.const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan'; const idBew = 'javascript.0.Bewässerung.Ventil1.LaufzeitVentil1'; var debug = true; var sched1 = null; var sched2 = null; var json = getState(idJSON).val; function zeiten() { var arr = JSON.parse(json); // Array aus 7 Elementen (Wochentage) var now = new Date(); var wd = now.getDay() - 1; // Wochentag (0 = Montag) if(wd < 0) wd = 6; // Sonntag if(debug) log('Wochentag: ' + wd); var obj = arr[wd]; if(debug) log(JSON.stringify(obj)); if(sched1) clearSchedule(sched1); if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active); if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time); if(obj.Active == "true" && obj.Bew1_time) { // ist Active ein String ? var t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew1_time); if(debug) log('Bewässerung1 gestartet'); }); } if(sched2) clearSchedule(sched2); if(obj.Active == "true" && obj.Bew2_time) { t = obj.Bew2.split(':'); sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew1_time); }); } } zeiten(); // Skriptstart schedule('1 0 * * *', zeiten); // kurz nach Mitternacht // Änderung des JSON-Strings on(idJSON, function(dp) { json = dp.state.val; zeiten(); });
EDIT: Fehlendes + korrigiert
-
so funktioniert jetzt…
ein Fehler habe ich gefunden:
if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time);
vor 'Minuten' fehlt ein +
und das eigendiche Problem war hier
if(obj.Active == "true" && obj.Bew1_time) { // ist Active ein String ?
und wenn richtig gelesen hätte wäre es mir auch aufgefallen. Active ist ein String also…
if(obj.Active == "x" && obj.Bew1_time) { // ist Active ein String ?
und schon klappt es
-
if(obj.Active == "x" && obj.Bew1_time) { // ist Active ein String ? ```` `
Dann habe ich dies falsch interpretiert:
@sveni_lee:soll immer bewässert werden wenn, wenn Active=true ist und … `
Markiere bitte noch das Thema als gelöst (im Betreff des ersten Beitrags). -
Ich hätte jetzt doch noch zwei Fragen zu dem Skript:
Ich habe nun 2 Kreisläufe die ich nun gern steuern möchte.
Kann ich das script einfach um eine Funktion bspw. Funktion zeiten_Ventil2() erweitern? Im grunde ist es der selbe Aufbau nur das
sich die beiden Konstanten ändern "const idJSON" und "const idBew"…
und ich würde mir gern anzeigen lassen, wann die nächste Bewesserung gestartet werden soll und für wie lange...
ist das auch irgendwie realisierbar?
-
ich würde mir gern anzeigen lassen, wann die nächste Bewesserung gestartet werden soll und für wie lange… `
Dann ergänze das Skript um einen Datenpunkt (Typ Zeichenkette) für die Zeitanzeige.const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt';
setState(idZeit, obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten', true); var t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew1_time); if(debug) log('Bewässerung1 gestartet'); if(obj.Bew2_time) setState(idZeit, obj.Bew2 + ' für ' + obj.Bew2_time + ' Minuten', true); });
Ich habe nun 2 Kreisläufe die ich nun gern steuern möchte.
Kann ich das script einfach um eine Funktion bspw. Funktion zeiten_Ventil2() erweitern? `
Das Skript einfach in ein zweites Skript kopieren und die 3 ID-Konstanten am Anfang ändern. -
Danke, das klappt super…
ich hab jetzt noch Uhrzeit und dauer von einander getrennt...
setState(idZeit, obj.Bew1, true); setState(idDauer, obj.Bew1_time + ' Minuten', true);
Kann mann noch irgendwie den Wochentag dort mit reinbringen? Es kann ja vorkommen, das nicht jeden Tag bewässert wird.
-
Kann mann noch irgendwie den Wochentag dort mit reinbringen? Es kann ja vorkommen, das nicht jeden Tag bewässert wird. `
Der Wochtentag als Zahl 0…6 liegt in der Variablen wd bereits vor. Durch Verwendung der Zahl als Index in ein Array, kann ein Name zugeordnet werden.const days = ['Mo','Di','Mi','Do','Fr','Sa','So']; log('Wochentag: ' + days[wd]);
-
Jepp… auch das klappt wunderbar...!
So langsam bekomme ich Ahnung wie man was realisieren kann.
Das Skript überprüft ja kurz nach Mitternacht ob für den dann aktuellen Tag was ansteht, das hat zur Folge, dass bis zum nächsten Tag als nächste Bewässerung immer noch die Zeit von heute angezeigt wird...
Gesendet von iPhone mit Tapatalk Pro
-
Das Skript überprüft ja kurz nach Mitternacht ob für den dann aktuellen Tag was ansteht, das hat zur Folge, dass bis zum nächsten Tag als nächste Bewässerung immer noch die Zeit von heute angezeigt wird… `
Ja, oderif(obj.Bew2_time) setState(idZeit, obj.Bew2 + ' für ' + obj.Bew2_time + ' Minuten', true); else setState(idZeit, 'morgen oder später', true;
-
ich habe mich jetzt intensive damit auseinandergesetzt…
Mein Ziel ist/war es die Geplante nächste Bewässerung anzeigen zu lassen auch wenn sie erst in den nächsten Tagen geplant ist.
also habe ich das skript mit meinen bescheidenen Kenntnissen erweitert.
const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan'; const idBew = ''; const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt'; const idDauer = 'javascript.0.Bewässerung.Ventil1.Dauer_next'; const days = ['Mo','Di','Mi','Do','Fr','Sa','So']; var debug = true; var sched1 = null; var sched2 = null; var json = getState(idJSON).val; function zeiten() { setState(idZeit, '--:--', true); // default Anzeige falls keine Zeit gefunden wird setState(idDauer, ' nicht geplant', true); // default Anzeife falls keine Zeit gefunden wird var arr = JSON.parse(json); // Array aus 7 Elementen (Wochentage) var now = new Date(); var wd = now.getDay() - 1; // Wochentag (0 = Montag) if(wd < 0) wd = 6; // Sonntag if(debug) log('Wochentag: ' + wd); var obj = arr[wd]; if(debug) log(JSON.stringify(obj)); if(sched1) clearSchedule(sched1); if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active); if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time); var time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); log('Zeit jetzt: ' + time); //nur für Testzwecke log(time < obj.Bew1); // nur für Testzwecke if(obj.Active == "x" && obj.Bew1_time && time < obj.Bew1) { // ist Active ein String ? setState(idZeit, days[wd] + '. ' + obj.Bew1, true); setState(idDauer, obj.Bew1_time + ' Minuten', true); var t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew1_time); if(debug) log('Bewässerung1 gestartet'); }); } if(sched2) clearSchedule(sched2); if(obj.Active == "x" && obj.Bew2_time && time < obj.Bew2) { setState(idZeit, days[wd] + '. ' + obj.Bew2, true); setState(idDauer, obj.Bew2_time + ' Minuten', true); t = obj.Bew2.split(':'); sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew2_time); }); } else for (i=1; i<=7; i++) { wd = wd + 1 if(wd>6) wd = 0; //umschalten Sonntag auf Montag obj = arr[wd]; if(obj.Active == "x" && obj.Bew1_time) { setState(idZeit, days[wd] + '. ' + obj.Bew1, true); setState(idDauer, obj.Bew1_time + ' Minuten', true); break; } else if(obj.Active == "x" && obj.Bew2_time) { setState(idZeit, days[wd] + '. ' + obj.Bew2, true); setState(idDauer, obj.Bew2_time + ' Minuten', true); break; } } } zeiten(); // Skriptstart schedule('1 0 * * *', zeiten); // kurz nach Mitternacht // Änderung des JSON-Strings on(idJSON, function(dp) { json = dp.state.val; zeiten(); });
das klappt auch mit einer Ausnahme. Ich habe für heute eine Bew. für 19:25 eingetragen aber diese wird mir nicht angezeigt als nächste
Bewässerung. Ich habe sicher irgendwo einen Fehler aber ich finde ihn einfach nicht…
EDIT:
hab's gelöst.... klappt jetzt... musste noch ein wenig mit dem "if" und "else if" Konditionen spielen
const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan'; const idBew = ''; const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt'; const idDauer = 'javascript.0.Bewässerung.Ventil1.Dauer_next'; const days = ['Mo','Di','Mi','Do','Fr','Sa','So']; var debug = true; var sched1 = null; var sched2 = null; var json = getState(idJSON).val; function zeiten() { setState(idZeit, '--:--', true); // default Anzeige falls keine Zeit gefunden wird setState(idDauer, ' nicht geplant', true); // default Anzeife falls keine Zeit gefunden wird var t = 0; var arr = JSON.parse(json); // Array aus 7 Elementen (Wochentage) var now = new Date(); var wd = now.getDay() - 1; // Wochentag (0 = Montag) if(wd < 0) wd = 6; // Sonntag if(debug) log('Wochentag: ' + wd); var obj = arr[wd]; if(debug) log(JSON.stringify(obj)); if(sched1) clearSchedule(sched1); if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active); if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time); var time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2); log('Zeit jetzt: ' + time); //nur für Testzwecke log(time < obj.Bew1); // nur für Testzwecke if(obj.Active == "x" && obj.Bew1_time && time < obj.Bew1) { // ist Active ein String ? setState(idZeit, days[wd] + '. ' + obj.Bew1, true); setState(idDauer, obj.Bew1_time + ' Minuten', true); t = obj.Bew1.split(':'); sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew1_time); if(debug) log('Bewässerung1 gestartet'); }); } if(sched2) clearSchedule(sched2); if(obj.Active == "x" && obj.Bew2_time && time < obj.Bew2 && (obj.Bew1_time === 0 || time > obj.Bew1)) { setState(idZeit, days[wd] + '. ' + obj.Bew2, true); setState(idDauer, obj.Bew2_time + ' Minuten', true); t = obj.Bew2.split(':'); sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() { setState(idBew, obj.Bew2_time); }); } else if (t===0) for (i=1; i<=7; i++) { wd = wd + 1; if(wd>6) wd = 0; //umschalten Sonntag auf Montag obj = arr[wd]; if(obj.Active == "x" && obj.Bew1_time) { setState(idZeit, days[wd] + '. ' + obj.Bew1, true); setState(idDauer, obj.Bew1_time + ' Minuten', true); break; } else if(obj.Active == "x" && obj.Bew2_time) { setState(idZeit, days[wd] + '. ' + obj.Bew2, true); setState(idDauer, obj.Bew2_time + ' Minuten', true); break; } } } zeiten(); // Skriptstart schedule('1 0 * * *', zeiten); // kurz nach Mitternacht // Änderung des JSON-Strings on(idJSON, function(dp) { json = dp.state.val; zeiten(); });