NEWS
Skript nur einmal am Tag ausführen und dann sperren
-
Die Bezeichnung 'sperre' ist verwirrend, da genau das Gegenteil bewirkt wird (Freigabe). `
Hab das mit der "Sperre" jetzt in Freigabe umbenannt. Das Skript sieht nun wie folgt aus:
! ````
var request = require ('request');
var Url = "http://192.168.178.58:50000/track=gong.mp3";
var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
! var freigabe = true;
! on({id: bwm, val: true}, function (obj) {
if ( isTimeInRange('12:12:00', '12:20:00') && (freigabe === true) ); // Trigger auslösen
{
morgenwetter(); // Ansage
freigabe = false;
log('Guten Morgen und Wetterbericht ausgegeben');
}
});function morgenwetter() {
//Wochentag ermitteln
var d = new Date ();
var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
var w = weekday[d.getDay()];! //Tagesdatum ermitteln
var t = d.getDate();
! //Monat ermitteln
var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var m = month[d.getMonth()];
! //Jahr ermitteln
var j = d.getFullYear()
! //Stunde ermitteln
h = d.getHours()
! //Minute ermitteln
mi = d.getMinutes()
! // Die Außentemperatur ist xx. Das Wetter heute ist xx
// Einfache Temperaturansage mit SayIt.
// Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
// "Es sind 18 Punkt 2 Grad " sagt.
! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
var temperatur = Temperatursensor.val.toString();
var temp_array = [];
! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
var maxtemp = MaxTemperatur.val.toString();
var maxtemp_array = [];
! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
log('Wetter: ' + witterung);
! temp_array = temperatur.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!temp_array[1]) {
temp_array[1] = "0";
log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
! maxtemp_array = maxtemp.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!maxtemp_array[1]) {
maxtemp_array[1] = "0";
log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
var ansage = "Einen schönen guten Morgen! Heute ist "
+ w + " der " + t + "te" + m + j
+ ", Es ist " + h + " Uhr und " + mi
+ " Minuten." + " Temperatur "
+ temp_array[0] + "," + temp_array[1]
+ " Grad. " + witterung + ". Maximal werden es heute. "
+ maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
! Url = "http://192.168.178.58:50000/track=4fachgong.mp3|tts=" + ansage;
request(Url);
}
! // Flag für Sperre auf true zurücksetzen
schedule("58 4 * * *", function() {
freigabe = true;
});Allerdings löst er wieder außerhalb des Zeitfensters aus…. Wie bereits erwähnt, die TimeInRange Funktion ist als Skript im Ordner "global". >! ```` function currentDate() { var d = new Date(); return new Date(d.getFullYear(), d.getMonth(), d.getDate()); } function addTime(strTime) { var time = strTime.split(':'); var d = currentDate(); d.setHours(time[0]); d.setMinutes(time[1]); d.setSeconds(time[2]); return d; } function isTimeInRange(strLower, strUpper) { var now = new Date(); var lower = addTime(strLower); var upper = addTime(strUpper); var inRange = false; if (upper > lower) { // opens and closes in same day inRange = (now >= lower && now <= upper) ? true : false; } else { // closes in the following day inRange = (now >= upper && now <= lower) ? false : true; } return inRange; }
Das mit der "Sperre" klappte beim eben durchgeführten Test leider auch noch nicht. Bei einer weiteren Bewegung wurde die Ansage wieder erneut ausgelöst.
-
Hast du dir den if Befehl angeschaut.
Nicht verstanden?
-
Und das mit der Variablen
Anzahl
-
Hast du dir den if Befehl angeschaut. `
Das Semikolon löschen hinter der if-Klammer !if ( isTimeInRange('12:12:00', '12:20:00') && (freigabe === true) ); // Trigger auslösen
-
Hast du dir den if Befehl angeschaut. `
Das Semikolon löschen hinter der if-Klammer !if ( isTimeInRange('12:12:00', '12:20:00') && (freigabe === true) ); // Trigger auslösen ```` `
@Bahnuhr: Du bist mit Deinem Post dazwischengerutscht, den hatte ich übersehen, sorry.
Hab das Semikolon jetzt entfernt und den Vorschlag mit dem Datenpunkt eingebaut.
Sieht jetzt so aus:
! ````
var request = require ('request');
var Url = "http://192.168.178.58:50000/track=gong.mp3";
var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
! var freigabe = "javascript.0.Freigabe_Morgenwetter";
! on({id: bwm, val: true}, function (obj) {
if ( isTimeInRange('12:25:00', '12:30:00') && (freigabe === true) ) // Trigger auslösen
{
morgenwetter(); // Ansage
setState (freigabe, false);
log('Guten Morgen und Wetterbericht ausgegeben');
}
});function morgenwetter() {
//Wochentag ermitteln
var d = new Date ();
var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
var w = weekday[d.getDay()];! //Tagesdatum ermitteln
var t = d.getDate();
! //Monat ermitteln
var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var m = month[d.getMonth()];
! //Jahr ermitteln
var j = d.getFullYear()
! //Stunde ermitteln
h = d.getHours()
! //Minute ermitteln
mi = d.getMinutes()
! // Die Außentemperatur ist xx. Das Wetter heute ist xx
// Einfache Temperaturansage mit SayIt.
// Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
// "Es sind 18 Punkt 2 Grad " sagt.
! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
var temperatur = Temperatursensor.val.toString();
var temp_array = [];
! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
var maxtemp = MaxTemperatur.val.toString();
var maxtemp_array = [];
! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
log('Wetter: ' + witterung);
! temp_array = temperatur.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!temp_array[1]) {
temp_array[1] = "0";
log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
! maxtemp_array = maxtemp.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!maxtemp_array[1]) {
maxtemp_array[1] = "0";
log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
var ansage = "Test";
! Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + ansage;
request(Url);
}
! // Flag für Sperre auf true zurücksetzen
schedule("30 12 * * *", function() {
freigabe = true;
});Klappt noch nicht, vermutlich stimmt das mit dem setState für die Freigabe nicht??!!??
-
So, Versuch es so:
! ````
var Anzahl = getState('Java.....anzahl').val;
var Zeit1 = isTimeInRange('12:12:00', '12:20:00');
! Function weiter() {
Sprache ausgeben ......
SetState('Java....anzahl', 1);
! }
! on({id: '......motion'}, function (obj) {
if ( Anzahl === 0 && Zeit1 === true ) {
Weiter();
}
});Kann sein dass noch ein Semikolon fehlt oder groß- Kleinschreibung. Ging auf dem iPad eben nicht so gut. Anzahl musst du vorher natürlich anlegen. Und noch Schedule nachts Anzahl auf 0 Probierst aus. Mit freundlichen Grüßen Dieter
-
Klappt noch nicht, vermutlich stimmt das mit dem setState für die Freigabe nicht??!!?? `
Richtig. Du hattest 2 Fehler in dem Ursprungsskript: Das Semikolon hinter der if-Klammer und setState(). -
Erneuter Test:
! ````
var request = require ('request');
var Url = "http://192.168.178.58:50000/track=gong.mp3";
var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
var Zeit1 = isTimeInRange('13:12:00', '13:20:00');
! var freigabe = getState("javascript.0.Freigabe_Morgenwetter").val/Freigabe_Morgenwetter/;
! on({id: bwm, val: true}, function (obj) {
if ( freigabe === 1 && Zeit1 === true ) // Trigger auslösen
{
morgenwetter(); // Ansage
setState(freigabe, 0);
log('Guten Morgen und Wetterbericht ausgegeben');
}
});function morgenwetter() {
//Wochentag ermitteln
var d = new Date ();
var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
var w = weekday[d.getDay()];! //Tagesdatum ermitteln
var t = d.getDate();
! //Monat ermitteln
var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var m = month[d.getMonth()];
! //Jahr ermitteln
var j = d.getFullYear()
! //Stunde ermitteln
h = d.getHours()
! //Minute ermitteln
mi = d.getMinutes()
! // Die Außentemperatur ist xx. Das Wetter heute ist xx
// Einfache Temperaturansage mit SayIt.
// Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
// "Es sind 18 Punkt 2 Grad " sagt.
! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
var temperatur = Temperatursensor.val.toString();
var temp_array = [];
! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
var maxtemp = MaxTemperatur.val.toString();
var maxtemp_array = [];
! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
log('Wetter: ' + witterung);
! temp_array = temperatur.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!temp_array[1]) {
temp_array[1] = "0";
log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
! maxtemp_array = maxtemp.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!maxtemp_array[1]) {
maxtemp_array[1] = "0";
log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
var ansage = "Test";
! Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + ansage;
request(Url);
}
! // Flag für Sperre auf true zurücksetzen
schedule("23 13 * * *", function() {
setState(freigabe, 1);
});Ansage wird ausgelöst. Wenn Zeitfenster geschlossen, wird die Ansage trotzdem gesprochen Der Wert 1 auf die 0 wird nicht gesetzt. ` > Das Semikolon hinter der if-Klammer und setState() ` Das Semikolon ist weg, den Fehler bei setState sehe ich leider nicht .
-
Wie schon in meinem ersten Post:
setState(freigabe, 0);
ersetzen durch
freigabe = false;
-
Inzwischen hast Du noch weitere Fehler eingebaut. Hier mal das erste Skript von Dir mit Korrekturen:
! ````
var request = require ('request');
var Url = "http://192.168.178.58:50000/track=gong.mp3";
var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
! var freigabe = true;
! on({id: bwm, val: true}, function (obj) {
if ( isTimeInRange('10:00:00', '10:45:00') && freigabe) // Trigger auslösen
{
morgenwetter(); // Ansage
freigabe = false;
log('Guten Morgen und Wetterbericht ausgegeben');
}
});function morgenwetter() { //Wochentag ermitteln var d = new Date (); var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); var w = weekday[d.getDay()];
! //Tagesdatum ermitteln
var t = d.getDate();
! //Monat ermitteln
var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var m = month[d.getMonth()];
! //Jahr ermitteln
var j = d.getFullYear()
! //Stunde ermitteln
h = d.getHours()
! //Minute ermitteln
mi = d.getMinutes()
! // Die Außentemperatur ist xx. Das Wetter heute ist xx
// Einfache Temperaturansage mit SayIt.
// Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
// "Es sind 18 Punkt 2 Grad " sagt.
! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
var temperatur = Temperatursensor.val.toString();
var temp_array = [];
! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
var maxtemp = MaxTemperatur.val.toString();
var maxtemp_array = [];
! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
log('Wetter: ' + witterung);
! temp_array = temperatur.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!temp_array[1]) {
temp_array[1] = "0";
log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
! maxtemp_array = maxtemp.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!maxtemp_array[1]) {
maxtemp_array[1] = "0";
log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
var ansage = "Einen schönen guten Morgen! Heute ist "
+ w + " der " + t + "te" + m + j
+ ", Es ist " + h + " Uhr und " + mi
+ " Minuten." + " Temperatur "
+ temp_array[0] + "," + temp_array[1]
+ " Grad. " + witterung + ". Maximal werden es heute. "
+ maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
! Url = "http://192.168.178.58:50000/track=4fachgong.mp3|tts=" + ansage;
request(Url);
}
! // Flag für Freigabe auf true zurücksetzen
schedule("59 4 * * *", function() {
freigabe = true;
}); -
... var Zeit1 = isTimeInRange('13:12:00', '13:20:00'); var freigabe = getState("javascript.0.Freigabe_Morgenwetter").val/*Freigabe_Morgenwetter*/; on({id: bwm, val: true}, function (obj) { if ( freigabe === 1 && Zeit1 === true ) // Trigger auslösen ...
funktioniert so nicht, da so die Funktion isTimeInRange('13:12:00', '13:20:00') nur bei Skriptstart ausgeführt wird, also die aktuelle Zeit bei Bewegung nicht erfasst.
Weshalb plötzlich die Verwendung eines Datenpunktes für die Freigabe ??
Außerdem ist setState("javascript.0.Freigabe_Morgenwetter", true) falsch angewendet.
EDIT: Falls Du für Freigabe deshalb einen Datenpunkt verwenden willst, damit die Freigabe einen (Skript-)Neustart übersteht, dann muss es so erfolgen:
var request = require ('request'); var Url = "http://192.168.178.58:50000/track=gong.mp3"; var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche var idFreigabe = "javascript.0.Freigabe_Morgenwetter"; //Freigabe_Morgenwetter on({id: bwm, val: true}, function (obj) { // Trigger auslösen var freigabe = getState(idFreigabe).val; if ( freigabe && isTimeInRange('13:12:00', '13:20:00')) { morgenwetter(); // Ansage setState(idFreigabe, false); log('Guten Morgen und Wetterbericht ausgegeben'); } }); ... // DP Freigabe auf true zurücksetzen schedule("23 13 * * *", function() { setState(idFreigabe, true); });
-
Hallo Nordlicht,
wenn du isTimeInRange sparen willst oder tatsächlich ein Sperre haben möchtest (die du evtl sogar mit VIS zusätzlich ein/ausschalten kannst), geht auch die Nutzung der neuen Funktion startScript() und stopScript(). Die hat Bluefox neuerdings eingebaut.
Dann zwei Skripte
Skript 1, Name "Bewegungsmelder_freigeben"
schedule("20 12 * * *", startScript("Bewegung_erkennen", true)); // "freigeben", also Skript starten schedule("30 12 * * *", startScript("Bewegung_erkennen", false)); // "sperren", Skript stoppen
Skript 2, Name "Bewegung_erkennen" (wie im Skript 1 verwendet)
function morgenwetter() { // ... } var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche on({id: bwm, val: true}, function(obj) { morgenwetter(); setTimeout(function() { stopScript(); }, 10 * 1000); // Stoppt sich selbst nach 10s });
Skript 1 läuft immer und schaltet täglich um 12:20 Skript 2 auf aktiv und um 12:30 auf inaktiv (wie grün und rot im Skriptreiter)
Skript 2 prüft (nur wenn aktiv) auf Bewegungen. Wenn ja, wird morgenwetter() aufgerufen und dann um 10s verzögert das Skript wieder gestoppt.
Per VIS kannst du nun die Sperre ausschalten/das Skript einschalten, durch Nutzung eines ToggleWidgets oder SetValue-Widgets mit dem Datenpunkt "javascript.0.scriptEnabled.common.Bewegung_erkennen" (Pfad und Instanz natürlich anpassen)
Gruß
Pix
-
Inzwischen hast Du noch weitere Fehler eingebaut. Hier mal das erste Skript von Dir mit Korrekturen:
! ````
var request = require ('request');
var Url = "http://192.168.178.58:50000/track=gong.mp3";
var bwm = "hm-rpc.0.MEQ1796971.1.MOTION"; // Bewegungsmelder Küche
! var freigabe = true;
! on({id: bwm, val: true}, function (obj) {
if ( isTimeInRange('10:00:00', '10:45:00') && freigabe) // Trigger auslösen
{
morgenwetter(); // Ansage
freigabe = false;
log('Guten Morgen und Wetterbericht ausgegeben');
}
});function morgenwetter() { //Wochentag ermitteln var d = new Date (); var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); var w = weekday[d.getDay()];
! //Tagesdatum ermitteln
var t = d.getDate();
! //Monat ermitteln
var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
var m = month[d.getMonth()];
! //Jahr ermitteln
var j = d.getFullYear()
! //Stunde ermitteln
h = d.getHours()
! //Minute ermitteln
mi = d.getMinutes()
! // Die Außentemperatur ist xx. Das Wetter heute ist xx
// Einfache Temperaturansage mit SayIt.
// Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
// "Es sind 18 Punkt 2 Grad " sagt.
! var Temperatursensor = getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE"); /Temperatursensor Balkon/
var temperatur = Temperatursensor.val.toString();
var temp_array = [];
! var MaxTemperatur = getState("yr.0.forecast.day0.temperature_max"); /Forecast of temperature for today/
var maxtemp = MaxTemperatur.val.toString();
var maxtemp_array = [];
! var witterung = getState("yr.0.forecast.day0.text").val ; /Actual text/
log('Wetter: ' + witterung);
! temp_array = temperatur.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!temp_array[1]) {
temp_array[1] = "0";
log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
! maxtemp_array = maxtemp.split(".");
! // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
// Es wird dann nur "18" gelesen.
if (!maxtemp_array[1]) {
maxtemp_array[1] = "0";
log("Die Nach-Kommastelle in maxtemp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
}
var ansage = "Einen schönen guten Morgen! Heute ist "
+ w + " der " + t + "te" + m + j
+ ", Es ist " + h + " Uhr und " + mi
+ " Minuten." + " Temperatur "
+ temp_array[0] + "," + temp_array[1]
+ " Grad. " + witterung + ". Maximal werden es heute. "
+ maxtemp_array[0] + "," + maxtemp_array[1] + " Grad. ";
! Url = "http://192.168.178.58:50000/track=4fachgong.mp3|tts=" + ansage;
request(Url);
}
! // Flag für Freigabe auf true zurücksetzen
schedule("59 4 * * *", function() {
freigabe = true;
});
```` `Das liegt vielleicht auch daran, dass - so wie ich als Anfänger es sehe - zwei verschiedene Wege gehen. Der von Dir und jener von @bahnuhr unterscheiden sich was das setzen von "freigabe" angeht. Welcher Weg nun der bessere ist vermag ich nicht zu beurteilen.
Mit
freigabe = false;
funktioniert es hier nicht, wieso und weshalb auch immer. Verwende ich stattdessen
setState("javascript.0.Freigabe_Morgenwetter", 1) bzw. setState("javascript.0.Freigabe_Morgenwetter", 0)
wird zumindest der Status richtig gesetzt bzw. gelöscht.
Vorteil dieser Variante meines Erachtens, ich kann den aktuellen Status in den Objekten einsehen und ggf. manuell verändern.
Bei "freigabe=false" bzw. "freigabe=true" ist das nicht der Fall.
Nichts desto trotz passiert folgendes:
Ungeachtet der Freigabe und des Zeitfensters wird die Ansage bei jeder festgestellten Bewegung ausgelöst.
Ich glaube es ja schon langsam nicht mehr….. :shock:
Verwende ich den von Dir zuletzt korrigierten Skript verhält es sich übrigens ganz genauso.
-
@pix:Hallo Nordlicht,
wenn du isTimeInRange sparen willst oder tatsächlich ein Sperre haben möchtest (die du evtl sogar mit VIS zusätzlich ein/ausschalten kannst), geht auch die Nutzung der neuen Funktion startScript() und stopScript(). Die hat Bluefox neuerdings eingebaut.
Gruß
Pix `
Hi Pix,
diese Funktion ist in jedem Fall interessant. Die merke ich mir für andere Projekte.
Hier ist sie nicht einsetzbar, der BWM muss immer aktiv bleiben, da er auch noch das Licht steuert.
Irgendwie wird man das hier schon noch gelöst bekommen.
Aber vielen Dank trotzdem!
Gruß
Thomas
-
Es ist nicht der Bewegunsmelder, der gesperrt wird, sondern nur dieses eine Skript.
Pix
-
@pix:Es ist nicht der Bewegunsmelder, der gesperrt wird, sondern nur dieses eine Skript.
Pix `
Ok, dann war das ein Missverständnis.
Habe es mal so eingebaut.
Aber es wirft folgenden Fehler aus, egal wie das programm genannt wird:
15:32:50.584 [info] javascript.1 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:32:50.587 [info] javascript.0 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:32:50.609 [info] javascript.0 Start javascript script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:32:50.610 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.javascript.0.scriptEnabled.TTS_Mediaplayer.Bewegung_erkennen", because not found 15:32:50.610 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing 15:32:50.610 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.javascript.0.scriptEnabled.TTS_Mediaplayer.Bewegung_erkennen", because not found 15:32:50.610 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing 15:32:50.610 [info] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: registered 0 subscriptions and 0 schedules
15:42:37.160 [info] javascript.1 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:42:37.159 [info] javascript.0 Stop script script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:42:37.173 [info] javascript.0 Start javascript script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben 15:42:37.174 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.Bewegung_erkennen", because not found 15:42:37.174 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing 15:42:37.174 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: Cannot start "script.js.Bewegung_erkennen", because not found 15:42:37.174 [error] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: schedule callback missing 15:42:37.174 [info] javascript.0 script.js.TTS_Mediaplayer.Bewegungsmelder_freigeben: registered 0 subscriptions and 0 schedules
-
Ungeachtet der Freigabe und des Zeitfensters wird die Ansage bei jeder festgestellten Bewegung ausgelöst.
Ich glaube es ja schon langsam nicht mehr….. :shock:
Verwende ich den von Dir zuletzt korrigierten Skript verhält es sich übrigens ganz genauso. `
Habe das folgende Skript bei mir getestet und es funktioniert wie es soll:var request = require ('request'); var Url = "http://192.168.178.58:50000/track=gong.mp3"; var bwm = "javascript.1.MOTION"; // Bewegungsmelder Küche var idFreigabe = "javascript.1.Freigabe_Morgenwetter"; //Freigabe_Morgenwetter on({id: bwm, val: true}, function (obj) { // Trigger auslösen var freigabe = getState(idFreigabe).val; if ( freigabe && isTimeInRange('15:48:00', '16:00:00')) { setState(idFreigabe, false); morgenwetter(); // Ansage log('Guten Morgen und Wetterbericht ausgegeben'); } }); function morgenwetter() { log('Funktion morgenwetter ausgeführt'); } // DP Freigabe auf true zurücksetzen schedule("23 13 * * *", function() { setState(idFreigabe, true); });
Bei Wechsel von false auf true des DP "javascript.1.MOTION" erfolgen die beiden Logs und der DP "javascript.1.Freigabe_Morgenwetter" wird von true auf false gesetzt. Eine nochmalige Ausgabe der Logs bei erneutem Wechsel von false auf true (MOTION) erfolgt nicht.
-
Nochmal
! ````
! function weiter() {
Sprache ausgeben ......
SetState('Java....anzahl', 1);
}
! on({id: '......motion'}, function (obj) {
! var Anzahl = getState('Java.....anzahl').val;
var Zeit1 = isTimeInRange('12:12:00', '12:20:00');
! if ( Anzahl === 0 && Zeit1 === true ) {
Weiter();
}
});Paul hat recht. Die vars müssen zu on. Nordlicht, warum probierst du dies nicht einmal aus????? Deinen Sprachteile musst du doch nur oben bei weiter() einfügen. Mit freundlichen Grüßen Dieter
-
Nochmal `
Ich probiere ja ständig aus was hier alles so beigetragen wird.
> Paul hat recht. Die vars müssen zu on.
Hier http://forum.iobroker.net/viewtopic.php?p=49661#p49661 war es halt anders dargestellt.Es ging mehrfach hin und her was die "Freigabe" betrifft. Als Neuling kann man hier schon schwer ins Schleudern kommen…. das ist keine böse Absicht.
Ich gehe aber davon aus, dass es so richtig ist (freigabe
if ( freigabe === true && isTimeInRange('16:26:00', '17:00:00'))
und nicht so
> if ( freigabe && isTimeInRange('16:26:00', '17:00:00'))
Oder?Hab es eben so wie genannt am laufen…. ich werde sehen ob das funzt.
-
Hier http://forum.iobroker.net/viewtopic.php?p=49661#p49661 war es halt anders dargestellt. `
Nein, ist es nicht. Die Funktion isTimeInRange('16:26:00', '17:00:00') wird innerhalb der if-Abfrage aufgerufen und nicht bei Skriptstart.
@Nordlicht:Ich gehe aber davon aus, dass es so richtig ist
if ( freigabe === true && isTimeInRange('16:26:00', '17:00:00'))
und nicht so
if ( freigabe && isTimeInRange('16:26:00', '17:00:00'))
Oder? `
Das ist beides im Ergebnis identisch.if(x) // prüft auf x === true bzw. x !== 0 bzw. x !== null if(!x) // prüft auf x === false bzw. x === 0 bzw. x === null
Bei boolschen Werten wird ohnehin schon true oder false geliefert, bei Zahlen oder Objekten erfolgt eine implizite Typwandlung wie angegeben.