<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wuehler</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wuehler"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Wuehler"/>
	<updated>2026-04-04T08:12:20Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=34270</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=34270"/>
		<updated>2020-11-22T21:01:59Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Erkennung neuer clients: Beispiel um SSID und AP erweitert*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
Oder falls man einen [[UnifiClient]] definiert hat:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit [[TelegramBot|Telegram]]-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;Mit zusätzlichen Infos zu SSID und AP:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
defmod UniFi_new_Client DOIF ([UniFi:-UC_newClients] ne &amp;quot;&amp;quot; )\&lt;br /&gt;
{my $host        = ReadingsVal(&amp;quot;UniFi&amp;quot;,&amp;quot;-UC_newClients&amp;quot;,&amp;quot;--&amp;quot;);; ## einlesen Hostname neuer WLAN Client\&lt;br /&gt;
 my $readingSSID = ReadingsVal(&amp;quot;UniFi&amp;quot;,$host.&amp;quot;_essid&amp;quot;,&amp;quot;--&amp;quot;);; ## bauen Reading SSID\&lt;br /&gt;
 my $readingAP   = ReadingsVal(&amp;quot;UniFi&amp;quot;,$host.&amp;quot;_accesspoint&amp;quot;,&amp;quot;--&amp;quot;);; ## bauen Reading AP\&lt;br /&gt;
 my $text = &amp;quot;Neuer WLAN Zugriff von &amp;quot;.$host.&amp;quot; über &amp;quot;.$readingAP.&amp;quot; an &amp;quot;.$readingSSID;; ## vorbereiten Text\&lt;br /&gt;
 fhem(&amp;quot;set TelegramBot msg $text&amp;quot;)} ## Telegram senden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funkscan mit startRFScan ===&lt;br /&gt;
Die Accesspoints von Unifi erlauben eine automatische Kanalwahl. &lt;br /&gt;
&lt;br /&gt;
Besonders dann, wenn der Funkraum mit vielen verschiedenen WLAN-Geräten belegt ist, ist die Auswahl des richtigen Kanals für einen stabilen Funkempfang wichtig. Um den richtigen Kanal zu wählen, sollte aber der vorhandene Funkraum vorher analysiert werden. Unifi erlaubt dies durch den so genannten RFScan, der für jeden einzelnen Accesspoint aufgerufen werden kann (und der dann für die Zeit des Scan von ca 5 Minuten offline ist).&lt;br /&gt;
&lt;br /&gt;
Im Modul wird der Funkscann durch den Befehl&lt;br /&gt;
&amp;lt;pre&amp;gt;set &amp;lt;UnifiModulname&amp;gt; setRFScan &amp;lt;APName&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
sofort ausgelöst. Wenn beispielsweise bei zwei Accesspoints mit den Namen Arbeitszimmer und Keller jeweils Montag Nacht ein Scan ausgelöst werden soll, kann dies mit folgendem DOIF geschehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod MeinScan DOIF ([02:55|Mo]) (set Unifi startRFScan Keller) DOELSEIF ([03:10|Mo]) (set Unifi startRFScan Arbeitszimmer) &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
Edit: Seid März 2019 wird versucht auch disconnected clients nach einem Neustart aus den Readings wiederherzustellen. Damit sollten die clients in den DropDowns vollständig sein.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30606</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30606"/>
		<updated>2019-06-03T18:22:07Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */ Erweiterung des presence-Readings auf wired-Abfrage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Aufgrund der großen Anzahl an Readings bietet es sich an, die Events mittels Attribut &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; einzuschränken.&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
Es bietet sich folgendes stateFormat an:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_usedOnlineTime&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;_f_usergroup_name&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;blocked&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;true&amp;quot;) ? &amp;quot;blocked&amp;quot;:ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder bei Verwendung von ROOMMATE ohne eigenes PRESENCE-Device per userReadings. Da beim verlassen des WLANs das Handy oft als &amp;quot;wired&amp;quot; an den USG o.ä. &amp;quot;übergeben&amp;quot; wird, mit einer zusätzlichen Abfrage auf &amp;lt;code&amp;gt;is_wired&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr &amp;lt;UnifiClientName&amp;gt; userReadings presence {((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;is_wired&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;true&amp;quot;) ? &amp;quot;absent&amp;quot; : ((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;connected&amp;quot;) ? &amp;quot;present&amp;quot;:&amp;quot;absent&amp;quot;));;}&lt;br /&gt;
&lt;br /&gt;
und im Roommate:&lt;br /&gt;
attr &amp;lt;myRoommate&amp;gt; rr_presenceDevice &amp;lt;UnifiClientName&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30568</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30568"/>
		<updated>2019-05-30T09:24:31Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Aufgrund der großen Anzahl an Readings bietet es sich an, die Events mittels Attribut &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; einzuschränken.&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
