NEWS
[gelöst]Widget mit getrennter Statusvariable und Steuervar.
-
@AchimB Widget mit getrennter Statusvariable und Steuervariable
Man kann Kommando- und Status-Datenpunkt in einem Alias zusammenführen.
-
@paul53
Danke für die schnelle Antwort aber leider kann ich dir nicht folgen !
Im Grunde möchte ich ja nur eine Lampe schalten und anschließend die korrekte Rückmeldung haben !
Also M13.0 als Steuer variabel und A8.0 Status variabel.
Und das nach Möglichkeit in einem einfachen Lampen-Widget !
Vielleicht gibt es ja auch die Möglichkeit über ein Blockly und einen Datenpunkt das Widget auszutricksen ?
Wenn es nur die von dir aufgezeigte Möglichkeit gibt werde ich das nicht realisieren können !
Gruß -
@AchimB sagte:
Vielleicht gibt es ja auch die Möglichkeit über ein Blockly und einen Datenpunkt das Widget auszutricksen ?
Das geht auch mit Blockly und einem eigenen Datenpunkt für Vis (unter 0_userdata.0). Die Verwendung eines Alias ist aber einfacher.
-
@paul53
Einfacher ist relativ
Habe überhaupt keinen Ansatz wo ich was eintragen müsste und was ich nachher im Widget aufrufen sollte !
Bin Vielleicht noch nicht soweit !
Werde mich mal durch den gesamten Chat kämpfen und es versuchen zu verstehen ! -
@AchimB sagte:
nach schalten mit einem Taster den aktuellen Ausgang signalisiert !
Folgt der Ausgang dem Wert des Tasters oder toggled der Taster den Ausgang ?
-
@paul53
Der Taster schaltet den Ausgang ! -
@AchimB sagte:
Der Taster schaltet den Ausgang !
Das ist klar. Aber wie ? Taster false --> Ausgang false / Taster true --> Ausgang true ? Dann wäre der Taster kein Taster, sondern ein Schalter.
-
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.
-
@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ß -
@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 -
@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.Beleuchtung
Was ist das für ein Skript "Licht.Licht_Büro" ?
-
@paul53 said in Widget mit getrennter Statusvariable und Steuervariable:
Alias-Datenpunkte werden im Ordner "alias.0" erstellt, also z.B.
idAlias = 'Beleuchtung.Buero'; // Ordner: alias.0.BeleuchtungHabe aber keinen Ordner : Alias.0
-
@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 !
-
@AchimB
Hast Du in den Einstellungen der Javascript-Instanz "setObject" freigegeben ? -
Ja habe ich !
-
@AchimB sagte:
Ja habe ich !
Dann wundert mich die Fehlermeldung
18:02:34.771 error javascript.0 (23398) at createAlias (script.js.Licht.Licht_Büro:50:7)
Es ist Zeile 50 mit setObject() ?
-
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