NEWS
[gelöst] Über Datenpunkte iterieren und Inhalte auswerten
-
Hi zusammen,
für ein neues Feature in meiner Heimautomation möchte ich mehrere Datenpunkte auswerten, weiß jedoch nicht, wie ich diese im Script greifen kann.
Der Aufbau sieht so aus:unifi.0.default.clients.<mac_1>.essid
unifi.0.default.clients.<mac_1>.last_seen
unifi.0.default.clients.<mac_2>.essid
unifi.0.default.clients.<mac_2>.last_seen
...
unifi.0.default.clients.<mac_n>.essid
unifi.0.default.clients.<mac_n>.last_seenDie Anzahl der Einträge ist unbekannt und kann sich jederzeit ändern. Jeder Eintrag besitzt jedoch immer die gleichen Datenpunkte.
Hintergrund der Frage:
Ich möchte gerne wissen, wieviele Teilnehmer sich aktuell im Gäste-WLAN befinden um in der Automation entsprechend darauf reagieren zu können. Die vorhandenen Datenpunkte reichen dafür leider nicht aus.Kann mir jemand auf die Sprünge helfen, die MAC-Adressen zu greifen und die darunter liegenden Datenpunkte für eine Auswertung heranzuziehen?
Vielen Dank schonmal.
-
@Hiltex sagte:
Die Anzahl der Einträge ist unbekannt und kann sich jederzeit ändern.
Dann müssen zyklisch per $Selector die IDs ermittelt werden.
schedule('* * * * *', function() { let ids = $('unifi.0.default.clients.*.essid'); log('Anzahl Verbindungen: ' + ids.length); ids.each(function(id, i) { log('essid: ' + getState(id).val); log('MAC: ' + id.split('.')[4]); }); });
-
@paul53 Besten Dank, das funktioniert wie gewünscht.
-
Falls das noch jemand gebrauchen kann - hier der Code, der ansich funktioniert.
Muss nur jeder für sich schauen, ob er andere Datenpunkte für die Auswertung heranziehen will, beispielsweiseis_online
. Da teste ich gerade noch, was besser passt. Im Moment frage ich ab, ob der jeweilige Client zuletzt mit dem Gast-WLAN verbunden war und in den letzten 2 Minuten gesehen wurde...In den Adaptereinstellungen kann man das Offset für
is_online
einstellen. Setzt man diesen Wert auf0
ist der Wert nach ca. 2 Minutenfalse
, wenn der Client das WLAN verlassen hat.Das Prinzip der Abfrage dürfte mit diesem Script klar werden.
schedule("*/10 * * * * *", function () { var GuestClients = 0; //WLAN-Clients holen mit Datenpunkt, der immer vorhanden ist let Clients = $('unifi.0.default.clients.*.is_online'); //Clients auswerten Clients.each(function(id, i) { //Datenpunkt abschneiden (Client erzeugen) var Client = id.split('.is_online')[0]; var ClientESSID = Client + '.essid' var ClientLastSeen = Client + '.last_seen_by_uap' //Netzwerknamen des Clients abfragen if (existsState(ClientESSID) && getState(ClientESSID).val == 'tremendous-Guest') { //Letzte Online-Zeit abfragen if (existsState(ClientLastSeen)) { var TimeLastSeen = getDateObject(getState(ClientLastSeen).val).getTime(); var TimeNow = new Date().getTime() //Wenn Client in den letzten 2 Minuten gesehen wurde... if (TimeNow - TimeLastSeen < 120000) { ++GuestClients; } } } }); setState('0_userdata.0.Netzwerk.WLAN.Anzahl_Gäste', GuestClients, true); //log('Gäste im WLAN: ' + GuestClients.toString()); });