NEWS
Unifi Script
-
Hallo zusammen,
nutzt hier eventuell jemand ein aktuelles script für den unifi adapter 0.70 und javascript 9.0.11 um die geräte in vis 1 anzeigen zu lassen? der unifi adapter läuft problemlos und die geräte werden im adapter unter unifi.0.default.clients angezeigt, hab schon zig Versionen was man so findet ausprobiert, leider lief keine da diese schon älter sind und mit javascript 9.0.11 scheinbar nicht laufen,
-
Hilft das hier?
const devices = $('unifi.0.default.clients.*.is_online').toArray(); const jsonId = '0_userdata.0.Monitoring.Unifi.Devices'; function checkOnline() { let list = []; devices.forEach(function (id) { let deviceName = getState(id.replace('.is_online', '.name')).val; if (!deviceName) deviceName = getState(id.replace('.is_online', '.hostname')).val; const idIP = id.replace('.is_online', '.ip'); const idLastSeen = id.replace('.is_online', '.last_seen_by_uap'); const idMac = id.replace('.is_online', '.mac'); let obj = { "Name": deviceName, "IP": getState(idIP).val, "Online": getState(id).val, "Aktiv": getState(idLastSeen).val, "MAC": existsState(idMac) ? getState(idMac).val : '' }; list.push(obj); }); setState(jsonId, JSON.stringify(list), true); } on({id: devices, change: "ne"}, function(obj) { checkOnline(); }); checkOnline();
-
Naja der javascript 9.x ist ja noch beta und da warte ich lieber auf das release und das changelog und docu, bevor ich meine scripte ändere..
-
@codierknecht
danke aber sollte nicht unter 0_userdata.0. ein Ordner angelegt werden wo die entsprechenden geräte drinnen sind, zumindest finde ich diesen nicht -
@reese1 sagte in Unifi Script:
sollte nicht unter 0_userdata.0. ein Ordner angelegt werden
Alles unter
0_userdata.0
legst Du selbst an. Ich habe dort einen DP0_userdata.0.Monitoring.Unifi.Devices
der das JSON bekommt. Das wertet bei mir dann Grafana aus.Das soll kein fertiges Script sein, sondern als Anregung verstanden werden. Anpassungen auf die eigenen Wünsche sind dort mit Sicherheit noch notwendig.
-
danke dir, hab es hinbekommen, anzeige in vis geht auch
-
@reese1 hallo zusammen, könntet Ihr mir bitte das genauer erklären? Der Adapter holt die DPs, das Script erstellt ein JSON ein nd das wiederum schickt Ihr an Grafana? Benutzt Ihr dort ein fertiges Dashboard ? Sorry, bin verwirrt… danke!
-
genau, der unifi adapter holt sich die Datenpunkte vom Cloud Gateway zb., dass script erstellt ein json in einem von dir erstellten Ordner, diese Daten kannst du dann zb. in vis mit einem table widget oder einem html widget anzeigen lassen, zu grafana kann ich nichts sagen, dass nutze ich nicht,
-
kannst du dein fertiges Script hier zeigen?
-
klar, hier dass script dafür,
const jsonSource = '0_userdata.0.Monitoring.Unifi.Devices'; const jsonPathPrefix = '0_userdata.0.Monitoring.Unifi.DeviceList.'; function updateDeviceList() { const raw = getState(jsonSource).val; if (!raw) return; let list; try { list = JSON.parse(raw); } catch (e) { log('Fehler beim Parsen des JSONs: ' + e, 'error'); return; } list.forEach((device, index) => { const base = jsonPathPrefix + index + '.'; setState(base + 'Name', device.Name || '', true); setState(base + 'IP', device.IP || '', true); setState(base + 'Online', device.Online || false, true); setState(base + 'Aktiv', device.Aktiv || '', true); setState(base + 'MAC', device.MAC || '', true); }); } on({id: jsonSource, change: 'ne'}, updateDeviceList); updateDeviceList();
und hier dass script zum erstellen des entsprechenden Ordner in objekte/0_userdata
// === KONFIGURATION === const jsonId = '0_userdata.0.Monitoring.Unifi.Devices'; const deviceSelector = $('unifi.0.default.clients.*.is_online'); // === Datenpunkt erstellen, falls nicht vorhanden === if (!existsState(jsonId)) { createState(jsonId, { type: 'string', name: 'UniFi Geräteübersicht', read: true, write: true, def: '', role: 'json' }, () => { log('Datenpunkt erstellt: ' + jsonId); checkOnline(); // Direkt nach Erstellung ausführen }); } else { checkOnline(); // Falls vorhanden, direkt starten } // === Hauptfunktion: Geräte einsammeln und JSON schreiben === function checkOnline() { const devices = deviceSelector.toArray(); // Alle .is_online States let list = []; devices.forEach(function (id) { const idBase = id.replace('.is_online', ''); const name = getState(idBase + '.name')?.val || getState(idBase + '.hostname')?.val || 'Unbekannt'; const ip = getState(idBase + '.ip')?.val || ''; const mac = existsState(idBase + '.mac') ? getState(idBase + '.mac').val : ''; const lastSeen = getState(idBase + '.last_seen_by_uap')?.val || null; const online = getState(id)?.val || false; list.push({ "Name": name, "IP": ip, "Online": online, "Aktiv": lastSeen, "MAC": mac }); }); // JSON schreiben setState(jsonId, JSON.stringify(list), true); log('UniFi Geräte-JSON aktualisiert. Anzahl Geräte: ' + list.length, 'info'); } // === Trigger: Bei jeder Änderung eines is_online-Werts neu berechnen === on({ id: deviceSelector, change: "ne" }, function (obj) { checkOnline(); });
so läut es momenten bei mir mit einem table widget in vis 1, ist zwar noch nicht perfekt aber es zeigt schon mal alles an,