NEWS
Frage zu DeviceCounter script [object Object]
-
Ä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! -