Hallo zusammen,
japp, die 3.7.5 funktioniert wieder einwandfrei!
Hallo zusammen,
japp, die 3.7.5 funktioniert wieder einwandfrei!
@paul53 said in Szenen DP manipulieren mit extendObject:
@sts85 sagte: Das ist dabei rausgekommen:
Die letzten beiden Befehle sollten nur bedingt ausgeführt werden:
if(index > -1) {
Japp, das war mein Minimalbeispiel. Bedingung ist schon umgesetzt.
@paul53 Mega, danke für den Ansatz. Eigentlich logisch. Das ist dabei rausgekommen:
var SceneName = 'scene.0.TEST'
var SceneObject = getObject('scene.0.TEST')
var SceneID = "alias.0.Buttons.Button-WZ-Bilderrahmen";
var SceneData = SceneObject.native.members
var index = SceneData.findIndex(obj => obj.id==SceneID);
//console.log(index);
SceneObject.native.members[index].disabled = true;
//console.log(SceneObject.native.members);
setObject(SceneName, SceneObject)
Hallo zusammen,
ich möchte gerne in einer Szene (iobroker Scenes Adapter) einzelne Zustände inaktiv machen:
Dies würde ich gern über Blockly oder JavaScript lösen.
Dazu habe ich den Ansatz über extendObject genutzt:
extendObject('scene.0.TEST', {native: {members: [{disabled: true}]}});
So lange die Szene nur aus einem Zustand besteht, funktioniert das so. Ich habe aber mehrere Zustände und weiß nicht, wie ich nur das "disabled" einer bestimmten ID manipulieren kann, da sie ja hintereinander in members stehen. Wie bekomme ich Zugriff auf das "disabled" der jeweiligen ID?
{
"common": {
"name": "TEST",
"type": "mixed",
"role": "scene.state",
"desc": "",
"enabled": true,
"read": true,
"write": true,
"def": false,
"engine": "system.adapter.scenes.0"
},
"native": {
"onTrue": {
"trigger": {},
"cron": null,
"astro": null
},
"onFalse": {
"enabled": true,
"trigger": {},
"cron": null,
"astro": null
},
"easy": true,
"burstInterval": 0,
"members": [
{
"id": "alias.0.Buttons.Button-WZ-St-Weinregal",
"setIfTrue": true,
"setIfFalse": false,
"stopAllDelays": true,
"desc": null,
"disabled": true,
"delay": 0
},
{
"id": "alias.0.Buttons.Button-WZ-Bilderrahmen",
"setIfTrue": true,
"setIfFalse": false,
"stopAllDelays": true,
"desc": null,
"disabled": false,
"delay": 0
}
]
},
"type": "state",
"_id": "scene.0.TEST",
"from": "system.adapter.admin.0",
"user": "system.user.admin",
"ts": 1715248145422,
"acl": {
"object": 1636,
"state": 1636,
"owner": "system.user.admin",
"ownerGroup": "system.group.administrator"
}
}
Danke euch,
viele Grüße
@haus-automatisierung said in Test Adapter Awtrix-Light:
Tip-top, genau so funktioniert es nun. Danke.
Ich verstehe das schon, dass es alles nicht so komplex werden soll. Ich habe tatsächlich auch auf das Format mit dem Punkt als Dezimaltrenner umgestellt und die Anzahl der Nachkommastellen limitiert.
Es sieht halt komisch aus, wenn nun das ",0" bei schwankenden Werten verschwindet und nur die nakte Zahl da steht. Natürlich ist das Geschmacksache.
Würde es funktionieren, wenn ich das in Blockly vorher in einen String umwandele und die Zahl dann als String mit dem Komma übergebe?
Hallo zusammen,
habe das schöne Teil auch vor zwei Tagen bekommen und den Adapter schon eingerichtet. Eigentlich funktioniert alles super.
Eine Sache stört mich aber noch:
Ich würde gerne die Anzahl der Nachkommastellen pro Wert fix einstellen. Zwar kann ich die Anzahl bequem über den Adapter auf eine Nachkommastelle limitieren, aber wenn jetzt ein Wert, z. B. Temperatur = 20 °C rein kommt, steht auf der Anzeige "20". Wenn dann der Wert steigt, steht dort z. B. "20.1".
Kann ich aus der "20" eine "20.0" machen? Super bequem wäre ein Häkchen "Anzahl Nachkommastellen fest" oder so. In der vis geht das problemlos.
Habe ich was übersehen bzw. wie lässt sich das einfach umsetzen?
Danke & Grüße
@paul53 said in Watchdog für Alter der Datenpunkte:
@sts85 sagte: Ich darf hier natürlich nur einen Intervall nutzen.
Ja, etwa so:
Perfekt, super, läuft 1A.
Hatte eben auch schon was gebastelt, aber dies ist hier noch ein wenig eleganter. Nur deine Zähl-Schleife habe ich durch eine "für jeden Wert" Schleife ersetzt.
Einiges gelernt...
Nochmals vielen Dank euch allen! 🥳
Haha, siehe edit. Hab ich auch gerade gemerkt. Ich darf hier natürlich nur einen Intervall nutzen.
Ob es elegant ist, sei dahingestellt, aber so geht es:
var ids, id, intervalle, messages, idx, Intervall, msg, i, idm, message_there;
function listsRepeat(value, n) {
var array = [];
for (var i = 0; i < n; i++) {
array[i] = value;
}
return array;
}
// Beschreibe diese Funktion …
async function getName(id) {
return getObject(id).common.name;
}
ids = Array.prototype.slice.apply($("state[id=*](functions=watchdog)"));
intervalle = listsRepeat(null, ids.length);
messages = listsRepeat(null, ids.length);
schedule("*/2 * * * * *", async function () {
for (var id_index in ids) {
id = ids[id_index];
idx = ids.indexOf(id) + 1;
Intervall = intervalle[(idx - 1)];
messages[(idx - 1)] = 'Sensorwert zu alt: ' + String(await getName(id));
msg = messages[(idx - 1)];
if (parseFloat((new Date().getTime())) - getState(id).ts <= 900000) {
(function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
messages[(idx - 1)] = null;
} else if (!Intervall) {
console.log(msg);
Intervall = setInterval(async function () {
for (var i_index in ids) {
i = ids[i_index];
idm = ids.indexOf(i) + 1;
message_there = intervalle[(idm - 1)];
if (message_there != null) {
console.log(('Sensorwert zu alt: ' + String(await getName(i))));
}
}
}, 6000);
}
intervalle[(idx - 1)] = Intervall;
}
});
Danke euch nochmals!
Edit: Kleiner Denkfehler, jetzt werden natürlich nich mehrere Intervalle ausgelöst...
@ticaki said in Watchdog für Alter der Datenpunkte:
@paul53
Statt der Intervall reference die Nachricht im Array speichern mit nur einem Intervall der das Array überprüft und die Nachricht verschickt?
Den Ansatz hatte ich auch eben, hab es aber in Blockly noch nicht so schnell umgesetzt bekommen.
Dann kommen alle betroffenen Meldungen immer gemeinsam, das wäre aber vollkommen OK.