Mitarbeiterantwort
Mrz 06, 2017 - 06:57
Ein spezielles Objektmodell gibt es nicht. Um einen Status abzufragen oder eine Aktion auszulösen gibt es die Funktionen getDeviceStatus und executeDeviceCommand. Ein fertiges Code-Snippet für das gewünschte Gerät kann man sich selbst über die Benutzeroberfläche zurechtklicken. Ein kleiner Abschnitt dazu wurde auch kürzlich in der Anleitung (Seite 16) ergänzt. Ein Beispiel:
getDeviceStatus(
"Büro",
"HM-CC-RT-DN",
{"value":"currentTempState","extMeta":"-30-30","scale":"0.1"},
function(err, status) {
if(!err) {
executeDeviceCommand(
"_progs&sysvars",
"gw10_float variable",
{"value":"rawFloatValue","ext":status,"scale":"0.1"},
function(err) {
err && console.error(err);
}
);
}
}
);
Zuerst wird die Temperatur eines Thermostats abgefragt und anschließend dieser Wert in einer CCU-Systemvariable gespeichert. Wichtig ist: Mit den abgefragten Werten kann erst in der Callback-Funktion gearbeitet werden, da die Aufrufe asynchron erfolgen.
Von
Wie kann man denn eine IF-Abfrage gestalten die nach einem getDeviceStatus den Inhalt von "status" auf "on" oder "off" prüft um dann eine Variable mit "0" oder "1" zu füllen?
Von
Wenn man vom Code-Beispiel oben ausgeht, dann könnte man bevor executeDeviceCommand aufgerufen wird folgendes hinzufügen:
if(!err) {
if(status == "on") { status = "1"; }
else { status = "0"; }
executeDeviceCommand(
Von
Danke für das Snippet. So geht es.
Von
Gibt es eine Beschreibung zu den Möglichkeiten im Script (Java) ?. Ich möchte nicht immer die Community nerven oder auf den Support warten bis eine Antwort kommt die mir dann sagt das die Syntax so nicht geht oder man eine Funktion XY benutzen soll. Ich würde gerne selbst nachlesen mit welchen Funktionen und Möglichkeiten ich arbeiten kann. Das wäre auch sicherlich im Interesse vom Mediola-Support. Dann würden nämlich weniger Supportanfragen kommen.
Liebes Mediola Team: Lasst uns Anwender doch nicht so im Dunkeln stehen.
Von
Im Skripteditor kann JavaScript geschrieben werden, wie es von Node.js v4 (gilt für V5+) bzw. Node.js v5 (gilt für alleinstehenden NEO SERVER) unterstützt wird.
Dies wird jeweils um eine Funktion zum Abfragen von Status (getDeviceStatus) und Ausführen einer Aktion (executeDeviceCommand) ergänzt, welche sich über das Seitenleistenmenü zusammenklicken lassen.
Von
Kann man in einem "getDeviceStatus" oder "executeDeviceCommand" den Raum bzw. den Variablennamen durch eine Variable ersetzen ?
Beispiel:
executeDeviceCommand(
"MyHome",
"RainMo",
{"value":"setValue","ext":"0","extMeta":"-21474836.48-21474836.47","scale":"0.01"},
function(err) {
err && console.error(err);
}
);
RainMo steht für eine Tagesvariable Regenmenge am Wochentag (Mo-So).
Ich habe für jeden Wochentag eine eigene Variable (RainMo, RainDi, usw.).
Jetzt möchte ich eine Funktion schreiben die den Wochentag (also z.B. den String "RainMo" übergibt und den Wert dafür in das Script zurückliefert. Ich möchte eine Variable mit dem Namen RDay dafür nutzen die ich dann entsprechend mit den Strings RainMo, RainDi, RainMi, usw. befüllen kann.
Von
Ja, das geht. Zum Beispiel so:
var rainDay = null;
var date = new Date();
var d = date.getDay();
if(d === 0) { rainDay = 'RainSo'; }
else if(d === 1) { rainDay = 'RainMo'; }
else if(d === 2) { rainDay = 'RainDi'; }
else if(d === 3) { rainDay = 'RainMi'; }
else if(d === 4) { rainDay = 'RainDo'; }
else if(d === 5) { rainDay = 'RainFr'; }
else { rainDay = 'RainSa'; }
executeDeviceCommand("MyHome", rainDay, usw.)
Von
Das geht aber nicht. Meine Idee war das Script soll um 23:59 einmalig ausgeführt werden und die Tagesregenmenge von Netatmo holen und per Tag/Woche/Jahr verarbeiten.
Dann soll eine Historie auf Woche Monat und Jahr angelegt werden. Und das wollte ich dann in NEO Remote in einer Tabelle oder so Anzeigen lassen.
Ich bin erstmal bei der Woche. Monat und Jahr kommt noch.
Mein Script sieht von der Logik her so aus (Der Anfang):
var rain=0;
var RDays = ["Rain_So","Rain_Mo","Rain_Di","Rain_Mi","Rain_Do","Rain_Fr","Rain_Sa"];
var RDay = RDays[mytime.getDay()];
var we, R_act=0, R_so=0, R_mo=0, R_di=0, R_mi=0, R_do=0, R_fr=0, R_sa=0;
var R_Jan=0, R_Feb=0, R_Mar=0, R_Apr=0, R_May=0, R_Jun=0, R_Jul=0, R_Aug=0, R_Sep=0, R_Oct=0, R_Nov=0, R_Dec=0;
var R_Week=0, R_Month=0, R_Year=0;
// Regen Tagesdaten von Netatmo holen und in Tagesvariable schreiben
getDeviceStatus(
"MyHome",
"MeinOrt (Regenmesser)",
{"value":"rain24h"},
function(err, status) {
if(!err){
switch(day){
case 0:
R_so = status;
R_act = R_so;
Write_Rain(Rday, R_act);
break;
case 1:
R_mo = status;
R_act = R_mo,
Write_Rain(Rday, R_act);
break;
case 2:
R_di = status;
R_act = R_di;
Write_Rain(Rday, R_act);
break;
case 3:
R_mi = status;
R_act = R_mi;
Write_Rain(Rday, R_act);
break;
case 4:
R_do = status;
R_act = R_do;
Write_Rain(Rday, R_act);
break;
case 5:
R_fr = status;
R_act = R_fr;
Write_Rain(Rday, R_act);
break;
case 6:
R_sa = status;
R_act = R_sa;
Write_Rain(Rday, R_act);
break;
}
console.log(err, status);
}
}
);
// Regen History Daten holen
R_Week = Read_Rain("R_Week", rain);
R_Month = Read_Rain("R_Month", rain);
R_Year = Read_Rain("R_Year", rain);
// Regen aktuelle Woche in Variable schreiben
R_Week = R_Week + R_act;
Write_Rain("R_Week", R_Week);
// Hier kommt noch Code fuer Monat und Jahres Historie
// Code....
// Funktionen zum Auslesen und Schreiben in Variablen
//
// Variable auslesen
function Read_Rain(RDay,rain){
getDeviceStatus(
"MyHome", RDay,
{"value":"state","extMeta":"-21474836.48-21474836.47","scale":"0.01"},
function(err, status) {
if(!err){
rain = status;
}
console.log(err, status);
}
);
return rain;
}
// Variable schreiben
function Write_Rain(RDay,rain){
executeDeviceCommand(
"MyHome", RDay,
{"value":"setValue","ext":rain,"extMeta":"-21474836.48-21474836.47","scale":"0.01"},
function(err) {
err && console.error(err);
}
);
}
Von
Hi Sebastian,
ich hab den Fehler gefunden. Hatte einen Variablennamen falsch geschrieben.
Von
Nun ja, auch ich tue mir, nach mehr als 30 Jahren Programmierung, hier echt schwer:
im SCRITEDITOR hab ich folgende Zeilen erzeugt:
executeDeviceCommand(
"_progs&sysvars",
"gw2_UVR1611 FBH-Rücklauf",
{"value":"rawFloatValue","ext":"11","scale":"0.1"},
function(err) {
err && console.error(err.message);
}
);
executeDeviceCommand(
"_progs&sysvars",
"gw2_UVR1611 Holz VL",
{"value":"rawFloatValue","ext":"12","scale":"0.1"},
function(err) {
err && console.error(err.message);
}
);
Es sollen einfach nur so zum Test die Werte 11 und 12 in die SYSTEMVARIABLEN der CCU3
"gw2_UVR1611 FBH-Rücklauf",
"gw2_UVR1611 Holz VL",
geschrieben werden.
Der Start des Scriptes verläuft so:
21:18:56Skript Neues Skript hat gestartet.
21:18:57
21:18:57Skript Neues Skript hat geendet.
In der CCU3 kommt nichts an.
Freue mich über jede Info UND: Wäre klasse, wenn ein eigenes Befehlsregister geschrieben werden könnte, auch wenn irgnedetwas kompatibel ist. Hab immerhin 150 EUR bezahlt und finde keine Anleitung.... zum bisschen SCRIPTE schreiben.
VG Andreas aus Berlin
Von
Verwendest du eine aktuelle CREATOR-Version – 2.5.1, 2.4.6, 2.3.8 oder 2.1.13? Läuft dieser unter Windows oder macOS?
Wenn ich es aus dem Skripteditor heraus teste, wird bei mir die Systemvariable auf der CCU3 entsprechend aktualisiert. Dein Skript sieht auch korrekt aus.
Beachte bitte auch, dass immer nur der zuletzt gespeicherte Stand ausgeführt wird. Falls im Skripteditor etwas geändert wurde, muss dies erst wieder gespeichert werden.
Was meinst du in dem Zusammenhang mit einem Befehlsregister? Was spezielle Funktionen anbelangt, sind "getDeviceStatus" und "executeDeviceCommand" die einzigen. Ansonsten steht JavaScript zur Verfügung, welches in einer Node.js-Umgebung ausgeführt wird.
Von
Danke für die Infos:
- Script vor Test speichern. - OK, jetzt funktioniert´s.
- Befehlsregister:
Die Software muss sich mehr erklären. Siehe die Sache mit zuerst speichern, dann testen.
"Ansonsten JavaScript", schreibt doch eine eigene kurze Zusammenfassung oder setzt Links dazu rein.
Viele Grüße Andreas
Von
Sehe ich genauso - Dokumentation zum Script-Editor mehr als dürftig. Und support verweist einen aufs Forum...
Neuen Kommentar hinzufügen