Es bietet sich folgendes stateFormat an:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_usedOnlineTime&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;_f_usergroup_name&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;blocked&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;true&amp;quot;) ? &amp;quot;blocked&amp;quot;:ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder bei Verwendung von ROOMMATE ohne eigenes PRESENCE-Device per userReadings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr &amp;lt;UnifiClientName&amp;gt; userReadings presence {((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;connected&amp;quot;) ? &amp;quot;present&amp;quot;:&amp;quot;absent&amp;quot;);;}&lt;br /&gt;
&lt;br /&gt;
und im Roommate:&lt;br /&gt;
attr &amp;lt;myRoommate&amp;gt; rr_presenceDevice &amp;lt;UnifiClientName&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30471</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30471"/>
		<updated>2019-05-20T20:22:16Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwendung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Aufgrund der großen Anzahl an Readings bietet es sich an, die Events mittels Attribut &amp;lt;code&amp;gt;event-on-change-reading&amp;lt;/code&amp;gt; einzuschränken.&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
Es bietet sich folgendes stateFormat an:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_usedOnlineTime&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;_f_usergroup_name&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;blocked&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;true&amp;quot;) ? &amp;quot;blocked&amp;quot;:ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30470</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30470"/>
		<updated>2019-05-20T20:17:05Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Online-Zeitsteuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
Es bietet sich folgendes stateFormat an:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_usedOnlineTime&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;_f_usergroup_name&amp;quot;,&amp;quot;? Minuten&amp;quot;).&amp;quot; / &amp;quot;.((ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;blocked&amp;quot;,&amp;quot;?&amp;quot;) eq &amp;quot;true&amp;quot;) ? &amp;quot;blocked&amp;quot;:ReadingsVal(&amp;quot;$name&amp;quot;,&amp;quot;fhem_state&amp;quot;,&amp;quot;?&amp;quot;))}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30469</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30469"/>
		<updated>2019-05-20T19:57:34Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30468</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30468"/>
		<updated>2019-05-20T19:53:48Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Mittels [[PRESENCE]]:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Ressourcennutzung des Unifi-Moduls zu reduzieren kann man im DEF des Unifi-Devices das Update-Intervall hoch setzen und nur einzelne Clients mittels at einzeln updaten:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
