NEWS
"Sammel-Bit(s)" pro vis view
-
Hallo zusammen,
ich würde gerne pro vis view ein oder mehrere "Sammel-Bits" erstellen. Z.B. gibt es ein Bild bei mir mit allen Fensterkontakten. Diese Fensterkontakte würde ich gerne ver-odern, um ein Objekt auf "true" oder "false" zu steuern. Dieses Objekt nehme ich dann zur Steuerung des Signalbilds
im Bild-Wechsel Widget (jqui - navigation - icon), um im überlagerten Bild ein rotes Blinken auf dem Bildwechselknopf zu erzeugen, das mich auf ein geöffnetes Fenster im unterlagerten Bild aufmerksam macht.
Kann mir jemand ein Script dafür liefern? Im Idealfall legt das Script auch das Objekt an, wenn es noch nicht existiert. Ich habe mit Blockly angefangen, da kriege ich das "Bit" gesetzt, indem ich mehrere Objekte an dem Blockly-Baustein anhänge. Problem ist aber, dass das Bit dann auch beim ersten Fenster, das schließt, wieder auf "False" geht, auch wenn noch ein anderes Fenster offen ist. Und das Objekt muss ich mit meinen Skript-Kenntnissen auch händisch anlegen.
Zusammenfassend bräuchte ich ein Script, das:
-
ein Objekt anlegt mit einem Namen, den ich im Script angeben kann, inkl. Objekt-Baum-Ordner z.B. "vis.0/Sammel-Bits/Fenster", wobei "Fenster" das eigentliche Objekt ist, "Sammel-Bits" ist ein Ordner unter vis.0
-
Ver-oderung von Objekten, die dann das neue Objekt setzen, z.B. "Fenster WC"=true oder "Fenster Bad"=true oder "Fenster Küche"=true ==> "Sammel-Bit Fenster"=true
-
Erst wenn alle Objekte wieder "false" sind, wird das neue Objekt wieder "false", z.B. "Fenster WC"=false und "Fenster Bad"=false und "Fenster Küche"=false ==> "Sammel-Bit Fenster"=false
Vielleicht würde eine if-then Schleife funktionieren:
if Fenster WC"=false und "Fenster Bad"=false und "Fenster Küche"=false ==> "Sammel-Bit Fenster"=false
else "Sammel-Bit Fenster"=true
Schön wäre auch, wenn man in das Sammel-Bit die Überwachung eines Analogwertes mit einbauen kann, z.B. "Temperatur Schaltschrank">30°C
Javascript-Syntax ist mir aber (noch) fremd, vor allem auch das Anlegen des neuen Objektes, falls noch nicht vorhanden.
Für die Unterstützung vielen Dank vorab!
-
-
- ein Objekt anlegt mit einem Namen, den ich im Script angeben kann, inkl. Objekt-Baum-Ordner z.B. "vis.0/Sammel-Bits/Fenster", wobei "Fenster" das eigentliche Objekt ist, "Sammel-Bits" ist ein Ordner unter vis.0 `
Mit folgendem Skript erfolgt die Erstellung eines Datenpunktes und eines Ordners "Sammle-Bits" unter javascript.0:
createState('Sammel-Bits.Fenster', false, { type: 'boolean', desc: 'mind. ein Fenster ist auf' });
- ein Objekt anlegt mit einem Namen, den ich im Script angeben kann, inkl. Objekt-Baum-Ordner z.B. "vis.0/Sammel-Bits/Fenster", wobei "Fenster" das eigentliche Objekt ist, "Sammel-Bits" ist ein Ordner unter vis.0 `
-
Kann mir jemand ein Script dafür liefern? Im Idealfall legt das Script auch das Objekt an, wenn es noch nicht existiert. Ich habe mit Blockly angefangen, da kriege ich das "Bit" gesetzt, indem ich mehrere Objekte an dem Blockly-Baustein anhänge. Problem ist aber, dass das Bit dann auch beim ersten Fenster, das schließt, wieder auf "False" geht, auch wenn noch ein anderes Fenster offen ist. Und das Objekt muss ich mit meinen Skript-Kenntnissen auch händisch anlegen. `
Hallo fu_zhouDas setzen/aktualisieren würde ich erstmal in einer "Liste" machen und dann in einen Datenpunkt schreiben.
Schau mal bei Blockly unter Listen.
Die Darstellung in VIS ist ein weiteres Problem.
Du solltest das hier in zwei Threads aufteilen.
Hier unter "VIS" und einmal unter "Scripten" mit Bezug auf Blockly im Betreff, falls Du das mit Blockly lösen möchtest.
Grüße
-
-
Ver-oderung von Objekten, die dann das neue Objekt setzen, z.B. "Fenster WC"=true oder "Fenster Bad"=true oder "Fenster Küche"=true ==> "Sammel-Bit Fenster"=true
-
Erst wenn alle Objekte wieder "false" sind, wird das neue Objekt wieder "false", z.B. "Fenster WC"=false und "Fenster Bad"=false und "Fenster Küche"=false ==> "Sammel-Bit Fenster"=false `
Prinzip:
const idSammel = 'javascript.0.Sammel-Bits.Fenster'; const id1 = '...'; // ID von 1\. Fenster const id2 = '...'; // usw. var val1 = getState(id1).val; var val2 = getState8id2).val; // usw. function sammel() { if(val1 || val2 || val3 || ...) setState(idSammel, true, true); else setState(idSammel, false, true); } sammel(); // Skriptstart on(id1, function(dp) { // 1\. Fenster wird geöffnet oder geschlossen val1 = dp.state.val; sammel(); }); on(id2, function(dp) { val2 = dp.state.val; sammel(); }); // usw.
-
-
Falls der Datenpunkt 'javascript.0.Sammel-Bits.Fenster' nicht bereits erzeugt wurde, kann man das auch im gleichen Skript erledigen:
const idSammel = 'javascript.0.Sammel-Bits.Fenster'; const id1 = '...'; // ID von 1\. Fenster const id2 = '...'; // usw. var val1 = getState(id1).val; var val2 = getState8id2).val; // usw. function sammel() { if(val1 || val2 || val3 || ...) setState(idSammel, true, true); else setState(idSammel, false, true); } createState('Sammel-Bits.Fenster', false, { type: 'boolean', desc: 'mind. ein Fenster ist auf' }, sammel); on(id1, function(dp) { // 1\. Fenster wird geöffnet oder geschlossen val1 = dp.state.val; sammel(); }); on(id2, function(dp) { val2 = dp.state.val; sammel(); }); // usw.
-
Hallo,
ich wusste erst nicht, was für ein Skript gebraucht wird. Sammel-Bits sagt mir nix.
Dann habe ich Pauls Skript gesehn und wusste bescheid
Nur weiterlesen, falls der Fensterstatus 0/1/2 statt true/false ist
Ich nutze pro Raum ein Skript, man kann aber auch durch Anpassung des Selektors alle Räume in ein Skript nehmen. Es werden die RotateHandleSensors RHS von Homematic ausgewertet (0 = zu, 1 = gekippt, 2=offen).
Die Zuordnung zum Gewerk Fenster ist vorausgesetzt.
Geräte mit dem Namen "Statistik" werden ausgenommen. Ich hatte früher für jeden TFK und RHS noch ein CUxD-Gerät für Statistik-Zwecke angelegt. Dieses Gerät sollte nicht einfließen.
Das Objekt wird so befüllt:
Alle Fenster zu -> Status 0
Mindestens ein Fenster gekippt und keines ganz offen -> Status 1
Mindestens ein Fenster ganz offen -> Status 2
Ich nutze es für die Darstellung eines Grundrisses in verschiedenen Farben abhängig vom Fensterstatus (grün, gelb, rot) in jedem Raum.
/* Skript zum Feststellen des Status mehrerer Fenster im Raum 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 01.12.2015 neue Variablen Struktur Status.Raum.Fenster.alle 21.02.2016 idStatus */ // Select and show (for debug) all sensors in "Schlafzimmer" and with type "Fenster" var sensors = $('channel[state.id=*.STATE](rooms=Schlafzimmer)(functions=Fenster)'); var idStatus = 'Status.Schlafzimmer.Fenster.alle'; 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(idStatus, getCurrentState()); var zustand = ['offen','gekippt','geschlossen']; log('Status aller Schlafzimmerfenster: ' + zustand[getState(idStatus).val], 'info'); }); createState(idStatus, getCurrentState(), { name: 'alle Fenster Schlafzimmer', type: 'number', min: 0, max: 3, def: 0, role: 'value' });
Gruß
Pix
-
Super, vielen Dank für den tollen Input, muss ich gleich mal probieren!!!
-
Mein Skript sieht jetzt so aus (Überwachung Meldungen wie Sicherungsfall und Phasenüberwachung etc. in der Hauptverteilung)
const idSammel = 'javascript.0.Sammel-Bits.HV_Verteiler'; const id1 = 's7.0.DBs.DB21.STATUS_E0_0'; // ID von 1\. Meldung const id2 = 's7.0.DBs.DB21.STATUS_E0_1'; const id3 = 's7.0.DBs.DB21.STATUS_E0_6'; const id4 = 's7.0.DBs.DB21.Stoerung_SPS'; const id5 = 's7.0.info.connection'; var val1 = getState(id1).val; var val2 = getState(id2).val; var val3 = getState(id3).val; var val4 = getState(id4).val; var val5 = getState(id5).val; function sammel() { if(val1 || val2 || val3 || val4 || val5) setState(idSammel, true, true); else setState(idSammel, false, true); } createState('Sammel-Bits.HV_Verteiler', false, { type: 'boolean', desc: 'Sammelmeldung HV Verteiler' }, sammel); on(id1, function(dp) { // 1\. Meldung kommt oder geht val1 = dp.state.val; sammel(); }); on(id2, function(dp) { val2 = dp.state.val; sammel(); }); on(id3, function(dp) { val3 = dp.state.val; sammel(); }); on(id4, function(dp) { val4 = dp.state.val; sammel(); }); on(id5, function(dp) { val5 = dp.state.val; sammel(); });
Funktioniert wahrscheinlich, nur nicht bei mir, weil die Meldungen alles Öffner sind, d.h. im Gut-Zustand sind alle Werte "true". Sobald ein Wert "false" wird, muss das Sammel-Bit (HV_Verteiler) auf "true" gesetzt werden. Ich habe also 4 Anwendungsfälle:
-
Alle Objekte sind Öffner, d.h. wenn ein Wert "false" wird, wird das Sammel-Bit "true"
-
Alle Objekte sind Schließer, d.h. wenn ein Wert "true" wird, wird das Sammel-Bit "true"
-
Die Objekte sind gemischt - ein paar Öffner, ein paar Schließer, d.h. wenn mind. ein Öffner "false" wird oder mindestens ein Schließer "true" wird, wird das Sammel-Bit "true"
-
Ein Analogwert wird über- oder unterschritten, das fließt dann in das "Oder" ein, dass das Sammel-Bit auf "true" setzt.
Für mich ist also wichtig zu wissen, wo ich Schließer und Öffner parametriere und wie eine Analogwertüberwachung gemacht wird.
Kannst du da noch mal drüberschauen?
Danke vorab!!!
-
-
Sobald ein Wert "false" wird, muss das Sammel-Bit (HV_Verteiler) auf "true" gesetzt werden. `
if(!val1 || !val2 || !val3 || !val4 || !val5) setState(idSammel, true, true); else setState(idSammel, false, true);
- Ein Analogwert wird über- oder unterschritten, das fließt dann in das "Oder" ein, dass das Sammel-Bit auf "true" setzt. `
Beispiel: val2 ist Analogwert und Überschreitung eines Wertes (im Beispiel 30) führt zu Sammel-Bit true.
if(val1 || val2 > 30 || val3 || val4 || val5) setState(idSammel, true, true); else setState(idSammel, false, true);
- Die Objekte sind gemischt - ein paar Öffner, ein paar Schließer, d.h. wenn mind. ein Öffner "false" wird oder mindestens ein Schließer "true" wird, wird das Sammel-Bit "true" `
Schließer: valN
Öffner: !valN
- Ein Analogwert wird über- oder unterschritten, das fließt dann in das "Oder" ein, dass das Sammel-Bit auf "true" setzt. `
-
Ein Traum!!!! Es geht!!!! Vielen Dank!!!!!
-
Alternative Lösung mit Arrays:
const idSammel = 'javascript.0.Sammel-Bits.HV_Verteiler'; const id1 = 's7.0.DBs.DB21.STATUS_E0_0'; // ID von 1\. Meldung const id2 = 's7.0.DBs.DB21.STATUS_E0_1'; const id3 = 's7.0.DBs.DB21.STATUS_E0_6'; const id4 = 's7.0.DBs.DB21.Stoerung_SPS'; const id5 = 's7.0.info.connection'; const ids = [id1, id2, id3, id4, id5]; var vals = [getState(id1).val, getState(id2).val, getState(id3).val, getState(id4).val, getState(id5).val]; function sammel() { if(vals[0] || vals[1] || vals[2] || vals[3] || vals[4]) setState(idSammel, true, true); else setState(idSammel, false, true); } createState('Sammel-Bits.HV_Verteiler', false, { type: 'boolean', desc: 'Sammelmeldung HV Verteiler' }, sammel); on(ids, function(dp) { var pos = ids.indexOf(dp.id); if(pos != -1) { vals[pos] = dp.state.val; sammel(); } else log('Trigger-ID nicht im Array !', 'warn'); });