NEWS
Auslesen mehrerer Sensoren in EINEN Status
-
Hallo zusammen,
leider habe ich zu meiner Frage bislang im Forum nichts finden können und bin neu im Thema.
Einiges habe ich mir im Bezug auf vis bereits aneignen können, stehe allerdings vor einem Problem, welches ich momentan nicht lösen kann.
Ich möchte den Status mehrerer Homematic Sensoren/Aktoren auslesen und einen gemeinsamen Status ausgeben. Konkret möchte ich z.B. für meine beiden Küchenfenster den aktuellen Sensorstatus (offen/geschlossen) auslesen und für den gesamten Raum den Status bestimmen. Soll heißen, gibt mind. einer der Sensoren den Status offen, soll der Status für den gesamten Raum "offen" sein. Liefern beide Sensoren den Status geschlossen, soll der Status für den gesamten Raum "geschlossen" sein.
Mit einer Szene kann ich das nach meinem (geringen) Verständnis nicht abbilden, da hier ja ein Sensor als Trigger für weitere Aktionen dient und nicht der Status zweier Sensoren ausgelesen wird.
Über einen kurzen Hint wäre ich sehr glücklich, um mit der vis fortfahren zu können.
Lieben Dank und VG
-
Schätze Du müsstest das mit JavaScript im ScriptAdapter oder direkt im Vis machen
-
Hallo,
ich nutze seit einigen Jahren dieses Javascript. Es tut genau, das:
Wenn eines von mehreren Fenstern im Raum geöffnet wird, ist dessen Status maßgeblich. Wird ein weiteres Fenster weiter geöffnet (Reihenfolge: zu,[ggf. gekippt],geöffnet), wird dessen Zustand maßgeblich, usw. Jeweils das am weitesten geöffnete Fenster gibt den Status der neu erstellten Variable (State) vor.
Bluefox war damals eine große Hilfe!
Es ist eigentlich klar, aber ich erwähne es dennoch: Das Skript arbeitet mit Gewerken und Räumen. Die Sensoren müssen also zugeordnet sein. Ich verwende nur Homematic-Sensoren, die in der CCU den Gewerken und Räumen zugeordnet wurden.
! ````
/*
Skript zum Feststellen des Status mehrerer Fenster im Raum Küche
Das Skript erstellt pro Raum eine Variable und meldet in Abhängigkeit vom
Öffnungszustand aller Fensterdrehgriffkontakte RHS eine Gesamtstatus
Der Status kann für VIS farbige Grundrisse oder die HM-OU-LED16 verwendet werden
Pro Raum ein Skript erstellen
Unterscheidung nach einzelnen Fenstern im Skript status_fenster_tueren
! erstellt: 24.10.2014 von Pix (für CCU.IO)
portiert: 21.03.2015 mit Hilfe von Bluefox http://forum.iobroker.org/viewtopic.php?f=21&t=535&sid=c758980908bb09871b9145d463543a3b#p3653
geändert: 22.03.2015
06.05.2015 Array zur Bennenung des Zustands im Klartext im Log erstellt
30.07.2015 neue Variablen Struktur Status.Raum.alleFenster
31.08.2015 Korrektur Variablen Status (erst nach einem Monat gemerkt :()
01.12.2015 neue Variablen Struktur Status.Raum.Fenster.alle
*/
! // Select and show (for debug) all sensors in "Wohnzimmer" and with type "Fenster"
var sensors = $('channelstate.id=*.STATE(functions=Fenster)');
! function getCurrentState() {
var commonState = 0;
sensors.each(function (id) {
if (id.indexOf('Statistik') != -1) return;
var val = toInt(getState(id).val);
// Find the maximum (2 - opened, 1 - tilted, 0 - closed)
if (val > commonState) commonState = val;
});
return commonState;
}
! // On change
sensors.on(function(obj) {
// if (obj.id.indexOf('Statistik') == -1) setState('Status.Wohnzimmer.Fenster.alle', getCurrentState());
setState("javascript.0.Status.Wohnzimmer.Fenster.alle"/Status.Wohnzimmer.Fenster.alle/, getCurrentState());
var zustand = ['offen','gekippt','geschlossen'];
log('Status aller Wohnzimmerfenster: ' + zustand[getState('Status.Wohnzimmer.Fenster.alle').val]);
});createState('Status.Wohnzimmer.Fenster.alle', getCurrentState(), {
name: 'alle Fenster Wohnzimmer',
type: 'number',
min: 0,
max: 3,
def: 0,
role: 'value'
});! ````
GrußPix
-
Hi pix,
vielen Dank für die schnelle Antwort.
Kannst Du mir noch sagen, wo ich das Skript einbinden kann ?
Den Adapter habe ich bereits installiert, aber bei mir fehlt in der Admin Ansicht der "Skripte" Tab.
Lieben Dank und viele Grüße
-
Das kann mal passieren (weiss auch nicht wieso)
Rechts oben hatts ein Stift-Button. Damit kann man die Bearbeitung der Reiter einschalten (und den Script Reiter wieder freigeben)
-
Hi Yves,
prima, vielen Dank !
-
So, alles installiert, das Objekt dem Skript zugewiesen und in VIS über eine Boolean abgefragt.
Technisch funktioniert alles, nur scheint das Skript bei mir nicht richtig zu reagieren.
Ich habe es für meine Küche mit 2 Fenstersensoren verwendet. Es erkennt die richtige Anzahl der Sensoren und auch einen Statuswechsel. Allerdings zeigt mir das Skript bei jeder Änderung, dass alle Fenster geschlossen sind. Egal ob ich öffne oder schließe.
! ` > 22:32:24.962
[info]
javascript.0 script.js.Verschluss_Kueche: registered 2 subscriptions and 0 schedules
22:32:27.328
[info]
javascript.0 Stop script script.js.Verschluss_Kueche
22:32:40.258
[info]
javascript.0 Start javascript script.js.Verschluss_Kueche
22:32:40.259
[info]
javascript.0 script.js.Verschluss_Kueche: registered 2 subscriptions and 0 schedules
22:32:58.392
[info]
javascript.0 script.js.Verschluss_Kueche: Status aller Küchenfenster: geschlossen
22:33:01.642
[info]
javascript.0 script.js.Verschluss_Kueche: Status aller Küchenfenster: geschlossen
22:33:15.888
[info]
javascript.0 script.js.Verschluss_Kueche: Status aller Küchenfenster: geschlossen
22:33:27.403
[info]
javascript.0 script.js.Verschluss_Kueche: Status aller Küchenfenster: geschlossen `
Das Skript sieht bei mir wie folgt aus :
! ` > var sensors = $('channelstate.id=*.STATE(functions=Verschluß)');
function getCurrentState() {
var commonState = 0;
sensors.each(function (id) {
if (id.indexOf('Statistik') != -1) return;
var val = toInt(getState(id).val);
// Find the maximum (2 - opened, 1 - tilted, 0 - closed)
if (val > commonState) commonState = val;
});
return commonState;
}
// On change
sensors.on(function(obj) {
if (obj.id.indexOf('Statistik') == -1) setState('Status.Küche.Fenster.alle', getCurrentState());
setState("javascript.0.Status.Küche.Fenster.alle"/Status.Küche.Fenster.alle/, getCurrentState());
var zustand = ['offen','gekippt','geschlossen'];
log('Status aller Küchenfenster: ' + zustand[getState('Status.Küche.Fenster.alle').val]);
});
createState('Status.Küche.Fenster.alle', getCurrentState(), {
name: 'alle Fenster Küche',
type: 'number',
min: 0,
max: 3,
def: 0,
role: 'value'
}); `
Hat jemand einen Tipp für mich, was hier flasch läuft ?
VG