defmod updateUnifiClients at +*00:00:10 {\&lt;br /&gt;
  fhem(&amp;quot;set clientName1 update&amp;quot;);;\&lt;br /&gt;
  fhem(&amp;quot;set clientName2 update&amp;quot;);;\&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30467</id>
		<title>UnifiClient</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=UnifiClient&amp;diff=30467"/>
		<updated>2019-05-20T19:38:25Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: Die Seite wurde neu angelegt: „{{Infobox Modul |ModPurpose=Steuerung von Unifi-Clients über FHEM  |ModType=d |ModForumArea=Automatisierung |ModTechName=74_UnifiClient.pm |ModOwner=Wuehler (…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung von Unifi-Clients über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_UnifiClient.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[UnifiClient]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== UnifiModul-Device ===&lt;br /&gt;
Es wird ein [[Unifi]]-Device (als IODev) benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; UnifiClient &amp;lt;clientname in Unifi-Modul&amp;gt; &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Online-Zeitsteuerung ===&lt;br /&gt;
Das Modul versucht die Onlinezeit eines Clients zu berechnen und stellt Attribute bereit, um den client nach dem Verbrauch der Online-Zeit (Attribut maxOnlineMinutesPerDay) entweder zu blocken (default; Achtung Provisionierung) oder in eine andere Usergroup zu verschieben (Attribut blockingUsergroup; ohne Provisionierung).&lt;br /&gt;
Mit dem Attribut treshholdBytesPerMinute kann die Menge an bytes angegeben werden, die ein Client ohne Anrechnung auf die Onlinezeit verbrauchen darf.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30466</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30466"/>
		<updated>2019-05-20T19:29:46Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
Ausserdem gibt es das Unterstützungsmodul [[UnifiClient]], welches alle vorhandenen Informationen zu Clients als Reading bereitstellt und clientspezifische Funktionen zur Verfügung stellt.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
Oder falls man einen [[UnifiClient]] definiert hat:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
Edit: Seid März 2019 wird versucht auch disconnected clients nach einem Neustart aus den Readings wiederherzustellen. Damit sollten die clients in den DropDowns vollständig sein.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30465</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30465"/>
		<updated>2019-05-20T19:27:52Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
Oder falls man einen [[UnifiClient]] definiert hat:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
Edit: Seid März 2019 wird versucht auch disconnected clients nach einem Neustart aus den Readings wiederherzustellen. Damit sollten die clients in den DropDowns vollständig sein.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30464</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30464"/>
		<updated>2019-05-20T19:27:04Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
Oder falls man UnifiClients definiert hat:&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;lt;NAME&amp;gt; PRESENCE event &amp;lt;UnifiClientName&amp;gt;:fhem_state:.disconnected &amp;lt;UnifiClientName&amp;gt;:fhem_state:.connected&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
Edit: Seid März 2019 wird versucht auch disconnected clients nach einem Neustart aus den Readings wiederherzustellen. Damit sollten die clients in den DropDowns vollständig sein.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30463</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30463"/>
		<updated>2019-05-20T19:23:34Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* FAQ */ Wiederherstellung von disconnected clients beschrieben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
Edit: Seid März 2019 wird versucht auch disconnected clients nach einem Neustart aus den Readings wiederherzustellen. Damit sollten die clients in den DropDowns vollständig sein.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30168</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30168"/>
		<updated>2019-04-14T15:56:44Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: Baustelle entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30167</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=30167"/>
		<updated>2019-04-14T15:56:27Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Anwesenheitserkennung */ Baustelle entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29994</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29994"/>
		<updated>2019-03-28T19:15:35Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: FAQ begonnen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== Warum enthält die DropDown-Liste einiger set-/get-Funktionen nicht alle Clients? ===&lt;br /&gt;
Vom UnifiController werden nur die Geräte mitgesendet, die connected sind / die im UnifiController auf der Seite Clients angezeigt werden. Clients, die connected waren, es aber nicht mehr sind - im UnifiController auf der Seite Insights - werden vom Modul aktuell nicht ausgelesen. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29993</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29993"/>
		<updated>2019-03-28T18:46:51Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Voraussetzungen */ Unifi-User beschrieben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Username und Passwort eines Unifi-Controller-Users (siehe [[Unifi#Unifi-User|Unifi-User]])&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
=== Unifi-User ===&lt;br /&gt;
Bei der Definition des Moduls werden username und passwort mit angegeben. Entweder wird der standardmäßig angelegte Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User (unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;) genutzt. Wenn ein neuer User angelegt wird kann dieser z.B. auch ausschließlich read-only-Berechtigungen bekommen. Dies reicht für die Grundfunktion des Unifi-Moduls )Informationen auslesen und in Readings darstellen) aus. Alle set-Funktionen (Ausnahmen: clear, update und updateClient) sowie das Attribut voucherCache benötigen schreibende Rechte im Unifi-Controller .&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29979</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29979"/>
		<updated>2019-03-24T07:24:39Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Attribut customClientReadings */ Hinweis auf get clientData ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Entweder der standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden. Eine Liste der möglichen Readings erhält man mittels &amp;lt;code&amp;gt;get &amp;lt;unifi&amp;gt; clientData all&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29978</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29978"/>
		<updated>2019-03-24T06:37:14Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: /* Attribut customClientReadings */ Korrektur eines Beispiels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem [[autocreate]] UnifiSwitch-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/password: Entweder der standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=en|Anker=Unifi}}&lt;br /&gt;
&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, das entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verfügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll.&lt;br /&gt;
&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var oldcode=0;&lt;br /&gt;
  function setComment(){&lt;br /&gt;
    var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
    if(oldcode!=code){&lt;br /&gt;
      oldcode=code;&lt;br /&gt;
      ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
      ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29961</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29961"/>
		<updated>2019-03-21T22:16:23Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: Port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;settings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte uptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29960</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29960"/>
		<updated>2019-03-21T21:10:51Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: Kategorien hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:IP Components]]&lt;br /&gt;
[[Kategorie:Code Snippets]]&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29959</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29959"/>
		<updated>2019-03-21T21:01:34Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Erkennung neuer clients ===&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29958</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29958"/>
		<updated>2019-03-21T21:00:10Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy und wird in den weiteren Beispielen mit verwendet:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Erkennung neuer clients ====&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29957</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29957"/>
		<updated>2019-03-21T20:56:46Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: Anwendungsfall &amp;quot;Erkennung neuer clients&amp;quot; beschreiben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung in diesem Beispiel ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Erkennung neuer clients ====&lt;br /&gt;
Kleines DOIF mit Telegram-Benachrichtigung:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod di_newClients DOIF ([Unifi:-UC_newClients] ne &amp;quot;&amp;quot; ) (set Telegram message unbekannter WLAN Zugriff:[Unifi:-UC_newClients])&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29956</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29956"/>
		<updated>2019-03-21T20:50:22Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung hier ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Datei:Ftui_vouchercache.png&amp;diff=29955</id>
		<title>Datei:Ftui vouchercache.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Datei:Ftui_vouchercache.png&amp;diff=29955"/>
		<updated>2019-03-21T20:48:43Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29954</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29954"/>
		<updated>2019-03-21T20:48:16Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: erste Beschreibung zur Anwendung des Moduls aufgenommen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Definition ===&lt;br /&gt;
Die Definition erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden. Es ist darauf zu achten, dass das Intervall groß genug ist, so dass auch unter Last nicht vor Ende eines Update-Zyklus ein neuer Update-Zyklus gestartet wird. Dies kann zum Beispiel passieren, wenn FHEM und der Unifi-Controller auf demselben RaspberryPi laufen (interval dann zB auf 90 setzen).&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;br /&gt;
==== Attribut customClientReadings ====&lt;br /&gt;
Mit dem Attribut &amp;lt;code&amp;gt;customClientReadings&amp;lt;/code&amp;gt; können die Readings für Clients individualisiert werden: &lt;br /&gt;
* Der state eines clients kann nicht entfernt werden. D.h. für jeden client wird es ein Reading &amp;lt;clientName&amp;gt; geben, dass entweder den Wert &amp;lt;code&amp;gt;connected&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;disconnected&amp;lt;/code&amp;gt; hat.&lt;br /&gt;
* Es werden die Daten, die der Unifi-Controller zu den Clients vorhält 1:1 als Readings zur Verügung gestellt.&lt;br /&gt;
* Zusätzlich stehen mit dem Präfix _f_ versehen formatierte Werte als Reading zur Verfügung.&lt;br /&gt;
* Wenn der Unifi-Controller einen Wert nicht liefert, so wird auch kein Reading angelegt, selbst wenn dies im Attribut customClientReadings explizit angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung des Attributes gibt es teilweise Abweichungen vom Standardverhalten, die bei einer nachträglichen Verwendung des Attributes ggf. berücksichtigt werden müssen:&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_last_seen wird nicht als Datum formatiert dargestellt, sondern wie vom Unifi-Controller zurückgegeben als Unix-Timestamp.&lt;br /&gt;
* Das Reading &amp;lt;clientName&amp;gt;_hostname kann ggf. auch fehlen. Ohne das Attribut customClientReadings wird bei fehlendem hostname die ip oder &amp;quot;unknown&amp;quot; angezeigt.&lt;br /&gt;
* Das Readings &amp;lt;clientName&amp;gt;_snr entfällt und lautet &amp;lt;clientName&amp;gt;_rssi.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:^mac$|^uptime$&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich ein Reading mit der mac-Adresse und ein Reading mit der uptime (Unix-Timestamp) zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für den Client mit dem Namen &amp;quot;meinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;^meinTelefon$:^mac$ ^seinTelefon$:^mac$&amp;lt;/code&amp;gt; : Stellt nur für die Clients mit dem Namen &amp;quot;meinTelefon&amp;quot; oder &amp;quot;seinTelefon&amp;quot; ein zusätzliches Reading mit der mac-Adresse zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;einTelefon$:^mac$:^mac$&amp;lt;/code&amp;gt; : Stellt für alle Clients, die auf &amp;quot;einTelefon&amp;quot; enden im Client-Namen haben die mac-Adresse zusätzlich zur Verfügung&lt;br /&gt;
* &amp;lt;code&amp;gt;.:uptime&amp;lt;/code&amp;gt; : Stellt für alle Clients zusätzlich einige Readings zur Verfügung, die &amp;quot;uptime&amp;quot; im Namen enthalten. Darunter sind auch formatierte ptimes.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung ===&lt;br /&gt;
Üblicherweise: siehe [[PRESENCE#Beispiel_Anwesenheitserkennung_mittels_UniFi_Controller|PRESENCE]]&lt;br /&gt;
&lt;br /&gt;
{{Todo|weitere Varianten?}}&lt;br /&gt;
&lt;br /&gt;
=== Voucher ===&lt;br /&gt;
{{Todo|Beschreibung aufnehmen}}&lt;br /&gt;
Das Modul kann automatisiert immer eine ausreichende Anzahl an Voucher-Nummern für den Zugang in ein per GuestPortal mit Voucherzugang konfiguriertes WLAN bereithalten.&lt;br /&gt;
Dazu wird das Attribut &amp;lt;code&amp;gt;voucherCache&amp;lt;/code&amp;gt; genutzt. Mit Komma separiert können mehrere Vouchercaches angegeben werden. Je Vouchercache werden vier Attribute mit Leerzeichen getrennt mitgegeben:&lt;br /&gt;
* expire: Ablaufzeit des Vouchers in Minuten&lt;br /&gt;
* quota: Anzahl der Voucher, die mindestens vorgehalten werden (sinnvoller Wert ist &amp;gt;=2)&lt;br /&gt;
* n: Gibt an, wie oft ein einzelner Voucher genutzt werden kann (sinnvoll ist in der Regel der Wert 1)&lt;br /&gt;
* note: der Name des Vouchers. Er darf keine Leerzeichen enthalten und kann z.B. bei einer Auswahl in ftui angezeigt werden.&lt;br /&gt;
Je Vouchercache wird ein Reading -VC_&amp;lt;note&amp;gt; mit dem nächsten noch nicht bzw. am längsten nicht angeforderten Voucher zur Verfügung gestellt. Wenn weniger als &amp;quot;quota&amp;quot;-Voucher zur Verfügung stehen werden &amp;quot;quota&amp;quot; neue Voucher erstellt. Die Maximalanzahl an vorgehaltenen Vouchern beträgt als 2*quota-1.&lt;br /&gt;
&lt;br /&gt;
==== Voucherverwendung aufzeichnen ====&lt;br /&gt;
Dies geschieht außerhalb des Moduls mit einem dummy:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherComment dummy&lt;br /&gt;
attr voucherComment event-on-change-reading comment&lt;br /&gt;
attr voucherComment readingList comment&lt;br /&gt;
attr voucherComment setList comment&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über eine ReadingsHistory kann dies festgehalten werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCacheRH readingsHistory voucherComment:comment&lt;br /&gt;
attr voucherCacheRH nolinks 1&lt;br /&gt;
attr voucherCacheRH rows 10&lt;br /&gt;
attr voucherCacheRH timestampFormat %Y.%m.%d_%H:%M:%S&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und/oder in einem Log speichern:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucherCommentLog FileLog ./log/voucher.log voucherComment:.*&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Voucher bereitstellen ====&lt;br /&gt;
Die Beispiele gehen davon aus, dass auch die Verwendung aufgezeichnet werden soll&lt;br /&gt;
===== über Telegram =====&lt;br /&gt;
Voraussetzung hier ist, dass das Modul msgDialog eingerichtet ist und ein VoucherCache mit der note &amp;quot;2h&amp;quot; konfiguriert wurde:&lt;br /&gt;
&amp;lt;pre&amp;gt;defmod voucher_Dialog msgDialog {\&lt;br /&gt;
  &amp;quot;Voucher&amp;quot;: {\&lt;br /&gt;
    &amp;quot;commands&amp;quot;: [\&lt;br /&gt;
      &amp;quot;{fhem(&#039;set voucherComment comment &#039;.ReadingsVal(&#039;Unifi&#039;,&#039;-VC_2h&#039;,&#039;&#039;).&#039; (2h): $recipient&#039;)}&amp;quot;\&lt;br /&gt;
    ],\&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;{return(&#039;Code: &#039;.fhem(&#039;get Unifi voucher 2h&#039;))}&amp;quot;\&lt;br /&gt;
  }\&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== in FTUI =====&lt;br /&gt;
&lt;br /&gt;
Im head der Seite wird folgender code benötigt:&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;script&amp;gt;&lt;br /&gt;
      var oldcode=0;&lt;br /&gt;
      function setComment(){&lt;br /&gt;
        var code =document.getElementById(&#039;voucherCode&#039;).children[0].value;&lt;br /&gt;
        if(oldcode!=code){&lt;br /&gt;
          oldcode=code;&lt;br /&gt;
          ftui.sendFhemCommand(&#039;get Unifi voucher &#039; + document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text);     &lt;br /&gt;
          ftui.sendFhemCommand(&#039;set voucherComment comment &#039; + code +&#039; (&#039;+document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].options.item(document.getElementById(&#039;voucherCacheNote&#039;).children[0].children[0].selectedIndex).text+&#039;): &#039;+document.getElementById(&#039;comment&#039;).children[0].value);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im body der Seite kann der folgende code verwendet werden. Es wird vorausgesetzt, dass es Vouchercaches mit der note 2h und 3h gibt. &lt;br /&gt;
&lt;br /&gt;
[[Datei:ftui_vouchercache.png|thumb|FTUI-Darstellung]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;li data-row=&amp;quot;18&amp;quot; data-col=&amp;quot;1&amp;quot; data-sizex=&amp;quot;2&amp;quot; data-sizey=&amp;quot;3&amp;quot; class=&amp;quot;semitransparent&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;header&amp;gt;Voucher&amp;lt;/header&amp;gt;&lt;br /&gt;
  Typ:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;select&amp;quot; data-items=&#039;[&amp;quot;-VC_2h&amp;quot;,&amp;quot;-VC_3h&amp;quot;]&#039; data-alias=&#039;[&amp;quot;2h&amp;quot;,&amp;quot;3h&amp;quot;]&#039; id=&amp;quot;voucherCacheNote&amp;quot; class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Kommentar:&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    id=&amp;quot;comment&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  Code: &lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;input&amp;quot;&lt;br /&gt;
    data-device=&amp;quot;Unifi&amp;quot;  &lt;br /&gt;
    data-get=&amp;quot;#voucherCacheNote&amp;quot;&lt;br /&gt;
    id=&amp;quot;voucherCode&amp;quot;&lt;br /&gt;
    class=&amp;quot;notransmit w3x&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div data-type=&amp;quot;link&amp;quot;&lt;br /&gt;
    class=&amp;quot;round notransmit&amp;quot;&lt;br /&gt;
    onclick=&amp;quot;setComment()&amp;quot;&amp;gt;&lt;br /&gt;
   Save&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt; &amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29953</id>
		<title>Unifi</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Unifi&amp;diff=29953"/>
		<updated>2019-03-21T18:52:26Z</updated>

		<summary type="html">&lt;p&gt;Wuehler: Neuanlage der Seite inklusive erster Beschreibung des Moduls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Baustelle}}&lt;br /&gt;
{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung des Unifi-Controllers über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Automatisierung&lt;br /&gt;
|ModTechName=74_Unifi.pm&lt;br /&gt;
|ModOwner=Wuehler ({{Link2FU|Wuehler|Forum}} / [[Benutzer Diskussion:Wuehler|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[Unifi]] ermöglicht die Steuerung eines Unifi-Controllers durch FHEM. Wenn durch den Unifi-Controller auch ein [[UnifiSwitch]] verwaltet wird, so legt das Modul bei aktiviertem autocreate [[UnifiSwitch]]-Devices an.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Unifi-Controller ===&lt;br /&gt;
Es wird eine dauerhaft laufende Unifi-Controller-Software benötigt. Diese kann z.B. auf dem Unifi-Cloud-Key oder selbst installiert z.B. auf einem RaspberryPi laufen.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Die Installation erfolgt mittels &amp;lt;code&amp;gt;define &amp;lt;name&amp;gt; Unifi &amp;lt;ip&amp;gt; &amp;lt;port&amp;gt; &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; [&amp;lt;interval&amp;gt; [&amp;lt;siteID&amp;gt;]] &amp;lt;/code&amp;gt;.&lt;br /&gt;
Dabei ist folgendes zu beachten:&lt;br /&gt;
* ip: Der Unifi-Controller muss eine feste IP-Adresse haben&lt;br /&gt;
* port: port der Adminkonsole des Unifi-Controllers. In der Regel 8443 oder 443.&lt;br /&gt;
* username/passwort: Entweder der Standardmäßig angelegt Admin des Unifi-Controllers, oder besser ein im Unifi-Controller angelegter eigener User, unter &amp;lt;code&amp;gt;setings-&amp;gt; admins -&amp;gt; add new admin&amp;lt;/code&amp;gt;&lt;br /&gt;
* interval: Gibt die Zeit in Sekunden an, nach der das Modul erneut die Daten beim Unifi-Controller abfragt. Default: 30 Sekunden&lt;br /&gt;
* siteID: Üblicherweise und als Default &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit ist die Installation abgeschlossen. Nach kurzer Zeit sollten die ersten Readings angezeigt werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Details siehe Siehe  {{Link2CmdRef|Lang=eb|Anker=Unifi}}&lt;/div&gt;</summary>
		<author><name>Wuehler</name></author>
	</entry>
</feed>