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,