NEWS
[gelöst]Widget mit getrennter Statusvariable und Steuervar.
-
Taster True => Ausgang => True beim nächsten Flankenwechsel Ausgang => False !
Taste also immer mit "1" und erzeuge dann einen wechsel des Ausgangs !
Habe Quasi einen Stromstoßschalter in S7 programmiert und übernehme nur die Werte !@AchimB sagte:
Taste also immer mit "1" und erzeuge dann einen wechsel des Ausgangs !
Also toggled der Taster. Dann kann Alias nicht verwendet werden, sondern man muss den Datenpunkt für Vis per Skript verarbeiten.
// IDs anpassen const idButton = 's7.0.DBs.DB1.NI02'; const idActor = 's7.0.DBs.DB1.Q02'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = '0_userdata.0.s7-0.' + common.name.replace(/\s/g, '_'); // Anpassen ! common.read = true; if(!existsState(idVis)) createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });Für die Verwendung des Skripts müssen nur die 3 IDs angepasst werden.
-
@AchimB sagte:
Taste also immer mit "1" und erzeuge dann einen wechsel des Ausgangs !
Also toggled der Taster. Dann kann Alias nicht verwendet werden, sondern man muss den Datenpunkt für Vis per Skript verarbeiten.
// IDs anpassen const idButton = 's7.0.DBs.DB1.NI02'; const idActor = 's7.0.DBs.DB1.Q02'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = '0_userdata.0.s7-0.' + common.name.replace(/\s/g, '_'); // Anpassen ! common.read = true; if(!existsState(idVis)) createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });Für die Verwendung des Skripts müssen nur die 3 IDs angepasst werden.
@paul53 sagte:
Dann kann Alias nicht verwendet werden
Muss mich korrigieren, denn ich habe es gerade getestet. Es funktioniert auch mit Alias:
"alias": { "id": { "read": "knx.0.Wohnen.Licht.Esstisch_Status", "write": "knx.0.Wohnen.Licht.Esstisch_Taster" }, "write": "val ? true : true" } -
@paul53
Danke für deine Hilfe aber leider fehlt mir wohl noch einiges an Grundwissen !
Wenn ich es halbwegs richtig verstanden habe soll ich einen Alias anlegen der aus Taster und Rückmeldung erzeugt wird und diesen dann als Objekt_ID ins Widget eintragen.
Habe also einen Aussgang z.B. : s7.2.Outputs.8.7 und einen Eingang : s7.2.Markers.17.S7_Merker_15 so das ich den Alias mit dem Taster beschreiben kann und gleichzeitig den aktuellen Ausgang lesen kann !
Ist das soweit richtig ?
Wenn das soweit richtig ist frage ich mich nur wo ich das Script anlege bzw. wo ich den Alias erzeuge ? Im Widget selber unter Scripte oder muss ich ein separates Script erstellen in JS oder TS ?
Und wie würde das dann komplett aussehen ?
Habe bisher nur mit Blockly gearbeitet und da weiß ich das ich einen Datenpunkt erzeugen kann den ich nachher wieder abholen kann aber das ist für mich absolut neuland ! Deshalb verzeih meine dummen Fragen !
Gruß -
@paul53
Danke für deine Hilfe aber leider fehlt mir wohl noch einiges an Grundwissen !
Wenn ich es halbwegs richtig verstanden habe soll ich einen Alias anlegen der aus Taster und Rückmeldung erzeugt wird und diesen dann als Objekt_ID ins Widget eintragen.
Habe also einen Aussgang z.B. : s7.2.Outputs.8.7 und einen Eingang : s7.2.Markers.17.S7_Merker_15 so das ich den Alias mit dem Taster beschreiben kann und gleichzeitig den aktuellen Ausgang lesen kann !
Ist das soweit richtig ?
Wenn das soweit richtig ist frage ich mich nur wo ich das Script anlege bzw. wo ich den Alias erzeuge ? Im Widget selber unter Scripte oder muss ich ein separates Script erstellen in JS oder TS ?
Und wie würde das dann komplett aussehen ?
Habe bisher nur mit Blockly gearbeitet und da weiß ich das ich einen Datenpunkt erzeugen kann den ich nachher wieder abholen kann aber das ist für mich absolut neuland ! Deshalb verzeih meine dummen Fragen !
Gruß@AchimB sagte:
soll ich einen Alias anlegen der aus Taster und Rückmeldung erzeugt wird und diesen dann als Objekt_ID ins Widget eintragen.
Ja.
@AchimB sagte in Widget mit getrennter Statusvariable und Steuervariable:
ein separates Script erstellen in JS
Ja, folgendes Javascript einmal ausführen, nachdem idAlias und nameAlias angepasst sind ('s7.2.Markers.17.S7_Merker_15' ist der Taster ?)
// Original-Datenpunkt const idOrigin = 's7.2.Markers.17.S7_Merker_15'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = 's7.2.Outputs.8.7'; // Alias-Datenpunkt const idAlias = 'Wohnen.Licht.Esstisch'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Lampe Esstisch'; desc = 'per Script erstellt'; // typeAlias = 'boolean'; // oder 'number' // read = "val < 20 ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch write = "val ? true : true"; role = 'switch'; // 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 ! 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(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj); if(raum && getObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && getObject('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);Nach Anpassung von idOrigin, idRead, idAlias, nameAlias kann es für weitere Aliasse zu S7-Datenpunkten mit Taster/Status verwendet werden.
-
@AchimB sagte:
soll ich einen Alias anlegen der aus Taster und Rückmeldung erzeugt wird und diesen dann als Objekt_ID ins Widget eintragen.
Ja.
@AchimB sagte in Widget mit getrennter Statusvariable und Steuervariable:
ein separates Script erstellen in JS
Ja, folgendes Javascript einmal ausführen, nachdem idAlias und nameAlias angepasst sind ('s7.2.Markers.17.S7_Merker_15' ist der Taster ?)
// Original-Datenpunkt const idOrigin = 's7.2.Markers.17.S7_Merker_15'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = 's7.2.Outputs.8.7'; // Alias-Datenpunkt const idAlias = 'Wohnen.Licht.Esstisch'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Lampe Esstisch'; desc = 'per Script erstellt'; // typeAlias = 'boolean'; // oder 'number' // read = "val < 20 ? true : false"; // Erkennung "Aus" --> false erfolgt automatisch write = "val ? true : true"; role = 'switch'; // 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 ! 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(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj); if(raum && getObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && getObject('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);Nach Anpassung von idOrigin, idRead, idAlias, nameAlias kann es für weitere Aliasse zu S7-Datenpunkten mit Taster/Status verwendet werden.
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
('s7.2.Markers.17.S7_Merker_15' ist der Taster ?)
Ja korrekt !
Als idAlias habe ich dann einen Ordner aus Javascript.0
'Beleuchtung'
genommen und nameAlias einen freien Namen
'Lampe Büro'funktioniert aber nicht !
18:02:34.768 error javascript.0 (23398) script.js.Licht.Licht_Büro: /opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913
18:02:34.771 error javascript.0 (23398) at createAlias (script.js.Licht.Licht_Büro:50:7)
18:02:34.772 error javascript.0 (23398) at script.js.Licht.Licht_Büro:64:1 -
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
('s7.2.Markers.17.S7_Merker_15' ist der Taster ?)
Ja korrekt !
Als idAlias habe ich dann einen Ordner aus Javascript.0
'Beleuchtung'
genommen und nameAlias einen freien Namen
'Lampe Büro'funktioniert aber nicht !
18:02:34.768 error javascript.0 (23398) script.js.Licht.Licht_Büro: /opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913
18:02:34.771 error javascript.0 (23398) at createAlias (script.js.Licht.Licht_Büro:50:7)
18:02:34.772 error javascript.0 (23398) at script.js.Licht.Licht_Büro:64:1@AchimB sagte:
Als idAlias habe ich dann einen Ordner aus Javascript.0 'Beleuchtung' genommen
Alias-Datenpunkte werden im Ordner "alias.0" erstellt, also z.B.
idAlias = 'Beleuchtung.Buero'; // Ordner: alias.0.BeleuchtungWas ist das für ein Skript "Licht.Licht_Büro" ?
-
@AchimB sagte:
Als idAlias habe ich dann einen Ordner aus Javascript.0 'Beleuchtung' genommen
Alias-Datenpunkte werden im Ordner "alias.0" erstellt, also z.B.
idAlias = 'Beleuchtung.Buero'; // Ordner: alias.0.BeleuchtungWas ist das für ein Skript "Licht.Licht_Büro" ?
-
@AchimB sagte:
Als idAlias habe ich dann einen Ordner aus Javascript.0 'Beleuchtung' genommen
Alias-Datenpunkte werden im Ordner "alias.0" erstellt, also z.B.
idAlias = 'Beleuchtung.Buero'; // Ordner: alias.0.BeleuchtungWas ist das für ein Skript "Licht.Licht_Büro" ?
-
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
Was ist das für ein Skript "Licht.Licht_Büro" ?
Das ist das Script das ich angelegt habe !
-
Habe in der Log Datei noch folgende Meldungen !
javascript.0 2020-07-26 20:04:43.008 error (1360) at Script.runInContext (vm.js:133:20)
javascript.0 2020-07-26 20:04:43.008 error (1360) at script.js.Licht.Licht_Büro:64:1
javascript.0 2020-07-26 20:04:43.007 error (1360) at createAlias (script.js.Licht.Licht_Büro:50:7)
javascript.0 2020-07-26 20:04:43.007 error (1360) at sandbox.setObject (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:2801:25)
javascript.0 2020-07-26 20:04:43.006 error (1360) at Adapter.setForeignObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913:101)
javascript.0 2020-07-26 20:04:43.006 error (1360) TypeError: obj.common.alias.id.startsWith is not a function
javascript.0 2020-07-26 20:04:43.006 error (1360) ^
javascript.0 2020-07-26 20:04:43.005 error (1360) if (obj && obj.common && obj.common.alias && obj.common.alias.id && obj.common.alias.id.startsWith(ALIAS_STARTS_WITH)) {
javascript.0 2020-07-26 20:04:43.004 error (1360) script.js.Licht.Licht_Büro: /opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913 -
Habe in der Log Datei noch folgende Meldungen !
javascript.0 2020-07-26 20:04:43.008 error (1360) at Script.runInContext (vm.js:133:20)
javascript.0 2020-07-26 20:04:43.008 error (1360) at script.js.Licht.Licht_Büro:64:1
javascript.0 2020-07-26 20:04:43.007 error (1360) at createAlias (script.js.Licht.Licht_Büro:50:7)
javascript.0 2020-07-26 20:04:43.007 error (1360) at sandbox.setObject (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:2801:25)
javascript.0 2020-07-26 20:04:43.006 error (1360) at Adapter.setForeignObject (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913:101)
javascript.0 2020-07-26 20:04:43.006 error (1360) TypeError: obj.common.alias.id.startsWith is not a function
javascript.0 2020-07-26 20:04:43.006 error (1360) ^
javascript.0 2020-07-26 20:04:43.005 error (1360) if (obj && obj.common && obj.common.alias && obj.common.alias.id && obj.common.alias.id.startsWith(ALIAS_STARTS_WITH)) {
javascript.0 2020-07-26 20:04:43.004 error (1360) script.js.Licht.Licht_Büro: /opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:1913@AchimB sagte:
noch folgende Meldungen !
Das sind meist Folge-Meldungen von
javascript.0 2020-07-26 20:04:43.007 error (1360) at createAlias (script.js.Licht.Licht_Büro:50:7)Welche Version haben der js-controller (Host) und der Javascript-Adapter ?
-
@AchimB sagte:
js-controller 2.2.8
Das mit getrenntem Kommando und Status im Alias funktioniert erst ab js-controller 3.0 ! Siehe Doku
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
Das mit getrenntem Kommando und Status im Alias funktioniert erst ab js-controller 3.0 ! Siehe Doku
Sorry mein Fehler !
Hab ein Update gemacht und Funktioniert !
Man darf zwar nicht zu schnell hintereinander schalten dann kommt er nicht mehr hinterher aber ansonsten genau das was ich wollte !
Vielen Dank für deine Geduld !! -
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
Das mit getrenntem Kommando und Status im Alias funktioniert erst ab js-controller 3.0 ! Siehe Doku
Sorry mein Fehler !
Hab ein Update gemacht und Funktioniert !
Man darf zwar nicht zu schnell hintereinander schalten dann kommt er nicht mehr hinterher aber ansonsten genau das was ich wollte !
Vielen Dank für deine Geduld !!
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden