NEWS
[gelöst] Könnte mir bitte jemand bei dem Script helfen?
-
Hallo,
aus diesem Thread habe ich folgendes Script genommen um auch den Satus meiner Xiaomi Aqara-TFK-Sensoren angezeigt zu bekommen.
Trotz anpassen des Scriptes funktioniert das leider nicht.
Was habe ich gemacht:
Im Script habe ich folgende Zeile ergänzt und den Datenpunkt so angepasst:
const miFenster = $('state[id=*.opened](functions="Fenster")');
Dann den Datenpunkt dem Gewerk "Fenster" zugeordnet:
Hier das ganze Script:
function fensterstatus(zustand) { var meldung; switch (zustand) { case 1: meldung = 'RHS gekippt'; break; case 2: meldung = 'RHS offen'; break; case true: meldung = 'TFK offen'; break; default: meldung = 'geschlossen'; break; } return(meldung); } createState('zählen_Fenster.anzahlFenster', { // wenn benötigt: Anzahl der vorhandenen Fenster type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.anzahlFensterauf', { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.textFensterauf', { // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen type: 'string', def: ' ', role: 'value' }); const hmFenster = $('channel[state.id=*.STATE](functions="Fenster")'); const miFenster = $('state[id=*.opened](functions="Fenster")'); function countFenster() { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0 var anzahlFenster = 0; var anzahlFensterauf = 0; var textFensterauf = []; hmFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); miFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.state im Gewerk Fenster var status = getState(id).val; // Zustand *.state abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name; if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); // Schleifen sind durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben log("Text: " + textFensterauf); log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " + anzahlFensterauf); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Fenster.textFensterauf", textFensterauf.join(',')); // Schreibt die aktuelle Namen der offenen Fenster setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length); // Schreibt die aktuelle Anzahl der offenen Fenster setState("zählen_Fenster.anzahlFenster", anzahlFenster); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster } countFenster(); // Skriptstart hmFenster.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); }); miFenster.on(function(obj) { // bei Zustandänderung *. state im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); });
Muss ich noch etwas anpassen, was mache ich falsch?
-
@Hicks sagte:
const miFenster = $('state[id=*.opened](functions="Fenster")');
Ist die Enum-ID "enum.functions.Fenster" oder "enum.functions.fenster" ? Im zweiten Fall muss es geändert werden
const miFenster = $('state[id=*.opened](functions="fenster")');
-
Hallo @paul53,
die Enum-ID scheint korrekt zu sein:
-
Hmm,
hat den niemand eine Idee, warum das Script mit den Aqara-Sensoren nicht geht?
Die Homematic-Sensoren funktionieren ja einwandfrei.
-
Lifert das folgende Testskript die IDs der Fenster ?
const miFenster = $('state[id=*.opened](functions="Fenster")'); miFenster.each(function(id, i) { log(id); });
-
Hallo @paul53,
leider nicht. Ich habe das Testskript so eingefügt, bin mir aber nicht sicher ob du das so meintest:
createState('zählen_Fenster.textFensterauf', { // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen type: 'string', def: ' ', role: 'value' }); const hmFenster = $('channel[state.id=*.STATE](functions="Fenster")'); const miFenster = $('state[id=*.opened](functions="Fenster")'); miFenster.each(function(id, i) { log(id); }); function countFenster() { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0 var anzahlFenster = 0; var anzahlFensterauf = 0; var textFensterauf = [];
-
Meinte zwar ein extra Testskript, aber so läßt es sich auch testen. Wenn die IDs nicht im Log erscheinen, passt der $Selector nicht. Versuche es mal in einem gesonderten Testskript mit
const miFenster = $('*.opened'); miFenster.each(function(id, i) { log(id); });
-
So, habe jetzt ein Testskript angelegt, geht leider auch nciht.
-
@Hicks Mit dem kurzen Selector ohne functions ? Im Log kommt nichts ?
Welche Javascript Version ? -
Ja, im Log steht nur:
4.3.2019, 17:13:07.319 [info ]: javascript.0 Stop script script.js.TESTTEST 4.3.2019, 17:13:08.209 [info ]: javascript.0 Start javascript script.js.TESTTEST 4.3.2019, 17:13:08.210 [info ]: javascript.0 script.js.TESTTEST: registered 0 subscriptions and 0 schedules
Die Javascript Version ist 4.1.5
-
...ich sehe gerade das es die Javascript-Version 4.1.8 gibt. Sollte ich besser updaten?
-
@Hicks Ein Versuch schadet nicht. Wenn es dann nicht funktioniert, mache ein Downgrade auf Version 3.6.4 (3.6.5), denn damit habe ich es gerade erfolgreich getestet.
-
OK, danke! Melde mich dann wieder...
-
Hallo @paul53,
du hattest den richtigen Riecher, die Javascript-Version war das Problem!
Mit der Version 4.1.8 ging's auch nicht, bin jetzt wieder zurück auf Version 3.6.4. und damit läuft auch mein oben geändertes Skript.
Schade, die neue Version hatte schon ihre Vorteile - ok, dann muss ich noch etwas warten.
Vielen Dank für deine Hilfe, ohne die wäre ich aufgemschissen gewesen.
-
Habe gerade mit Version 4.1.10 getestet und bei mir funktioniert es.
@Hicks Kannst Du bitte testen, ob es auch bei Dir funktioniert. Dann kann ich das Issue auf Github schließen.
-
so, ich bin jetzt auf Version 4.1.10. Leider läuft das Skript hier auch nicht.
Zudem habe ich einige Warnungen im Log vom Javascript-Adapter:
-
Sehr eigenartig
Die Datenpunkte sind tatsächlich enum.functions.Fenster zugeordnet ?
Unter members im Objekt ?{ "_id": "enum.functions.Fenster", "common": { "name": "Fenster", "members": [ "alias.0.geraet_1.opened", "alias.0.Geraet_2.opened" ], "icon": "", "color": false }, "type": "enum", "from": "system.adapter.admin.1", "ts": 1551716287358, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "native": {} }
-
-
-
...habe gerade festgestellt, dass dieses Skript mit der Version 4.1.10 auch Probleme macht.
Wenn es klingelt, schickt mir das Skript normalerweise drei Fotos von der Cam an Telegram.
Jetzt, scheint hier eine Endlosschleife vorzuliegen, dass Skript schickt ständig Fotos, Ruhe ist erst, wenn ich das Skript stoppe.// Telegram Bild senden durch Klingel oder Text to command var source_url = 'http://192.168.xxx.xx/tmpfs/snap.jpg?usr=xxxxx&pwd=xxxxx', //IP Adresse der Instar mit user und password dest_path = '/tmp/'; //Speicherort für das Bild var Nachricht = "Jemand klingelt"; // Nachricht, welche mit dem Bild gesendet wird var request = require('request'); var fs = require('fs'); //var timer = null; var count = 0; // Bild an telegram schicken function sendImage (pfad) { sendTo('telegram.0', pfad); //log('Webcam Bild per telegram verschickt'); sendTo("telegram.0", Nachricht); // <-- nach der Timeout funktion ausführen } // Bild speichern function saveImage() { request.get({url: source_url, encoding: 'binary'}, function (err, response, body) { fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) { if (err) { //log('Fehler beim Bild speichern: ' + err, 'warn'); } else { //log('Webcam Bild gespeichert'); sendImage(dest_path + 'image2.jpg'); } }); }); } //Trigger // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist on({id: "mqtt.0.xxxxxxx"/*xxx*/, val: true}, function () { // if (getState("javascript.0.Unifi.Anwesenheit.UAP.Chef"/*WLAN Anwesenheit (UAP) - Chef*/).val === false) { count = 3; counter(); timer = setInterval(counter, 3000); } ); function counter() { saveImage(); count--; if(count === 0 && timer) clearInterval(timer); }