NEWS
Skript nur einmal am Tag ausführen und dann sperren
-
@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.
-
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.
Das bezog sich darauf, dass hier die "vars" nicht bei on standen sowie @bahnuhr es erwähnte.
Das klang eben so, als würde ich nicht das machen was hier vorgeschlagen wird. Und das ist nun mal nicht so.
Ansonsten
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
das glaube ich Dir gerne, aber für Anfänger ist es ohnehin nicht einfach. Da darfst Du nicht damit kommen, dass dies identisch ist.
Das Skript habe ich jetzt getestet, soweit eben möglich.
! ````
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 === true && isTimeInRange('05:00:00', '08:00:00'))
{
setState(idFreigabe, false);
morgenwetter(); // Ansage
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=gong.mp3|tts=" + ansage;
request(Url);
log('Funktion morgenwetter ausgeführt');
}
! // DP Freigabe auf true zurücksetzen
schedule("59 4 * * *", function() {
setState(idFreigabe, true);
});Es scheint zu klappen, hundertprozentig weiß ich dass dann morgen. Mit
if ( freigabe && isTimeInRange('05:00:00', '08:00:00'))
hat es übrigens nicht ausgelöst. Weiß der Geier warum….. Nicht böse sein, aber Anfänger sehen eben oft den Wald vor lauter Bäumen nicht. Selbstverständlichkeiten für Fortgeschrittene finden da noch nicht den nötigen Platz. Danke für die Hilfe und ich werde morgen nochmals berichten ob es klappt. Thomas
-
das glaube ich Dir gerne, aber für Anfänger ist es ohnehin nicht einfach. Da darfst Du nicht damit kommen, dass dies identisch ist. `
Da ich annehme, dass Du nicht alle Skripte selbst entwickelst, sondern auch in vorhandene Skripte schaust und diese vermutlich verstehen möchtest, wird Dir die Kenntnis dieses Zusammenhanges helfen. Ich würde z.B. niemals schreibenif(x === true)
,es sei denn, ich möchte gleichzeitig den Typ (boolean) testen.
-
Übrigens kann die globale Funktion
isTimeInRange('05:00:00', '08:00:00')
ersetzt werden durch die vom JS-Adapter bereit gestellte Funktion
compareTime(getDateObject('05:00'), getDateObject('08:00'), 'between')
EDIT: Die Funktion compareTime() gibt es erst ab Version 3.0.10 des JS-Adapters.
-
Übrigens kann die globale Funktion
isTimeInRange('05:00:00', '08:00:00')
ersetzt werden durch die vom JS-Adapter bereit gestellte Funktion
compareTime(getDateObject('05:00'), getDateObject('08:00'), 'between') ```` `
Das ist es eben.
Es fehlt ein Handbuch, das speziell solche grundlegenden Dinge (auch mit Praxisbeispielen) aufzeigt.
ioBroker hat viele "Grundfunktionen" sag ich mal. Mag sein dass vieles hier im Forum steht, ist nur die Frage wo und wie man es suchen soll.
Das soll jetzt kein Vorwurf sein, nur eine Feststellung. Ich bin sicher sehr vielen Anfängern wäre damit geholfen.
-
Nun, gerade das oben beschriebene ist JavaScript. Und da gibt es Doku bis zum abwinken im Netz.
Bei anderen Adaptern sehe ich das ein. (auch wenn diese Lücke dankenswerterweise durch Rainer laufend geschlossen wird).
Aber gerade be JavaScript braucht man meines Erachtens nicht noch viel extra schreiben.
Lg
Günther
-
Nun, gerade das oben beschriebene ist JavaScript. Und da gibt es Doku bis zum abwinken im Netz.
Bei anderen Adaptern sehe ich das ein. (auch wenn diese Lücke dankenswerterweise durch Rainer laufend geschlossen wird).
Aber gerade be JavaScript braucht man meines Erachtens nicht noch viel extra schreiben.
Lg
Günther `
Es geht nicht um die Erklärung von Javascript.
Ich meinte damit eine Sammlung von Beispielen.
-Wenn ich "etwas nur einmal am Tag laufen lassen will"…. dann geht das so.
-Wenn ich eine Sprachausgabe haben möchte.... dann so
Den kompletten Funktionsumfang von Javascript braucht man nicht, wenn man nicht gerade das mega-Projekt vor hat.
ioBroker arbeitet mit Jacascript, richtig. Aber der spezielle Verwendungszweck, der müsste zusammengfasst sein.
Aber egal, ich will hier keinen Zoff produzieren, das ist ganz alleine meine Ansicht.
Gruß
Thomas
-
Das ist es eben.
Es fehlt ein Handbuch, das speziell solche grundlegenden Dinge (auch mit Praxisbeispielen) aufzeigt. `
Diesmal bin ich nicht dieser Meinung.Im Gegensatz zu grundlegenden Funktionen sehe ich eine Aufgabenstellung mit javascript um ein
> Skript nur einmal am Tag ausführen und dann sperren
nicht als Anfängerthema.GST888/Steinwedel hat eine schöne Einsteigerdoku mit Praxisbeispielen geschrieben.
http://www.iobroker.net/docu/?page_id=5385&lang=de
Und die ist auf der Website unter Scripte als erster Menüpunkt wirklich leicht zu finden.
Was den Umfang des javascript-Adapters angeht, hat Bluefox sich die Finger wund getippt und diese umfangreiche Doku auf Github angefertigt:
https://github.com/iobroker/ioBroker.ja … /README.md
Hier wird jeder einzelne Befehl, der im Adapter integriert ist mit Syntax erklärt.
Und auch diese Seite ist ganz einfach zu finden, indem man im Admin bei dem Adapter auf das Fragezeichen rechts außen klickt
Dies steht in der Doku zum Admin
Admin-Doku"](?) Wenn dieser Button aktiv ist, verlinkt er zu der Hilfeseite zu dem Adapter. Diese befindet sich üblicherweise auf GitHub, wo auch der Adapter gepflegt wird. `Gruß
Rainer
EDIT: zu langsam getippt und Links gesucht
-
so, nun wird dir geholfen.
! ````
// Idee von Nordlicht
// 27.01.2017 Script von bahnuhr
//
! function weiter() {// Varaiablen
var idzahl = 'javascript.0.Morgenwetter.zahl'; // diese Zahl wird automatisch angelegt.
var Zeit1 = isTimeInRange('05:00:00', '08:00:00');! // Variable in Objekten anlegen
createState(idzahl, {
type: 'number',
name: 'Anzahl der Ansagen',
min: 0,
def: 0,
role: 'value'
});
! // eigentliches Script - nix mehr ändern
// Datum und Uhrzeit ermitteln
var d = new Date ();
var weekday = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
var w = weekday[d.getDay()];
var vTag = new Date().getDate(),
vMonat = new Date().getMonth()+1,
vJahr = new Date().getFullYear();
var sDatum = w + "," + vTag + "." + vMonat + "." + vJahr; // String mit Wochentag + Tag + Monat + Jahr (Jahr mit 4 Stellen)
var vStunde = new Date().getHours(),
vMinute = new Date().getMinutes();
// Temperatur
var Temp = parseInt(getState("hm-rpc.0.MEQ1600895.1.TEMPERATURE").val);
var Temp_max = parseInt("yr.0.forecast.day0.temperature_max").val;
var witterung = getState("yr.0.forecast.day0.text").val ;
log('Wetter: ' + witterung);
! var vtext = "Einen schönen guten Morgen! Heute ist ";
vtext = vtext + w + " " + sDatum + ",";
vtext = vtext + "Es ist " + vStunde + " Uhr und " + vMinute;
vtext = vtext + "Minuten. " + " Die Temperatur beträgt " + Temp + " Grad.";
vtext = vtext + witterung + ". Maximal werden es heute. " + Temp_max + " Grad.";
! //Sound
var request = require ('request');
Url = "http://192.168.178.58:50000/track=gong.mp3|tts=" + vtext;
request(Url);
! setState('javascript.0.Morgenwetter.zahl', 1);
}
! // Auslöser und Schedule ---------------------------------------------------------------------------------------------------------
! on({id: "hm-rpc.0.MEQ1796971.1.MOTION"}, function() { // Bewegung Küche
getState('javascript.0.Morgenwetter.zahl').val;
if (zahl === 0) {
weiter();
log('Guten Morgen und Wetterbericht ausgegeben');
}
});
! // Zahl wieder auf 0 setzen
schedule("59 4 * * *", function() {
setState('javascript.0.Morgenwetter.zahl', 0);
});
! ````Habs mal umgeschrieben und verkürzt. so hätte ich es geschrieben.
Probier es aus.
mfg
Dieter
P.S.
getestet hab ichs nicht. Hab ja andere HMid.
Falls Fragen, melden.
-
so, nun wird dir geholfen. `
Danke für Deine Mühe, ich werde das so mal einbauen.Diesmal bin ich nicht dieser Meinung. `
Das musst Du ja auch nicht, jeder hat so seine Sicht auf die Dinge.Ich will hier auch gar nicht weiter eintauchen, dafür ist dieses Forum nicht geschaffen worden um Meinungsverschiedenheiten dieser Kategorie zu klären.
Und… ich will auch niemandem zu nahe treten mit der Arbeit die er hier einbringt. Ich würde es auch tun.... könnte ich es denn.
-
dafür ist dieses Forum nicht geschaffen worden um Meinungsverschiedenheiten dieser Kategorie zu klären. `
Doch!sollte sich bei so einer Diskussion zeigen, dass die große Mehrheit der Meinung ist, dass in der ioBroker Doku eine komplette Einführung in Javascript mit ausführlichen (anfängerbezogenen) Beispielen sämtlicher im Javascript-Adapter verankerten Befehle notwendig sei, so müssen wir uns überlegen, wie wir das anfängerfreundlich umsetzen könnten.
Gruß
Rainer, der das Ganze absichtlich überspitzt formuliert hat.
-
Doch!
Gruß
Rainer, der das Ganze absichtlich überspitzt formuliert hat. `
Na wenn Du meinst…..
Es ist natürlich die Frage, was man als Anfänger deklariert. Einer der Javascript im Traum beten kann und neu bei ioBroker einsteigt ist zwar auch ein Anfänger, nicht aber was das Javascript betrifft.
Ich bin was Hausautomation betrifft Anfänger, gut inzwischen schon etwas fortgeschrittener. In Sachen ioBroker (und auch Javascript) bin ich blutiger Anfänger. Ja, es gibt zu Javascript viel Dokumentation. In dieser habe ich auch geblättert.... und das nicht nur 15 Minuten lang! Trotzdem nützen einem blutigen Anfänger diese Dokus über Java recht wenig weil sie eben nicht "ioBroker-bezogen" sind.
Ich vergleiche es mal mit dem Schul-Englisch von früher (bin ja nun schon etwas älter). Du konntest zwar englisch sprechen, das reichte auch für eine Schulaufgabe aus. Doch bei so mancher Unterhaltung (z.B. in England) stand man damit auf dem Schlauch.... und auch der Gegenüber wusste nicht immer was Du meintest.....!
Ich hoffe dieser Vergleich bringt Dir näher was ich zum Ausdruck bringen will. Eine Java-Doku erklärt viel, aber nicht was ioBroker braucht wenn man etwas bestimmtes tun möchte.
Für umfangreiche Konstellationen innerhalb von ioBroker muss man meines Erachtens sowieso ein kleiner Java-Experte sein. Es sind aber so Kleinigkeiten, so Banalitäten die ein Einsteiger umzusetzen versucht und den Ansatz dazu nicht findet. Wie eben solche Sachen mit "nur einmal am Tag ausführen und dann erst morgen wieder". Hier ist auch ein weiteres Problem, dass es oftmals verschiedene Wege gibt etwas umzusetzen. Grundsätzlich ja in Ordnung. Für den Anfänger wird es aber noch schwieriger, wenn im bspw. 3 Leute helfen und dabei 3 verschiedene - für sich jeweils praktikable Wege - aufzeigen, die wiederum untereinander nicht vermischt werden dürfen/können. Am Ende blickst Du es dann gar nicht mehr.
Deswegen meine ich eben:
Für so Alltagsfunktionen eine klare Übersicht wie das ja auch schon hier ansatzweise der Fall ist http://www.iobroker.net/?page_id=2786&lang=de.
Ich hoffe mich jetzt nicht mehr missverständlich ausgedrückt zu haben und Du kannst mich etwas besser verstehen.
Gruß
Thomas
-
Hallo Thomas,
@Nordlicht:Ich hoffe mich jetzt nicht mehr missverständlich ausgedrückt zu haben `
das hattest du auch bisher nicht.wie das ja auch schon hier ansatzweise der Fall ist `
damit kommst du mir ja auch schon zuvorAber Code (-Schnipsel) sind für mich keine Doku
und dein England-Vergleich trifft auch genau das auf den Kopf, was ich meine:
Das ist kein Anfänger mehr.
Watt nu?
Wenn ich das versuche zusammenzutragen, fällt mir als js-Legatheniker, natürlich nicht der passende Vergleich ein. Ich versuche es trotzdem mal, um das Dilemma darzustellen (wieder etwas überspitzt).
-
wir benötigen eine ioBroker-spezifische js-Erklärung der im js-Adapter vorliegenden Funtionen.
-
einzelne Beispiele reichen da nicht, es müssten ALLE Aspekte zumindest als Codeschnipsel vorliegen, sonst fehlt ggf. genau das, wo der User xy gerade nicht weiterkommt.
-
das Ganze muss klar und deutlich EINE Linie haben (auch wenn viele Wege nach Rom führen)
Ganz abgesehen davon, dass das ein Riesenprojekt würde, das IMHO wirklich den Rahmen der Doku sprengt, würde ein solcher Block in der Demo Einsteiger erst recht verschrecken, da das den Eindruck erheblich verstärkt, dass ioBroker nur mit Programmierkenntnissen zu bedienen sei.
Je mehr ich darüber nachdenke, stellt sich mir die Frage ob es hier (dir) weniger um js-Handwerkszeug sondern eher um das Verständnis der dahintersteckenden (ioBroker-)Logik geht. Schließlich ist dies IMHO der Grund warum es verschiedene Ansätze für eine Aufgabe gibt.
Ich denke, dass die hervorragende individuelle Betreuung einiger js-Cracks im Forum da wesentlich hilfreicher ist.
Gruß
Rainer, der da mal drüber schlafen muss.
-
-
Hallo Rainer,
ich verstehe Nordlicht sehr gut und finde es super, dass du dir darüber Gedanken machst.
ioBroker entwickelt sich seit Beginn mit großen Schritten weiter und auch die Doku hat sich durch eure ständige Arbeit wesentlich verbessert.
Was ihr da leistet, ist bemerkenswert.
Ein Anfänger kann mit Tutorials im Internet oder mit Literatur JS erlernen, doch bezieht sich das Meiste davon auf Webseiten-Programmierung mit HTML und CSS.
All das wird in ioBroker auch eingesetzt, aber nur selten auf die gleiche Art und Weise, wie es die Literatur erklärt. Jedenfalls fehlt dem Anfänger hier noch das Transfervermögen. Ich selbst stehe da irgendwo in der Mitte dieser Phase
Speziell beim JavaScript-Adapter würde ich mir zu den Funktionen noch mehr Details mit Erklärungen wünschen.
Trotz des gesamten Umfanges sind die einzelnen Beschreibungen extrem kompakt gehalten.
Es ist vielmehr ein Nachschlagewerk für erfahrene Anwender, als eine Beschreibung für Einsteiger.
Als Beispiel und zur Erklärung möchte ich die "on"-Funktion nennen, mit deren Parametern ich mich zur Zeit intensiver auseinandersetze.
Nehmen wir davon mal den ersten Parameter:
` > You can use following parameters to specify the trigger:parameter______type/value _____description
–---------------------------------------------------------------------------
logic___________string__________"and" or "or" logic to combine the conditions (default: "and") `
Hierzu ergaben sich folgende Fragen:1. Lassen sich beliebig viele Parameter verunden bzw. verodern?
2. Kann "and" mit "or" kombiniert werden? z.B. (Licht1 and Licht2) or (Licht3 and Licht4)
3. Wenn ja, wie sieht die Syntax dazu aus?
Wer genug Erfahrung hat, würde die Fragen so beantworten
1. Es wurden keine Grenzen angegeben, deshalb können beliebig viele Parameter verwendet werden.
2. Da steht "and" or "or", also geht nur eines von beiden.
3. Geht nicht, wegen Antwort von Frage 2.
Als weiteres Beispiel nehme ich einen Ausschnitt aus dem diskutierten Skript von Nordlicht:
> on({id: bwm, val: true}, function (obj) { // Trigger auslösen
Bei val steht In der Beschreibung: New value must be equal to given one.Als Anfänger bin ich davon ausgegangen, dass sich ein neuer Wert von einem alten Wert im Wert unterscheiden muss, sonst ist es kein neuer Wert.
Daher hätte ich erwartet, dass der Trigger nur auslöst, wenn der Wert des bwm von "false" auf "true" wechselt.
Das tut er sogar, aber er löst auch aus, wenn der "Zeitstempel" des Wertes aktualisiert wird, weil dann der Wert "true" durch ein neues "true" ersetzt wurde.
Im Skript von Nordlicht hat das keine Auswirkungen, da er noch eine Sperrvariabale verwendet, aber in einem anderen Skript sorgt es erstmal für Verwirrung.
Zumindest zu dem zweiten Beispiel gab es schon einige Diskussionen, die mit einer etwas umfangreicheren Doku wahrscheinlich nicht entstanden wären.
Die Doku ist das wichtigste Instrument, um neue User bei den ersten Schritten mit ioBroker zu begleiten und um den Spaß an der Sache aufrechtzuerhalten.
Ich möchte in Bezug auf den JS-Adapter vorschlagen, die Funktionen in der bestehenden GitHubDoku mit weiterführenden Links zu Detailbeschreibungen zu versehen.
Die verlinkten Seiten beschreiben dann die gewählte Funktion noch mal genauer (evtl. in Denglisch) und zeigen weitere Beispiele (Codeschnipsel) mit Kommentierung auf.
Man könnte das mit den Linux Man-Pages vergleichen, die man dann aufruft, wenn die Kurz-Referenz des –help-Parameters nicht ausreicht.
Grüße