NEWS
trigger, triggert zu oft ...
-
Hallo,
ich habe ein Bosch Zwischenstecker, der leider nur ON und OFF als Wert hat. Aber der "Schalter" in ioBroker nur true/false kennt.
Da habe ich mir gedacht, schreibst ein Script welches bei True ein ON rein schreibt und bei False ein OFF. Nur leider triggert mein Script sofort bei jeder Änderung. Eigentlich hätte ich gedacht, dass erst dann wieder getriggert wird, wenn das Script zu Ende gearbeitet hat.
Hier mein blockly:
Weiß jemand wie man das lösen kann?
-
-
@paul53 das ist der gleiche. Einmal ON damit der Zwischenstecker schaltet und einmal true damit meine Visualisierung weiß, das geschaltet wurde.
Das mit den Alias verstehe ich nicht so ganz.
-
@jb1985 sagte in trigger, triggert zu oft ...:
das ist der gleiche.
Das funktioniert nicht.
@jb1985 sagte in trigger, triggert zu oft ...:
Das mit den Alias verstehe ich nicht so ganz.
Der Alias bildet den Original-Datenpunkt von Typ "string" in einen Alias-Datenpunkt vom Typ "boolean" ab. Führe das folgende Skript nach Eingabe der richtigen idOrigin einmal kurz aus, um den Alias-Datenpunkt zu erstellen.
// Original-Datenpunkt const idOrigin = '...'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = ''; // Alias-Datenpunkt const idAlias = 'KG_Flur.Zwischenstecker.Status'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Zwischenstecker KG Flur'; desc = 'per Script erstellt'; typeAlias = 'boolean'; // oder 'number' // read = "val == 'ON' ? true : false"; // Erkennung "OFF" --> false erfolgt automatisch write = "val ? 'ON' : 'OFF'"; // role = 'value'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! // Ab hier nichts ändern !! function createAlias(idDst, idSrc, idRd) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; if(idRd) { obj.common.alias.id = {}; obj.common.alias.id.read = idRd; obj.common.alias.id.write = idSrc; obj.common.read = true; } else obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(obj.common.type == 'number') { if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; } else { if(obj.common.min !== undefined) delete obj.common.min; if(obj.common.max !== undefined) delete obj.common.max; if(obj.common.unit) delete obj.common.unit; } if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj, function() { if(idRd) setState(idRd, getState(idRd).val, true); else setState(idSrc, getState(idSrc).val, true); }); if(raum && existsObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && existsObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias('alias.0.' + idAlias, idOrigin, idRead);
-
@jb1985 sagte in trigger, triggert zu oft ...:
@paul53 das ist der gleiche. Einmal ON damit der Zwischenstecker schaltet und einmal true damit meine Visualisierung weiß, das geschaltet wurde.
Das kommt nicht gut. Ein Datenpunkt hat einen Typ und der ist entweder "boolean" (wahr/falsch) oder "string". Du kannst die zwei nicht einfach mischen.
Du solltest, wie @paul53 geschrieben hat, mit einem Alias arbeiten, der den Wert "übersetzt". Aliasse kannst du entweder per Skript erstellen oder mit dem Devices Adapter.
-
@paul53 sagte in trigger, triggert zu oft ...:
// Original-Datenpunkt const idOrigin = '...'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = ''; // Alias-Datenpunkt const idAlias = 'KG_Flur.Zwischenstecker.Status'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Zwischenstecker KG Flur'; desc = 'per Script erstellt'; typeAlias = 'boolean'; // oder 'number' // read = "val == 'ON' ? true : false"; // Erkennung "OFF" --> false erfolgt automatisch write = "val ? 'ON' : 'OFF'"; // role = 'value'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! // Ab hier nichts ändern !! function createAlias(idDst, idSrc, idRd) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; if(idRd) { obj.common.alias.id = {}; obj.common.alias.id.read = idRd; obj.common.alias.id.write = idSrc; obj.common.read = true; } else obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(obj.common.type == 'number') { if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; } else { if(obj.common.min !== undefined) delete obj.common.min; if(obj.common.max !== undefined) delete obj.common.max; if(obj.common.unit) delete obj.common.unit; } if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj, function() { if(idRd) setState(idRd, getState(idRd).val, true); else setState(idSrc, getState(idSrc).val, true); }); if(raum && existsObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && existsObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias('alias.0.' + idAlias, idOrigin, idRead);
Cool Danke, das funktioniert! Muss das Script immer an bleiben oder kann man das wieder löschen?
-
@jb1985 sagte: Muss das Script immer an bleiben oder kann man das wieder löschen?
Nein, stoppe das Skript. Löschen solltest Du es nicht, denn mit kleinen Anpassungen (idOrigin, idAlias, nameAlias, ...) kannst Du es zur Erstellung weiterer Alias-Datenpunkte nutzen.
-
@paul53 Danke Dir!