NEWS
VIS1 Raum , licht an oder aus signalisieren
-
Hi,
ich nutze vis1 und hab dort raumpläne angelegt
beispielsweise sieht man das in b1.17 das licht an ist
aktuell zeigt das objekt nur an ob eine von 2 deckenlampen eingeschaltet ist.problem:
es gibt in den räumen mehrere lichtquellen
deckenlampe 1
deckenlampe 2
schmuck ( nanoleaf)
licht Panel rgbich bräuchte also ne Möglichkeit mehrer lampen abzufragen
wenn eine von den an ist dann soll das icon erscheinen
also icon auf true so wie ich es bisher auch macheals sobald 1 an ist, icon true
gibt es da möglichkeiten?
vllt hat jemand bereits erfahrung damit gemacht:)
LG
dennis -
@densema Also wenn ich in einem Raum mehrere Lampen habe, dann habe ich auch in der vis mehrere Lampensymbole, damit habe ich das Problem nicht
Wenn du es so machen willst wie du schreibst (ein Lampensymbol je Raum), dann würde ich das mit je einem Datenpunkt "0_userdate.0.Lampe_Raum_XXX" und dann ein Skript was bei Änderung einer Lampe im Raum (an/aus) jeweils alle Lampen im Raum prüft und dann den Datenpunkt updated mit wahr oder falsch.
Dann kannst du in der vis das Symbol via Datenpunkt darstellen. -
@amg_666
ja wäre mir auch am liebsten, auch überlegt die zu überlappen stört ja erstmal keinen
geht in dem szenario nur darum direkt zu sehen ist noch licht an , lux wert geht leider nicht da Helligkeit von aussen zu hochdas mit dem skript klingt gut
hast du vllt nen beispiel wie man das mit einem skript löst bin da nicht so bewandert.
welches skript würdest du wählen -
Ich hätte da ein "kleines" Blockly am laufen.
Ist nicht übermäßig professionell, funktioniert aber für meine Zwecke um z.B. die Räume in denen Licht brennt anzuzeigen.
Nutze dazu die Aufzählungen mit Räumen und Funktionen
Kann aber sein, dass in jedem Raum mal ein Licht ein- und ausgeschalten werden muss, damit die entsprechenden Datenpunkte pro Raum angelegt werden. Und sollten Räume mit anderen Umlauten als "ü" dabei sein müsste das entsprechend auch noch bei "Datenpunkt steuern" ergänzt werden.
Ganz unten der Datenpunkt "Lampen" (für eine Gesamtsumme) wird nicht automatisch angelegt.
Wie gesagt, ist nicht übermäßig professionell, aber für meine Zwecke reichts und evtl. ist das ja ein Ansatz für Deine Wünsche.Edit: Blockly-Export im Spoiler war nicht richtig kopiert
-
@densema sagte in VIS1 Raum , licht an oder aus signalisieren:
geht in dem szenario nur darum direkt zu sehen ist noch licht an
du legst unter objekte manuell einen Datenpunkt unter 0_userdata an, den nennst du zum beispiel licht_an_wohnzimmer
der hat den Typ "Zustand" und den Zustandstyp "Logikwert".
Dann unter Skripte ein neues Skript anlegen, wenn du dich damit nicht auskennst musst du dich natürlich einarbeiten, ich würd dir empfehlen ein blockly Skript anzulegen. Das Skript löst aus, wenn eine Lampe an/ausgeschaltet wird und prüft ob andere Lampen an sind und setzt dann den Logikwert.
Beispiel: Du hast 2 Lampen in einem Raum
Im roten Block muss bei OnjektID der Schaltzustand der 1. Lampe rein
im blauen Block muss in der Zeile falls bei der 1. Objektid der Schaltzustand der 1. Lampe rein, bei der 2. ObjektID hinter dem oder der Schaltzustand der 2. Lampe
und bei "mache" und "sonst" muss rechts bei ObjektID die angelegte Variable licht_an_wohnzimmer rein.
Dann koierst du den gesamten Block und änderst in der Kopie im roten Block die ObjectID auf den Schaltzustand der 2. Lampe. Fertig.
Du kannst unter Skripte einfach ein neues Skript Typ Blockly anlegen und da dann das Blockly-Gerippe von mir reinkopieren:<block xmlns="https://developers.google.com/blockly/xml" type="controls_if" id="|Rda!2quGnTi$NXDL1Xw" x="159" y="146"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_operation" id="0t1|Hk_}]|Lj+U@@P_YO"> <field name="OP">OR</field> <value name="A"> <block type="get_value" id="TIh(0X}Gz)_L`Ef4wfYZ"> <field name="ATTR">val</field> <field name="OID">ID auswählen</field> </block> </value> <value name="B"> <block type="get_value" id="4Nmqet]o~m`2L:JAGF@E"> <field name="ATTR">val</field> <field name="OID">ID auswählen</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="EC:_-ct[/2CIyTiHL:fo"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">Object ID</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="{y@16)Yk%8GT?/|OlHCA"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="control" id="*%veEZ,)RU(rKrim;X$)"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">Object ID</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="eBY!W=bQUYw5D*u%vyN+"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> </block>
und ja, man kann das auch eleganter programmerien aber für den Anfang ist das so hoffe ich am einfachsten verständlich...
-
Hab das Blockly noch etwas überarbeitet. Bei mir funktionierts jetzt einwandfrei.
blockly.txtJetzt baut sich die notwendige Datenstruktur vollständig selber auf. Und mit ein paar Eingaben ist es schnell auch für andere Gewerke nutzbar.
Wichtig ist halt die 2x
state[id=*](functions=light)
an Deine Bezeichnung bei den Aufzählungen anzupassen.
-
So schaut des Code in JS aus
var objID, term, term_old, objID_sum, term_sum, ObjectID, path_pre, search_room, value, txt_original, txt_search, txt_switch, part1, txt_result, function2, datapoint, part2, name2, txt_search_length, position, store, path_sum, list_rooms, list_lights, active_sum_all, i, list_lights_txt, count, j; // Erstelle DP je Raum async function create_dp_boolean(objID, term, term_old) { if (!existsObject(objID)) { createState(objID, false, { read: true, write: true, name: term_old, type: "boolean", def: false }); await wait(1000); } } // Erstelle DP für aktive Geräte async function create_dp_number_sum(objID_sum, term_sum) { if (!existsObject(objID_sum)) { createState(objID_sum, 0, { type: 'number', read: true, write: true, name: term_sum }); await wait(1000); } } // Finde Raumname async function rooms_extract(ObjectID) { let room = getObject(ObjectID, 'rooms').enumNames[0]; if(typeof room == 'string') return room; return room.de; } // Liefere Ergebnis Zustand je Raum async function write_datapoint(path_pre, search_room, value) { // Entferne Sonderzeichen datapoint = await changeText(String(search_room), 'ä', 'ae'); datapoint = await changeText(String(txt_result), 'ö', 'oe'); datapoint = await changeText(String(txt_result), 'ü', 'ue'); datapoint = await changeText(String(txt_result), 'ß', 'ss'); datapoint = await changeText(String(txt_result), ' ', '_'); objID = [path_pre,'.',datapoint].join(''); await create_dp_boolean(objID, txt_result, search_room); setStateDelayed(objID, value, true, parseInt(((0) || '').toString(), 10), false); } // Entferne Sonderzeichen async function changeText(txt_original, txt_search, txt_switch) { part1 = ''; part2 = ''; txt_result = txt_original; txt_search_length = txt_search.length; position = txt_result.indexOf(txt_search) + 1; while (position > 0) { // Wenn nicht erste Zeichen im Text! if (position > 1) { part1 = txt_result.slice(0, position - 1); } part2 = txt_result.slice(((position + txt_search_length) - 1), txt_result.length); txt_result = [part1,txt_switch,part2].join(''); position = txt_result.indexOf(txt_search) + 1; } return txt_result; } // Script // >>> Name wählen !!! function2 = 'Licht'; // >>> Name eintragen!!! name2 = 'aktive Lichter'; // Erstelle Datenpunkt für aktive Geräte // >>> Speicherort unter 0_userdata. einstellen store = '0_userdata.0.Datenpunkte.Widgets'; path_pre = [store,'.',function2].join(''); path_sum = String(path_pre) + '.Active'; await create_dp_number_sum(path_sum, name2); setStateDelayed(path_sum, 0, true, parseInt(((0) || '').toString(), 10), false); // Trigger // >>> functions nach = anpassen !!! on({ id: [].concat(Array.prototype.slice.apply($('state[id=*](functions=light)'))), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; console.log(name2); list_rooms = []; list_lights = []; active_sum_all = 0; // >>> functions nach = anpassen !!! var i_list = Array.prototype.slice.apply($('state[id=*](functions=light)')); for (var i_index in i_list) { i = i_list[i_index]; list_rooms.push([await rooms_extract(i)]); if (getState(i).val) { list_lights.push([await rooms_extract(i)]); active_sum_all = (typeof active_sum_all === 'number' ? active_sum_all : 0) + 1; } } console.log(active_sum_all); list_lights_txt = String(list_lights); count = 0; for (var j_index in list_rooms) { j = list_rooms[j_index]; count = (typeof count === 'number' ? count : 0) + 1; search_room = String(list_rooms[(count - 1)]); if (list_lights_txt.indexOf(search_room) + 1 > 0) { await write_datapoint(path_pre, search_room, true); } else { await write_datapoint(path_pre, search_room, false); } } setStateDelayed(path_sum, active_sum_all, true, parseInt(((0) || '').toString(), 10), false); });
-
Ich hab das Blockly noch etwas "aufgepimpt". Vielleicht hast Du ja eine entsprechende Verwendung.
Es braucht jetzt nicht mehr angetriggert werden und kann zudem neben boolean-Werten auch mit Schwellwerten (Zahlen) arbeiten. Zudem werden die Geräte (aktiv/inaktiv) gleich mitgezählt.
Dazu muss je Gewerk (Funktion) entsprechend ein Script mit folgenden Einstellungen befüllt werden (hoffentlich selbsterklärend)
Bspw. aus diesen Daten
wird je nach Einstellungen folgender Objektbaum generiert.