NEWS
Frage Javascript "on-id-change"
-
kann ich auch irgendwie den Wert also true o. False mit angeben?
Ja, da aber sicherlich bei true und false unterschiedliche Reaktionen erfolgen sollen, mache die Abfrage in der Callback-Funktion des Triggers.
on(/^radar2\.0\..+_here$/, function(dp) { if(dp.state.val) { // Reaktionen auf true } else { // Reaktionen auf false } });
-
erst einmal Danke das klappt richtig gut.
Allerdings ist Radar2 & Iphone nicht die beste Lösung. Ich habe das jetzt mal mit
dem script für die CCU probiert und das ist richtig zuverlässing da es drn WLAN Status aus der Fritzbox ausliest.Kann ich ein Liste bilden um sie darin enthaltenen States abzufragen?
-
@sveni_lee sagte:
Kann ich ein Liste bilden um sie darin enthaltenen States abzufragen?
Ja, aber Du wirst zwei Listen brauchen: Eine mit den IDs (wer hat getriggert) und eine mit den Werten.
-
ich hatte mir das jetzt so vorgestellt...
var anwesenheit_devices = ["hm-rega.0.1857", "hm-rega.0.1858", "hm-rega.0.1864"] on(anwesenheit_devices, function(dp) { if(dp.state.val) { // Reaktionen auf true sendTo("telegram.0", "send", { text: dp.common.name + " ist online" }); } else { // Reaktionen auf false sendTo("telegram.0", "send", { text: dp.common.name + " ist offline" }); } });
-
@sveni_lee sagte:
ich hatte mir das jetzt so vorgestellt
Ja, solange keine Auswertung benötigt wird, ob niemand anwesend ist, genügt es so.
-
@paul53 sagte in Frage Javascript "on-id-change":
Ja, solange keine Auswertung benötigt wird, ob niemand anwesend ist, genügt es so.
Du meinst also wenn ich feststellen möchte ob überhaupt jemand anwesend ist geht das so nicht mehr?
-
@sveni_lee sagte:
ob überhaupt jemand anwesend ist geht das so nicht mehr?
Richtig, denn dann braucht man eine Oder-Verknüpfung aller Anwesenden: Wenn einer von zwei Anwesenden das Haus verlässt, ist trotzdem noch jemand anwesend.
-
stimmt..
aber die ccu bietet einen state mit allen anwesenden. den könnte man wenn nötig auch auswerten...ONKYO-AVR,Google-Home,EchoDot,WDR3600,CCU2,Strom-Pi,Gotham-City,VissmannWP-Pi
-
Ich wollte das ganze jetzt noch etwas verfeinern und dem Datenpunkt einen clearname zuordnen aber das scheint so nicht zu funktionieren.
var anwesenheit_devices = ["hm-rega.0.1857", "hm-rega.0.1858", "hm-rega.0.1864"]; var online_devices = ["hm-rega.0.1867", "hm-rega.0.1868", "hm-rega.0.1869", "hm-rega.0.1871", "hm-rega.0.1872", "hm-rega.0.1873", "hm-rega.0.1874", "hm-rega.0.1875", "hm-rega.0.1876", "hm-rega.0.1877", "hm-rega.0.1879", "hm-rega.0.1880", "hm-rega.0.1881", "hm-rega.0.1882", "hm-rega.0.1883", "hm-rega.0.1884"]; var humans = {"hm-rega.0.1857" : "XXX", "hm-rega.0.1858" : "YYY", "hm-rega.0.1864" : "ZZZ"}; on(anwesenheit_devices, function(dp) { str = dp.common.name; if(dp.state.val) { // Reaktionen auf true sendTo("telegram.0", "send", { text: humans.dp + " ist anwesend" }); } else { // Reaktionen auf false sendTo("telegram.0", "send", { text: humans.dp + " ist abwesend" }); } }); on(online_devices, function(dp) { str = dp.common.name; if(dp.state.val) { // Reaktionen auf true sendTo("telegram.0", "send", { text: str.substr(12) + " ist online" }); } else { // Reaktionen auf false sendTo("telegram.0", "send", { text: str.substr(12) + " ist offline" }); } });
aber das klappt nicht... "humans.dp" wird nicht zugeordnet.
-
@sveni_lee
Weshalb verwendest Du nicht die in der CCU vergebenen Namen ?text: dp.common.name + " ist anwesend"
In humans sind die Datenpunkt-IDs die Bezeichner, also
var str = dp.id; ... text: humans[str] + " ist anwesend"
-
das klingt irgendwie nicht so toll. In der CCU werden die Name mit Anwesenheit.XXX_IPhone bezeichnet.
Ich Iabe die Namensgebung so wie in der Fritzbox gewählt, kann man dann besser nachvollziehen.
Klingt aber nicht schön wenn der Bot medet Anwesenheit.XXX_iPhone ist anwesend.Darum dachte ich mir die Idee mit dem Objekt wäre nicht schlecht...
müss das Objekt humans nicht so aussehen:
var humans = {['hm-rega.0.1857'] : "XXX", ['hm-rega.0.1858'] : "YYY", ['hm-rega.0.1864'] : "ZZZ"};
-
@sveni_lee sagte in Frage Javascript "on-id-change":
var humans = {['hm-rega.0.1857'] : "XXX", ['hm-rega.0.1858'] : "YYY", ['hm-rega.0.1864'] : "ZZZ"};
Das wird niemals funktionieren.
Der fehler liegt daran wie du an die Namen kommen möchtest.
Ersetze folgendes:text: humans.dp + " ist abwesend" // durch text: humans[dp.id] + " ist abwesend"
Das sollte funktioneren, ist aber nicht getestet.
-
@sveni_lee sagte:
das Objekt humans nicht so aussehen:
Nein, die ursprüngliche Form war schon richtig, nur dass über die Datenpunkt-ID ([dp.id]) zugegriffen werden muss und nicht über das Datenpunkt-Objekt (dp).
-
okay, also das ganze sieht nun so aus...
var anwesenheit_devices = ["hm-rega.0.1857", "hm-rega.0.1858", "hm-rega.0.1864"]; var online_devices = ["hm-rega.0.1867", "hm-rega.0.1868", "hm-rega.0.1869", "hm-rega.0.1871", "hm-rega.0.1872", "hm-rega.0.1873", "hm-rega.0.1874", "hm-rega.0.1875", "hm-rega.0.1876", "hm-rega.0.1877", "hm-rega.0.1879", "hm-rega.0.1880", "hm-rega.0.1881", "hm-rega.0.1882", "hm-rega.0.1883", "hm-rega.0.1884"]; var str; var humans = {"hm-rega.0.1857" : "XXX", "hm-rega.0.1858" : "YYY", "hm-rega.0.1864" : "ZZZ"}; on(anwesenheit_devices, function(dp) { if(dp.state.val) { var str1 = dp.id; // Reaktionen auf true sendTo("telegram.0", "send", { text: humans[dp.id] + " ist anwesend" }); } else { // Reaktionen auf false sendTo("telegram.0", "send", { text: humans[dp.id] + " ist abwesend" }); } }); on(online_devices, function(dp) { str = dp.common.name; if(dp.state.val) { // Reaktionen auf true sendTo("telegram.0", "send", { text: str.substr(12) + " ist online" }); } else { // Reaktionen auf false sendTo("telegram.0", "send", { text: str.substr(12) + " ist offline" }); } });
Ich warte dann mal bis heute nachmittag jemand nach Hause kommt. ann weiß ich ob es geht.
-
jetzt versuche ich grad in dem zusammenhang eien json-datei auszulesen.
[{"id":290,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:48","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":289,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:47","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":288,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:46","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":287,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:45","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":286,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:43","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":285,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:42","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":284,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:40","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":283,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:38","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":282,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:33","duration":"0:00","count":"","path":"","sym":"x","external":""}, {"id":281,"type":"2","caller":"","called":"SIP: 700000","callednumber":"700000","name":"Unbekannt","numbertype":"sip","device":"","port":"-1","date":"24.06.19 14:29","duration":"0:00","count":"","path":"","sym":"x","external":""}]
jetzt hatte ich folgendes probiert um zu sehen ob etwas augegeben wird:
var objects = JSON.parse(jsonstring); log(objects.id);
aber wird es natürlich nicht. Ich denke ich müsste mit einer Schleife arbeiten aber irgendwie hab ich da grad keine idee...
-
@sveni_lee
Bei dir ist objects ein Array/Liste.
Du musst, wie du gesagt hast, mit einer Schleife alle Einträge durchgehen.for(var i = 0; i<objects.length; i++) { var tempObj = objects[i]; log(tempObj.id); }
-
ja, das hat funktioniert.
ich hab das ganze jetzt mal versuht in ein scrpt zu packen: am ende möchte ich per telegram einen button drücken und dann bekomme ich die entsprechende Liste.
var jsonstring = getState("tr-064-community.0.calllists.missed.json"/*json*/).val; function list_Calls(jsonstring, call_list){ call_list = call_list.split('\r\n'); var objects = JSON.parse(jsonstring); for(var i = 0; i<objects.length; i++) { var tempObj = objects[i]; call_list.unshift(tempObj.date + " " + tempObj.name + " " + tempObj.caller + '\r\n'); } log(call_list); sendTo("telegram.0", "send", { text: call_list }); } list_Calls(jsonstring, "missed calls:");
wenn ich das so mache bekomme ich eine Fehlermeldung von Telegram:
telegram.0 2019-06-25 12:06:59.838 error Cannot send message [chatId - xxxxxxx]: Error: ETELEGRAM: 400 Bad Request: message text is empty javascript.0 2019-06-25 12:06:59.812 info script.js.common.Telegram.Abfrage_Calls: registered 0 subscriptions and 0 schedules javascript.0 2019-06-25 12:06:59.812 debug sendTo "send" to system.adapter.telegram.0 from system.adapter.javascript.0 javascript.0 2019-06-25 12:06:59.811 info ,missed calls: javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:48 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:47 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:46 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:45 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:43 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:42 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:40 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:38 Unbekannt javascript.0 2019-06-25 12:06:59.811 info ,24.06.19 14:33 Unbekannt
lt. Log wird die Variable "call_list" ja erzeugt.
-
@sveni_lee Das problem ist, dass call_list ein Array ist und kein String.
call_list = call_list.split('\r\n');
Das erstellt ein Array und trennt den String nach jeder neuen Zeile.
Lass das weg, dann bleibt es ein String.
Und ersetze dann folglich:call_list.unshift(tempObj.date + " " + tempObj.name + " " + tempObj.caller + '\r\n');
durch
call_list = tempObj.date + " " + tempObj.name + " " + tempObj.caller + '\r\n' + call_list;
Oder... was ach geht:
sendTo("telegram.0", "send", { text: call_list.join("\r\n"); });
(Dann musst du aber das \r\n in "unshift" weglassen, da sonst zwei Zeilenumbrüche entstehen.)
-
ja, das klappt...
aber kann ich irgendwie das "missed calls:" an den Anfang?
-
@sveni_lee Ich würde es so machen:
function list_Calls(){ var jsonstring = getState("tr-064-community.0.calllists.missed.json"/*json*/).val; var call_list = []; var objects = JSON.parse(jsonstring); for(var i = 0; i<objects.length; i++) { var tempObj = objects[i]; call_list.push(tempObj.date + " " + tempObj.name + " " + tempObj.caller); } call_list = call_list.reverse(); log(call_list); sendTo("telegram.0", "send", { text: "missed calls:\r\n\r\n" + call_list.join("\r\n"); }); } list_Calls();
Was es tut:
Es schreibt alle Anrufer in ein Array.
Array umdrehen, damit neue ganz oben stehen.
Array zusammenführen mit einem Zeilenumbruch, davor noch "missed calls" anfügen.Minimaler aufwand, Liste wird bei jedem Funktionsaufruf aktualisiert, keine unnötigen Parameter.