NEWS
[Tipp] Anwesenheit mit unifi-Adapter
-
Ich möchte meine positive Erfahrung mit Anwesenheit und dem unifi-Adapter teilen.
Eine Kombination aus BT-Dongle und Handy anpingen funktioniert bei mir bisher gut, bei meiner Frau sind leider nachts Unterbrechungen, obwohl beides die gleichen Android Handys sind.
Deswegen die folgende zusätzliche Möglichkeit. In orange sieht man die Daten vom Unifi-Adapter und in blau die Kombination aus BT und ping (gegen 23 Uhr umgestellt):
Ich hatte festgestellt, dass solange man im wlan des unifi ist, der Wert des clients _uptime_by_uap stetig steigt (logisch).Das folgende Script schaut nun alle zwei Minuten, ob der Wert von _uptime_by_uap zwei Minuten nicht mehr geändert hat. Wenn er sich nicht ändert wird die Variable false. Vielleicht bringt es bei jemanden auch den gewünschten Effekt.
-
Auch ein Ansatz. Ich habe damit auch herumgespielt und hier http://forum.iobroker.net/viewtopic.php … ifi#p90821 meinen Ansatz hingeschrieben.
Ob technisch gesehen deine Abfrage alle zwei Minuten oder meine Timeoutvariante ressourcenschonender sind o.ae. habe ich aber keine Ahnung…
-
Hallo,
das liest sich ja super.
Hier gibt es noch einen weiteren Ansatz über lastseen: http://forum.iobroker.net/viewtopic.php … 100#p90821
und im gleichen Thread auch noch diesen, der einen extra Bibliothek im javascript-Adapter benötigt (etwas aufwendiger): http://forum.iobroker.net/viewtopic.php ... =80#p87286
Kannst du mir dein Blockly Script als Javascript ausgeben? Ich würde es gern bei mir auch testen.
Danke,
Pix
EDIT: Da war jemand schneller ...
-
@pix:Kannst du mir dein Blockly Script als Javascript ausgeben? Ich würde es gern bei mir auch testen. `
Gerne :createState("Variablen.SIE_UAP", function () { }); schedule("*/2 * * * *", function () { if (getState("unifi.0.default.clients.c0:ee:fb:fd:ef:68._uptime_by_uap").lc - ((new Date().getTime()) - 120000) < 0 == true) { setState("javascript.0.Variablen.SIE_UAP"/*Variablen.SIE_UAP*/, false); } else { setState("javascript.0.Variablen.SIE_UAP"/*Variablen.SIE_UAP*/, true); } });
-
Hallo,
vielen Dank für das Skript.
Ich habe es für meine Zwecke angepasst und will das auch hier teilen.
Meine Zwecke heisst: Mehrere Nutzer. Dazu werden die Daten der Nutzer oben im Objekt wificlients eingegeben, Skript macht den Rest.
Unter
javascript.[instanz].Unifi.Anwesenheit.UAP.[Name_des_Nutzers]
wird dann der Status true oder false gesetzt. Dieser Datenpunkt wird dann mit History/Influx geloggt.
/* Weiteres Skript zur Überwachung des Uptime Datenpunktes im Unifi-Adapter fragt alle zwei Minuten den Datenpunkt _uptime_by_uap des eingebuchten Gerätes ab wenn keine Änderung, dann Anwesenheit = false 18.10.2017 erstellt von lobomau auf Basis des Unifi Adapters von jens_maus http://forum.iobroker.net/viewtopic.php?f=30&t=8556#p90883 19.10.2017 angepasst von Pix (mehrere Geräte) */ const wificlients = { "devices": [ { "nutzer": "Tom", "mac": "8a:8b:8c:8f:8g:ab", "name": "Kater's iPhone", "geraet": "iPhone" }, { "nutzer": "Jerry", "mac": "e1:e2:e3:e4:e5:e6", "name": "Maeusephone", "geraet": "iPhone" } ] // Ende devices }; const logging = false; const fC = false; // forceCreation für createState // Ab hier nix mehr ändern ++++++++++++++++++++++ function createStates() { for (var j=0; j<wificlients.devices.length; j++) { var idUAP = "javascript." + instance + ".Unifi.Anwesenheit.UAP." + wificlients.devices[j].nutzer; createState(idUAP, false, fC, { name: 'WLAN Anwesenheit (UAP) - ' + wificlients.devices[j].nutzer, desc: 'Anwesenheit über Uptime-Datenpunkt des Unifi Adapters', type: 'boolean', def: false, role: 'indicator', custom: { "influxdb.0": { "enabled": true, "changesOnly": false, "debounce": "", "retention": 63072000 // 2 Jahre } } }); } } function checkUAP () { for (var i=0; i<wificlients.devices.length; i++) { // UAP abfragen var lchange = getState("unifi.0.default.clients." + wificlients.devices[i].mac + "._uptime_by_uap").lc; var uap_anwesenheit = (lchange - ((new Date().getTime()) - 120000) < 0 === true) ? false : true; if (logging) log('Gerät ' + wificlients.devices[i].geraet + ' von ' + wificlients.devices[i].nutzer + ' ist ' + uap_anwesenheit); // Datenpunkt verzögert beschreiben var idUAP = "javascript." + instance + ".Unifi.Anwesenheit.UAP." + wificlients.devices[i].nutzer; setStateDelayed(idUAP, uap_anwesenheit, 1000); } } // alle 2min schedule("*/2 * * * *", checkUAP); // bei Skriptstart createStates(); // Datenpunkte erstmal anlegen setTimeout(function() { // 2s verzögert Abfrage erstmals ausführen checkUAP(); }, 2*1000);
Viel Spaß,
Gruß
Pix -
@pix:Hallo,
vielen Dank für das Skript.
Ich habe es für meine Zwecke angepasst und will das auch hier teilen.
Meine Zwecke heisst: Mehrere Nutzer. Dazu werden die Daten der Nutzer oben im Objekt wificlients eingegeben, Skript macht den Rest.
Unter
javascript.[instanz].Unifi.Anwesenheit.UAP.[Name_des_Nutzers]
wird dann der Status true oder false gesetzt. Dieser Datenpunkt wird dann mit History/Influx geloggt.
/* Weiteres Skript zur Überwachung des Uptime Datenpunktes im Unifi-Adapter >! fragt alle zwei Minuten den Datenpunkt _uptime_by_uap des eingebuchten Gerätes ab wenn keine Änderung, dann Anwesenheit = false >! 18.10.2017 erstellt von lobomau auf Basis des Unifi Adapters von jens_maus http://forum.iobroker.net/viewtopic.php?f=30&t=8556#p90883 19.10.2017 angepasst von Pix (mehrere Geräte) >! */ >! const wificlients = { "devices": [ { "nutzer": "Tom", "mac": "8a:8b:8c:8f:8g:ab", "name": "Kater's iPhone", "geraet": "iPhone" }, { "nutzer": "Jerry", "mac": "e1:e2:e3:e4:e5:e6", "name": "Maeusephone", "geraet": "iPhone" } ] // Ende devices }; >! const logging = false; const fC = false; // forceCreation für createState >! // Ab hier nix mehr ändern ++++++++++++++++++++++ >! function createStates() { for (var j=0; j<wificlients.devices.length; 0="==" 2/63072000/j++)/{/var/iduap="javascript." +/instance/".unifi.anwesenheit.uap."/wificlients.devices[j].nutzer;/createstate(iduap,/false,/fc,/name:/'wlan/anwesenheit/(uap)/-/'/wificlients.devices[j].nutzer,/desc:/'anwesenheit/über/uptime-datenpunkt/des/unifi/adapters',/type:/'boolean',/def:/role:/'indicator',/custom:/"influxdb.0":/"enabled":/true,/"changesonly":/"debounce":/"",/"retention":/jahre/}/});/function/checkuap/()/for/(var/i="0;" i<wificlients.devices.length;/i++)/uap/abfragen/lchange="getState("unifi.0.default.clients."" wificlients.devices[i].mac/"._uptime_by_uap").lc;/uap_anwesenheit="(lchange" ((new/date().gettime())/120000)/</true)/?/false/:/true;/if/(logging)/log('gerät/wificlients.devices[i].geraet/von/wificlients.devices[i].nutzer/ist/uap_anwesenheit);/datenpunkt/verzögert/beschreiben/wificlients.devices[i].nutzer;/setstatedelayed(iduap,/uap_anwesenheit,/1000);/alle/2min/schedule("*/*/*",/checkuap);/bei/skriptstart/createstates();/datenpunkte/erstmal/anlegen/settimeout(function()/2s/abfrage/erstmals/ausführen/checkuap();/},/2*1000);/<e=""></wificlients.devices.length;
Viel Spaß,
Gruß
PixDanke für das Script. Habe es gleich ausprobiert. Die beiden Handy werden korrekt wiedergegeben, das eine true, das andere false.
Was auffällt: die Zahnräder zum Einstellen der state settings war bereits blau, dann wollte ich es Anklicken zum loggen. Das wird aber nicht gesichert, ich kann also nicht loggen. Die states sind übrigens rot... hin und wieder werden sie kurz grün.
Ich habe es auf javascript.1-instanz laufen und habe die Pfade in Zeile 36 und 64 für mich angepasst. -
Vielen Dank allen Beteiligten für das Script.
Hatte auch die selben Probleme wie von Lobomau beschrieben. Habe bei meinem SQL History Adapter nach Fehlern gesucht, bis ich dann (leider erst am Ende) Dein Script genauer angeschaut habe.
Da ist mir aufgefallen das Du es, wie Du schreibst "für Dich angepasst hast". Sprich Du hast die Aufzeichnung schon drinnen aber eben auf Basis vom InfluxDB History Adapter .
Habe dann bei mir den entsprechenden Teil einfach entfernt, den bestehenden States-Zweig nochmal gelöscht und gut war es (@Lobomau: dürfte auch die Lösung für deine Frage sein).
custom: { "influxdb.0": { "enabled": true, "changesOnly": false, "debounce": "", "retention": 63072000 // 2 Jahre } }
Hätte ich mir nur Deinen Code vorher genauer angeschaut. Hätte mir einiges an Zeit erspart.
Aber auch hier, habe ich wieder daraus gelernt :mrgreen:
Gruß
Roland
-
hallo und frohe Ostern euch allen noch,
ich bin auf der Suche nach einer Anwesenheitssteuerung auf diesen Post gekommen.
Ich wollte mir das Blockly skript aus dem ersten Post nachbauen…..
Ich blick es aber gerade nicht so ganz, ich hab alles gefunden (glaube ich zumindest)
bis auf den in meinem Bild eingekreisten Teil.....
Kann mir vielleicht jemand sagen was das ist? Würde mich sehr freuen.
Österliche Grüße
FloH
-
Das ist ein Minus. Findest bei Mathematik, zweites von oben.
-
Hey,
vielen Dank genau das war es!
Hatte es gestern auch zum laufen bekommen
zusammen mit einer Pushover Meldung.
Die ist dann allerdings auch alle 2 Minuten gekommen…...
Script deaktiviert und was passiert?
Die Meldung kommt trotzdem alle 2 Minuten....
Sogar nach Löschen des Scriptes, nur ein Neustart hat den Fehler behoben.
Hab es dann heute nochmals ohne Pushover versucht, da lief dann gar nix mehr.
Muss mich die Tage noch mal ganz in Ruhe da dran setzen.
Gruß
FloH
-
Eigentlich sollte die pushover Meldung nicht mehr kommen, wenn man das Script abschaltet. Wahrscheinlich läuft da was weiter, was man nicht so sieht. Aber das Script scheint ja nicht ganz korrekt zu sein… du willst ja nicht alle 2 min. eine Meldung erhalten, sondern nur wenn sich die Ab/Anwesenheit ändert. Kannst einfach einen Block dadrunter machen wo der Trigger dann die Änderung der AN/Abwesenheit ist.
-
So ich habs jetzt noch ein paar mal in verschiedenen Variationen probiert.
Hab sogar IoBroker neu aufgesetzt, laufen tut aber gar nichts mehr….
Aktuell sieht es bei mir so aus, aber laufen tut nix....
Ich hatte auch noch eine Variante mit der Sperre damit ich nicht alle zwei Minuten die
Meldung bekomme, geht wie alles andere auch nicht….
filename="Blockly AnwTest.jpg" index="0">~~Gibt es eine Möglichkeit zu testen ob Skripte laufen?Testskripte um die allgemeine Funktion zu testen?
Gruß
FloH
-
Hallo Pix,
könntest du dein JS-Script hier noch mal zur Verfügung stellen ?
Ich kenne mich mit dem neu gestalteten Forum noch nicht aus, habe aber den Eindruck
das die Scripte von der Darstellung "verrissen" sind. -
@IanS sagte in [Tipp] Anwesenheit mit unifi-Adapter:
So ich habs jetzt noch ein paar mal in verschiedenen Variationen probiert.
Hab sogar IoBroker neu aufgesetzt, laufen tut aber gar nichts mehr….
Aktuell sieht es bei mir so aus, aber laufen tut nix....
Ich hatte auch noch eine Variante mit der Sperre damit ich nicht alle zwei Minuten die
Meldung bekomme, geht wie alles andere auch nicht….
filename="Blockly AnwTest.jpg" index="0">~~Gibt es eine Möglichkeit zu testen ob Skripte laufen?Testskripte um die allgemeine Funktion zu testen?
Gruß
FloH
Ich habe dein Skript nachgebaut und habe exakt die gleiche Reaktionen des System. Skript längst angepasst.
Dennoch kommen die Pushmitteilungen immer noch. Selbst wenn das Skript deaktiviert ist. Hast du dafür mittlerweile eine Lösung gefunden?Darüberhinaus scheint der unifi Adapter sehr CPU intensiv zu sein. In der Spitze zieht der Adapter > 90% der CPU Kapazität.
Habt ihr ähnliches festgestellt? -
@ahfreezer Nein, 90% kann ich nicht bestätigen. Es ist aber schon Mal so, dass bei mir kein anderer Adapter so viele Objekte anlegt.
Welches Aktualisierungsintervall hast du eingestellt und auf welcher Hardware läuft ioBroker. Wie stellst du die 90% fest? -
Wegen der puren menge an Objekten und Datenpunkten, die der unifi-Adapter bei mir angelegt hat, bin ich den Umweg über FHEM gegangen. Dort kann ich im unifi-Adapter gezielt die Geräte rausfiltern mit den Daten, die mich interessieren und dann nur die via MQTT an den iobroker weiterschieben. Somit habe ich im iobroker nur die unifi-Datenpunkte, die ich benötige. Bissle umständlich, aber FHEM läuft bei mir eh nebenher wegen zwei CULs und Geräten, die der CUL-Adapter von iobroker nicht kann. Und obe jtzt auf nem NUC eine VM mehr oder weniger läuft...
Gruss, Jürgen
-
@Wildbill sagte in [Tipp] Anwesenheit mit unifi-Adapter:
Wegen der puren menge an Objekten und Datenpunkten, die der unifi-Adapter bei mir angelegt hat, bin ich den Umweg über FHEM gegangen. Dort kann ich im unifi-Adapter gezielt die Geräte rausfiltern mit den Daten, die mich interessieren und dann nur die via MQTT an den iobroker weiterschieben. Somit habe ich im iobroker nur die unifi-Datenpunkte, die ich benötige. Bissle umständlich, aber FHEM läuft bei mir eh nebenher wegen zwei CULs und Geräten, die der CUL-Adapter von iobroker nicht kann. Und obe jtzt auf nem NUC eine VM mehr oder weniger läuft...
Gruss, Jürgen
Ja...FHEM hatte ich ursprünglich auch parallel laufen, habe mich nach einem Hardwareschaden dann dazu entschieden nur noch ioBroker zu nutzen. Mich interessieren für meine Steuerung nur die Daten zu den Endgeräten im USG von Unifi. Wäre klasse, wenn man das noch parametrieren könnte im Adapter.
-
@lobomau sagte in [Tipp] Anwesenheit mit unifi-Adapter:
@ahfreezer Nein, 90% kann ich nicht bestätigen. Es ist aber schon Mal so, dass bei mir kein anderer Adapter so viele Objekte anlegt.
Welches Aktualisierungsintervall hast du eingestellt und auf welcher Hardware läuft ioBroker. Wie stellst du die 90% fest?Ich habe auf Grund der hohen Auslastung das Intervall auf 2min gesetzt (Standard 60sek)
Da ich aber zeitnah Trigger für die Abwesenheit haben möchte, wollte ich nicht mehr als 2min warten.ioBroker läuft bei mir auf einem HP ThinClient mit einem Intel Atom N280 (2x 1,66GhZ) und 2 RAM
Bis dato vollkommen ausreichend.Die 90% habe ich gesehen, als ich per SSH und "TOP" mir die "Verbraucher" angeschaut habe. Die Last liegt immer so bei 10-20% (abhängig welcher Adapter gerade arbeitet. Sobald unifi durchstartet steigt die Last wie folgt.
Hab leider nicht den Peak getroffen
Wenn unifi durch ist sieht es dann wieder so aus. Komisch finde ich, dass trotz intervall auf 2min unifi all 30 Sekunden die Last erzeugt.
-
@ahfreezer sagte in [Tipp] Anwesenheit mit unifi-Adapter:
Sobald unifi durchstartet steigt die Last wie folgt.
Also nur beim "anfahren"?
Ich habe es gerade mal bei meiner Installation gecheckt:
Der Unify Adapter baruch zwar nach dem Controller die meisten Ressourcen, ist aber (im Lauf) gerade mal 0,6% eines CPU-Kerns.Das ganze läuft in einer Proxmox VM auf einem NUC6i3
Der Unify-controller läuft da auf einer zweiten VMDas Abfrageintervall beträgt 60sekunden
-
@Homoran sagte in [Tipp] Anwesenheit mit unifi-Adapter:
Also nur beim "anfahren"?
Immer dann, wenn er die Daten neu abholt. Also stand jetzt alle 2min der Peak.
Guck mal zur Laufzeit, wenn er gerade die Daten zieht ob's dann auch die 0,6% sind oder im Verhältnis zu deinem deutlich performanteren Rechner auch eine (deutliche) Steigerung sichtbar ist.