NEWS
Frage zu DeviceCounter script [object Object]
-
Hi,
ich experimentiere mit dem Script zum ählen von Devices: https://www.iobroker.net/docu/index-309.htm?page_id=3641&lang=de
Das macht schon ein bischen was. Im Datenpunkt wirft es unter anderem eine Liste aus.
Meine bescheidenen Fähigkeiten in JS reichen nicht aus, um mit der Liste irgendwas an zu fangen. Wie kann ich da per Script reinschauen? Durchiterieren? Oder visualisieren?
Hat wer nen Tipp für mich?
-
@Archimedeus sagte:
ich experimentiere mit dem Script zum ählen von Devices:
Wie sieht das Experiment (Script) aus ?
-
Äh mein Script? Gibts gar nicht. Ich kann mit .val den Eintrag lesen.
also etwa so:mylist = getState("javascript.0.deviceCounter.lamps_on.list").val; // oder mylist = getState("javascript.0.deviceCounter.lamps_on.list").toString(); log(mylist);
Oder meinst du das Script, was den Datenpunkt anlegt? Das ist das "geklaute" Original s.u., da habe ich nur die Aufrufe angepasst. Fun-fact: Das Problem mit LOWBATT und LOW_BATT bei HM und HMIP hat der * gelöst
Ich kann mit dem Rückgabewert
javascript.0 (1891) script.js.common.Experimental.ListTest: [object Object]einfach nichts anfangen. Müsste man irgendwie einem Array zuweisen und dann durch mit for each oder so. Hab ein bisschen probiert und wieder verworfen. Wie gesagt, ich bon C&P Programmierer
addDeviceCounter("battery_homematic",$('channel[state.id=hm-rpc.1.*.0.LOW*]'), true); // Use sonoff for testing addDeviceCounter("lamps_on",$('state[id=*](functions=sonoff)'), true); /****************************************** * Code - do not change anything bellow this line * ******************************************/ function addDeviceCounter(name, selector, val_to_count) { //Total amount of devices found by selector var state_total = 'deviceCounter.' + name + '.total'; createState(state_total, 0); //List of devices that match condition var state_list = 'deviceCounter.' + name + '.list'; createState(state_list, ""); //Number of devices that match condition var state_counter = 'deviceCounter.' + name + '.counter'; createState(state_counter, 0); function countDevs(obj) { var d_count = 0; var d_list = []; selector.each(function (id, i) { var status = getState(id).val; var obj = getObject(id); log("**********Found " + id) if ((typeof val_to_count === 'function' && val_to_count(status)) || (typeof val_to_count === 'boolean' && val_to_count == status)) { //Get parent object var roomsX = getObject(id,'rooms'); //var functionsX = getObject(id,'functions'); // function behind room //var parentChannelId = id.slice(id.lastIndexOf(".")); //var parentDevicelId = id.split(".").slice(0,-2).join("."); //var deviceObject = getObject(parentDevicelId); //remember device name & functions d_list.push(roomsX.enumNames)//, functionsX.enumNames); } ++d_count; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status }); log("------!" +name + "(" + d_count + "): " + d_list); setState(state_list, d_list.join('<br>')); setState(state_counter, d_list.length); setState(state_total, d_count); } //Re-evaluate when a device status changes selector.on(function(obj) { // bei Zustandänderung *. LOWBAT in allen Gewerken countDevs(obj); }); //Re-evaluate each 1/4 hour schedule("*/15 * * * *", countDevs); //Evaluate for the first time countDevs(); log("TestCount Started"); }
-
@Archimedeus sagte:
d_list.push(roomsX.enumNames)//, functionsX.enumNames);
Ändere mal Zeile 37:
d_list.push(roomsX.enumNames[0]); //, functionsX.enumNames[0]);
EDIT: Besser noch Zeilen 29 bis 37 ändern in
var room = getObject(id,'rooms').enumNames[0]; if(!d_list.includes(room)) d_list.push(room);
-
@paul53 said in Frage zu DeviceCounter script [object Object]:
var room = getObject(id,'rooms').enumNames[0];
Leider keine Verbesserung:
Leider ist total jetzt auch 0, sollte 2 sein.
Wenn ich nur wüsste, was mir JS mit [object Object] sagen will. Ich vermute, dass ist ein komplexeres Objekt, auf das man nur richtig zugreifen muss.
Ich probiere es mal so:
mylist = getState("javascript.0.deviceCounter.lamps_on.list").val; log(mylist); for(var property in mylist) { log(property + "=" + mylist[property]); }
Laut Google: The default conversion from an object to string is "[object Object]".
Das Ergebnis ist kurios:
21.12.2020, 22:13:51.887 [info ]: javascript.0 (1891) Stop script script.js.common.Experimental.ListTest 21.12.2020, 22:13:52.041 [info ]: javascript.0 (1891) Start javascript script.js.common.Experimental.ListTest 21.12.2020, 22:13:52.065 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: [object Object] 21.12.2020, 22:13:52.065 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 0=[ 21.12.2020, 22:13:52.066 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 1=o 21.12.2020, 22:13:52.066 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 2=b 21.12.2020, 22:13:52.066 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 3=j 21.12.2020, 22:13:52.066 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 4=e 21.12.2020, 22:13:52.066 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 5=c 21.12.2020, 22:13:52.067 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 6=t 21.12.2020, 22:13:52.067 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 7= 21.12.2020, 22:13:52.067 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 8=O 21.12.2020, 22:13:52.067 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 9=b 21.12.2020, 22:13:52.067 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 10=j 21.12.2020, 22:13:52.068 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 11=e 21.12.2020, 22:13:52.068 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 12=c 21.12.2020, 22:13:52.068 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 13=t 21.12.2020, 22:13:52.068 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: 14=] 21.12.2020, 22:13:52.069 [info ]: javascript.0 (1891) script.js.common.Experimental.ListTest: registered 0 subscriptions and 0 schedules
-
@Archimedeus
Was sagt das Log (anstelle Zeile 41)?log(d_list);
@Archimedeus sagte in Frage zu DeviceCounter script [object Object]:
Leider ist total jetzt auch 0, sollte 2 sein.
An der Zählung (Zeile 39) hat sich nichts geändert ?
-
Ich bin etwas weiter.
var roomsX = getObject(id,'rooms');
Die Zeile gibt schon das object Obct. Grund ist, dass in der Aufzählung direkt die Endpunkte -POWER stehen. ID ist dann also sonoff.0.sonoff1.POWER Da drin ist natürlich kein .rooms drin. Ich muss den Aufruf anders machen. Habe jetzt in der Auzählung sonoff.0.sonoff1 und versuche es so:
addDeviceCounter("lamps_on",$('channel[id=state.*.POWER](functions=sonoff)'), true);
Tut aber nicht, findet keine Devices. Ich glaube ioch muss mal drüber schlafen. Hast mir geholfen. Man kämpft sich bit für bit voran.
-
@Archimedeus sagte in Frage zu DeviceCounter script [object Object]:
Tut aber nicht, findet keine Devices.
Versuche es mal so:
addDeviceCounter("lamps_on",$('sonoff.0.*.POWER'), true);
@Archimedeus sagte in Frage zu DeviceCounter script [object Object]:
Das Problem mit LOWBATT und LOW_BATT bei HM und HMIP hat der * gelöst
Das sind unterschiedliche Instanzen.
-
@paul53 said in Frage zu DeviceCounter script [object Object]:
addDeviceCounter("lamps_on",$('sonoff.0.*.POWER'), true);
Das findet alle devices in sonoff (auch die bridge) aber roomsX bleibt object Object.
Das andere
addDeviceCounter("battery_homematic",$('channel[state.id=hm-rpc.*.*.0.LOW*]'), true);
funktioniert wirklich. Er findet die LOW* aus beiden instanzen.
-
@Archimedeus sagte:
funktioniert wirklich. Er findet die LOW* aus beiden instanzen.
Jetzt ist auch keine Instanz angegeben. Der Selektor kann kürzer sein:
addDeviceCounter("battery_homematic",$('hm-rpc.*.0.LOW*'), true);
@Archimedeus sagte in Frage zu DeviceCounter script [object Object]:
aber roomsX bleibt object Object.
Welche Version des Javascript-Adapters ? Sind Räume zugeordnet ?
-
@paul53
4.8.4 und ja es sind Räume zugewiesen. Morgen klappts. bestimmt -
@Archimedeus
Habe nicht mehr daran gedacht: Raumname kann mehrsprachig sein. Deshalbvar room = getObject(id,'rooms').enumNames[0]; if(typeof room == 'object') room = room.de; if(!d_list.includes(room)) d_list.push(room);
-
@paul53 said in Frage zu DeviceCounter script [object Object]:
var room = getObject(id,'rooms').enumNames[0];
Schon besser. Problem: enumNames nimmt nur den ersten Raum. Deshalb stand im Original auch
d_list.push(rooms.enumNames)
und
setState(state_list, d_list.join('-'));Naja, eigentlich sollte ein Gerät auch nur in einem Raum sein...
-
@Archimedeus
Aber es tut, was es soll! Danke vielmals! -