http://wiki.fhem.de/w/api.php?action=feedcontributions&user=Sailor&feedformat=atomFHEMWiki - Benutzerbeiträge [de]2024-03-28T13:54:17ZBenutzerbeiträgeMediaWiki 1.39.3http://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&diff=39208FHEM Connector für Amazon Alexa2024-03-27T17:03:22Z<p>Sailor: /* Finale: Skill verknüpfen */</p>
<hr />
<div>'''Alexa FHEMlazy''' war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als '''FHEM Connector''' verfügbar ist.<br />
<br />
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):<br />
<br />
* SONOS Beam und SONOS One <br />
<br />
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).<br />
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. <br />
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt<br />
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server<br />
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite<br />
* Als Skill bei Amazon wird der Skill "FHEM Connector" verwendet.<br />
<br />
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.<br />
{{Infobox Modul<br />
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa<br />
|ModType=h<br />
|ModCmdRef=alexa<br />
|ModTechName=39_alexa.pm / alexa-fhem<br />
|ModForumArea=Frontends/Sprachsteuerung<br />
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])<br />
}} <br />
==Einführung==<br />
===Arbeitsweise und Datenfluss===<br />
Vorläufig ist alexa-fhem im "FHEM Connector-Modus" ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].<br />
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann "Alexa, wie ist die Temperatur im Wohnzimmer?", während andere Skills zunächst explizit angesprochen werden müssen ("Alexa, frage FHEM nach der Temperatur im Wohnzimmer"). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.<br />
<br />
Gehen wir den Datenfluss bei der konkreten Frage "Wie ist die Temperatur im Wohnzimmer?" durch:<br />
* Alexa hat bei der Skillinstallation gelernt, dass "FHEM Connector" bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von "Alexa Voice Service" in der Cloud erkannt, dass eine Abfrage an "FHEM Connector" erfolgversprechend ist.<br />
* Zunächst wird die zentrale "Lambda-Funktion" von "FHEM Connector" aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte "Bearer-Token".<br />
* Der "Vereinsserver" prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.<br />
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.<br />
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests "lauscht". In der Original-Version [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei "FHEM Connector" kommen sie ausschließlich aus dem SSH-Tunnel von lokal.<br />
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.<br />
* FHEM führt den Befehl aus<br />
<br />
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.<br />
<br />
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.<br />
<br />
==Installation==<br />
<br />
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.<br />
<br />
===node.js installieren===<br />
<br />
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo apt-get install nodejs npm<br />
</syntaxhighlight><br />
<br />
kannst Du es installieren. Mit <br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
node --version<br />
</syntaxhighlight><br />
<br />
erfährst Du die aktuelle Version - wenn hier etwas mit "8" oder höher vorneweg erscheint, ist alles gut.<br />
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.<br />
<br />
'''Anmerkung:''' diese Aussage bzgl. node-Version (und Jessie/Stretch) stimmt wohl für alexa-fhem Stand heute (12.06.2020) nicht mehr, siehe https://forum.fhem.de/index.php/topic,112025.msg1063218.html#msg1063218<br />
<br />
=== Alexa-FHEM installieren ===<br />
<br />
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo npm install -g alexa-fhem<br />
</syntaxhighlight><br />
<br />
Der Vorgang benötigt etwas Zeit.<br />
<br />
=== Alexa-FHEM aktivieren ===<br />
<br />
Wechsele jetzt in FHEM-Web!<br />
<br />
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:<br />
Speichern der Config nicht vergessen, und<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
update<br />
shutdown restart<br />
</syntaxhighlight><br />
<br />
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
define alexa alexa<br />
</syntaxhighlight><br />
<br />
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:<br />
<br />
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert<br />
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.<br />
* Du wirst auf dem Server "va-fhem.fhem.de" des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.<br />
<br />
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und <br />
ungefähr so aussehen:<br />
<br />
[[Datei:Alexa-Device-2.png|800px]]<br />
<br />
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM.bearerToken crypt:...<br />
alexaFHEM.skillRegKey crypt:...<br />
</syntaxhighlight><br />
<br />
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
get <alexa> proxyKey<br />
</syntaxhighlight><br />
<br />
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.<br />
<br />
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte "bearerToken" zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.<br />
<br />
==== Fehler bei der Aktivierung ====<br />
<br />
Während kompliziertere Fehlerfälle im Abschnitt "Mögliche Probleme und Lösungen" behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:<br />
<br />
* Zuerst bitte einfach einmal die Seite neu laden.<br />
<br />
===== 401: Authorization Required =====<br />
<br />
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required<br />
</syntaxhighlight><br />
<br />
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt "alexaFHEM-auth" auswählen, User/Passwort mit ":" getrennt angeben und "attr" anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
attr alexa alexaFHEM-auth user:pass<br />
</syntaxhighlight><br />
<br />
===== Permission denied =====<br />
<br />
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis "/opt/fhem/.ssh/" von dir bei der Arbeit mit "root" oder "sudo" mit den falschen Berechtigungen versehen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied<br />
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied<br />
</syntaxhighlight><br />
<br />
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
ls -l /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Du solltest dann folgende Ausgabe erhalten:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
insgesamt 12<br />
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa<br />
-rw-r--r-- 1 fhem dialout 391 Jul 12 13:10 id_rsa.pub<br />
-rw-r--r-- 1 fhem dialout 884 Jul 12 13:10 known_hosts<br />
</syntaxhighlight><br />
<br />
Steht in der Ausgabe nicht "fhem dialout" (dein fhem User), sondern bspw. "root root", dann bspw. mit folgendem Befehl an deinen fhem User anpassen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
chown fhem:dialout /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Mit dem ersten Befehl "ls -l ..." kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. <br />
<br />
===== weitere Prüfungen =====<br />
<br />
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ps -ef | egrep '(alexa|ssh)'<br />
</syntaxhighlight><br />
<br />
sollte Dir idealerweise so etwas anzeigen:<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
fhem 31322 1 99 13:56 ? 00:00:03 alexa <br />
fhem 31332 31322 8 13:56 ? 00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:<zufälliger port> -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de<br />
</syntaxhighlight><br />
<br />
"alexa" ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.<br />
<br />
Wenn Du diese Prozesse '''nicht''' siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.<br />
<br />
Im Logfile (über den link <code>Logfile</code> in der Detail-Ansicht über <code>set</code>, oder über den Namen bei ''currentlogfile'' in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.<br />
<br />
=== Geräte im FHEM-Webfrontend zuweisen ===<br />
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!<br />
<br />
Wähle die Geräte aus, rufe sie auf und setze das Attribut "alexaName". Hierbei in Kürze nur der Hinweis:<br />
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.<br />
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern "handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal".<br />
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch <s>Strichpunkt</s> Komma getrennt<ref>Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}</ref>.<br />
* Das Attribut "alexaRoom" ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].<br />
<br />
Lade die Geräte neu in die Software, indem Du <code>set <alexa> restart</code> ausführst!<br />
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]<br />
<br />
'''Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:'''<br />
<br />
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter "Edit Files") passt.<br />
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.<br />
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.<br />
Ob der Filter entsprechend funktioniert kann man wie folgt testen: ''list Filtereinstellung'' beispiel mit Standardfilter: ''list alexaName=..*''<br />
<br />
* Hat alexa-fhem per Filter Devices aus fhem "gefunden", geht es weiter mit der "Erkennung". Also um welches Device (Typ und "Fähigkeiten") handelt es sich. Dazu gilt folgendes:<br />
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).<br />
** sind entsprechende "set-Befehle" erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein ''setList'' mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.<br />
** wird das Device nicht richtig oder "unvollständig" erkannt helfen folgende Attribute:<br />
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung "geschubbst" werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per "Drop-Down" erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: ''attr Devicename genericDeviceType media''<br />
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: <syntaxhighlight lang="bash" style="width:50%;"><br />
attr <thermostat> homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature<br />
</syntaxhighlight> [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]<br />
<br />
<br>'''Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.'''<br><br />
Die Namen werden durch <s>Strichpunkt</s> Komma getrennt.<br><br />
Beispiel:<br><br />
<code>attr dmLampe alexaName Lichtkuppel,Lichtkugel</code><br />
<br />
<br />
'''Anmerkung bzgl. genericDeviceType und homebridgeMapping:'''<br><br />
* diese Attribute werden von verschiedenen "Sprachsteuerungsmodulen" in fhem verwendet (homebridge [dort wurde es "erfunden"], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle "Dienste" verwendbar. Ausprobieren schadet aber nicht.<br />
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so "missbraucht") nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): "Alexa, fahre den Rollo hoch/runter". Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]<br />
<br />
== Finale: Skill verknüpfen ==<br />
Suche auf der Alexa-App den Skill "FHEM Connector".<br />
<br />
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.<br />
<br />
Sobald Du "FHEM Connector" aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:<br /><BR><br />
[[Datei:FHEMlazy_login.png|240px]]<br />
<br />
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein, den du mittels "get alexa proxyKey" erhalten hast, und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:<br /><br />
[[Datei:FHEMlazy_check.png|240px]]<br />
<br />
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).<br />
<br />
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.<br />
<br />
Ist alles okay, klicke rechts den Button "Activate Skill". Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.<br />
<br />
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.<br />
<br />
== Was geht alles ? ==<br />
<br />
* Geräte, die sich ein- und ausschalten lassen:<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** dummys müssen <code>setList</code> mit on und off haben<br />
** Über <code>genericDeviceType</code> switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.<br />
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=<ein>,cmdOff=<aus> setzen<br />
** Kommandos:<br />
***Alexa, schalte <name> ein/aus<br />
***Alexa, Licht an/aus<br />
***Alexa, schalte <gruppe> ein/aus<br />
* Geräte, die eine Temperatur messen<br />
** Automatisch: Es muss ein Reading <code>temperature</code> geben<br />
** Über <code>genericDeviceType</code> thermometer<br />
** Sonst: homebridgeMapping CurrentTemperature:reading=<reading><br />
<br />
* Geräte, deren Helligkeit sich ändern lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** Über <code>genericDeviceType</code> light<br />
** Über homebridgeMapping: Wenn <code>helligkeit</code> das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit <code>set <device> prozent xxx</code> gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=<maximalwert><br />
** Kommandos:<br />
*** Alexa, mache <name> heller/dunkler<br />
*** Alexa, Licht heller/dunkler<br />
* Geräte, deren Farbe sich ändern lässt<br />
** ...<br />
<br />
* Geräte, deren Farbtemperatur sich ändern lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich eine Lautstärke einstellen lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** ...<br />
<br />
* elektrische Türschlösser<br />
** <code>genericDeviceType</code>: lock<br />
** homebridgeMapping mit LockCurrentState und LockTargetState<br />
<br />
* Thermostate<br />
** Über <code>genericDeviceType</code> thermostate<br />
** ...<br />
<br />
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)<br />
** können mit <code>genericDeviceType</code> scene als Szene eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer structure lassen sich ein- und ausschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)<br />
** können mit <code>genericDeviceType</code> scene als Szenen eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer LightScene lassen sich nur einschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping ChannelController:reading=<reading>,cmd=<cmd><br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel<br />
** ...<br />
<br />
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery<br />
** ...<br />
<br />
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping InputController:reading=<reading>,cmd=<cmd>,values=HDMI+1;HDMI+2;XBOX<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input<br />
** ...<br />
<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.15)<br />
** Über <code>genericDeviceType</code> contact<br />
** homebridgeMapping ContactSensorState:reading=<reading> oder CurrentDoorState:reading=<reading><br />
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.<br />
<br />
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)<br />
** Über <code>genericDeviceType</code> speaker<br />
** Automatisch: es muss ein Reading <code>volume</code> und/oder <code>mute</code> geben<br />
** homebridgeMapping Volume:reading=<reading>,cmd=<cmd> Mute:reading=<reading>,cmd=<cmd><br />
** ...<br />
<br />
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)<br />
** Über <code>genericDeviceType</code> scene<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** homebridgeMapping On:reading=<reading>,cmdOn=<cmd>[,cmdOff=<cmd>]<br />
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
* Rollläden. Lange ein Problemthema, das nur mit "Schalte auf 0%, schalte auf 100% lief". Wichtig: "alexa-fhem" ab Version 0.5.39 einsetzen. GenericDevice-Type auf "blind" setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:<br />
** "..., öffne <Name> ganz"<br />
** "..., schließe <Name> komplett"<br />
** "hoch" und "runter" (ohne "ganz" oder "komplett") schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit <code>attr <name> homebridgeMapping TargetPosition:minStep=<wert></code>geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.47)<br />
** Automatisch wenn ein Reading <code>motion</code> vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt<br />
** Über <code>genericDeviceType</code> MotionSensor<br />
** homebridgeMapping MotionDetected:reading=<reading>,values=<wert für bewgung>:1;<wert für keine bewegung>:0<br />
<br />
* Alarmmelder (noch nicht in Deutschland):<br />
** genericDeviceType Security<br />
** homebridgeMapping Alarm=<reading>[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]<br />
** wenn der type nicht angegeben wird ist fireAlarm der default<br />
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.<br />
*Geräte mit mehrstufigen Modi:<br />
**siehe den zugehörigen Thread im Forum: {{Link2Forum|Topic= 125604}}<br />
<br />
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.<br />
<br />
to be continued ...<br />
<br />
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.<br />
<br />
=== Aktiv Routinen starten ===<br />
Routinen (eine Funktionalität, die rein - genauso wie "Räume" - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: "Meine Frau möchte aber '''Öffne Rollläden''<nowiki/>' sagen": In der Alexa-App gibt es im Menü den Punkt "Routinen", und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.<br />
<br />
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul "echodevice", aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie <br />
<br />
''"Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten"'' <br />
<br />
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.<br />
<br />
'''Vorgeschichte''':<br />
<br />
Die Smarthome-Skill-API von Amazon sah schon lange das "proactiveReporting" vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? <br />
<br />
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von ''Bewegungssensoren'' und ''Fensterkontakten'' als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.<br />
<br />
'''Umsetzung''':<br />
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut "alexaProactiveEvents" mit einer "1" versehen. Per Default wird ''kein'' Gerät laufend aktiv zu Amazon gepusht!<br />
* das geänderte Device einmal zu Amazon pushen "set <alexa> add <device>" (oder 'Alexa, suche neue Geräte' murmeln)<br />
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine ("Neue Routine", "Wenn Folgendes passiert", "Smart Home") als möglicher Triggerpunkt erscheinen.<br />
<br />
==== Dummygeräte: ====<br />
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
define voicetrigger1 dummy<br />
attr voicetrigger1 alexaName alle Fenster<br />
attr voicetrigger1 alexaProactiveEvents 1<br />
attr voicetrigger1 genericDeviceType contact<br />
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED<br />
attr voicetrigger1 setList open closed<br />
<br />
set alexa add voicetrigger1<br />
set alexa restart<br />
</syntaxhighlight><br />
<br />
'''Fehlersuche:'''<br />
<br />
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:<br />
<br />
<code>failed to refresh token: invalid_grant: 'The request has an invalid grant parameter : refresh_token'</code><br />
<br />
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:<br />
* Löschen des ".eventToken" im Alexa-Device über "deletereading"<br />
* "FHEM-Connector"-Skill auf "alexa.amazon.de" einmal deaktivieren und dann neu verbinden<br />
<br />
== Mögliche Probleme und Lösungen ==<br />
<br />
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. <br />
<br />
=== Fehlersuche über die FHEM-Oberfläche ===<br />
<br />
* alexa-fhem Logfile anschauen (Detail-Ansicht des <alexa>-Device aufrufen, klick auf '''Logfile''' oben)<br />
* alexa-fhem im Debug-Modus aufrufen:<br />
** -D zum alexaFHEM-params attribut hinzufügen<br />
** Alexa-Befehl auslösen<br />
** -D aus dem alexaFHEM-params attribut entfernen<br />
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)<br />
<br />
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===<br />
<br />
:* set <alexa> stop (FHEM-Oberfläche)<br />
:* Auf der Kommandozeile <code>alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg > debug.log</code> starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)<br />
:* Alexa-Befehl auslösen<br />
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)<br />
:* set <alexa> start (FHEM-Oberfläche)<br />
<br />
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.<br />
<br />
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.<br />
<br />
=== Registrierungskey vergessen, Registrierung zurücksetzen ===<br />
<br />
Auf der Kommandoshell:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status<br />
Registered.<br />
Registered on 2019-01-13T15:38:13Z.<br />
</syntaxhighlight><br />
<br />
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.<br />
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister<br />
Your registration has been removed<br />
</syntaxhighlight><br />
<br />
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.<br />
<br />
== Sicherheitskonzept und Secrets ==<br />
<br />
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt "Arbeitsweise" im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, "irgendwie sicherer" ist. Andererseits möchte man nicht blind vertrauen.<br />
<br />
=== SSH ===<br />
==== SSH - macht das nichts Gefährliches? ====<br />
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte "Reverse-Tunnel" implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: "Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.". Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.<br />
<br />
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ssh -R 1234:localhost:<zufälliger port> zielserver <br />
</syntaxhighlight><br />
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo /usr/sbin/tcpdump -X -s 0 -i lo port <zufälliger port><br />
</syntaxhighlight><br />
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.<br />
<br />
==== Wie wird bei SSH verschlüsselt? ====<br />
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie "LetsEncrypt" unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: "Willst Du jetzt und künftig diesem Schlüssel vertrauen?" Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.<br />
<br /><br />
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: "Das ist definitiv wieder derjenige, der sich damals "registriert" hat". Und an dieser Stelle kann ich auch den <b>ersten Teil des 3-teiligen Registrierungskeys</b> erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.<br />
<br />
=== Die Rolle der Secrets ===<br />
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:<br />
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:<br />
* Das <b>Anmelde</b>-Secret<br />
* Das <b>Bearer</b>-Token<br />
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der <b>Hashwert</b> des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.<br />
<br />
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann "sieht" der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.<br />
<br />
2) Das zweite Problem ist: Wie soll Amazon "beweisen", dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf "Activate Skill" den <b>dritten Teil</b> des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine "User-ID" enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token "stimmt".<br />
<br />
== alexa-fhem Updaten bzw. "Upgraden" ==<br />
<br />
'''Updaten einer "Connector" Installation:'''<br />
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa stop</syntaxhighlight><br />
<br />
*Auf der Konsole wie anfangs bei der Installation:<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm update -g alexa-fhem</syntaxhighlight><br />
<br />
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: <br />
<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm install -g alexa-fhem</syntaxhighlight><br />
<br />
*alexa-fhem über FHEM wieder starten:<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa start</syntaxhighlight><br />
<br />
'''"Upgraden von einer "Nicht-Connector" Installation (z.B. manuelle Installation per pm-Download):'''<br />
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)<br />
* Autostart der aktuellen alexa-fhem Installation deaktivieren:<br />
** Bei initd: Service deaktivieren mittels: <code>sudo update-rc.d -f alexa remove</code> Vorher mittels stoppen: <code>sudo service alexa stop</code> Startscript unter /etc/init.d/ löschen.<br />
** Bei systemd: Service deaktivieren mittels: <code>sudo systemctl disable alexa</code> Vorher mittels stoppen: <code>sudo systemctl alexa stop</code> Startscript unter /etc/systemd/system/ löschen.<br />
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!<br />
* (reboot)<br />
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)<br />
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter "Edit files") übernehmen.<br />
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.<br />
<br />
== Bug- und Wunschliste ==<br />
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)<br />
<br />
==Weitergehende Informationen==<br />
*[[Alexa und Mappings]]<br />
*[[Alexa Tipps und Kniffe]]<br />
*[[FHEM Connector for Amazon Alexa]]<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Sprachsteuerung]]<br />
<br />
==Hinweise==<br />
<references /></div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&diff=39207FHEM Connector für Amazon Alexa2024-03-27T15:52:11Z<p>Sailor: /* Finale: Skill verknüpfen */</p>
<hr />
<div>'''Alexa FHEMlazy''' war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als '''FHEM Connector''' verfügbar ist.<br />
<br />
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):<br />
<br />
* SONOS Beam und SONOS One <br />
<br />
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).<br />
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. <br />
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt<br />
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server<br />
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite<br />
* Als Skill bei Amazon wird der Skill "FHEM Connector" verwendet.<br />
<br />
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.<br />
{{Infobox Modul<br />
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa<br />
|ModType=h<br />
|ModCmdRef=alexa<br />
|ModTechName=39_alexa.pm / alexa-fhem<br />
|ModForumArea=Frontends/Sprachsteuerung<br />
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])<br />
}} <br />
==Einführung==<br />
===Arbeitsweise und Datenfluss===<br />
Vorläufig ist alexa-fhem im "FHEM Connector-Modus" ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].<br />
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann "Alexa, wie ist die Temperatur im Wohnzimmer?", während andere Skills zunächst explizit angesprochen werden müssen ("Alexa, frage FHEM nach der Temperatur im Wohnzimmer"). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.<br />
<br />
Gehen wir den Datenfluss bei der konkreten Frage "Wie ist die Temperatur im Wohnzimmer?" durch:<br />
* Alexa hat bei der Skillinstallation gelernt, dass "FHEM Connector" bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von "Alexa Voice Service" in der Cloud erkannt, dass eine Abfrage an "FHEM Connector" erfolgversprechend ist.<br />
* Zunächst wird die zentrale "Lambda-Funktion" von "FHEM Connector" aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte "Bearer-Token".<br />
* Der "Vereinsserver" prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.<br />
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.<br />
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests "lauscht". In der Original-Version [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei "FHEM Connector" kommen sie ausschließlich aus dem SSH-Tunnel von lokal.<br />
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.<br />
* FHEM führt den Befehl aus<br />
<br />
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.<br />
<br />
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.<br />
<br />
==Installation==<br />
<br />
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.<br />
<br />
===node.js installieren===<br />
<br />
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo apt-get install nodejs npm<br />
</syntaxhighlight><br />
<br />
kannst Du es installieren. Mit <br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
node --version<br />
</syntaxhighlight><br />
<br />
erfährst Du die aktuelle Version - wenn hier etwas mit "8" oder höher vorneweg erscheint, ist alles gut.<br />
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.<br />
<br />
'''Anmerkung:''' diese Aussage bzgl. node-Version (und Jessie/Stretch) stimmt wohl für alexa-fhem Stand heute (12.06.2020) nicht mehr, siehe https://forum.fhem.de/index.php/topic,112025.msg1063218.html#msg1063218<br />
<br />
=== Alexa-FHEM installieren ===<br />
<br />
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo npm install -g alexa-fhem<br />
</syntaxhighlight><br />
<br />
Der Vorgang benötigt etwas Zeit.<br />
<br />
=== Alexa-FHEM aktivieren ===<br />
<br />
Wechsele jetzt in FHEM-Web!<br />
<br />
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:<br />
Speichern der Config nicht vergessen, und<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
update<br />
shutdown restart<br />
</syntaxhighlight><br />
<br />
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
define alexa alexa<br />
</syntaxhighlight><br />
<br />
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:<br />
<br />
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert<br />
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.<br />
* Du wirst auf dem Server "va-fhem.fhem.de" des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.<br />
<br />
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und <br />
ungefähr so aussehen:<br />
<br />
[[Datei:Alexa-Device-2.png|800px]]<br />
<br />
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM.bearerToken crypt:...<br />
alexaFHEM.skillRegKey crypt:...<br />
</syntaxhighlight><br />
<br />
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
get <alexa> proxyKey<br />
</syntaxhighlight><br />
<br />
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.<br />
<br />
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte "bearerToken" zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.<br />
<br />
==== Fehler bei der Aktivierung ====<br />
<br />
Während kompliziertere Fehlerfälle im Abschnitt "Mögliche Probleme und Lösungen" behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:<br />
<br />
* Zuerst bitte einfach einmal die Seite neu laden.<br />
<br />
===== 401: Authorization Required =====<br />
<br />
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required<br />
</syntaxhighlight><br />
<br />
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt "alexaFHEM-auth" auswählen, User/Passwort mit ":" getrennt angeben und "attr" anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
attr alexa alexaFHEM-auth user:pass<br />
</syntaxhighlight><br />
<br />
===== Permission denied =====<br />
<br />
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis "/opt/fhem/.ssh/" von dir bei der Arbeit mit "root" oder "sudo" mit den falschen Berechtigungen versehen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied<br />
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied<br />
</syntaxhighlight><br />
<br />
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
ls -l /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Du solltest dann folgende Ausgabe erhalten:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
insgesamt 12<br />
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa<br />
-rw-r--r-- 1 fhem dialout 391 Jul 12 13:10 id_rsa.pub<br />
-rw-r--r-- 1 fhem dialout 884 Jul 12 13:10 known_hosts<br />
</syntaxhighlight><br />
<br />
Steht in der Ausgabe nicht "fhem dialout" (dein fhem User), sondern bspw. "root root", dann bspw. mit folgendem Befehl an deinen fhem User anpassen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
chown fhem:dialout /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Mit dem ersten Befehl "ls -l ..." kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. <br />
<br />
===== weitere Prüfungen =====<br />
<br />
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ps -ef | egrep '(alexa|ssh)'<br />
</syntaxhighlight><br />
<br />
sollte Dir idealerweise so etwas anzeigen:<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
fhem 31322 1 99 13:56 ? 00:00:03 alexa <br />
fhem 31332 31322 8 13:56 ? 00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:<zufälliger port> -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de<br />
</syntaxhighlight><br />
<br />
"alexa" ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.<br />
<br />
Wenn Du diese Prozesse '''nicht''' siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.<br />
<br />
Im Logfile (über den link <code>Logfile</code> in der Detail-Ansicht über <code>set</code>, oder über den Namen bei ''currentlogfile'' in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.<br />
<br />
=== Geräte im FHEM-Webfrontend zuweisen ===<br />
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!<br />
<br />
Wähle die Geräte aus, rufe sie auf und setze das Attribut "alexaName". Hierbei in Kürze nur der Hinweis:<br />
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.<br />
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern "handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal".<br />
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch <s>Strichpunkt</s> Komma getrennt<ref>Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}</ref>.<br />
* Das Attribut "alexaRoom" ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].<br />
<br />
Lade die Geräte neu in die Software, indem Du <code>set <alexa> restart</code> ausführst!<br />
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]<br />
<br />
'''Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:'''<br />
<br />
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter "Edit Files") passt.<br />
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.<br />
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.<br />
Ob der Filter entsprechend funktioniert kann man wie folgt testen: ''list Filtereinstellung'' beispiel mit Standardfilter: ''list alexaName=..*''<br />
<br />
* Hat alexa-fhem per Filter Devices aus fhem "gefunden", geht es weiter mit der "Erkennung". Also um welches Device (Typ und "Fähigkeiten") handelt es sich. Dazu gilt folgendes:<br />
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).<br />
** sind entsprechende "set-Befehle" erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein ''setList'' mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.<br />
** wird das Device nicht richtig oder "unvollständig" erkannt helfen folgende Attribute:<br />
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung "geschubbst" werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per "Drop-Down" erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: ''attr Devicename genericDeviceType media''<br />
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: <syntaxhighlight lang="bash" style="width:50%;"><br />
attr <thermostat> homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature<br />
</syntaxhighlight> [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]<br />
<br />
<br>'''Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.'''<br><br />
Die Namen werden durch <s>Strichpunkt</s> Komma getrennt.<br><br />
Beispiel:<br><br />
<code>attr dmLampe alexaName Lichtkuppel,Lichtkugel</code><br />
<br />
<br />
'''Anmerkung bzgl. genericDeviceType und homebridgeMapping:'''<br><br />
* diese Attribute werden von verschiedenen "Sprachsteuerungsmodulen" in fhem verwendet (homebridge [dort wurde es "erfunden"], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle "Dienste" verwendbar. Ausprobieren schadet aber nicht.<br />
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so "missbraucht") nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): "Alexa, fahre den Rollo hoch/runter". Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]<br />
<br />
== Finale: Skill verknüpfen ==<br />
Suche im WebFrontend oder der Alexa-App den Skill "FHEM Connector". Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.<br />
<br />
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.<br />
<br />
Sobald Du "FHEM Connector" aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:<br /><br />
Aufgrund der Umstellung seitens AMAZON auf "APP only" ohne die Verfügbarkeit der webseite, kann man, nachdem man den Skill in der APP aktiviert hat, auf dieser Adresse den Proxy-Code im Webbrowser eingeben:<BR> https://va.fhem.de/register/check.html<BR><br />
[[Datei:FHEMlazy_login.png|240px]]<br />
<br />
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:<br /><br />
[[Datei:FHEMlazy_check.png|240px]]<br />
<br />
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).<br />
<br />
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.<br />
<br />
Ist alles okay, klicke rechts den Button "Activate Skill". Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.<br />
<br />
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.<br />
<br />
== Was geht alles ? ==<br />
<br />
* Geräte, die sich ein- und ausschalten lassen:<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** dummys müssen <code>setList</code> mit on und off haben<br />
** Über <code>genericDeviceType</code> switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.<br />
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=<ein>,cmdOff=<aus> setzen<br />
** Kommandos:<br />
***Alexa, schalte <name> ein/aus<br />
***Alexa, Licht an/aus<br />
***Alexa, schalte <gruppe> ein/aus<br />
* Geräte, die eine Temperatur messen<br />
** Automatisch: Es muss ein Reading <code>temperature</code> geben<br />
** Über <code>genericDeviceType</code> thermometer<br />
** Sonst: homebridgeMapping CurrentTemperature:reading=<reading><br />
<br />
* Geräte, deren Helligkeit sich ändern lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** Über <code>genericDeviceType</code> light<br />
** Über homebridgeMapping: Wenn <code>helligkeit</code> das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit <code>set <device> prozent xxx</code> gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=<maximalwert><br />
** Kommandos:<br />
*** Alexa, mache <name> heller/dunkler<br />
*** Alexa, Licht heller/dunkler<br />
* Geräte, deren Farbe sich ändern lässt<br />
** ...<br />
<br />
* Geräte, deren Farbtemperatur sich ändern lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich eine Lautstärke einstellen lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** ...<br />
<br />
* elektrische Türschlösser<br />
** <code>genericDeviceType</code>: lock<br />
** homebridgeMapping mit LockCurrentState und LockTargetState<br />
<br />
* Thermostate<br />
** Über <code>genericDeviceType</code> thermostate<br />
** ...<br />
<br />
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)<br />
** können mit <code>genericDeviceType</code> scene als Szene eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer structure lassen sich ein- und ausschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)<br />
** können mit <code>genericDeviceType</code> scene als Szenen eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer LightScene lassen sich nur einschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping ChannelController:reading=<reading>,cmd=<cmd><br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel<br />
** ...<br />
<br />
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery<br />
** ...<br />
<br />
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping InputController:reading=<reading>,cmd=<cmd>,values=HDMI+1;HDMI+2;XBOX<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input<br />
** ...<br />
<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.15)<br />
** Über <code>genericDeviceType</code> contact<br />
** homebridgeMapping ContactSensorState:reading=<reading> oder CurrentDoorState:reading=<reading><br />
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.<br />
<br />
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)<br />
** Über <code>genericDeviceType</code> speaker<br />
** Automatisch: es muss ein Reading <code>volume</code> und/oder <code>mute</code> geben<br />
** homebridgeMapping Volume:reading=<reading>,cmd=<cmd> Mute:reading=<reading>,cmd=<cmd><br />
** ...<br />
<br />
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)<br />
** Über <code>genericDeviceType</code> scene<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** homebridgeMapping On:reading=<reading>,cmdOn=<cmd>[,cmdOff=<cmd>]<br />
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
* Rollläden. Lange ein Problemthema, das nur mit "Schalte auf 0%, schalte auf 100% lief". Wichtig: "alexa-fhem" ab Version 0.5.39 einsetzen. GenericDevice-Type auf "blind" setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:<br />
** "..., öffne <Name> ganz"<br />
** "..., schließe <Name> komplett"<br />
** "hoch" und "runter" (ohne "ganz" oder "komplett") schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit <code>attr <name> homebridgeMapping TargetPosition:minStep=<wert></code>geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.47)<br />
** Automatisch wenn ein Reading <code>motion</code> vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt<br />
** Über <code>genericDeviceType</code> MotionSensor<br />
** homebridgeMapping MotionDetected:reading=<reading>,values=<wert für bewgung>:1;<wert für keine bewegung>:0<br />
<br />
* Alarmmelder (noch nicht in Deutschland):<br />
** genericDeviceType Security<br />
** homebridgeMapping Alarm=<reading>[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]<br />
** wenn der type nicht angegeben wird ist fireAlarm der default<br />
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.<br />
*Geräte mit mehrstufigen Modi:<br />
**siehe den zugehörigen Thread im Forum: {{Link2Forum|Topic= 125604}}<br />
<br />
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.<br />
<br />
to be continued ...<br />
<br />
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.<br />
<br />
=== Aktiv Routinen starten ===<br />
Routinen (eine Funktionalität, die rein - genauso wie "Räume" - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: "Meine Frau möchte aber '''Öffne Rollläden''<nowiki/>' sagen": In der Alexa-App gibt es im Menü den Punkt "Routinen", und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.<br />
<br />
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul "echodevice", aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie <br />
<br />
''"Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten"'' <br />
<br />
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.<br />
<br />
'''Vorgeschichte''':<br />
<br />
Die Smarthome-Skill-API von Amazon sah schon lange das "proactiveReporting" vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? <br />
<br />
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von ''Bewegungssensoren'' und ''Fensterkontakten'' als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.<br />
<br />
'''Umsetzung''':<br />
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut "alexaProactiveEvents" mit einer "1" versehen. Per Default wird ''kein'' Gerät laufend aktiv zu Amazon gepusht!<br />
* das geänderte Device einmal zu Amazon pushen "set <alexa> add <device>" (oder 'Alexa, suche neue Geräte' murmeln)<br />
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine ("Neue Routine", "Wenn Folgendes passiert", "Smart Home") als möglicher Triggerpunkt erscheinen.<br />
<br />
==== Dummygeräte: ====<br />
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
define voicetrigger1 dummy<br />
attr voicetrigger1 alexaName alle Fenster<br />
attr voicetrigger1 alexaProactiveEvents 1<br />
attr voicetrigger1 genericDeviceType contact<br />
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED<br />
attr voicetrigger1 setList open closed<br />
<br />
set alexa add voicetrigger1<br />
set alexa restart<br />
</syntaxhighlight><br />
<br />
'''Fehlersuche:'''<br />
<br />
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:<br />
<br />
<code>failed to refresh token: invalid_grant: 'The request has an invalid grant parameter : refresh_token'</code><br />
<br />
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:<br />
* Löschen des ".eventToken" im Alexa-Device über "deletereading"<br />
* "FHEM-Connector"-Skill auf "alexa.amazon.de" einmal deaktivieren und dann neu verbinden<br />
<br />
== Mögliche Probleme und Lösungen ==<br />
<br />
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. <br />
<br />
=== Fehlersuche über die FHEM-Oberfläche ===<br />
<br />
* alexa-fhem Logfile anschauen (Detail-Ansicht des <alexa>-Device aufrufen, klick auf '''Logfile''' oben)<br />
* alexa-fhem im Debug-Modus aufrufen:<br />
** -D zum alexaFHEM-params attribut hinzufügen<br />
** Alexa-Befehl auslösen<br />
** -D aus dem alexaFHEM-params attribut entfernen<br />
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)<br />
<br />
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===<br />
<br />
:* set <alexa> stop (FHEM-Oberfläche)<br />
:* Auf der Kommandozeile <code>alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg > debug.log</code> starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)<br />
:* Alexa-Befehl auslösen<br />
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)<br />
:* set <alexa> start (FHEM-Oberfläche)<br />
<br />
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.<br />
<br />
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.<br />
<br />
=== Registrierungskey vergessen, Registrierung zurücksetzen ===<br />
<br />
Auf der Kommandoshell:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status<br />
Registered.<br />
Registered on 2019-01-13T15:38:13Z.<br />
</syntaxhighlight><br />
<br />
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.<br />
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister<br />
Your registration has been removed<br />
</syntaxhighlight><br />
<br />
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.<br />
<br />
== Sicherheitskonzept und Secrets ==<br />
<br />
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt "Arbeitsweise" im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, "irgendwie sicherer" ist. Andererseits möchte man nicht blind vertrauen.<br />
<br />
=== SSH ===<br />
==== SSH - macht das nichts Gefährliches? ====<br />
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte "Reverse-Tunnel" implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: "Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.". Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.<br />
<br />
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ssh -R 1234:localhost:<zufälliger port> zielserver <br />
</syntaxhighlight><br />
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo /usr/sbin/tcpdump -X -s 0 -i lo port <zufälliger port><br />
</syntaxhighlight><br />
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.<br />
<br />
==== Wie wird bei SSH verschlüsselt? ====<br />
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie "LetsEncrypt" unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: "Willst Du jetzt und künftig diesem Schlüssel vertrauen?" Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.<br />
<br /><br />
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: "Das ist definitiv wieder derjenige, der sich damals "registriert" hat". Und an dieser Stelle kann ich auch den <b>ersten Teil des 3-teiligen Registrierungskeys</b> erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.<br />
<br />
=== Die Rolle der Secrets ===<br />
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:<br />
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:<br />
* Das <b>Anmelde</b>-Secret<br />
* Das <b>Bearer</b>-Token<br />
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der <b>Hashwert</b> des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.<br />
<br />
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann "sieht" der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.<br />
<br />
2) Das zweite Problem ist: Wie soll Amazon "beweisen", dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf "Activate Skill" den <b>dritten Teil</b> des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine "User-ID" enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token "stimmt".<br />
<br />
== alexa-fhem Updaten bzw. "Upgraden" ==<br />
<br />
'''Updaten einer "Connector" Installation:'''<br />
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa stop</syntaxhighlight><br />
<br />
*Auf der Konsole wie anfangs bei der Installation:<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm update -g alexa-fhem</syntaxhighlight><br />
<br />
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: <br />
<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm install -g alexa-fhem</syntaxhighlight><br />
<br />
*alexa-fhem über FHEM wieder starten:<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa start</syntaxhighlight><br />
<br />
'''"Upgraden von einer "Nicht-Connector" Installation (z.B. manuelle Installation per pm-Download):'''<br />
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)<br />
* Autostart der aktuellen alexa-fhem Installation deaktivieren:<br />
** Bei initd: Service deaktivieren mittels: <code>sudo update-rc.d -f alexa remove</code> Vorher mittels stoppen: <code>sudo service alexa stop</code> Startscript unter /etc/init.d/ löschen.<br />
** Bei systemd: Service deaktivieren mittels: <code>sudo systemctl disable alexa</code> Vorher mittels stoppen: <code>sudo systemctl alexa stop</code> Startscript unter /etc/systemd/system/ löschen.<br />
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!<br />
* (reboot)<br />
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)<br />
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter "Edit files") übernehmen.<br />
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.<br />
<br />
== Bug- und Wunschliste ==<br />
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)<br />
<br />
==Weitergehende Informationen==<br />
*[[Alexa und Mappings]]<br />
*[[Alexa Tipps und Kniffe]]<br />
*[[FHEM Connector for Amazon Alexa]]<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Sprachsteuerung]]<br />
<br />
==Hinweise==<br />
<references /></div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_Connector_f%C3%BCr_Amazon_Alexa&diff=39206FHEM Connector für Amazon Alexa2024-03-27T15:50:44Z<p>Sailor: /* Finale: Skill verknüpfen */</p>
<hr />
<div>'''Alexa FHEMlazy''' war historisch ein Fork des Original [[Alexa-Fhem|alexa-fhem]], der im Januar 2019 mit dem Original zusammengeführt wurde und nun als '''FHEM Connector''' verfügbar ist.<br />
<br />
Er ermöglicht innerhalb von Minuten die Verknüpfung von FHEM mit einem Amazon Echo Gerät. Auch Geräte anderer Hersteller mit verbauten Mikrofonen und Alexa-Sprachassistenten-Unterstützung sollten problemlos funktionieren. Für folgende Geräte ist dies bspw. der Fall (Falls Ihr andere/weitere Gerätemodelle bzw. Hersteller in Verwendung habt, bitte hier pflegen):<br />
<br />
* SONOS Beam und SONOS One <br />
<br />
Gegenüber dem klassischen Ansatz ergeben sich Einschränkungen, so läuft die Software normalerweise unter dem gleichen Benutzer wie FHEM auf dem gleichen Server, und es wird z.Zt. nur der Smarthome-Skill unterstützt (die Variante, bei der die Möglichkeiten der Interaktion von Amazon festgelegt wurden).<br />
Dafür ist weder ein Developer-Account bei Amazon, eigene Lambda- und Skillfunktionen, noch das Öffnen eines eingehenden Ports aus dem Internet nötig. <br />
* Die Software integriert einen Installer, der die Erstkonfiguration und Anmeldung übernimmt<br />
* Die Kommunikation zur Software auf dem heimischen Rechner und dann zu FHEM verläuft über SSH und einen vom FHEM-Verein gehosteten Server<br />
* Funktioniert mit IPv4, IPv6, echtem Dual Stack und DS-Lite<br />
* Als Skill bei Amazon wird der Skill "FHEM Connector" verwendet.<br />
<br />
Der Thread im Forum zur Software ist hier: {{Link2Forum|Topic=94817}}.<br />
{{Infobox Modul<br />
|ModPurpose=Einfache Anbindung von FHEM an Amazon Assistent Alexa<br />
|ModType=h<br />
|ModCmdRef=alexa<br />
|ModTechName=39_alexa.pm / alexa-fhem<br />
|ModForumArea=Frontends/Sprachsteuerung<br />
|ModOwner=gvzdus, André/ justme1968 ({{Link2FU|430|Forum}} / [[Benutzer Diskussion:Justme|Wiki]])<br />
}} <br />
==Einführung==<br />
===Arbeitsweise und Datenfluss===<br />
Vorläufig ist alexa-fhem im "FHEM Connector-Modus" ein reiner [https://developer.amazon.com/de/docs/smarthome/understand-the-smart-home-skill-api.html SmartHome-Skill].<br />
SmartHome-Skills erhalten weder die Sprachdaten selber noch das, was Amazon in Textform verstanden hat, sondern vielmehr extrahiert Amazon aus dem verstandenen Text Anweisungen und Abfragen für Geräte, die dann an den Skill übermittelt werden. Charmant ist dabei, dass unmittelbar gefragt werden kann "Alexa, wie ist die Temperatur im Wohnzimmer?", während andere Skills zunächst explizit angesprochen werden müssen ("Alexa, frage FHEM nach der Temperatur im Wohnzimmer"). Außerdem kann der Nutzer mehrere Smarthome-Skills installieren, und die Geräte werden zu einer Gesamtmenge zusammengefasst.<br />
<br />
Gehen wir den Datenfluss bei der konkreten Frage "Wie ist die Temperatur im Wohnzimmer?" durch:<br />
* Alexa hat bei der Skillinstallation gelernt, dass "FHEM Connector" bei Dir einen Thermostaten im Raum Wohnzimmer kennt. Dadurch wird bei der Sprachanalyse von "Alexa Voice Service" in der Cloud erkannt, dass eine Abfrage an "FHEM Connector" erfolgversprechend ist.<br />
* Zunächst wird die zentrale "Lambda-Funktion" von "FHEM Connector" aufgerufen. Die Funktion leitet aber im Kern nur den Request unverändert an den vom Verein bereitgestellten Server weiter. Im Request enthalten ist ein Token, das sogenannte "Bearer-Token".<br />
* Der "Vereinsserver" prüft anhand dieses Tokens, ob es überhaupt bekannt ist, und zu welchem Nutzer es gehört. Ist dieser Nutzer verbunden, wird der Request wiederum quasi unverändert an den Nutzer weitergeleitet.<br />
* Diese Weiterleitung passiert über einen sogenannten SSH-Reverse-Tunnel, der von Deiner Seite und der Software auf dem FHEM-Tunnel automatisch aufgebaut wird.<br />
* Auf Deiner Seite läuft die eigentliche Software, und zwar unter nodeJS. nodeJS ist ein Javascript ausführender Miniserver, der lokal auf einem Zufallsport auf Requests "lauscht". In der Original-Version [[Alexa-Fhem|Alexa FHEM]] kommen die Requests aus dem Internet (hoffentlich von der eigenen Lambda-Funktion), hier bei "FHEM Connector" kommen sie ausschließlich aus dem SSH-Tunnel von lokal.<br />
* Die Software validiert nun diesen Request anhand des Bearer-Tokens. Konkret wird dabei das bei der Installation generierte Token, dass bei der Skill-Aktivierung an Amazon übertragen wurde, mit dem lokal gespeicherten Wert verglichen. Stimmt das Token, wird der Befehl verarbeitet, üblicherweise wird hierbei ein Aufruf an die Webschnittstelle von FHEM abgesetzt.<br />
* FHEM führt den Befehl aus<br />
<br />
Hört sich langsam und kompliziert an? Kompliziert: Okay. Langsam eher nicht, in etlichen Fällen liegt die Gesamtantwortszeit unter 200 ms.<br />
<br />
Soweit ein erster Überblick über die Datenflüsse. Im Abschnitt Sicherheit ist das Konzept der Absicherung deutlich genauer und ausführlicher beschrieben.<br />
<br />
==Installation==<br />
<br />
Du wirst bei der Installation zuerst auf der Kommandozeile auf Deinem Raspberry (o.ä.) unterwegs sein, anschließend im Webfrontend von FHEM, und zum Schluss auf der Alexa-Konsole im Web.<br />
<br />
===node.js installieren===<br />
<br />
Ab Jessy liegt NodeJS bereits in einer ausreichend aktuellen Version vor (Stretch und Buster funktionieren ebenfalls). Mit<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo apt-get install nodejs npm<br />
</syntaxhighlight><br />
<br />
kannst Du es installieren. Mit <br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
node --version<br />
</syntaxhighlight><br />
<br />
erfährst Du die aktuelle Version - wenn hier etwas mit "8" oder höher vorneweg erscheint, ist alles gut.<br />
Ansonsten suche Dir bitte eine Anleitung im Web, wie Du NodeJS auf Deinem System auf einen aktuellen Stand bringen kannst.<br />
<br />
'''Anmerkung:''' diese Aussage bzgl. node-Version (und Jessie/Stretch) stimmt wohl für alexa-fhem Stand heute (12.06.2020) nicht mehr, siehe https://forum.fhem.de/index.php/topic,112025.msg1063218.html#msg1063218<br />
<br />
=== Alexa-FHEM installieren ===<br />
<br />
Nun installieren wir Alexa-fhem aus dem offiziellen Repository:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo npm install -g alexa-fhem<br />
</syntaxhighlight><br />
<br />
Der Vorgang benötigt etwas Zeit.<br />
<br />
=== Alexa-FHEM aktivieren ===<br />
<br />
Wechsele jetzt in FHEM-Web!<br />
<br />
Wichtig ist, dass das Alexa-Modul in der Version ab Januar 2019 vorliegt. Dafür bitte einmal FHEM aktualisieren:<br />
Speichern der Config nicht vergessen, und<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
update<br />
shutdown restart<br />
</syntaxhighlight><br />
<br />
Alles, was jetzt noch nötig ist, ist das Anlegen eines Alexa-Devices. Gib dafür in der FHEM-Web-Kommandozeile<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
define alexa alexa<br />
</syntaxhighlight><br />
<br />
an. Nun läuft, während Du bereits das neu angelegte Alexa-Devices siehst, ein komplexer Prozess im Hintergrund:<br />
<br />
* Falls noch kein SSH-Key für den Benutzer, unter dem FHEM läuft, existiert, wird einer generiert<br />
* Es wird ein Secret-Key im Prozess generiert, dass den Server nicht verlässt, und der Skillanmeldung dient.<br />
* Du wirst auf dem Server "va-fhem.fhem.de" des FHEM-Vereins mit dem SSH-Key angemeldet, und der Hash-Wert Deines Secret-Key dort abgelegt.<br />
<br />
Und wenn Du diese Sätze gelesen hast, sollte inzwischen sich das Alexa-Device in FHEM-Web aktualisiert haben, und <br />
ungefähr so aussehen:<br />
<br />
[[Datei:Alexa-Device-2.png|800px]]<br />
<br />
Neben dem Status für alexa-fhem und der Proxyverbindung ist wichtig, dass diese beiden Zeilen beim Reload aufgetaucht sind:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM.bearerToken crypt:...<br />
alexaFHEM.skillRegKey crypt:...<br />
</syntaxhighlight><br />
<br />
Ja, und diesen Schlüssel benötigst Du wirklich! Also am besten schon einmal mit <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
get <alexa> proxyKey<br />
</syntaxhighlight><br />
<br />
in Klartext anzeigen lassen und in ein Editor-Fenster dauerhaft wegsichern.<br />
<br />
Jetzt solltest Du Dein Alexa-Device nicht mehr löschen, denn das im Reading angezeigte "bearerToken" zu löschen bedeutet, dass die Software die Zugriffe von nicht mehr überprüfen kann und keine Kommandos mehr funktionieren. In diesem Fall hilft nur die Neuinstallation des Skills.<br />
<br />
==== Fehler bei der Aktivierung ====<br />
<br />
Während kompliziertere Fehlerfälle im Abschnitt "Mögliche Probleme und Lösungen" behandelt werden, hier häufige Fälle, warum die kryptischen Zeilen nicht auftauchen:<br />
<br />
* Zuerst bitte einfach einmal die Seite neu laden.<br />
<br />
===== 401: Authorization Required =====<br />
<br />
Wenn Du FHEM-Web mit einem User/Passwort-Schutz versehen hast, wirst du folgende Fehlermeldung sehen: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
alexaFHEM stopped; failed to connect to fhem: 401: Authorization Required<br />
</syntaxhighlight><br />
<br />
In der Regel musst du die Angaben User/Passwort noch einmal explizit setzen. Im Attribute-Abschnitt "alexaFHEM-auth" auswählen, User/Passwort mit ":" getrennt angeben und "attr" anklicken. alexa-fhem wird automatisch neu gestartet. Hier das Ganze in der Text-Variante:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
attr alexa alexaFHEM-auth user:pass<br />
</syntaxhighlight><br />
<br />
===== Permission denied =====<br />
<br />
Wenn du folgende Fehlermeldungen im Alexa Logfile siehst, wurde das Verzeichnis "/opt/fhem/.ssh/" von dir bei der Arbeit mit "root" oder "sudo" mit den falschen Berechtigungen versehen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
[2019-7-25 11:59:12] sshautoconf: aborted with ssh-keygen returned error - key_save_private: Permission denied<br />
[2019-7-25 11:59:12] *** SSH: proxy configuration failed: ssh-keygen returned error - key_save_private: Permission denied<br />
</syntaxhighlight><br />
<br />
Prüfen kannst du die Berechtigungen mit folgendem Befehl auf der Shell-Konsole: <br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
ls -l /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Du solltest dann folgende Ausgabe erhalten:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
insgesamt 12<br />
-rw------- 1 fhem dialout 1675 Jul 12 13:10 id_rsa<br />
-rw-r--r-- 1 fhem dialout 391 Jul 12 13:10 id_rsa.pub<br />
-rw-r--r-- 1 fhem dialout 884 Jul 12 13:10 known_hosts<br />
</syntaxhighlight><br />
<br />
Steht in der Ausgabe nicht "fhem dialout" (dein fhem User), sondern bspw. "root root", dann bspw. mit folgendem Befehl an deinen fhem User anpassen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
chown fhem:dialout /opt/fhem/.ssh<br />
</syntaxhighlight><br />
<br />
Mit dem ersten Befehl "ls -l ..." kannst du dann nochmal prüfen, ob die Berechtigungen korrekt übernommen wurden. <br />
<br />
===== weitere Prüfungen =====<br />
<br />
Hast Du noch die Shell-Konsole offen? Dann prüfe bitte noch einmal auf der Konsole, ob nun zwei Prozesse laufen:<br />
<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ps -ef | egrep '(alexa|ssh)'<br />
</syntaxhighlight><br />
<br />
sollte Dir idealerweise so etwas anzeigen:<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
fhem 31322 1 99 13:56 ? 00:00:03 alexa <br />
fhem 31332 31322 8 13:56 ? 00:00:00 /usr/bin/ssh -R 1234:127.0.0.1:<zufälliger port> -oServerAliveInterval=90 -p 58824 fhem-va.fhem.de<br />
</syntaxhighlight><br />
<br />
"alexa" ist dabei der Node-JS-Prozess, der ssh-Prozess ist die aufgebaute Verbindung zum Vereinsserver.<br />
<br />
Wenn Du diese Prozesse '''nicht''' siehst oder das Alexa-Device keinen Registrierungskey anzeigt, dann ist leider der Start nicht glatt verlaufen.<br />
<br />
Im Logfile (über den link <code>Logfile</code> in der Detail-Ansicht über <code>set</code>, oder über den Namen bei ''currentlogfile'' in den Internals) findest Du idealerweise selber Hinweise, wo es hakt, oder kannst im Forum nachfragen.<br />
<br />
=== Geräte im FHEM-Webfrontend zuweisen ===<br />
Um das Aha-Erlebnis zu vergrößern, ist jetzt ein guter Zeitpunkt, 1 oder besser mind. 2 Geräte für den Alexa-Dienst zuzuweisen. Von Haus aus wird keines Deiner FHEM-Geräte automatisch Alexa zugewiesen!<br />
<br />
Wähle die Geräte aus, rufe sie auf und setze das Attribut "alexaName". Hierbei in Kürze nur der Hinweis:<br />
* Keine Angst vor Leerzeichen und Umlauten, funktioniert.<br />
* Große Angst vor Rechtschreibfehlern (Terrasse, Rollladen) oder komplizierten Wörtern "handgebastelte Martinslaterne im Kinderzimmer Iphigenie-Chantal".<br />
* Mehrere Namen für dasselbe Gerät/Device in fhem werden unterstützt. Mehrere Namen werden durch <s>Strichpunkt</s> Komma getrennt<ref>Feature nicht dokumentiert {{Link2Forum|Topic=74041|LinkText=Forumsthread}}</ref>.<br />
* Das Attribut "alexaRoom" ist NUR FÜR DEN CUSTOM SKILL relevant. Ausnahme: structure und LightScene Devices, siehe: [[FHEM_Connector_f%C3%BCr_Amazon_Alexa#Was_geht_alles_.3F]].<br />
<br />
Lade die Geräte neu in die Software, indem Du <code>set <alexa> restart</code> ausführst!<br />
[[Datei:HowToSet alexaName.png|alternativtext=How to set alexaName|ohne|mini|Wie setzt man das Attribut alexaName]]<br />
<br />
'''Anmerkungen (weil oft gestellte Fragen im Forum) bzgl. Erkennung von Geräten:'''<br />
<br />
* Wichtig ist, dass die Filtereinstellung in der alexa-fhem.cfg (zu finden unter "Edit Files") passt.<br />
Das, was dort eingetragen ist (Standard: alexaName=..* / also es ist ein alexaName vergeben) auch an den entsprechenden Devices in fhem vorhanden ist.<br />
Stimmt das nicht überein, kann alexa-fhem keine Devices von fhem abfragen/finden.<br />
Ob der Filter entsprechend funktioniert kann man wie folgt testen: ''list Filtereinstellung'' beispiel mit Standardfilter: ''list alexaName=..*''<br />
<br />
* Hat alexa-fhem per Filter Devices aus fhem "gefunden", geht es weiter mit der "Erkennung". Also um welches Device (Typ und "Fähigkeiten") handelt es sich. Dazu gilt folgendes:<br />
** sind entsprechende Readings beim Device vorhanden (z.B. temperature, state mit on/off, ...) erkennt das alexa-fhem automatisch. Die Liste der automatisch erkannten Readings wächst ständig. Daher erst mal schauen ob das Device bereits entsprechend erkannt (typisiert) wurde. Das kann durch prüfen des alexa-fhem-Logs geschehen (NICHT fhem-log!).<br />
** sind entsprechende "set-Befehle" erkennbar (oft auch durch Readings). Also ist beispielsweise (wie beim Dummy nötig) ein ''setList'' mit entsprechenden Einträgen vorhanden oder entsprechende Readings, z.B. desired-temp zum Stellen der Temperatur etc.<br />
** wird das Device nicht richtig oder "unvollständig" erkannt helfen folgende Attribute:<br />
*** genericDeviceType: hiermit kann alexa-fhem in die gewünschte Richtung "geschubbst" werden. Anmerkung: man kann nicht alles erzwingen, Readings bzw. set-Befehle müssen passen (oder per homebridgeMapping passend gemacht werden). Wenn ein genericDeviceType nicht per "Drop-Down" erscheint, dann kann er auch (wenn bekannt) einfach per WEB-cmd eingegeben werden: ''attr Devicename genericDeviceType media''<br />
*** homebridgeMapping: hierdurch kann alexa-fhem bei der Erkennung von Zuständen und möglichen Einstellungen (also WAS kann das Device) unterstützt werden. Mittels homebridgeMapping können vorhandene Readings (Zustände) auf für alexa-fhem bekannte Zustände gemappt werden. Ebenso können damit Standard-fhem-Kommandos von alexa-fhem auf Device-spezifische gemappt werden. Beispiel: on/off auf Ein/Aus (falls das Device statt on/off eben ein Ein/Aus erwartet). Zum Beispiel: <syntaxhighlight lang="bash" style="width:50%;"><br />
attr <thermostat> homebridgeMapping TargetTemperature=target::target,minValue=18,maxValue=25,minStep=0.5 CurrentTemperature=myTemp:temperature<br />
</syntaxhighlight> [https://github.com/justme-1968/homebridge-fhem/blob/master/README.md weitere Beispiele]<br />
<br />
<br>'''Mehrere Namen für dasselbe Gerät/Device in fhem sind möglich.'''<br><br />
Die Namen werden durch <s>Strichpunkt</s> Komma getrennt.<br><br />
Beispiel:<br><br />
<code>attr dmLampe alexaName Lichtkuppel,Lichtkugel</code><br />
<br />
<br />
'''Anmerkung bzgl. genericDeviceType und homebridgeMapping:'''<br><br />
* diese Attribute werden von verschiedenen "Sprachsteuerungsmodulen" in fhem verwendet (homebridge [dort wurde es "erfunden"], alexa-fhem, gassistant, ...). Daher ist nicht jedes Mapping für alle "Dienste" verwendbar. Ausprobieren schadet aber nicht.<br />
* ebenso kann man mit diesen Attributen (homebridgeMapping wird gerne so "missbraucht") nichts erzwingen, was seitens Amazon/Alexa nicht unterstützt bzw. verstanden wird! D.h. zunächst ist zu prüfen, ob ein bestimmter (gewünschter) Sprachbefehl seitens Amazon/Alexa unterstützt wird! Aktuelles Beispiel (Stand Jan 2020): "Alexa, fahre den Rollo hoch/runter". Da ist Amazon/Alexa gerade dabei etwas zu tun. Bislang wird das nicht unterstützt, also ist das auch mit einem entsprechenden homebridgeMapping nicht zu erzwingen! Was unterstützt wird kann man bei Amazon nachlesen: [https://developer.amazon.com/es-ES/docs/alexa/device-apis/list-of-interfaces.html]<br />
<br />
== Finale: Skill verknüpfen ==<br />
Suche im WebFrontend oder der Alexa-App den Skill "FHEM Connector". Für nicht-Mac/iOS Anwerder empfiehlt das WebFrontend (https://alexa.amazon.de) statt die App, damit Du den Anmeldeschlüssel auch bequem kopieren kannst.<br />
<br />
Wenn du noch nicht bei Amazon angemeldet bist, erwartet Amazon zunächst, dass Du Dich normal bei Amazon anmeldest.<br />
<br />
Sobald Du "FHEM Connector" aktivierst, öffnet sich ein Browser-Tab mit folgender Maske:<br /><br />
Aufgrund der Umstellung seitens AMAZON auf "APP only" ohne die Verfügbarkeit der webseite, kann man, nachdem man den Skill in der APP aktiviert hat, auf dieser Adresse den ProxzßCode im Webbrowser eingeben:<BR> https://va.fhem.de/register/check.html<BR><br />
[[Datei:FHEMlazy_login.png|240px]]<br />
<br />
Hier kopierst Du Deinen Anmeldeschlüssel (im Klartext!) hinein und klickst auf Check. Als glücklicher Mensch ist auf der folgenden Statusseite alles grün:<br /><br />
[[Datei:FHEMlazy_check.png|240px]]<br />
<br />
Im Einzelnen wird hier geprüft, ob Du per SSH verbunden bist (und auch Deine IP zur Sicherheit angezeigt), ob der Reverse-Tunnel steht, ob nodeJS erreichbar ist und wie viele Geräte Alexa gleich finden sollte (in meinem Fall 22).<br />
<br />
Sollte etwas nicht grün sein und Du eine Idee zum Fixen haben, kannst Du mit "Retry" neue Versuche auslösen.<br />
<br />
Ist alles okay, klicke rechts den Button "Activate Skill". Du springst damit wieder zurück zu Amazon, die Dir hoffentlich zur erfolgreichen Verknüpfung gratulieren.<br />
<br />
Amazon möchte nun unmittelbar die Gerätesuche starten, und unter SmartHome-Geräte sollten diese nun auftauchen.<br />
<br />
== Was geht alles ? ==<br />
<br />
* Geräte, die sich ein- und ausschalten lassen:<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** dummys müssen <code>setList</code> mit on und off haben<br />
** Über <code>genericDeviceType</code> switch bzw. light kann bestimmt werden ob es in alexa als Schalter oder Licht behandelt wird.<br />
** Wenn die Set-Kommandos im FHEM Device anders benannt sind: homebridgeMapping On:cmdOn=<ein>,cmdOff=<aus> setzen<br />
** Kommandos:<br />
***Alexa, schalte <name> ein/aus<br />
***Alexa, Licht an/aus<br />
***Alexa, schalte <gruppe> ein/aus<br />
* Geräte, die eine Temperatur messen<br />
** Automatisch: Es muss ein Reading <code>temperature</code> geben<br />
** Über <code>genericDeviceType</code> thermometer<br />
** Sonst: homebridgeMapping CurrentTemperature:reading=<reading><br />
<br />
* Geräte, deren Helligkeit sich ändern lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** Über <code>genericDeviceType</code> light<br />
** Über homebridgeMapping: Wenn <code>helligkeit</code> das Reading für die aktuelle Helligkeit enthält und die Helligkeit mit <code>set <device> prozent xxx</code> gesetzt wird, sieht das homebridgeMapping wie folgt aus: homebridgeMapping Brightness=helligkeit::prozent,minValue=0,maxValue=<maximalwert><br />
** Kommandos:<br />
*** Alexa, mache <name> heller/dunkler<br />
*** Alexa, Licht heller/dunkler<br />
* Geräte, deren Farbe sich ändern lässt<br />
** ...<br />
<br />
* Geräte, deren Farbtemperatur sich ändern lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich eine Lautstärke einstellen lässt<br />
** ...<br />
<br />
* Geräte, bei denen sich ein prozentualer Wert einstellen lässt<br />
** Automatisch: wenn <code>dim</code> oder <code>pct</code> Kommandos erkannt werden<br />
** ...<br />
<br />
* elektrische Türschlösser<br />
** <code>genericDeviceType</code>: lock<br />
** homebridgeMapping mit LockCurrentState und LockTargetState<br />
<br />
* Thermostate<br />
** Über <code>genericDeviceType</code> thermostate<br />
** ...<br />
<br />
* structure Devices aus FHEM (ab alexa-fhem version 0.5.7)<br />
** können mit <code>genericDeviceType</code> scene als Szene eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer structure lassen sich ein- und ausschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* LightScene Devices aus FHEM (ab alexa-fhem version 0.5.8)<br />
** können mit <code>genericDeviceType</code> scene als Szenen eingebunden werden<br />
** über <code>alexaRoom</code> kann der name um einen Ort ergänzt werden<br />
** Szenen aus einer LightScene lassen sich nur einschalten<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
<br />
* Geräte, deren Kanal sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping ChannelController:reading=<reading>,cmd=<cmd><br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-channelcontroller.html#changechannel<br />
** ...<br />
<br />
* Geräte, deren Playback status sich schalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping PlaybackController:playback,values=Play;Pause;Stop;Previous;Next<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-playbackcontroller.html#discovery<br />
** ...<br />
<br />
* Geräte, deren Eingang sich umschalten lässt (ab alexa-fhem version 0.5.13)<br />
** Über <code>genericDeviceType</code> media<br />
** homebridgeMapping InputController:reading=<reading>,cmd=<cmd>,values=HDMI+1;HDMI+2;XBOX<br />
** Erlaubte Werte siehe hier: https://developer.amazon.com/de/docs/device-apis/alexa-property-schemas.html#input<br />
** ...<br />
<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.15)<br />
** Über <code>genericDeviceType</code> contact<br />
** homebridgeMapping ContactSensorState:reading=<reading> oder CurrentDoorState:reading=<reading><br />
** Die Anzeige in der Alexa-App funktioniert sofort, die Abfrage per Sprache erst ab Version 0.5.27.<br />
<br />
* Geräte, deren Lautstärke sich ändern lässt (ab alexa-fhem version 0.5.24)<br />
** Über <code>genericDeviceType</code> speaker<br />
** Automatisch: es muss ein Reading <code>volume</code> und/oder <code>mute</code> geben<br />
** homebridgeMapping Volume:reading=<reading>,cmd=<cmd> Mute:reading=<reading>,cmd=<cmd><br />
** ...<br />
<br />
* Geräte, die sich ein- (und optional) ausschalten lassen als Szene (ab alexa-fhem version 0.5.26)<br />
** Über <code>genericDeviceType</code> scene<br />
** Automatisch: Müssen <code>set on</code> und <code>set off</code> Kommandos haben<br />
** homebridgeMapping On:reading=<reading>,cmdOn=<cmd>[,cmdOff=<cmd>]<br />
** Hinweis: Fehlende Kommandos lassen sich mit cmdalias erzeugen<br />
** Wichtig:<br />
*** Ein Skill darf nur 12 Szenen automatisch erkennen und einbinden.<br />
* Rollläden. Lange ein Problemthema, das nur mit "Schalte auf 0%, schalte auf 100% lief". Wichtig: "alexa-fhem" ab Version 0.5.39 einsetzen. GenericDevice-Type auf "blind" setzen. Nach Restart von alexa-fhem und neuer Gerätesuche sollte folgendes funktionieren:<br />
** "..., öffne <Name> ganz"<br />
** "..., schließe <Name> komplett"<br />
** "hoch" und "runter" (ohne "ganz" oder "komplett") schalten jeweils nur einen bestimmten Prozentsatz hoch oder runter. Dieser kann mit <code>attr <name> homebridgeMapping TargetPosition:minStep=<wert></code>geändert werden. Aber Achtung: In diesem Intervall kann dann auch nur noch ein absoluter Prozentwert per Sprache oder Slider eingestellt werden! Bei z.B. 25% würden 13% zu 25% aufgerundet, 12% zu 0% abgerundet werden.<br />
* Kontaktsensoren (ab alexa-fhem version 0.5.47)<br />
** Automatisch wenn ein Reading <code>motion</code> vorhanden ist oder es sich um einen Zigbee bewgungsmelder an einer HUE oder deCONZ Bridge handelt<br />
** Über <code>genericDeviceType</code> MotionSensor<br />
** homebridgeMapping MotionDetected:reading=<reading>,values=<wert für bewgung>:1;<wert für keine bewegung>:0<br />
<br />
* Alarmmelder (noch nicht in Deutschland):<br />
** genericDeviceType Security<br />
** homebridgeMapping Alarm=<reading>[,type=[fireAlarm|waterAlarm|burglaryAlarm|carbonMonoxideAlarm]]<br />
** wenn der type nicht angegeben wird ist fireAlarm der default<br />
** automatisch werden 0, ok und alles was mit no anfängt als OK erkannt. alles andere gilt als ALARM.<br />
*Geräte mit mehrstufigen Modi:<br />
**siehe den zugehörigen Thread im Forum: {{Link2Forum|Topic= 125604}}<br />
<br />
Es werden noch einige andere häufig verwendete Geräte (Homematic, hue,...) automatisch erkannt.<br />
<br />
to be continued ...<br />
<br />
In der [https://developer.amazon.com/docs/device-apis/list-of-interfaces.html List of Capability Interfaces] bei Amazon kann man sehen, welche Möglichkeiten das Smart Home Skill API aktuell in einzelnen Ländern bietet. Leider ohne die jeweiligen landessprachlichen Kommandos.<br />
<br />
=== Aktiv Routinen starten ===<br />
Routinen (eine Funktionalität, die rein - genauso wie "Räume" - bei Amazon liegt und nicht von FHEM Connector beeinflusst wird) waren lange die ewige Antwort auf die Frage: "Meine Frau möchte aber '''Öffne Rollläden''<nowiki/>' sagen": In der Alexa-App gibt es im Menü den Punkt "Routinen", und hier lässt sich eine gewisse Anzahl von Aktionen (unter optionalen Bedingungen) an ein Sprachkommando knüpfen.<br />
<br />
Neu: Routinen können inzwischen auch von Skills getriggert werden, und seit Version 0.5.47 (Februar 2020) auch von FHEM Connector. Das braucht niemand, um die Rollläden hochzufahren, denn das kann FHEM ja selber, aber um z.B. eine Ansage auf einem Alexa-Gerät zu triggern. Dafür gibt es auch das FHEM-Modul "echodevice", aber es erfordert ein paar Klimmzüge. Mit dem aktiven Triggern von Routinen kann FHEM auslösen, dass Alexa ungefragt (!) Dinge wie <br />
<br />
''"Die Temperatur in der Tiefkühltruhe hat -16 Grad überschritten"'' <br />
<br />
in den Raum sagt. Also eine Alternative bzw. Ergänzung zu Alarmen / Erinnerungen per Telegram o.ä.<br />
<br />
'''Vorgeschichte''':<br />
<br />
Die Smarthome-Skill-API von Amazon sah schon lange das "proactiveReporting" vor: Also z.B. die gemessene Temperatur nicht erst auf Anfrage hin zu übermitteln, sondern laufend aktiv zu pushen. Aber warum Daten an Amazon senden, wenn es dafür keinen Mehrwert gibt? Beim Öffnen z.B. des Thermostaten in der Alexa-App kommen ohnehin laufend Statusabfragen. Warum also einen Datenpool bei Amazon über die Haustemperatur aufbauen und Änderungen pushen, wenn es keinen Mehrwert dafür gibt? <br />
<br />
Inzwischen lassen sich (reale oder vermeintliche) Änderungen von ''Bewegungssensoren'' und ''Fensterkontakten'' als Startbedingung an Alexa-Routinen koppeln. Man kann in der Alexa-App (ggf. fiktive) Öffnen eines Fensterkontaktes an das Aufsagen eines freien Textes durch die Hausbutlerin knüpfen.<br />
<br />
'''Umsetzung''':<br />
* Jedes Alexa-Device, dessen Status aktiv zu Amazon gepusht werden soll, im Attribut "alexaProactiveEvents" mit einer "1" versehen. Per Default wird ''kein'' Gerät laufend aktiv zu Amazon gepusht!<br />
* das geänderte Device einmal zu Amazon pushen "set <alexa> add <device>" (oder 'Alexa, suche neue Geräte' murmeln)<br />
* Das Gerät sollte jetzt beim Anlegen einer neuen Routine ("Neue Routine", "Wenn Folgendes passiert", "Smart Home") als möglicher Triggerpunkt erscheinen.<br />
<br />
==== Dummygeräte: ====<br />
Ein Dummydevice sollte einen Kontaktschalter oder Bewegungssensor simulieren, um dann in FHEM eine beliebige Bedingung als Trigger zu definieren, und eine freie Ansage in Alexa als Routine zu definieren. Hier ein Beispiel:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
define voicetrigger1 dummy<br />
attr voicetrigger1 alexaName alle Fenster<br />
attr voicetrigger1 alexaProactiveEvents 1<br />
attr voicetrigger1 genericDeviceType contact<br />
attr voicetrigger1 homebridgeMapping ContactSensorState=state,values=closed:CONTACT_DETECTED;open:CONTACT_NOT_DETECTED<br />
attr voicetrigger1 setList open closed<br />
<br />
set alexa add voicetrigger1<br />
set alexa restart<br />
</syntaxhighlight><br />
<br />
'''Fehlersuche:'''<br />
<br />
Der Push setzt ein intaktes Push-Token voraus. Sollte im Alexa-Logfile Folgendes erscheinen:<br />
<br />
<code>failed to refresh token: invalid_grant: 'The request has an invalid grant parameter : refresh_token'</code><br />
<br />
so ist das Push-Token nicht aktuell. Weil die Auswirkung lange nur war, dass Geräteänderungen nicht aktiv an Amazon gemeldet wurden, gibt es noch keine umfassende Analyse des Problems. Es lässt sich lösen, indem eine oder beide folgenden Aktionen ausgeführt werden:<br />
* Löschen des ".eventToken" im Alexa-Device über "deletereading"<br />
* "FHEM-Connector"-Skill auf "alexa.amazon.de" einmal deaktivieren und dann neu verbinden<br />
<br />
== Mögliche Probleme und Lösungen ==<br />
<br />
Es kann vorkommen, dass Geräte zwar korrekt erkannt werden, aber das durch Alexa erkannte Kommando nicht richtig umgesetzt wird (Beispiel - mittlerweile behoben: {{Link2Forum|Topic=96766}}). Neben dem FHEM-Log gibt es noch das Logfile, welches von alexa-fhem angelegt wird. <br />
<br />
=== Fehlersuche über die FHEM-Oberfläche ===<br />
<br />
* alexa-fhem Logfile anschauen (Detail-Ansicht des <alexa>-Device aufrufen, klick auf '''Logfile''' oben)<br />
* alexa-fhem im Debug-Modus aufrufen:<br />
** -D zum alexaFHEM-params attribut hinzufügen<br />
** Alexa-Befehl auslösen<br />
** -D aus dem alexaFHEM-params attribut entfernen<br />
* Die notwendigen Informationen finden sich in dem alexa-Logfile (siehe oben)<br />
<br />
=== Fehlersuche über Kommandozeile (lies: Shell) + FHEM-Oberfläche ===<br />
<br />
:* set <alexa> stop (FHEM-Oberfläche)<br />
:* Auf der Kommandozeile <code>alexa-fhem -D -c /opt/fhem/alexa-fhem.cfg > debug.log</code> starten (dadurch wird die Datei debug.log erzeugt im aktuellen Verzeichnis)<br />
:* Alexa-Befehl auslösen<br />
:* alexa-fhem auf der Kommandozeile wieder stoppen (CTRL-C)<br />
:* set <alexa> start (FHEM-Oberfläche)<br />
<br />
Die Datei debug.log sollte Hinweise enthalten, wie das Problem zu lösen ist oder Dich zumindest in die richtige Richtung schieben.<br />
<br />
Im Beispiel aus dem Forum fand sich in dem Logfile der Hinweis darauf, dass das Device mit falschen min/max-Werten unterwegs war.<br />
<br />
=== Registrierungskey vergessen, Registrierung zurücksetzen ===<br />
<br />
Auf der Kommandoshell:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de status<br />
Registered.<br />
Registered on 2019-01-13T15:38:13Z.<br />
</syntaxhighlight><br />
<br />
heisst, das der Vereinsserver eigentlich alles hat, was er will. Es wird kein neuer Schlüssel generiert.<br />
Wenn Du die Situation zurücksetzen möchtest, wäre die hässliche Methode, Deinen SSH-Key zu löschen. Eleganter ist, die Registrierung auf Vereinsseite zu löschen:<br />
<br />
<syntaxhighlight lang="bash" style="width:90%;"><br />
pi@raspberrypi:~# sudo -u fhem ssh -p 58824 fhem-va.fhem.de unregister<br />
Your registration has been removed<br />
</syntaxhighlight><br />
<br />
löscht Deinen Schlüssel mitsamt allen dort gespeicherten Daten auf Vereinsseite. Bei Restart von alexa-fhem in FHEM-WEB wird jetzt ein neuer Registrierungskey angefordert.<br />
<br />
== Sicherheitskonzept und Secrets ==<br />
<br />
Um diesen Abschnitt zu verstehen, solltest Du den Abschnitt "Arbeitsweise" im Kopf haben. Einerseits ist Dir vermutlich einleuchtend, dass ein Server, der per SSH rückwärts nur ausgewählte Kommandos in den Tunnel, den Du aufgebaut hast, leitet, "irgendwie sicherer" ist. Andererseits möchte man nicht blind vertrauen.<br />
<br />
=== SSH ===<br />
==== SSH - macht das nichts Gefährliches? ====<br />
SSH ist ein Veteran des Internet und entstand, um sich sicher (verschlüsselt) und schnell auf Servern einzuloggen. Schon früh wurde dabei der sogenannte "Reverse-Tunnel" implementiert: Also der vom Client (Deinem Rechner) geäußerte Wunsch: "Bitte leite mir Requests, die bei Dir, Server, auf Port xy eingehen, an meinen lokalen Port yz weiter.". Dieses Verfahren implementiert der Reverseproxy, wobei tatsächlich auf dem Server für Dich kein echter Port geöffnet wird.<br />
<br />
Wie Dir ggf. sicher der Unix-Guru Deines Vertrauens bestätigen wird: Die Kombination<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
ssh -R 1234:localhost:<zufälliger port> zielserver <br />
</syntaxhighlight><br />
erlaubt keine Ausführung von Shell-Kommandos auf Deinem Server, sondern einzig, dass vom SSH-Programm Verbindungen zu einem lokalen Port auf Deinem Server auf dem alexa-fhem lauscht aufgebaut werden. Du kannst also z.B. mit einem<br />
<syntaxhighlight lang="bash" style="width:50%;"><br />
sudo /usr/sbin/tcpdump -X -s 0 -i lo port <zufälliger port><br />
</syntaxhighlight><br />
vollständig überwachen (oder ggf. permanent aufzeichen), was auf Deinem Server von außen gesteuert passiert.<br />
<br />
==== Wie wird bei SSH verschlüsselt? ====<br />
Im Prinzip wie im Web auf SSL-Seiten, teils mit den gleichen Verschlüsselungsverfahren. Allerdings arbeitet SSH eher wie das im Web recht seltene Verfahren: Bei jeder Verbindung übermitteln sowohl Server wie auch Client den öffentlichen Teil ihres Schlüssels. Anders als im Web wird der Schlüssel aber nicht von einer öffentlichen Zertifizierungsstelle wie "LetsEncrypt" unterschrieben. Stattdessen entscheiden Server wie Client beim ersten Verbindungsaufbau typischerweise per manueller Frage: "Willst Du jetzt und künftig diesem Schlüssel vertrauen?" Bei der Installation wird diese Frage für Deine Seite bejaht, und fortan wird der öffentliche Schlüssel des FHEM-Servers auf Deinem Rechner gespeichert. Ab da bist Du z.B. davor sicher, dass jemand den DNS-Eintrag verbiegt oder sich in den Datenfluss Deines Providers einhängt: Ein geänderter Serverschlüssel würde bemerkt werden.<br />
<br /><br />
Soweit klar? Aus Deinem öffentlichen Schlüssel wiederum leitet der Server her: "Das ist definitiv wieder derjenige, der sich damals "registriert" hat". Und an dieser Stelle kann ich auch den <b>ersten Teil des 3-teiligen Registrierungskeys</b> erläutern: Die typischerweise 6-stellige Hex-Zahl am Anfang ist der Java-Hashcode Deines öffentlichen Schlüssel. Sie ist damit sozusagen Deine aus Deinem öffentlichen Schlüssel abgeleitete Benutzer-ID.<br />
<br />
=== Die Rolle der Secrets ===<br />
Wenn jetzt klar ist, dass die Verbindung zum Vereinsserver sicher und vertauschungsfrei funktioniert, bleiben noch 2 Probleme zu lösen:<br />
1) Im Web bei der Skill-Aktivierung musst Du beweisen, dass Du der Mensch am Browser bist, dem der SSH-Tunnel von IP xy mit dem öffentlichen Schlüssel X gehört. Bei der automatischen Registrierung werden lokal auf Deinem Rechner zwei 64-Bit-Secrets generiert:<br />
* Das <b>Anmelde</b>-Secret<br />
* Das <b>Bearer</b>-Token<br />
Beim Anmelden des SSH-Keys auf dem öffentlichen Server wird nun der <b>Hashwert</b> des ersten Secrets übertragen und dort in Verbindung mit Deinem öffentlichen Schlüssel gespeichert. Ein Hashwert bedeutet, dass (sofern das Verfahren, hier SHA256, funktioniert), niemand aus dem Hash das Secret zurückrechnen kann. Ein Datenbankklau auf dem Server gefährdet also nicht die Sicherheit Deines Passwortes.<br />
<br />
Wenn Du nun beim Skill-Aktivieren den Registrierungskey eingibst, dann "sieht" der Server zum ersten Mal Dein ausgewürfeltes Secret, vergleicht es mit dem Hashwert und wird es anschließend wieder umgehend vergessen. Anhand des Hashwertes kann der Server aber entscheiden, dass Du der legitime Nutzer zum öffentlichen Schlüssel XY bist.<br />
<br />
2) Das zweite Problem ist: Wie soll Amazon "beweisen", dass sie der legitime Aufrufer sind? Amazon erhält binnen wenigen Sekunden nach dem Klick auf "Activate Skill" den <b>dritten Teil</b> des Registrierungskeys als sogenanntes Bearer-Token. Zwar läuft er durch den Registrierungsserver, er wird dort, auf dem Registrierungs/Vereinsserver aber nicht gespeichert. Das Bearer-Token wird von Amazon bei allen Requests zu Deinem Server mitgesendet. Da es am Anfang zusätzlich Deine "User-ID" enthält, weiß der Vereinsserver, zu welchem SSH-Tunnel der Request zu senden ist. Aber lokal auf Deinem Rechner wird ausgewertet, ob das Token "stimmt".<br />
<br />
== alexa-fhem Updaten bzw. "Upgraden" ==<br />
<br />
'''Updaten einer "Connector" Installation:'''<br />
* alexa-fhem über FHEM anhalten (Name des Alexa-Device: alexa):<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa stop</syntaxhighlight><br />
<br />
*Auf der Konsole wie anfangs bei der Installation:<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm update -g alexa-fhem</syntaxhighlight><br />
<br />
:Manchmal hat npm Probleme mit einem Update. Dann einfach die aktuelle Version noch mal drüber Installieren: <br />
<br />
:<syntaxhighlight lang="bash" style="width:50%;">sudo npm install -g alexa-fhem</syntaxhighlight><br />
<br />
*alexa-fhem über FHEM wieder starten:<br />
:<syntaxhighlight lang="perl" style="width:50%;">set alexa start</syntaxhighlight><br />
<br />
'''"Upgraden von einer "Nicht-Connector" Installation (z.B. manuelle Installation per pm-Download):'''<br />
* Daten der aktuellen Installation sichern (v.a. config.json / man weiß ja nie)<br />
* Autostart der aktuellen alexa-fhem Installation deaktivieren:<br />
** Bei initd: Service deaktivieren mittels: <code>sudo update-rc.d -f alexa remove</code> Vorher mittels stoppen: <code>sudo service alexa stop</code> Startscript unter /etc/init.d/ löschen.<br />
** Bei systemd: Service deaktivieren mittels: <code>sudo systemctl disable alexa</code> Vorher mittels stoppen: <code>sudo systemctl alexa stop</code> Startscript unter /etc/systemd/system/ löschen.<br />
* ALLE vorhandenen alexa-fhem Daten LÖSCHEN! Bleiben Dinge zurück und wird dann laut Connector installiert kann es zu Problemen kommen!<br />
* (reboot)<br />
* Installation von alexa-fhem laut Anleitung (Beginn dieses Wiki)<br />
* Falls eigene Dinge von früher genutzt werden wollen/sollen (z.B. Custom Skill), dann die entsprechenden Einträge aus der gesicherten config.json in die neu angelegte alexa-fhem.cfg (zu finden unter "Edit files") übernehmen.<br />
* Werden keine eigenen Dinge verwendet, dann kann der Port (Standard: 3000) geschlossen werden und auch die Daten unter Amazon-Developer können gelöscht werden.<br />
<br />
== Bug- und Wunschliste ==<br />
* Ist beim Start keine Internetverbindung vorhanden, erfolgt kein Retry -- alexa-fhem muss restartet werden (ssh_autoconfig wertet keine temporären Fehler aus)<br />
<br />
==Weitergehende Informationen==<br />
*[[Alexa und Mappings]]<br />
*[[Alexa Tipps und Kniffe]]<br />
*[[FHEM Connector for Amazon Alexa]]<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Sprachsteuerung]]<br />
<br />
==Hinweise==<br />
<references /></div>Sailorhttp://wiki.fhem.de/w/index.php?title=Departure&diff=39205Departure2024-03-26T18:41:57Z<p>Sailor: </p>
<hr />
<div>Departure ist ein Modul zur Anzeige der Abfahrtszeiten von Bahn, Bus, Zug und Fähre des öffentlichen Personennahverkehrs (ÖPNV).<br />
Diese Seite basiert auf einem {{Link2Forum|Topic=48255.0|LinkText=Beitrag im Forum}} (von [https://forum.fhem.de/index.php?action=profile;u=5250 sbiermann]). Mittlerweile gibt es hierzu ein {{Link2Forum|Topic=60046.0|LinkText= noch inoffizielles Modul}} (von [https://forum.fhem.de/index.php?action=profile;u=14026 uniqueck]).<br />
<br />
Zusätzlich gibt es ein {{Link2Forum|Topic=48255.0|LinkText=Widget für die FHEM Tablet UI}} (FTUI) (von [https://forum.fhem.de/index.php?action=profile;u=7023 setstate]).<br />
<br />
{{Todo|Diese Seite sollte angepasst/überarbeitet werden, wenn das Modul 98_departure offiziell eingecheckt ist.}}<br />
<br />
__TOC__<br />
<br />
== Vorbereitung ==<br />
Um die Abfahrtzeiten zu ermitteln wird der REST-Wrapper von sbiermann genutzt, der auf dem Dienst für die Android App "Öffi" basiert.<br />
Für die Spätere Abfrage wird der Provider und die ID der Haltestelle benötigt. Beides kann wie folgt ermittelt werden.<br />
<br />
<b>1. Ermitteln welche Provider gibt es und welcher ist für mich zuständig.</b><br />
<pre>https://transport.stefan-biermann.de/publictransportapi/rest/provider</pre><br />
<br />
Dieses liefert als Antwort im JSON Format:<br />
<pre><br />
[{"name":"Sncb","aClass":"SncbProvider"},{"name":"Vbn","aClass":"VbnProvider"},{"name":"Wien","aClass":"WienProvider"},{"name":"Linz","aClass":"LinzProvider"},{"name":"Vrr","aClass":"VrrProvider"},{"name":"Oebb","aClass":"OebbProvider"},{"name":"Gvh","aClass":"GvhProvider"},{"name":"Ns","aClass":"NsProvider"},{"name":"Vao","aClass":"VaoProvider"},{"name":"Tfi","aClass":"TfiProvider"},{"name":"Vgn","aClass":"VgnProvider"},{"name":"Mvg","aClass":"MvgProvider"},{"name":"Pl","aClass":"PlProvider"},{"name":"Vgs","aClass":"VgsProvider"},{"name":"Nasa","aClass":"NasaProvider"},{"name":"Vbb","aClass":"VbbProvider"},{"name":"Ivb","aClass":"IvbProvider"},{"name":"Nvv","aClass":"NvvProvider"},{"name":"Mvv","aClass":"MvvProvider"},{"name":"Vagfr","aClass":"VagfrProvider"},{"name":"Vvv","aClass":"VvvProvider"},{"name":"Sf","aClass":"SfProvider"},{"name":"Vms","aClass":"VmsProvider"},{"name":"Sbb","aClass":"SbbProvider"},{"name":"Bsvag","aClass":"BsvagProvider"},{"name":"Jet","aClass":"JetProvider"},{"name":"Septa","aClass":"SeptaProvider"},{"name":"Bvb","aClass":"BvbProvider"},{"name":"Mersey","aClass":"MerseyProvider"},{"name":"Vvs","aClass":"VvsProvider"},{"name":"Nvbw","aClass":"NvbwProvider"},{"name":"Se","aClass":"SeProvider"},{"name":"Svv","aClass":"SvvProvider"},{"name":"Bahn","aClass":"BahnProvider"},{"name":"Vrs","aClass":"VrsProvider"},{"name":"Stockholm","aClass":"StockholmProvider"},{"name":"Vmv","aClass":"VmvProvider"},{"name":"Stv","aClass":"StvProvider"},{"name":"Sydney","aClass":"SydneyProvider"},{"name":"Paris","aClass":"ParisProvider"},{"name":"Dsb","aClass":"DsbProvider"},{"name":"Rt","aClass":"RtProvider"},{"name":"Dub","aClass":"DubProvider"},{"name":"Bvg","aClass":"BvgProvider"},{"name":"Paca","aClass":"PacaProvider"},{"name":"Vor","aClass":"VorProvider"},{"name":"FrenchSouthWest","aClass":"FrenchSouthWestProvider"},{"name":"Avv","aClass":"AvvProvider"},{"name":"Zvv","aClass":"ZvvProvider"},{"name":"Nri","aClass":"NriProvider"},{"name":"Invg","aClass":"InvgProvider"},{"name":"Eireann","aClass":"EireannProvider"},{"name":"Vbl","aClass":"VblProvider"},{"name":"Vvo","aClass":"VvoProvider"},{"name":"Sh","aClass":"ShProvider"},{"name":"Kvv","aClass":"KvvProvider"},{"name":"Bayern","aClass":"BayernProvider"},{"name":"Atc","aClass":"AtcProvider"},{"name":"Lu","aClass":"LuProvider"},{"name":"Italy","aClass":"ItalyProvider"},{"name":"Vvm","aClass":"VvmProvider"},{"name":"Met","aClass":"MetProvider"},{"name":"Ding","aClass":"DingProvider"},{"name":"Tlem","aClass":"TlemProvider"},{"name":"Vvt","aClass":"VvtProvider"},{"name":"Vrn","aClass":"VrnProvider"}]<br />
</pre><br />
Das was bei Name steht wird verwendet, der Wert aClass ist intern und braucht hier nicht weiter verwendet werden. Im Beispiel haben die Verkehrsbetriebe Stuttgart (VVS) den Namen "Vvs".<br />
<br />
<b>2. Ermitteln der StationId für die Haltestelle deren Abfahrtszeiten ich gerne haben möchte. In diesem Beispiel die Haltstelle "SSB-Zentrum"</b><br />
<pre><br />
https://transport.stefan-biermann.de/publictransportapi/rest/station/suggest?q=SSB-Zentrum&provider=Vvs<br />
</pre><br />
Dieses liefert als Antwort im JSON Format:<br />
<pre><br />
[{"type":"STATION","id":"5000350","lat":48726856,"lon":9129721,"place":"Stuttgart","name":"SSB-Zentrum","products":null,"lonAsDouble":9.129721,"latAsDouble":48.726856,"identified":true},{"type":"STATION","id":"5002601","lat":48722757,"lon":9129058,"place":"Stuttgart","name":"Industriestraße (SSB-Zentrum)","products":null,"lonAsDouble":9.129058,"latAsDouble":48.722757,"identified":true}]<br />
</pre><br />
Wie man sehen kann gibt es mehrere Treffer für SSB-Zentrum. Es wird aber nur der Typ "STATION" benötigt und somit lautet die StationId "5000350".<br />
<br />
<b>3. Abfrage der Departure Zeiten für die Haltestelle "SSB-Zentrum". Diese liefert die Daten im passenden Format für das zugehörige departure Widget für FTUI</b><br />
<pre><br />
https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=5000350&provider=Vvs<br />
</pre><br />
dieses liefert als Antwort im passenden Format:<br />
<pre><br />
[["U8","Vaihingen","3"],["U12","Dürrlewang","6"],["U8","Ostfildern","5"],["U3","Vaihingen","6"],["U12","Hallschlag","7"],["U3","Plieningen","9"],["U8","Vaihingen","12"],["U12","Dürrlewang","17"],["U8","Waldau","15"],["U3","Vaihingen","16"]]<br />
</pre><br />
Die Zeiten sind immer inklusive Verspätung angegeben, sofern der Provider diese Daten mit sendet.<br />
<br />
== Einbindung in FHEM ==<br />
Wie in der Einleitung erwähnt gibt es aktuell zwei Wege, die Abfahrtszeiten einzubinden: über HTTPMOD oder über das noch inofizielle Modul 98_departure<br />
<pre><br />
define myDeparture HTTPMOD none 0<br />
attr myDeparture get01Name SSB-Zentrum<br />
attr myDeparture get01URL https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=5000350&provider=Vvs<br />
attr myDeparture get01Regex (\[\[.*\]\]).*<br />
attr VAG timeout 30<br />
</pre><br />
Es können mehrere Haltestellen in einem Device hinterlegt werden, hierzu einfach die drei Attribute get01Name, get01URL und get01Regex duplizieren und durchnummerieren. Dabei müssen natürlich Name und URL angepasst werden.<br />
Bei dieser Konfiguration erfolgt die Aktualisierung über das FTUI Widget!<br />
<br />
Alternativ wird im Forum erläutert, wie man mit HTTPMOD die Abfahrtszeiten erhalten kann. Erstmal auf der Bahn-Seite https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox? den gewünschten Bahnhof raussuchen, es sind wie gesagt aber nicht nur Bahnhöfe drin sondern auch die meisten Haltestellen der regionalen Verkehrsverbünde. Einmal Abfahrt oder Ankunft wählen und dann "Später" drücken, erst dann ist oben in der URL der Parameter "si" mit der Bahnhofs-ID zu sehen.<br />
<br />
Eine URL für den Hauptbahnhof Hannover würde jetzt so aussehen:<br />
<pre><br />
https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes&<br />
</pre><br />
<br />
in FHEM dann damit ein<br />
<pre><br />
define bhf_HannoverHbf HTTPMOD https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes& 0<br />
</pre><br />
<br />
In dem angelegtem Device auf Raw-Definition gehen und alles löschen und das eintragen<br />
<pre><br />
defmod bhf_HannoverHbf HTTPMOD https://reiseauskunft.bahn.de/bin/bhftafel.exe/dox?si=8000152&bt=dep&p=1111111111&max=5&rt=1&use_realtime_filter=1&start=yes& 0<br />
attr bhf_HannoverHbf userattr get1Name reading01-10Name reading01-11Name reading01-12Name reading01-13Name reading01-14Name reading01-15Name reading01-16Name reading01-17Name reading01-18Name reading01-19Name reading01-1Name reading01-20Name reading01-2Name reading01-3Name reading01-4Name reading01-5Name reading01-6Name reading01-7Name reading01-8Name reading01-9Name reading01Name reading01OExpr reading01RegOpt reading01Regex<br />
attr bhf_HannoverHbf get1Name Update<br />
attr bhf_HannoverHbf reading01-10Name departure_3_destination<br />
attr bhf_HannoverHbf reading01-11Name departure_3_time<br />
attr bhf_HannoverHbf reading01-12Name departure_3_delay<br />
attr bhf_HannoverHbf reading01-13Name departure_4_product<br />
attr bhf_HannoverHbf reading01-14Name departure_4_destination<br />
attr bhf_HannoverHbf reading01-15Name departure_4_time<br />
attr bhf_HannoverHbf reading01-16Name departure_4_delay<br />
attr bhf_HannoverHbf reading01-17Name departure_5_product<br />
attr bhf_HannoverHbf reading01-18Name departure_5_destination<br />
attr bhf_HannoverHbf reading01-19Name departure_5_time<br />
attr bhf_HannoverHbf reading01-1Name departure_1_product<br />
attr bhf_HannoverHbf reading01-20Name departure_5_delay<br />
attr bhf_HannoverHbf reading01-2Name departure_1_destination<br />
attr bhf_HannoverHbf reading01-3Name departure_1_time<br />
attr bhf_HannoverHbf reading01-4Name departure_1_delay<br />
attr bhf_HannoverHbf reading01-5Name departure_2_product<br />
attr bhf_HannoverHbf reading01-6Name departure_2_destination<br />
attr bhf_HannoverHbf reading01-7Name departure_2_time<br />
attr bhf_HannoverHbf reading01-8Name departure_2_delay<br />
attr bhf_HannoverHbf reading01-9Name departure_3_product<br />
attr bhf_HannoverHbf reading01Name reading<br />
attr bhf_HannoverHbf reading01OExpr {$val =~ s/<br\/><span class="delay.*">//g;; $val =~ s/<\/span>.*//g;; $val =~ s/.*&nbsp;;.*//g;; $val =~ s/, <span.*//g;; $val =~ s/&#x0028;;/(/g;; $val =~ s/&#x0029;;/)/g;; $val =~ s/&#252;;/ü/g;; $val =~ s/&#246;;/ö/g;; $val =~ s/&#228;;/ä/g;; $val =~ s/&#223;;/ß/g;; $val;;}<br />
attr bhf_HannoverHbf reading01RegOpt gm<br />
attr bhf_HannoverHbf reading01Regex <span class="bold">(.*)<\/span>\s<\/a>[\w\W]&[gl]t;;&[gl]t;;\s(.*)\s<br \/>[\w\W]<span class="bold">(\d\d:\d\d)<\/span>(.*)<\/div><br />
attr bhf_HannoverHbf stateFormat departure_1_product departure_1_destination departure_1_time (departure_1_delay)<br />
</pre><br />
<br />
Jetzt gibt es oben den Update Button oder "get bhf_HannoverHbf Update" in der FHEM Befehlzeile wählen, dann sollten ein paar Readings erscheinen:<br />
<br />
<pre><br />
READINGS:<br />
2019-12-22 17:15:23 departure_1_delay 17:16<br />
2019-12-22 17:15:23 departure_1_destination Hauptbahnhof/ZOB, Hannover<br />
2019-12-22 17:15:23 departure_1_product STB 10<br />
2019-12-22 17:15:23 departure_1_time 17:14<br />
2019-12-22 17:15:23 departure_2_delay 17:17<br />
2019-12-22 17:15:23 departure_2_destination Sarstedt (Endpunkt GVH)<br />
2019-12-22 17:15:23 departure_2_product STB 1<br />
2019-12-22 17:15:23 departure_2_time 17:14<br />
2019-12-22 17:15:23 departure_3_delay 17:15<br />
2019-12-22 17:15:23 departure_3_destination Haltenhoffstraße, Hannover<br />
2019-12-22 17:15:23 departure_3_product Bus 121<br />
2019-12-22 17:15:23 departure_3_time 17:14<br />
2019-12-22 17:15:23 departure_4_delay 17:15<br />
2019-12-22 17:15:23 departure_4_destination Ahlem, Hannover<br />
2019-12-22 17:15:23 departure_4_product STB 10<br />
2019-12-22 17:15:23 departure_4_time 17:15<br />
2019-12-22 17:15:23 departure_5_delay <br />
2019-12-22 17:15:23 departure_5_destination Hauptbahnhof/ZOB, Hannover<br />
2019-12-22 17:15:23 departure_5_product Bussprin<br />
2019-12-22 17:15:23 departure_5_time 17:15<br />
</pre><br />
<br />
Man kann in der Bahnabfrage auch eine Linie auswählen, die Info muss dann im URL Parameter "tn" stehen. Wenn man eine bestimmte Richtung ausfiltern will geht das auch im Atrribut reading01Regex, da könnte man z.B. dort wo das jeweils zweite Reading erzeugt wird ....t;;\s(Leipzig.*)\s<br..... schreiben.<br />
<br />
Läuft bei jetzt seit ein paar Tagen ganz gut. Allerdings scheint nicht bei allen Verkehrsverbünden die Verspätungsanzeige schon zu funktionieren, da bleibt dann das Reading delay leer, bei mir im VBN geht es aber auch für lokale Bushaltestellen.<br />
<br />
Falls es nicht für alle Abfahrten Echtzeiten gibt kann man mit einem Userreading noch definieren, dass dann ein Planzeit angezeigt wird, z.B. so:<br />
<br />
departure_1_delay_time { ReadingsVal($NAME,"departure_1_delay",0) eq "" ? ReadingsVal($NAME,"departure_1_time",0) : ReadingsVal($NAME,"departure_1_delay",0);}<br />
<br />
oder wenn man z.B. eine Farbsteuerung bei Verspätungen benötigt ein Userreading was zwischen 0 und 1 umschaltet.<br />
<br />
departure_1_is_delay { ReadingsVal($NAME,"departure_1_delay",0) eq ReadingsVal($NAME,"departure_1_time",0) ? 0 : 1;}<br />
<br />
== Bekannte Probleme ==<br />
=== UTC versus lokale Zeitzone ===<br />
Die Uhrzeit unter departure_0_time und departure_0_time_human_readable wird in UTC und nicht in lokaler Zeit angezeigt.<br />
Hierfuer kann man sich ein User-Reading erstellen, welches die Zeitzonen-Differenz ermittelt und anschliessend auf die Abfahrtszeit in UTC vorzeichenrichtig drauf addiert.<br />
Das entsprechende Atrrribut "UserReading" lautet wie folgt:<br />
<pre><br />
departure_0_only_time {my $oldtime = ReadingsVal($NAME,"departure_0_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_1_only_time {my $oldtime = ReadingsVal($NAME,"departure_1_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_2_only_time {my $oldtime = ReadingsVal($NAME,"departure_2_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_3_only_time {my $oldtime = ReadingsVal($NAME,"departure_3_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_4_only_time {my $oldtime = ReadingsVal($NAME,"departure_4_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_5_only_time {my $oldtime = ReadingsVal($NAME,"departure_5_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_6_only_time {my $oldtime = ReadingsVal($NAME,"departure_6_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_7_only_time {my $oldtime = ReadingsVal($NAME,"departure_7_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_8_only_time {my $oldtime = ReadingsVal($NAME,"departure_8_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;},<br />
departure_9_only_time {my $oldtime = ReadingsVal($NAME,"departure_9_time",0);$oldtime =~ s/.*T//;$oldtime =~ s/\+.*//;my @lt = localtime(12*60*60);my @gt = gmtime(12*60*60);my $tz = $lt[2] - $gt[2];my @DepTimeSplit = split(":", $oldtime);my $newtime = $DepTimeSplit[0]+$tz . ":" . $DepTimeSplit[1];$newtime;}<br />
</pre><br />
Dieses schneidet auch gleich das Datum raus.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=48255|LinkText=Forum: Neues FTUI Widget - Departure}}<br />
* [https://forum.fhem.de/index.php?topic=60046.0 Forum: Modul 98_Departure: Bereitstellung von Abfahrtszeiten an einem Bahnhof]<br />
* [[FTUI Widget Departure|Wiki: FHEM Tablet UI - Departure Widget]]<br />
<br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:Code Snippets]]<br />
[[Kategorie:Modul (Inoffiziell)]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39194DoorBird2024-03-20T09:38:29Z<p>Sailor: /* Einrichtung des DoorBird Anlage */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/connect/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
Des weiteren muss für den entsprechenden User, welcher in fhem angegeben wird, das Setting "API-Operator" freigegeben werden. Diese Einstellung findet man in der DoorBird - App unter "Einstellungen" -> "Administration" -> Entsprechend Einloggen -> "BENUTZER - Einstellungen" -> User auswählen -> "Berechtigungen" -> "API-Operator" aktivieren.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
;disable <br />
:Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird - Anlage ausgesendeten UDP - Datageramme<br />
:Der Default Wert ist 0 = aktiviert<br />
<br />
;AudioFileDir <br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;AudioFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Audio-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;EventReset <br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;HistoryFilePath <br />
:Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image")<br />
:Der Default Wert ist "0" = disabled<br />
<br />
;ImageFileDir <br />
:Der relative (z.B. "images") oderr absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;ImageFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Image-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;KeepAliveTimeout <br />
:Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird.<br />
:Der Default Wert ist 30s<br />
<br />
;MaxHistory <br />
:Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor.<br />
:Der Default Wert ist "50" = Maximum.<br />
<br />
;OpsModeList <br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;PollingTimeout <br />
:Timeout in Sekunden before der Download-Versuch aufgrund fehlender Antwort seitens der DoorBird-Anlage terminiert wird. Eine Adjustierung mag notwendig sein, sobald :Netzwerk-Latenzen aufteten.<br />
:Der Default-Wert ist 10s.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;UdpPort <br />
:Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;VideoFileDir <br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;VideoFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Video-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;VideoFileFormat <br />
:Das Dateiformat für die Videodatei<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;WaitForHistory <br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen fhemßServer und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39175DoorBird2024-03-12T11:30:53Z<p>Sailor: /* Einstellungen über Attribute */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
;disable <br />
:Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird - Anlage ausgesendeten UDP - Datageramme<br />
:Der Default Wert ist 0 = aktiviert<br />
<br />
;AudioFileDir <br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;AudioFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Audio-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;EventReset <br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;HistoryFilePath <br />
:Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image")<br />
:Der Default Wert ist "0" = disabled<br />
<br />
;ImageFileDir <br />
:Der relative (z.B. "images") oderr absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;ImageFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Image-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;KeepAliveTimeout <br />
:Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird.<br />
:Der Default Wert ist 30s<br />
<br />
;MaxHistory <br />
:Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor.<br />
:Der Default Wert ist "50" = Maximum.<br />
<br />
;OpsModeList <br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;PollingTimeout <br />
:Timeout in Sekunden before der Download-Versuch aufgrund fehlender Antwort seitens der DoorBird-Anlage terminiert wird. Eine Adjustierung mag notwendig sein, sobald :Netzwerk-Latenzen aufteten.<br />
:Der Default-Wert ist 10s.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;UdpPort <br />
:Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;VideoFileDir <br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;VideoFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Video-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;VideoFileFormat <br />
:Das Dateiformat für die Videodatei<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;WaitForHistory <br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen fhemßServer und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39174DoorBird2024-03-12T11:28:43Z<p>Sailor: /* Einstellungen über Attribute */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
;disable <br />
:Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird - Anlage ausgesendeten UDP - Datageramme<br />
:Der Default Wert ist 0 = aktiviert<br />
<br />
;AudioFileDir <br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;AudioFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Audio-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;EventReset <br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;HistoryFilePath <br />
:Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image")<br />
:Der Default Wert ist "0" = disabled<br />
<br />
;ImageFileDir <br />
:Der relative (z.B. "images") oderr absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;ImageFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Image-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;KeepAliveTimeout <br />
:Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird.<br />
:Der Default Wert ist 30s<br />
<br />
;MaxHistory <br />
:Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor.<br />
:Der Default Wert ist "50" = Maximum.<br />
<br />
;OpsModeList <br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;PollingTimeout <br />
:Timeout in Sekunden before der Download-Versuch aufgrund fehlender Antwort seitens der DoorBird-Anlage terminiert wird. Eine Adjustierung mag notwendig sein, sobald :Netzwerk-Latenzen aufteten.<br />
:Der Default-Wert ist 10s.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;UdpPort <br />
:Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;VideoFileDir <br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;VideoFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Video-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;VideoFileFormat <br />
:Das Dateiformat für die Videodatei<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;WaitForHistory <br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen fhemßServer und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39173DoorBird2024-03-12T11:25:11Z<p>Sailor: /* Einstellungen über Attribute */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
;disable <br />
:Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird ß Anlage ausgesendeten UDP - Datageramme<br />
:Der Default Wert ist 0 = aktiviert<br />
<br />
;AudioFileDir <br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;AudioFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Audio-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;EventReset <br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;HistoryFilePath <br />
:Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image")<br />
:Der Default Wert ist "0" = disabled<br />
<br />
;ImageFileDir <br />
:Der relative (z.B. "images") oderr absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;ImageFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Image-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;KeepAliveTimeout <br />
:Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird.<br />
:Der Default Wert ist 30s<br />
<br />
;MaxHistory <br />
:Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor.<br />
:Der Default Wert ist "50" = Maximum.<br />
<br />
;OpsModeList <br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;PollingTimeout <br />
:Timeout in Sekunden before der Download-Versuch aufgrund fehlender Antwort seitens der DoorBird-Anlage terminiert wird. Eine Adjustierung mag notwendig sein, sobald :Netzwerk-Latenzen aufteten.<br />
:Der Default-Wert ist 10s.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;UdpPort <br />
:Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;VideoFileDir <br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
;VideoFileDirMaxSize <br />
:Die maximale Größe des Unterverzeichnisses für die Video-Dateien in Megabyte (MB). Beim Erreichen dieses Wertes, werden die ältesten Dateien automatisch gelöscht.<br />
:Der Default Wert ist 50 = 50MB<br />
<br />
;VideoFileFormat <br />
:Das Dateiformat für die Videodatei<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion <br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;WaitForHistory <br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen fhemßServer und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39172DoorBird2024-03-12T07:55:39Z<p>Sailor: /* Update der Firmware */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39171DoorBird2024-03-12T07:52:48Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39153DoorBird2024-03-03T18:20:33Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39144DoorBird2024-02-27T15:36:01Z<p>Sailor: </p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits als Download via update - Befehl erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39098DoorBird2024-02-15T08:18:39Z<p>Sailor: </p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - Dieses Wiki bezieht sich bereits auf die neue Version. Die neue Version der 73_DoorBird.pm ist bereits im Forum als Download erhältlich.}}<br />
<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39097DoorBird2024-02-15T08:15:33Z<p>Sailor: /* Bekannte Probleme */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<br />
<br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39096DoorBird2024-02-15T08:13:53Z<p>Sailor: /* Es werden keine Sprachmeldungen mehr an den DoorBird überragen */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39095DoorBird2024-02-15T08:11:33Z<p>Sailor: /* Einstellungen über Attribute */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39094DoorBird2024-02-15T08:10:55Z<p>Sailor: Änderung 39093 von Sailor (Diskussion) rückgängig gemacht.</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39093DoorBird2024-02-15T08:10:04Z<p>Sailor: /* Es werden keine Sprachmeldungen mehr an den DoorBird überragen */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39092DoorBird2024-02-15T08:09:25Z<p>Sailor: /* Links */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39091DoorBird2024-02-15T08:09:02Z<p>Sailor: /* Zukünftige Entwicklungen */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39090DoorBird2024-02-15T08:07:55Z<p>Sailor: /* Keine Ausgabe von Mp3-Dateien */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element »wavparse«" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39089DoorBird2024-02-15T08:06:22Z<p>Sailor: /* Bibliothek "Crypt::NaCL::Sodium"-Installation fehlgeschlagen */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39088DoorBird2024-02-15T08:03:47Z<p>Sailor: /* SIP und Text2Speech */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39087DoorBird2024-02-15T08:03:05Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code><br />
:<Code> sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
:<Code> sudo cpan install Crypt::AuthEnc::ChaCha20Poly1305</Code><br />
:<Code> sudo cpan install Crypt::Argon2</Code><br />
:<Code> sudo cpan install Sodium::FFI</Code><br />
:<Code> sudo cpan install IO::String module</Code><br />
:<Code> sudo cpan install IO::Socket</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=39086DoorBird2024-02-14T17:04:16Z<p>Sailor: /* Bekannte Probleme */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
{{Randnotiz|RNTyp=r|RNText='''Achtung''' - Februar 2024 - In {{Link2Forum|Topic=100758|Message=1302884|LinkText=diesem Forenbeitrag}} kündigt der Autor eine inkompatible Änderung des Moduls an. Zur Vermeidung von plötzlichen Funktionsproblemen wird empfohlen, das Modul aus dem FHEM Update auszuschließen, bis die im Forum beschriebenen notwendigen Vorbereitungen getroffen wurden}}<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev && sudo apt-get install -y gstreamer1.0-tools</Code><br />
:<Code> wget http://ftp.us.debian.org/debian/pool/main/libs/libsodium/libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo dpkg -i ./libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo apt-get install libyaml-appconfig-perl</Code><br />
<br />
:<Code> sudo nano /etc/ssh/sshd_config</Code><br />
Uncomment<br />
:<Code> #PermitRootLogin without-password</Code><br />
into<br />
:<Code> PermitRootLogin yes</Code><br />
<br />
:<Code> sudo passwd</Code><br />
Choose Root password which is different than pi password and really save!<br />
Close ssh session reboot (sudo reboot) and reenter as root<br />
<br />
:<Code> cd /root/.cpan/build/Alien-Sodium-2.000-1</Code><br />
<br />
:<Code> make uninstall</Code><br />
Copy all the unlink entries shown in the screen above at once and paste (execute) them in the command line below<br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
:<Code> rm -r Alien-Sodium-*</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> install AJGB/Alien-Sodium-1.0.8.0.tar.gz</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> find /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0* -name Makefile</Code><br />
:<Code> /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code> <br />
:<Code> cd /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code><br />
:<Code> make uninstall</Code><br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
<br />
:<Code> rm -r Crypt-NaCl-Sodium-1.0.8.0*</Code><br />
<br />
:<Code> cd /usr/local/lib/aarch64-linux-gnu/perl/5.28.1/auto/share/dist</Code><br />
<br />
:<Code> rm -fr Alien-Sodium</Code><br />
<br />
:<Code> ln -s /usr/local/share/perl/5.28.1/auto/share/dist/Alien-Sodium Alien-Sodium</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> force install Crypt::NaCl::Sodium</Code><br />
:<Code> install IO:String</Code><br />
:<Code> install Crypt::Argon2</Code><br />
:<Code> install Alien::Base::ModuleBuild</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> nano /etc/ssh/sshd_config</Code><br />
:<Code> Swap PermitRootLogin yes</Code><br />
:<Code> into #PermitRootLogin yes</Code><br />
<br />
:<Code> /etc/init.d/ssh restart</Code><br />
<br />
:<Code> Close ssh session and reenter as pi</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<syntaxhighlight lang="html4strict"><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</syntaxhighlight><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<br />
<br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Keine Ausgabe von Mp3-Dateien ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" oder "WARNUNG: Fehlerhafte Leitung: Kein Element »wavparse«" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DevelopmentModuleIntro&diff=38814DevelopmentModuleIntro2024-01-03T11:26:53Z<p>Sailor: /* Readings */</p>
<hr />
<div>{{Hinweis|Dieser Text ist in Arbeit und muss noch an einigen Stellen ergänzt werden. }}<br />
== Einleitung ==<br />
Um neue Geräte, Dienste, o.ä. in FHEM verfügbar zu machen, kann man ein eigenes Modul in Perl schreiben. Ein Modul wird in FHEM automatisch geladen, wenn ein entsprechendes Device in FHEM definiert wird. Das Modul ermöglicht eine spezifische Kommunikation mit einem physikalischen Gerät, stellt Ergebnisse ("Readings") und Events innerhalb von FHEM zur Verfügung und erlaubt es, das Gerät mit "Set"-/"Get"-Befehlen zu beeinflussen. Dieser Artikel soll den Einstieg in die Entwicklung eigener Module erleichtern.<br />
<br />
Mit dem FHEM-Befehl <code>define</code> werden Devices in FHEM basierend auf einem Modul definiert. Dieser Befehl sorgt dafür, dass ein neues Modul bei Bedarf geladen und initialisiert wird. Ein gutes Beispiel ist hierbei die zentrale Konfigurationsdatei "fhem.cfg" in der sämtliche Devices in Form von <code>define</code>-Statements gespeichert sind.<br />
<br />
Damit das funktioniert müssen der Name des Moduls und der Name der [[#X_Initialize|Initialisierungsfunktion]] identisch sein. Das folgende Beispiel soll dies verdeutlichen:<br />
<br />
Ein Jeelink USB-Stick könnte beispielsweise mit dem Befehl <code>define JeeLink1 ''JeeLink'' /dev/ttyUSB0@57600</code> definiert werden.<br />
<br />
In fhem.pl wird der <code>define</code>-Befehl verarbeitet und geprüft, ob ein Modul mit dem Namen "JeeLink" schon geladen ist. Falls nicht, wird ein Modul mit Namen XY_JeeLink.pm im Modulverzeichnis (z.B. /opt/fhem/FHEM) gesucht und, falls vorhanden, anschließend geladen. <br />
Danach wird die Funktion <code>''JeeLink''_Initialize()</code> aufgerufen um das Modul in FHEM zu registrieren. Eine Moduldatei muss dazu eine Funktion <code>''&lt;Modulname&gt;''_Initialize()</code> enthalten. Durch den Aufruf dieser Funktion wird FHEM mitgeteilt, welche Funktionalitäten dieses Modul unterstützt und durch welche Perl-Funktionen im Modul selbst diese ausimplementiert werden.<br />
<br />
In der Initialisierungsfunktion des Moduls werden die Namen aller weiteren Perl-Funktionen des Moduls, die von fhem.pl aus aufgerufen werden, bekannt gemacht. Dazu wird für jedes Modul ein eigener Hash (genauer "Modul-Hash") mit entsprechenden Werten gefüllt, der in fhem.pl für jedes Modul entsprechend abgelegt wird. Dadurch weiß FHEM wie dieses Modul anzusprechen ist.<br />
<br />
== Grundlegender Aufbau eines Moduls ==<br />
<br />
=== Dateiname ===<br />
<br />
Ein FHEM-Modul wird als Perl-Modul mit der Dateiendung *.pm abgespeichert. Der Dateiname folgt dabei folgendem Schema:<br />
<br />
:<code>''['''Schlüsselnummer''']''<font color="grey">_</font>''['''Modulname''']''<font color="grey">.pm</font></code><br />
<br />
* '''Schlüsselnummer''' - Eine zweistellige Zahl zwischen 00 - 99. Die Schlüsselnummer hat aktuell keine technische Relevanz mehr. In früheren FHEM-Versionen ist sie relevant für [[#Zweistufiges_Modell_f.C3.BCr_Module|zweistufige Module]] (Reihenfolge für [[DevelopmentModuleAPI#Dispatch|Dispatch()]] um logische Module zu prüfen). Die allgemeine Empfehlung ist hierbei eine Schlüsselnummer eines Moduls zu verwenden, welches eine ähnliche Funktionalität bietet. Die Schlüsselnummer 99 hat hierbei eine besondere Bedeutung, da alle Module mit dieser Schlüsselnummer beim Start von FHEM automatisch geladen werden, selbst, wenn sie in der Konfiguration nicht verwendet werden. Daher wird für myUtils 99 als Schlüsselnummer verwendet (99_myUtils.pm). Module mit der Schlüsselnummer 99 werden im SVN nicht akzeptiert (siehe [[SVN Nutzungsregeln]])<br />
* '''Modulname''' - Der Name des Moduls wie er in FHEM bei dem Anlegen einer Gerätedefinition zu verwenden ist. Der Modulname sollte nur aus den folgenden möglichen Zeichen bestehen: Groß-/Kleinbuchstaben, Zahlen sowie Unterstrich (_)<br />
<br />
=== Inhaltlicher Aufbau ===<br />
<br />
Ein Modul ist inhaltlich in folgende Abschnitte unterteilt:<br />
<br />
<syntaxhighlight lang="perl"><br />
#<br />
# 72_MYMODULE.pm <br />
#<br />
<br />
package main;<br />
<br />
# Laden evtl. abhängiger Perl- bzw. FHEM-Hilfsmodule<br />
use HttpUtils;<br />
use [...]<br />
<br />
# FHEM Modulfunktionen<br />
<br />
sub MYMODULE_Initialize() {<br />
...<br />
}<br />
<br />
sub MYMODULE_Define() {<br />
...<br />
}<br />
<br />
...<br />
<br />
# Eval-Rückgabewert für erfolgreiches<br />
# Laden des Moduls<br />
1;<br />
<br />
<br />
# Beginn der Commandref<br />
<br />
=pod<br />
=item [helper|device|command]<br />
=item summary Kurzbeschreibung in Englisch was MYMODULE steuert/unterstützt<br />
=item summary_DE Kurzbeschreibung in Deutsch was MYMODULE steuert/unterstützt<br />
<br />
=begin html<br />
Englische Commandref in HTML<br />
=end html<br />
<br />
=begin html_DE<br />
Deutsche Commandref in HTML<br />
=end html<br />
<br />
# Ende der Commandref<br />
=cut<br />
</syntaxhighlight><br />
<br />
Man kann hierbei von folgender Reihenfolge sprechen:<br />
<br />
# Perl-Code, welcher das Modul implementiert<br />
# Die Zeile <code>1;</code> nachdem der Perl-Code abgeschlossen ist. Dies dient FHEM der Erkennung, dass das Modul erfolgreich und vollständig geladen wurde. Sollte diese Zeile nicht enthalten sein, wird FHEM beim Laden des Moduls die Fehlermeldung <code>Error:Modul 72_MYMODULE deactivated</code> in das Logfile schreiben.<br />
# Commandref zur Dokumentation des Moduls. Diese Dokumentation soll dem User die möglichen Befehle/Attribute/Readings/Events vermitteln. Weitere Informationen und Hinweise findet man in den [[Guidelines zur Dokumentation]].<br />
<br />
== Der Hash einer Geräteinstanz ==<br />
Eine Besonderheit in Perl sind [http://de.wikipedia.org/wiki/Assoziatives_Array#Perl assoziative Arrays], (nicht ganz richtig als "Hash" bezeichnet) in denen die Adressierung nicht über eine Zählvariable erfolgt, sondern über einen beliebigen String. Die internen Abläufe bei der Adressierung führen dazu, dass die Speicherung in und der Abruf aus Hashes relativ langsam ist.<br />
<br />
Der zentrale Speicherort für Informationen einer Geräteinstanz bei FHEM ist ein solcher Hash, der seinerseits in fhem.pl von einem globalen Hash referenziert wird. <br />
<br />
In fhem.pl werden alle Gerätedefinitionen in dem globalen Hash <code>%defs</code> abgelegt. Der Inhalt von <code>$defs{''&lt;Name&gt;''}</code> in fhem.pl verweist dabei auf den Hash der Geräteinstanz in Form einer Hashreferenz. Diesen Verweis (also nur die Adresse) bekommen die Funktionen eines Moduls übergeben (i.d.R. als <code>$hash</code> bezeichnet), welche direkt von fhem.pl aufgerufen werden. In dem Hash stehen beispielsweise die internen Werte des Geräts, die im Frontend als "Internals" angezeigt werden, sowie die Readings des Geräts. <br />
<br />
Beispiele:<br />
*<code>$hash->{NAME}</code> enthält den Namen der Geräteinstanz, <br />
*<code>$hash->{TYPE}</code> enthält die Typbezeichnung des Geräts (Modulname)<br />
<br />
==Ausführung von Modulen==<br />
FHEM arbeitet intern nicht parallel, sondern arbeitet alle Aufgaben seriell nacheinander kontinuierlich ab. Daher wäre es ungünstig, wenn Module Daten von einem physikalischen Gerät abfragen wollen und dabei innerhalb der selben Funktion auf die Antwort des Geräts warten. In dieser Zeit, in der FHEM auf die Antwort des Gerätes warten muss, wäre der Rest von FHEM blockiert. Da immer nur eine Aufgabe zur selben Zeit bearbeitet wird, müssen alle weiteren Aufgaben solange warten. Eine Datenkommunikation innerhalb eines Moduls sollte daher immer ohne Blockierung erfolgen. Dadurch kann FHEM die Wartezeit effizient für andere Aufgaben nutzen um bspw. anstehende Daten für andere Module zu verarbeiten. Es gibt in FHEM entsprechende Mechanismen, welche eine "Non-Blocking"-Kommunikation über verschiedene Wege (z.B. seriell, HTTP, TCP, ...) ermöglichen.<br />
<br />
Dafür werden in FHEM zwei zentrale Listen gepflegt, in der die Filedeskriptoren der geöffneten Kommunikatonsverbindungen gespeichert sind. Auf Linux- bzw. Unix-basierten Plattformen wird der select-Befehl des Betriebssystems verwendet um Filedeskriptoren auf lesbare Daten zu überprüfen. In FHEM gibt es dazu eine Liste (<code>%selectlist</code>), in der die Filedeskriptoren sämtlicher Geräte (z.B. serielle Verbindung, TCP-Verbindung, etc.) gespeichert sind. <br />
<br />
In der zentralen Schleife (Main-Loop) von fhem.pl wird mit <code>select()</code> überwacht, ob über eine der geöffneten Schnittstellen Daten zum Lesen anstehen. Wenn dies der Fall ist, dann wird die Lesefunktion ([[#X_Read|X_Read]]) des zuständigen Moduls aufgerufen, damit es die Daten entgegennimmt und verarbeitet. Anschließend wird die Schleife weiter ausgeführt.<br />
<br />
Auf Windows-Systemen funktioniert dies anders. Hier können USB/Seriell-Geräte nicht per <code>select()</code> überwacht werden. In FHEM unter Windows werden daher diese Schnittstellen kontinuierlich abgefragt ob Daten bereitstehen. Dafür müssen Module zusätzlich zur Lesefunktion eine Abfragefunktion ([[#X_Ready|X_Ready]]) implementieren, welche prüft, ob Daten zum Lesen anstehen. Auch auf Linux/Unix-Plattformen hat diese Funktion eine Aufgabe. Falls nämlich eine Schnittstelle ausfällt, beziehungsweise ein CUL oder USB-zu-Seriell Adapter ausgesteckt wird, dann wird über diese Funktion regelmäßig geprüft ob die Schnittstelle wieder verfügbar wird.<br />
<br />
Innerhalb der eigentlichen Lesefunktion (X_Read) werden dann die Daten vom zugehörigen Gerät gelesen, das nötige Protokoll implementiert um die Daten zu interpretieren und Werte in Readings geschrieben.<br />
<br />
Auch wenn von einem Anwender über einen Get-Befehl Daten aktiv von einem Gerät angefordert werden, sollte nicht blockierend gewartet werden. Eine asynchrone Ausgabe, sobald das Ergebnis vorliegt, ist über [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] möglich. Siehe {{Link2Forum|Topic=43771|Message=357870|LinkText=Beschreibung}} und {{Link2Forum|Topic=43771|Message=360935|LinkText=Beispiel}}. Weitere Anwendungsbeispiele finden sich im {{Link2Forum|Topic=43052|Message=353477|LinkText=PLEX Modul}} und im überarbeiteten und nicht-blockierenden {{Link2Forum|Topic=42771|Message=348498|LinkText=SYSSTAT Modul}}.<br />
<br />
== Wichtige globale Variablen aus fhem.pl ==<br />
<br />
FHEM arbeitet mit einer Vielzahl an internen Variablen. Die nun folgenden aufgelisteten Variablen sind die wichtigsten, welche man im Rahmen der Modulprogrammierung kennen sollte:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Variable !! Beschreibung<br />
|-<br />
| <code>$init_done</code> || Dient der Erkennung für fhem.pl sowie den Modulen, ob FHEM den Initialisierungsvorgang abgeschlossen hat. Beim Starten von FHEM ist <code>$init_done</code> gleich <code>0</code>. Erst, wenn das Einlesen der Konfiguration, sowie des State-Files (Readings) abgeschlossen ist, wird <code>$init_done</code> auf <code>1</code> gesetzt.<br />
Das gleiche Verfahren wird auch bei dem Befehl <code>rereadcfg</code> angewandt. Während <code>rereadcfg</code> ausgeführt wird (Konfiguration löschen, neu einlesen), ist <code>$init_done</code> gleich <code>0</code>.<br />
<br />
Dies ist insbesondere in der [[#X_Define|Define]]-Funktion eines Moduls relevant. Durch eine Prüfung auf <code>$init_done</code> kann man erkennen, ob eine Definition von Hand (<code>$init_done</code> = 1) oder im Rahmen der Initialisierung (FHEM Start / Rereadcfg => <code>$init_done</code> = 0) erfolgte. Während der Initialisierung stehen bspw. die gesetzten Attribute der Definition noch nicht zur Verfügung und können daher nicht ausgewertet werden (siehe . <br />
|-<br />
| <code>%attr</code> || In <code>%attr</code> werden sämtliche gesetzten Attribute aller Geräte gespeichert. Diese Datenstruktur wird generell durch den <code>attr</code>-Befehl verwaltet. Hierbei wird einem Gerätenamen eine Mehrzahl an Attributnamen mit einem Wert zugeordnet. Attribut-Inhalte können über die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] ausgelesen werden.<br />
|-<br />
| <code>%cmds</code> || In <code>%cmds</code> wird jedem in FHEM existierendem Befehl die entsprechende Funktion zugewiesen, welche diesen Befehl umsetzt. Module können durch das Eintragen eines Befehlsnamen samt Funktion in <code>%cmds</code> über die [[#X_Initialize|Initialize]]-Funktion eines Moduls einen (oder mehrere) eigene Befehle in FHEM registrieren.<br />
<br />
Die Struktur ist dabei wiefolgt:<br />
<br />
$cmds{''&lt;Befehlsname&gt;''} = { Fn => "''&lt;Funktionsname&gt;''",<br />
Hlp => "''&lt;Aufrufsyntax&gt;''"};<br />
<br />
|-<br />
| <code>%data</code>|| Der eigentliche Zweck von <code>%data</code> ist dem Nutzer eine Möglichkeit zum Speichern von temporären Daten im globalen Kontext zu ermöglichen. Einige Module verwenden <code>%data</code> jedoch auch um modul- & geräteübergreifend Daten auszutauschen.<br />
|-<br />
| <code>%defs</code>|| In <code>%defs</code> werden sämtliche Gerätedefinitionen, bzw. die Hash-Referenzen auf diese, gespeichert. Hier ist jedem Gerätenamen eine Hash-Referenz zugeordnet.<br />
|-<br />
| <code>%modules</code>|| In <code>%modules</code> sind alle geladenen Module gelistet mit ihren entsprechenden Initialisierungsdaten (Funktionsnamen, Attribut-Listen, spezielle Einstellungen, ...). Hier wird für jeden Modulname der Modul-Hash aus der [[#X_Initialize|Initialize]]-Funktion gespeichert. <br />
Desweiteren legen viele Module, welche nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] hier eine Rückwärtszuordnung von Geräteadressen zu Geräte-Hash an.<br />
|-<br />
| <code>%readyfnlist</code>|| In <code>%readyfnlist</code> sind alle zu prüfenden Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte regelmäßig über eine Aufruf der entsprechenden [[#X_Ready|Ready]]-Funktion.<br />
<br />
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in <code>%readyfnlist</code>.<br />
|-<br />
| <code>%selectlist</code>|| In <code>%selectlist</code> sind alle geöffneten Verbindungen mit ihrer entsprechendem Geräte-Hash gelistet. FHEM prüft alle hier gelisteten Geräte, ob der geöffnete Filedeskriptor unter <code>$hash->{FD}</code> Daten zum Lesen bereitgestellt hat. Ist dass der Fall, wird die entsprechende [[#X_Read|Read]]-Funktion aufgerufen, um anstehende Daten durch das Modul zu verarbeiten.<br />
Bei einer Nutzung von dem Hilfsmodul [[DevIo|DevIo.pm]] zum Aufbau einer Kommunikationsverbindung, kümmert sich DevIo selbständig um den entsprechenden Eintrag in <code>%selectlist</code>.<br />
|}<br />
<br />
Es gibt durchaus viele weitere globale Variablen, die jedoch für sehr spezielle Anwendungsfälle und z.T. nur einzelne Module gedacht sind und daher hier nicht aufgeführt werden.<br />
<br />
== Internals ==<br />
Daten, die ein Modul im Geräte-Hash speichert nennt man Internals. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielswiese <code>$hash->{NAME}</code> für den Gerätenamen, welcher beim Define-Befehl übergeben wurde und als Internal gespeichert wird. Diese Daten spielen für FHEM eine sehr wichtige Rolle, da sämtliche gerätespezifischen Daten als Internal im Gerätehash gespeichert werden.<br />
<br />
Falls Werte wie z.B. ein Intervall nicht über den Define-Befehl gesetzt werden sollen und im Betrieb einfach änderbar sein sollten, ist eine alternative Möglichkeit die Speicherung in so genannten Attributen. Dann würde man den Define-Befehl so implementieren, dass er kein Intervall übergeben bekommt und statt dessen das Interval als Attribut über den Befehl <code>attr</code> gesetzt wird.<br />
<br />
Generell werden alle Werte, welche direkt in der ersten Ebene von <code>$hash</code> (Gerätehash) gespeichert werden auf der Detail-Seite einer Definition in der FHEMWEB Oberfläche angezeigt. Es gibt jedoch Ausnahmen:<br />
<br />
* <code>$hash->{helper}{URL}</code> - Alle Elemente, welche als Unterelement wieder einen Hash besitzen werden nicht in FHEMWEB dargestellt. Typischerweise speichern Module Daten unter <code>$hash->{helper}</code> interne Daten zwischen, die für den User nicht relevant sind, sondern nur der internen Verarbeitung dienen.<br />
* <code>$hash->{'''.'''<font color="grey">ELEMENT</font>}</code> - Alle Knoten, welche mit einem Punkt beginnen werden in der FHEMWEB Oberfläche nicht angezeigt. Man kann diese Daten jedoch beim Aufruf des [[List|list-Kommandos]] einsehen.<br />
<br />
Es gibt bereits vorbelegte Internals welche in FHEM dazu dienen definitionsbezogene Informationen wie bspw. Namen und Readings zu speichern. Dies sind im besonderen:<br />
<br />
{| class="wikitable"<br />
|-<br />
! style="min-width: 13em;" | Internal !! Beschreibung<br />
|-<br />
| <code>$hash->{NAME}</code> || Der Definitionsname, mit dem das Gerät angelegt wurde. <br />
|-<br />
| <code>$hash->{READINGS}</code> || Enthält alle aktuell vorhandenen Readings. Daten unterhalb dieses Knotens sollte man nicht direkt manipulieren. Um Readings zu Erzeugen gibt es entsprechende [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]].<br />
|-<br />
| <code>$hash->{NR}</code> || Die Positions-Nr. der Definition innerhalb der Konfiguration. Diese dient dazu die Konfiguration in der gleichen Reihenfolge zu speichern, wie die einzelnen Geräte angelegt wurden.<br />
|-<br />
| <code>$hash->{TYPE}</code> || Der Modulname, mit welchem die Definition angelegt wurde.<br />
|-<br />
| <code>$hash->{DEF}</code> || Sämtliche Argumente, welche beim <code>define</code>-Befehl nach dem Modulnamen übergeben wurden.<br />
|-<br />
| <code>$hash->{CFGFN}</code> || Der Dateiname der Konfigurationsdatei in der diese Definition enthalten ist (sofern nicht in fhem.cfg). Dieser Wert ist nur gefüllt, wenn man mit mehreren Konfigurationsdateien arbeitet, welche dann in fhem.cfg via include-Befehl eingebunden werden.<br />
|-<br />
| <code>$hash->{NTFY_ORDER}</code> || Sofern das Modul Events via [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] verarbeitet enthält jede Definition eine Notify-Order als Zeichenkette bestehend aus dem Notify Order Prefix und dem Definitionsnamen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt "Reihenfolge für den Aufruf der Notify-Funktion beeinflussen".<br />
|-<br />
| <code>$hash->{NOTIFYDEV}</code> || Sofern das Modul Events via NotifyFn verarbeitet kann man damit die Definitionen, von denen man Events erhalten will begrenzen. Details zur Funktionsweise gibt es in der Beschreibung zur [[DevelopmentModuleIntro#X_Notify|Notify-Funktion]] im Abschnitt "Begrenzung der Aufrufe auf bestimmte Geräte".<br />
|-<br />
| <code>$hash->{IODev}</code> || Hier wird das zugeordnete IO-Gerät durch [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] gespeichert, welches für den Datentransport und -empfang dieses logischen Gerätes zuständig ist. Dieser Wert existiert nur bei Modulen die nach dem [[DevelopmentModuleIntro#Zweistufiges_Modell_f.C3.BCr_Module|zweistufigen Modulkonzept]] arbeiten. <br />
|-<br />
| <code>$hash->{CHANGED}</code> || Hier werden alle Events kurzzeitig gesammelt, welche für die Eventverarbeitung anstehen. Insbesondere die [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] speichern hier alle Events zwischen um sie nach Abschluss via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] zu verarbeiten. <br />
|-<br />
| <code>$hash->{FD}</code> || Wenn die Definition eine Netzwerkverbindung oder serielle Schnittstelle geöffnet hat (z.B. via [[DevIo]]), so wird der entsprechende File-Deskriptor in diesem Internal gespeichert. Damit kann FHEM alle geöffneten Filedeskriptoren der entsprechenden Definition zuordnen um bei ankommenden Daten die Definition via [[DevelopmentModuleIntro#X_Read|Read-Funktion]] damit zu versorgen.<br />
|-<br />
| <code>$hash->{EXCEPT_FD}</code> || Ähnlich wie <code>$hash->{FD}</code>. Sofern die Definition in <code>[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]</code> eingetragen ist und ein Fildeskriptor in diesem Internal gesetzt ist, wird bei einer auftretenden Exception bzw. Interrupt die [[DevelopmentModuleIntro#X_Except|Except]]-Funktion des entsprechenden Moduls aufgerufen um darauf zu reagieren.<br />
|}<br />
<br />
Generell sollte man die meisten der hier genannten systemweiten Internals nicht modifizieren, da ansonsten die korrekte Funktionsweise von FHEM nicht mehr garantiert werden kann.<br />
<br />
== Readings ==<br />
Daten, welche von einem Gerät gelesen werden und in FHEM in einer für Menschen verständlichen Form zur Verfügung gestellt werden können, werden Readings genannt. Sie geben den Status des Gerätes wieder und erzeugen Events innerhalb von FHEM auf die andere Geräte reagieren können. Sie werden als Unterstruktur des Hashes der jeweiligen Geräteinstanz gespeichert, beispielsweise <br />
*<code>$hash->{READINGS}{temperature}{VAL}</code> für die Temperatur eines Fühlers<br />
*<code>$hash->{READINGS}{temperature}{TIME}</code> für den Zeitstempel der Messung<br />
<br />
Für den lesenden Zugriff auf Readings steht die Funktion <code>[[DevelopmentModuleAPI#ReadingsVal|ReadingsVal()]]</code> zur Verfügung. Ein direkter Zugriff auf die Datenstruktur sollte nicht vorgenommen werden.<br />
<br />
Readings werden im Statefile von FHEM automatisch auf der Festplatte zwischengespeichert, damit sie nach einem Neustart sofort wieder zur Verfügung stehen. Dadurch ist der letzte Status eines Gerätes vor einem Neustart nachvollziehbar.<br />
<br />
Readings, die mit einem Punkt im Namen beginnen, haben eine funktionale Besonderheit. Sie werden im FHEMWEB nicht angezeigt und können somit als "Permanentspeicher" für kleinere Daten innerhalb des Moduls genutzt werden. Um größere Datenmengen permanent zu speichern sollte man jedoch die Funktion <code>[[DevelopmentModuleAPI#setKeyValue|setKeyValue()]]</code> verwenden.<br />
<br />
Zum Setzen von Readings sollen <br />
*bei Gruppen von Readings der Funktionsblock <code>[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]</code>, <code>[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]</code> (mehrfach wiederholt), <code>[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]</code><br />
*bei einzelnen Updates die Funktion <code>[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]</code> <br />
aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht. Events erzeugen, je nach Hardwareperformance, spürbare Last auf dem System (siehe [[DevelopmentModuleIntro#X_Notify|NotifyFn]]), das Ändern von Readings ohne dass dabei Events erzeugt werden jedoch nicht.<br />
<br />
Eine Sequenz zum Setzen von Readings könnte folgendermaßen aussehen:<br />
<br />
<syntaxhighlight lang="perl"><br />
readingsBeginUpdate($hash);<br />
readingsBulkUpdate($hash, $readingName1, $wert1 );<br />
readingsBulkUpdate($hash, $readingName2, $wert2 );<br />
readingsEndUpdate($hash, 1);<br />
</syntaxhighlight><br />
<br />
Um Readings zu löschen, wird für die Modulprogrammierung die Funktion <code>[[DevelopmentModuleAPI#readingsDelete|readingsDelete()]]</code> empfohlen. Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
readingsDelete($hash, $readingsname) <br />
</syntaxhighlight><br />
{{Hinweis|'''Hintergrundinfo dazu aus dem Forum:''' {{Link2Forum|Topic=83069|Message=753066}}<br />
<br />
<code>CommandDeleteReading()</code> bzw. <code>deletereading</code> ist eher fuer den Endbenutzer und seine userReadings gedacht, und macht bei den Modulen die unnoetige Schleife ueber [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wenn der Modulautor beim Aufruf auch <code>$cl</code> weitergibt, und der Anwender meint, dieses Geraet auf blacklist setzen zu muessen, dann kann das Modul sein eigenes Reading nicht entfernen, und das ist kontraproduktiv.<br />
}}<br />
<br />
Hierbei ist anzumerken, dass man keine RegEx verwenden kann sondern ausschließlich den expliziten Namen des Reading. <br />
Wer dennoch alle Readings löschen möchte muss den Befehl entsprechend erweitern:<br />
<syntaxhighlight lang="perl"><br />
foreach my $reading (keys(%{$hash->{READINGS}})) {<br />
readingsDelete($hash, $reading);<br />
}<br />
</syntaxhighlight><br />
<br />
bzw. unter Verwendung einer beliebigen RegEx<br />
<syntaxhighlight lang="perl"><br />
my RegEx = ".*";<br />
foreach my $reading (grep(/$RegEx/, keys(%{$hash->{READINGS}}))) {<br />
readingsDelete($hash, $reading);<br />
}<br />
</syntaxhighlight><br />
<br />
== Events ==<br />
<br />
FHEM verfügt über einen Event-Mechanismus um Änderungen verschiedenster Art an einzelne oder alle Definitionen mitzuteilen. Jedes Modul (und damit alle Definitionen dieses Moduls) können auf Events von FHEM selber (Definition <code>global</code>) oder von anderen Definitionen reagieren und dadurch selber aktiv werden. Ein Event wird innerhalb von FHEM als Zeichenkette behandelt.<br />
<br />
Events sind grundsätzlich immer definitionsbezogen. Das bedeutet, dass ein Event immer in Verbindung mit einem Definitionsnamen erzeugt wird. Jede Definition, welche ein Event verarbeitet, erhält den Definitions-Hash (<code>$hash</code>) der auslösenden Definition.<br />
<br />
Events werden typischerweise bei der Erstellung von Readings implizit für jedes einzelne Reading erzeugt. Es gibt jedoch auch Events die nichts mit Readings zu tun haben um anderweitige Änderungen bekannt zu geben.<br />
<br />
Eigene Events können in FHEM mit der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] erzeugt werden. Um auf Events in einem Modul reagieren zu können, muss eine [[#X_Notify|Notify]]-Funktion implementiert sein. Sobald ein oder mehrere Events für eine Definition getriggert werden, prüft FHEM, welche Definitionen über Events der auslösenden Definition informiert werden möchten. Diese werden dann nacheinander in einer bestimmten Reihenfolge durch Aufruf der [[#X_Notify|Notify]]-Funktion über anstehende Events in Kenntnis gesetzt. Es obliegt dann dem jeweiligen Modul, wie es auf die Events reagiert.<br />
<br />
=== globale Events ===<br />
<br />
Als "globale Events" werden alle Events bezeichnet, die durch die Definition <code>global</code> erzeugt werden. Es handelt sich hierbei um Events die Strukturänderungen in der Konfiguration, als auch systemweite Ereignisse zu FHEM selbst signalisieren.<br />
<br />
Hier eine kurze Zusammenfassung, welche Events durch <code>global</code> getriggert werden können:<br />
<br />
<u>Allgemeine Events:</u><br />
<br />
{| class="wikitable"<br />
|-<br />
! Event-Text !! Beschreibung.<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>INITIALIZED</code>''' || Der Start von FHEM ist abgeschlossen. Sämtliche Definitionen und Attribute wurden aus der Konfiguration (fhem.cfg oder configDB) eingelesen, sowie sämtliche Readings sind aus dem State-File eingelesen und stehen nun voll umfänglich zur Verfügung.<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>REREADCFG</code>''' || Die Konfiguration wurde erneut eingelesen. Dies bedeutet, es wurden alle Definitionen/Attribute/Readings aus FHEM entfernt und durch Einlesen der Konfiguration neu angelegt. (FHEM-Befehl: "rereadcfg")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>SAVE</code>''' || Die laufende Konfiguration soll gespeichert werden (in fhem.cfg oder configDB). Dieses Event wird '''VOR''' dem Speichern der Konfiguration getriggert. Sobald der Trigger verarbeitet wurde, beginnt das Speichern der Konfiguration. (FHEM-Befehl: "save")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>SHUTDOWN</code>''' || FHEM wird sich beenden. (FHEM-Befehl: "shutdown")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code> DELAYEDSHUTDOWN </code>''' || FHEM wird sich beenden. (FHEM-Befehl: "shutdown")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>UPDATE</code>''' || Es wurde ein Update erfolgreich installiert. (FHEM-Befehl: "update")<br />
|}<br />
<br />
<u>Definitionsbezogene Events:</u><br />
<br />
{| class="wikitable"<br />
|-<br />
! Event-Text !! Beschreibung.<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>DEFINED ''<Name>''</code>''' || Es wurde eine neue Definition mit Namen <code>''<Name>''</code> angelegt. (FHEM-Befehl: "define")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>DELETED ''<Name>''</code>''' || Die Definition mit dem Namen <code>''<Name>''</code> wurde gelöscht. (FHEM-Befehl: "delete")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>RENAMED ''<Alt>'' ''<Neu>''</code>''' || Die Definition mit dem Namen <code>''<Alt>''</code> wurde in den Namen <code>''<Neu>''</code> umbenannt. (FHEM-Befehl: "rename")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>MODIFIED ''<Name>''</code>''' || Die Definition mit dem Namen <code>''<Name>''</code> wurde modifiziert. (FHEM-Befehl: "modify")<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | '''<code>UNDEFINED ''<Name> <Modul> <Define-Parameter>''</code>''' || Es wurde eine Nachricht von einem physikalischen Modul (siehe [[#Zweistufiges Modell für Module|zweistufiges Modulkonzept]]) erhalten, für die keine passende logische Definition in FHEM existiert. Details dazu, siehe dazu Abschnitt [[#Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)|Automatisches Anlegen von logischen Gerätedefinitionen (autocreate)]].<br />
|}<br />
<br />
=== Begrenzung von Events ===<br />
<br />
Ein Modul, welches Events verarbeitet, kann die Eventverarbeitung auf bestimmte Definitionen begrenzen. Dadurch werden nur Events an das Modul gemeldet (via [[#X_Notify|X_Notify()]]), welche von einer oder mehreren bestimmten Definitionen getriggert wurden. Dadurch werden unnötige Events nicht an das Modul gemeldet und schont somit Ressourcen.<br />
<br />
Standardmäßig werden sämtliche Events ohne Begrenzung an ein Modul gemeldet, welches eine [[#X_Notify|Notify]]-Funktion implementiert hat und somit Events verarbeiten kann. Details zur Begrenzung von Events findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].<br />
<br />
=== Reihenfolge der Eventverarbeitung ===<br />
<br />
Ein getriggertes Event wird nacheinander gegen jede Definition geprüft, deren Modul eine [[#X_Notify|Notify]]-Funktion implementiert hat. Dies bedeutet, jede Definition wird nacheinander durch Aufruf der [[#X_Notify|Notify]]-Funktion mit dem Definitionshash der auslösenden Definition aufgerufen.<br />
<br />
Unter bestimmten Umständen kann es erforderlich sein, in diese Reihenfolge einzugreifen. Beispielsweise wenn das eigene Modul und deren Definitionen das Event als letztes oder erstes verarbeiten müssen. Ein Beispiel bietet hierbei das Modul [[dewpoint]], welches Events vor allen anderen Modulen verarbeiten muss.<br />
<br />
Details, wie man die Reihenfolge der Eventverarbeitung steuern kann, findet man in der Beschreibung zur Modulfunktion [[#X_Notify|X_Notify()]].<br />
<br />
== Attribute ==<br />
Damit der Nutzer das Verhalten einer einzelnen Gerätedefinition zur Laufzeit individuell anpassen kann, gibt es in FHEM für jede Definition sogenannte Attribute, welche mit dem Befehl <code>attr</code> gesetzt werden können.<br />
Diese stehen dann dem Modul unmittelbar zur Verfügung um das Verhalten während der Ausführung zu beeinflussen. Attribute werden zusammen mit dem <code>define</code>-Befehl der jeweiligen Definition beim Speichern der aktuellen Konfiguration von FHEM in die Konfigurationsdatei geschrieben. Beim Neustart werden die entsprechenden Befehle ausgeführt um alle Definition inkl. Attribute wieder anzulegen. Zur Laufzeit werden Attribute in dem globalen Hash <code>%attr</code> mit dem Definitionsnamen als Index (<code>$attr{$name} = $value</code>) gespeichert. Ein Attribut mit dem Namen <code>header</code> würde beispielsweise mit <code>$attr{$name}{header}</code> adressiert. Generell sollte <code>%attr</code> nicht durch direkten Zugriff manipuliert/benutzt werden.<br />
<br />
Zum Auslesen von Attributen sollte die Funktion [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verwendet werden.<br />
<br />
Welche Attribute ein Modul unterstützt muss in der Funktion <code>[[#X_Initialize|X_Initialize]]</code> durch Setzen von <code>$hash->{AttrList}</code> bekannt gemacht werden (siehe unten).<br />
<br />
Wenn beim Setzen von Attributen in einer Gerätedefinition entsprechende Werte geprüft werden sollen oder zusätzliche Funktionalitäten implementiert werden müssen, dann muss dies in der Funktion <code>[[#X_Attr|X_Attr]]</code> (siehe unten) implementiert werden. Hier kann man bspw. einen Syntaxcheck für Attribut-Werte implementieren um ungültige Werte zurückzuweisen.<br />
<br />
== Modulfunktionen ==<br />
<br />
Damit fhem.pl ein Modul nutzen kann, muss dieses entsprechende Funktionen mit einer vorgegebenen Aufrufsyntax implementieren. Durch die Bekanntgabe dieser modulspezifischen Funktionen können Daten zwischen fhem.pl und einem Modul entsprechend ausgetauscht werden. Es gibt verschiedene Arten von Funktionen die ein Modul anbieten muss bzw. kann, je nach Funktionsumfang.<br />
<br />
=== Die wichtigsten Funktionen in einem Modul ===<br />
<br />
Folgende Funktion muss ein Modul mit dem beispielhaften Namen "X" mindestens bereitstellen:<br />
<br />
{| class="wikitable"<br />
|-<br />
! style="text-align:left" | Funktionsname !! style="text-align:left" | Kurzbeschreibung<br />
|-<br />
| [[#X_Initialize|X_Initialize]] || Initialisiert das Modul und gibt den Namen zusätzlicher Modulfunktionen bekannt, sowie modulspezifische Einstellungen. Wird direkt nach dem erfolgreichen Laden des Moduls durch fhem.pl aufgerufen.<br />
|}<br />
<br />
Die folgenden Funktionen sind die wichtigsten Funktionen, welche je nach Anwendungsfall zu implementieren sind. Es handelt sich hierbei um die wichtigsten Vertreter, welche in den meisten Modulen Verwendung finden. Nicht alle Funktionen machen jedoch in jedem Modul Sinn. Generell sollte auch hier bei jeder Funktion der Modulname vorangestellt werden um ein einheitliches Namensschema zu gewährleisten. Hier die wichtigsten Modulfunktionen:<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! style="text-align:left" | Funktionsname !! style="text-align:left" class="unsortable" | Kurzbeschreibung<br />
|-<br />
| [[#X_Define|X_Define]] || Wird im Rahmen des <code>define</code>-Befehls aufgerufen.<br />
|-<br />
| [[#X_Undef|X_Undef]] || Wird im Rahmen des <code>delete</code>-Befehls, sowie <code>rereadcfg</code>-Befehl aufgerufen. Dient zum Abbau von offenen Verbindungen, Timern, etc.<br />
|-<br />
| [[#X_Delete|X_Delete]] || Wird im Rahmen des beim <code>delete</code>-Befehls aufgerufen wenn das Gerät endgültig gelöscht wird um weiterführende Aktionen vor dem Löschen durchzuführen.<br />
|-<br />
| [[#X_Get|X_Get]] || Wird im Rahmen des <code>get</code>-Befehls aufgerufen um Daten vom Gerät abzufragen<br />
|-<br />
| [[#X_Set|X_Set]] || Wird im Rahmen des <code>set</code>-Befehls aufgerufen um Daten an das Gerät zu senden.<br />
|-<br />
| [[#X_Attr|X_Attr]] || Wird im Rahmen des <code>attr</code>-Befehls aufgerufen um Attributwerte zu prüfen)<br />
|-<br />
| [[#X_Read|X_Read]] || Wird durch FHEM aufgerufen, wenn ein gelisteter Filedeskriptor in <code>[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]</code> Daten zum Lesen bereitstellt.<br />
|-<br />
| [[#X_Ready|X_Ready]] || Wird unter Windows durch FHEM aufgerufen um zyklisch einen seriellen Filedeskriptor auf lesbare Daten zu prüfen. Unter Linux dient diese Funktion dem Wiederaufbau verlorener Verbindungen.<br />
|-<br />
| [[#X_Notify|X_Notify]] || Verarbeitet Events von anderen Geräten innerhalb von FHEM<br />
|-<br />
| [[#X_Rename|X_Rename]] || Wird aufgerufen, wenn ein Gerät umbenannt wird.<br />
|-<br />
| [[#X_Shutdown|X_Shutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.<br />
|-<br />
| [[#X_DelayedShutdown | X_DelayedShutdown]] || Wird beim Herunterfahren von FHEM ausgeführt.<br />
|}<br />
<br />
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.<br />
<br />
==== X_Initialize ====<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize<br />
{<br />
my ($hash) = @_;<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Das <code>X</code> im Namen muss dabei auf den Namen des Moduls bzw. des definierten Gerätetyps geändert werden. Im Modul mit der Datei <code>36_JeeLink.pm</code> beispielsweise ist der Name der Funktion <code>JeeLink_Initialize</code>. Die Funktion wird von fhem.pl nach dem Laden des Moduls aufgerufen und bekommt eine leere Hashreferenz für den Initialisierungsvorgang übergeben. <br />
<br />
Dieser Hash muss nun von X_Initialize mit allen modulrelevanten Funktionsnamen gefüllt werden. Anschließend wird dieser Hash durch fhem.pl im globalen Hash <code>%modules</code> gespeichert. <code>$modules{ModulName}</code> wäre dabei der Hash für das Modul mit dem Namen <code>ModulName</code>. Es handelt sich also nicht um den oben beschriebenen Hash der Geräteinstanzen sondern einen Hash, der für jedes Modul existiert und modulspezifische Daten wie bspw. die implementierten Modulfunktionen enthält. Die Initialize-Funktion setzt diese Funktionsnamen, in den Hash des Moduls wie folgt:<br />
<br />
<syntaxhighlight lang="perl" line="1"><br />
$hash->{DefFn} = \&X_Define;<br />
$hash->{UndefFn} = \&X_Undef;<br />
$hash->{DeleteFn} = \&X_Delete;<br />
$hash->{SetFn} = \&X_Set;<br />
$hash->{GetFn} = \&X_Get;<br />
$hash->{AttrFn} = \&X_Attr;<br />
$hash->{ReadFn} = \&X_Read;<br />
$hash->{ReadyFn} = \&X_Ready;<br />
$hash->{NotifyFn} = \&X_Notify;<br />
$hash->{RenameFn} = \&X_Rename;<br />
$hash->{ShutdownFn} = \&X_Shutdown;<br />
$hash->{DelayedShutdownFn} = \&X_ DelayedShutdown;<br />
</syntaxhighlight><br />
<br />
Um eine entsprechende Funktion in FHEM bekannt zu machen muss dazu der Funktionsname, wie er im Modul als <code>sub &lt;''Funktionsname''&gt;() { ... }</code> definiert ist, in <code>$hash</code> bekanntgemacht werden. Vorzugsweise direkt wie im Beispiel als Codereferenz. Dabei sollten die entsprechenden Funktionsnamen immer den Modulnamen (in diesem Beispiel <code>X</code>) als Präfix verwenden, wenn diese im Package "main" veröffentlicht werden.<br />
Auf diese Weise können sämtliche modulspezifisch implementierten Funktionen wie <code>X_Read</code>, <code>X_Parse</code> etc. durch Zuweisung an <code>$hash->{ReadFn}</code> bzw. <code>$hash->{ParseFn}</code> usw. bekannt gemacht werden.<br />
<br />
Darüber hinaus sollten die vom Modul unterstützten Attribute definiert werden:<br />
<br />
<syntaxhighlight lang="perl"><br />
$hash->{AttrList} =<br />
"do_not_notify:1,0 " . <br />
"header " .<br />
$readingFnAttributes; <br />
</syntaxhighlight><br />
<br />
Die Auflistung aller unterstützten modulspezifischen Attribute erfolgt in Form einer durch Leerzeichen getrennten Liste in <code>$hash->{AttrList}</code>. Es gibt in FHEM globale Attribute, die in allen Gerätedefinitionen verfügbar sind und nur modulspezifische Attribute die jedes Modul via <code>$hash->{AttrList}</code> über die eigene Initialize-Funktion setzt. In fhem.pl werden dann die entsprechenden Attributwerte beim Aufruf eines <code>attr</code>-Befehls in die globale Datenstruktur <code>$attr{$name}</code>, z.B. <code>$attr{$name}{header}</code> für das Attribut <code>header</code> gespeichert. Falls im Modul weitere Aktionen oder Prüfungen beim Setzen eines Attributs nötig sind, dann kann wie im Beispiel oben die [[#X_Attr|Attr]]-Funktion implementiert und in der Initialize-Funktion bekannt gemacht werden.<br />
<br />
Die Variable <code>$readingFnAttributes</code>, die im obigen Beispiel an die Liste der unterstützten Attribute angefügt wird, definiert Attributnamen, die dann zusätzlich gemacht werden, wenn das Modul zum Setzen von Readings die Funktionen <code>[[DevelopmentModuleAPI#readingsBeginUpdate|readingsBeginUpdate()]]</code>, <code>[[DevelopmentModuleAPI#readingsBulkUpdate|readingsBulkUpdate()]]</code>, <code>[[DevelopmentModuleAPI#readingsEndUpdate|readingsEndUpdate()]]</code> oder <code>[[DevelopmentModuleAPI#readingsSingleUpdate|readingsSingleUpdate()]]</code> verwendet. In diesen Funktionen werden Attribute wie <code>event-min-interval</code> oder auch <code>event-on-change-reading</code> ausgewertet. Für Details hierzu siehe commandref zu {{Link2CmdRef|Anker=readingFnAttributes|Label=readingFnAttributes}}.<br />
<br />
<br />
<u>Nutzung von parseParams()</u><br />
<br />
Die Funktion <code> [[DevelopmentModuleAPI#parseParams|parseParams()]]</code> unterstützt Modul-Autoren beim Parsen von Übergabeparametern, welche bei <code>define</code>, <code>get</code> und <code>set</code> Kommandos an die entsprechenden Modulfunktionen übergeben werden. Dadurch lassen sich auf einfache Weise insbesondere komplexe Parameter (wie bspw. Perl-Ausdrücke) sehr einfach parsen.<br />
<br />
Diese Zusatzfunktion kann man in der Initialize-Funktion einfach über folgenden Parameter für [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion modulweit aktivieren:<br />
<syntaxhighlight lang="perl">$hash->{parseParams} = 1;</syntaxhighlight><br />
Sobald es gesetzt ist wird automatisch durch fhem.pl <code>[[DevelopmentModuleAPI#parseParams|parseParams()]]</code> aufgerufen und die an die [[#X_Define|Define]]-, [[#X_Get|Get]]- und [[#X_Set|Set]]-Funktion übergebenen Parameter ändern sich wie weiter unten in den jeweiligen Funktionen beschrieben.<br />
<br />
==== X_Define ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$)<br />
{<br />
my ( $hash, $def ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Define-Funktion eines Moduls wird von FHEM aufgerufen wenn der Define-Befehl für ein Geräte ausgeführt wird und das Modul bereits geladen und mit der Initialize-Funktion initialisiert ist. Sie ist typischerweise dazu da, die übergebenen Parameter zu prüfen und an geeigneter Stelle zu speichern sowie einen Kommunikationsweg zum Gerät zu öffnen (z.B. TCP-Verbindung, USB-Schnittstelle o.ä.) oder einen [[#Pollen_von_Geräten|Status-Timer]] zu starten.<br />
Sie beginnt typischerweise mit:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$)<br />
{<br />
my ( $hash, $def ) = @_;<br />
my @a = split( "[ \t][ \t]*", $def );<br />
...<br />
</syntaxhighlight><br />
<br />
Als Übergabeparameter bekommt die Define-Funktion den Hash der Geräteinstanz sowie den die im <code>define</code>-Befehl übergebenen Parameter. Welche bzw. wie viele Parameter <br />
akzeptiert werden und welcher Syntax diese entsprechen müssen ist Sache dieser Funktion. Im obigen Beispiel wird die Argumentzeile <code>$def</code> in ein Array aufgeteilt (durch Leerzeichen/Tabulator getrennt) und so können die vom Modul bzw. der Define-Funktion erwarteten Werte über das Array der Reihe nach verarbeitet werden:<br />
<br />
<syntaxhighlight lang="perl"><br />
my $name = $a[0];<br />
my $module = $a[1];<br />
my $url = $a[2];<br />
my $inter = 300;<br />
<br />
if(int(@a) == 4) { <br />
$inter = $a[3]; <br />
if ($inter < 5) {<br />
return "interval too small, please use something > 5s, default is 300 seconds";<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Damit die übergebenen Werte auch anderen Funktionen zur Verfügung stehen und an die jeweilige Geräteinstanz gebunden sind, werden die Werte typischerweise als Internals im Hash der Geräteinstanz gespeichert:<br />
<br />
<syntaxhighlight lang="perl"><br />
$hash->{url} = $url;<br />
$hash->{Interval} = $inter;<br />
</syntaxhighlight><br />
<br />
Sobald alle Parameter korrekt verarbeitet wurden, wird in der Regel die erste Verbindung zum Gerät aufgebaut. Je nach Art des Geräts kann das eine permanente Datenverbindung sein (z.B. serielle Schnittstelle oder TCP-Verbindung) oder das Starten eines regelmäßigen Timers, der zyklisch den Status z.B. via [[HttpUtils|HTTP]] ausliest.<br />
<br />
Sollten im Rahmen der Define-Funktion Syntax-Probleme der Übergabeparameter festgestellt werden oder es kann bspw. keine Verbindung aufgebaut werden, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn alle Übergabeparameter akzeptiert werden, darf <code>undef</code> zurückgegeben werden. Sobald eine Define-Funktion eine Fehlermeldung zurückmeldet, wird der define-Befehl durch FHEM zurückgewiesen und der User erhält die Fehlermeldung, welche die Define-Funktion produziert hat, als Ausgabe zurück.<br />
<br />
===== <u>Verfügbarkeit von Attributen</u> =====<br />
Während die Define-Funktion ausgeführt wird, sollte man nicht davon ausgehen, dass alle vom Nutzer konfigurierten Attribute via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] verfügbar sind. Attribute stehen in der Define-Funktion nur dann zur Verfügung, wenn FHEM sich nicht in der Initialisierungsphase befindet (globale Variable <code>$init_done</code> ist wahr; der Nutzer hat die Gerätedefinition modifiziert). Daher sollte man weiterführende Funktion, welche auf gesetzte Attribute angewiesen sind, nur dann in der Define-Funktion starten, wenn <code>$init_done</code> zutrifft.<br />
<br />
Andernfalls sollte man den Aufruf in der Notify-Funktion durchführen sobald <code>global:INITIALIZED</code> bzw. <code>global:REREADCFG</code> getriggert wurde:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$)<br />
{<br />
my ( $hash, $def ) = @_;<br />
<br />
...<br />
<br />
$hash->{NOTIFYDEV} = "global";<br />
<br />
X_FunctionWhoNeedsAttr($hash) if($init_done);<br />
}<br />
<br />
sub X_Notify($$)<br />
{<br />
my ($own_hash, $dev_hash) = @_;<br />
my $ownName = $own_hash->{NAME}; # own name / hash<br />
<br />
return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled<br />
<br />
my $devName = $dev_hash->{NAME}; # Device that created the events<br />
my $events = deviceEvents($dev_hash, 1);<br />
<br />
if($devName eq "global" && grep(m/^INITIALIZED|REREADCFG$/, @{$events}))<br />
{<br />
X_FunctionWhoNeedsAttr($hash);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Dadurch wird die Modulfunktion X_FunctionWhoNeedsAttr() nach dem Start erst aufgerufen, wenn alle Attribute aus der Konfiguration geladen wurden.<br />
<br />
<br />
<u>Nutzung von parseParams()</u><br />
<br />
Zum Aufteilen und Parsen von <code>$def</code> lässt sich die Funktion [[DevelopmentModuleAPI#parseParams|parseParams()]] verwenden um die einzelnen Argumente einfach zu parsen. Wenn in [[#X_Initialize|X_Initialize()]] <code>$hash->{parseParams} = 1;</code> gesetzt wurde dann wird parseParams() automatisch aufgerufen und X_Define() ändert sich wie folgt:<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$$)<br />
{<br />
my ( $hash, $a, $h ) = @_;<br />
...<br />
</syntaxhighlight><br />
<br />
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.<br />
<br />
==== X_Undef ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Undef ($$)<br />
{<br />
my ( $hash, $name ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
Die Undef-Funktion wird aufgerufen wenn ein Gerät mit <code>delete</code> gelöscht wird oder bei der Abarbeitung des Befehls <code>rereadcfg</code>, der ebenfalls alle Geräte löscht und danach das Konfigurationsfile neu einliest. Entsprechend müssen in der Funktion typische Aufräumarbeiten durchgeführt werden wie das saubere Schließen von Verbindungen oder das Entfernen von internen Timern, sofern diese im Modul zum Pollen verwendet wurden (siehe Abschnitt [[#Pollen_von_Geräten|Pollen von Geräten]]). <br />
<br />
Zugewiesene Variablen im Hash der Geräteinstanz, Internals oder Readings müssen hier nicht gelöscht werden. In fhem.pl werden die entsprechenden Strukturen beim Löschen der Geräteinstanz ohnehin vollständig gelöscht.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Undef($$) <br />
{ <br />
my ( $hash, $name) = @_; <br />
DevIo_CloseDev($hash); <br />
RemoveInternalTimer($hash); <br />
return undef; <br />
}<br />
</syntaxhighlight><br />
<br />
Sollten im Rahmen der Undef-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur wenn die Undef-Funktion erfolgreich durchgeführt wurde, darf <code>undef</code> zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht bzw. neu angelegt. Sollte die Undef-Funktion jedoch eine Fehlermeldung zurückgeben, wird der entsprechende Vorgang (<code>delete</code> bzw. <code>rereadcfg</code>) für dieses Gerät abgebrochen. Es bleibt dann unverändert in FHEM bestehen.<br />
<br />
==== X_Delete ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Delete ($$)<br />
{<br />
my ( $hash, $name ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Delete-Funktion ist das Gegenstück zur Funktion [[#X_Define|X_Define]] und wird aufgerufen wenn ein Gerät mit dem Befehl <code>delete</code> gelöscht wird. <br />
<br />
Wenn ein Gerät in FHEM gelöscht wird, wird zuerst die Funktion [[#X_Undef|X_Undef]] aufgerufen um offene Verbindungen zu schließen, anschließend wird die Funktion X_Delete aufgerufen. Diese dient eher zum Aufräumen von dauerhaften Daten, welche durch das Modul evtl. für dieses Gerät spezifisch erstellt worden sind. Es geht hier also eher darum, alle Spuren sowohl im laufenden FHEM-Prozess, als auch dauerhafte Daten bspw. im physikalischen Gerät zu löschen die mit dieser Gerätedefinition zu tun haben.<br />
<br />
Dies kann z.B. folgendes sein:<br />
<br />
* Löschen von Dateien im Dateisystem die während der Nutzung dieses Geräts angelegt worden sind.<br />
* Lösen von evtl. Pairings mit dem physikalischen Gerät <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Delete($$) <br />
{ <br />
my ( $hash, $name ) = @_; <br />
<br />
# Löschen von Geräte-assoziiertem Temp-File<br />
unlink($attr{global}{modpath}."/FHEM/FhemUtils/$name.tmp";)<br />
<br />
return undef;<br />
} <br />
</syntaxhighlight><br />
<br />
Sollten im Rahmen der Delete-Funktion Probleme festgestellt werden, die ein Löschen nicht zulassen, so ist als Funktionsrückgabewert eine entsprechende Fehlermeldung zurückzugeben. Nur die Delete-Funktion erfolgreich durchgeführt wurde, darf <code>undef</code> zurückgegeben werden. Nur dann wird eine Gerätedefinition von FHEM auch tatsächlich gelöscht. Sollte die Delete-Funktion eine Fehlermeldung zurückgeben, wird der Löschvorgang abgebrochen und das Gerät bleibt weiter in FHEM bestehen.<br />
<br />
==== X_Get ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Get ($$@)<br />
{<br />
my ( $hash, $name, $opt, @args ) = @_;<br />
<br />
...<br />
<br />
return $result;<br />
}<br />
</syntaxhighlight><br />
Die Get-Funktion wird aufgerufen wenn der FHEM-Befehl <code>get</code> für eine Definition dieses Moduls ausgeführt wird. Mit <code>get</code> werden typischerweise Werte von einem Gerät abgefragt. In vielen Modulen wird auf diese Weise auch der Zugriff auf generierte Readings ermöglicht. Der Get-Funktion wird dabei der Definitions-Hash <code>$hash</code>, der Definitionsname <code>$name</code>, sowie die Aufrufparameter <code>$opt</code> plus optional weiterer Parameter <code>@args</code> übergeben. Als Rückgabewert <code>$result</code> wird das Ergebnis des entsprechenden Befehls in Form einer Zeichenkette zurückgegeben. Der Rückgabewert <code>undef</code> hat hierbei keine besondere Bedeutung und wird behandelt wie eine leere Zeichenkette <code>""</code>.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Get($$@)<br />
{<br />
my ( $hash, $name, $opt, @args ) = @_;<br />
<br />
return "\"get $name\" needs at least one argument" unless(defined($opt));<br />
<br />
if($opt eq "status") <br />
{<br />
...<br />
}<br />
elsif($opt eq "power")<br />
{<br />
...<br />
}<br />
...<br />
else<br />
{<br />
return "Unknown argument $opt, choose one of status power [...]";<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn eine unbekannte Option an die Get-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Get-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf <code>get <font color="grey">''<NAME>''</font> <u>'''?'''</u></code>, welche durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:<br />
<br />
<code>'''unknown''' argument ''<font color="grey">[Parameter]</font>'' '''choose one of''' ''<font color="grey">[Liste möglicher Optionen]</font>''</code><br />
<br />
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Get-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort "unknown" vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt "choose one of" mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. <br />
<br />
Beispiel:<br />
<ul><br />
<syntaxhighlight lang="perl">return "unknown argument $opt choose one of status temperature humidity";</syntaxhighlight><br />
<br />
Hier werden als mögliche Optionen für einen Get-Befehl folgende Parameter angegeben:<br />
<br />
* <code>status</code><br />
* <code>temperature</code><br />
* <code>humidity</code><br />
<br />
Dies würde in folgenden, mögliche Get-Befehle für einen User resultieren:<br />
<br />
* <code>get ''&lt;NAME&gt;'' status</code><br />
* <code>get ''&lt;NAME&gt;'' temperature</code><br />
* <code>get ''&lt;NAME&gt;'' humidity</code><br />
</ul><br />
<br />
Im weiteren Verlauf der Get-Funktion könnte man dann mit dem physischen Gerät kommunizieren und den gefragten Wert direkt abfragen und diesen als Return-Wert der Get-Funktion zurückgeben. Vielfach werden aber auch die vorhandenen Readings zurückgegeben.<br />
<br />
<br />
<u>Nutzung von parseParams()</u><br />
<br />
Wenn in [[#X_Initialize|X_Initialize()]] <code>$hash->{parseParams} = 1;</code> gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Get() ändert sich wie folgt:<br />
<syntaxhighlight lang="perl"><br />
sub X_Get($$$)<br />
{<br />
my ( $hash, $a, $h ) = @_;<br />
...<br />
</syntaxhighlight><br />
<br />
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.<br />
<br />
==== X_Set ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Set ($$@)<br />
{<br />
my ( $hash, $name, $cmd, @args ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
return ($error, $skip_trigger);<br />
}<br />
</syntaxhighlight><br />
<br />
Die Set-Funktion ist das Gegenteil zur [[#X_Get|Get]]-Funktion. Sie ist dafür gedacht, Daten zum physischen Gerät zu schicken, bzw. entsprechende Aktionen im Gerät selber auszulösen. Ein Set-Befehl dient daher der direkten Steuerung des physikalischen Gerätes in dem es bspw. Zustände verändert (wie <code>on</code>/<code>off</code>). Der Set-Funktion wird dabei der Definitions-Hash <code>$hash</code>, der Definitionsname <code>$name</code>, sowie die Aufrufparameter <code>$cmd</code> und optional weitere Argumente <code>@args</code> übergeben. Als Rückgabewert <code>$error</code> kann eine Fehlermeldung in Form Zeichenkette zurückgegeben werden. Der Rückgabewert <code>undef</code> bedeutet hierbei, dass der Set-Befehl erfolgreich durchgeführt wurde. Eine Set-Funktion gibt daher nur im Fehlerfall eine Rückmeldung mit einer entsprechenden Fehlermeldung. Der Wert <code>undef</code> wird als "erfolgreich" interpretiert. <br />
<br />
Standardmäßig wird jeder Set-Befehl, welcher erfolgreich ausgeführt wurde (<code>$error</code> ist <code>undef</code>), als Event getriggert um dies bspw. in einem FileLog festzuhalten. Dieses Verhalten kann optional unterbunden werden indem der optionale zweite Rückgabewert <code>$skip_trigger</code> auf <code>1</code> gesetzt wird. Damit wird das Generieren eines Events für das erfolgreich ausgeführte Set-Kommando unterbunden. Falls nicht gesetzt, wird ein Event erzeugt (<code>$cmd</code> mit sämtlichen <code>@args</code>).<br />
<br />
Rückmeldungen (Fehler) von set-Befehlen sämtlicher Module, die im Rahmen der Ausführung eines getriggerten [[Notify]] auftreten, werden im FHEM Logfile festgehalten.<br />
<br />
Falls nur interne Daten, die ausschließlich für das Modul relevant sind, gesetzt werden müssen, so sollte statt Set die [[#X_Attr|Attr]]-Funktion verwendet werden. Attribute werden bei Save-Config auch in der Fhem.cfg gesichert. Set-Befehle nicht, da sie nur zu Steuerungszwecken im laufenden Betrieb von FHEM dienen.<br />
<br />
Eine Set-Funktion ist ähnlich aufgebaut wie die Get-Funktion, sie bekommt jedoch in der Regel weitere zusätzliche Parameter (<code>@args</code>) übergeben um Zustände zu setzen/ändern. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Set($@)<br />
{<br />
my ( $hash, $name, $cmd, @args ) = @_;<br />
<br />
return "\"set $name\" needs at least one argument" unless(defined($cmd));<br />
<br />
if($cmd eq "status")<br />
{<br />
if($args[0] eq "up")<br />
{<br />
...<br />
}<br />
elsif($args[0] eq "down")<br />
{<br />
...<br />
}<br />
else<br />
{<br />
return "Unknown value $args[0] for $cmd, choose one of up down";<br />
} <br />
}<br />
elsif($cmd eq "power")<br />
{<br />
if($args[0] eq "on")<br />
{<br />
...<br />
}<br />
elsif($args[0] eq "off")<br />
{<br />
...<br />
} <br />
else<br />
{<br />
return "Unknown value $args[0] for $cmd, choose one of on off";<br />
} <br />
}<br />
...<br />
else<br />
{<br />
return "Unknown argument $cmd, choose one of status power";<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn eine unbekannte Option an die Set-Funktion übergeben wird, so muss als Rückgabewert der Funktion eine bestimmte Syntax eingehalten werden um FHEM mitzuteilen, welche Optionen für einen Set-Befehl aktuell unterstützt werden. Dies gilt insbesondere für den Aufruf <code>set <font color="grey">''<NAME>''</font> <u>'''?'''</u></code>, welcher durch verschiedene Module (z.B. FHEMWEB) benutzt wird, um eine Liste aller unterstützten Befehle für eine Definition zu ermitteln. Die Rückgabe muss dabei folgender Syntax entsprechen:<br />
<br />
<code>'''unknown''' argument ''<font color="grey">[Parameter]</font>'' '''choose one of''' ''<font color="grey">[Liste möglicher Optionen]</font>''</code><br />
<br />
Hierbei sind die fett gedruckten Teile der Rückmeldung besonders wichtig. Sind diese nicht vorhanden, können Module wie FHEMWEB nicht die möglichen Set-Kommandos für das entsprechende Gerät ermitteln. Es muss am Anfang der Meldung das Stichwort "unknown" vorkommen gefolgt von einer frei definierbaren Fehlermeldung (i.d.R der übergebene Parameter, welcher ungültig ist). Anschließend folgt "choose one of" mit einer anschließenden Liste möglicher Optionen getrennt durch ein Leerzeichen. <br />
<br />
Beispiel:<br />
<ul><br />
<syntaxhighlight lang="perl">return "unknown argument $cmd choose one of status power";</syntaxhighlight><br />
<br />
Hier werden als mögliche Optionen für einen Set-Befehl folgende Parameter angegeben:<br />
<br />
* <code>status</code><br />
* <code>power</code><br />
<br />
Dies würde in folgenden, mögliche Set-Befehle für einen User resultieren:<br />
<br />
* <code>set ''&lt;NAME&gt;'' status</code><br />
* <code>set ''&lt;NAME&gt;'' power</code><br />
</ul><br />
<br />
<br />
<u>Nutzung von SetExtensions.pm</u><br />
<br />
Wenn man dem Nutzer zusätzlich zu den Set-Befehlen <code>on</code> und <code>off</code> auch weiterführende Befehle wie <code>on-for-timer</code>, <code>on-till</code>, usw. anbieten möchte, obwohl die zu steuernde Hardware solche Kommandos nicht unterstützt, kann man dies über das Hilfsmodul SetExtensions.pm realisieren.<br />
<br />
Das Hilfsmodul SetExtensions.pm bietet weiterführende Set-Kommandos basierend auf den Befehlen <code>on</code>/<code>off</code> an. Dabei werden durch interne Timer bzw. eigens angelegten [[at]]-Definitionen diese Befehle durch FHEM selber umgesetzt. Je nach ausgeführtem Befehl wird der <code>on</code>- bzw. <code>off</code>-Befehl dann durch FHEM zum richtigen Zeitpunkt ausgeführt. Vorausgesetzt das Modul unterstützt in der Set-Funktion die Befehle <code>on</code> und <code>off</code>, so werden durch den Einsatz von SetExtensions.pm folgende Befehle zusätzlich unterstützt:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Set-Kommando !! Beispiel !! Beschreibung<br />
|-<br />
| style="white-space: nowrap;" | <code>on-for-timer ''&lt;Dauer&gt;''</code> || style="white-space: nowrap;" | <code>on-for-timer 120</code> || Schaltet das Gerät sofort mit dem <code>on</code>-Befehl ein und nach der angegebenen Dauer in Sekunden via <code>off</code> wieder aus.<br />
|-<br />
| style="white-space: nowrap;" | <code>off-for-timer ''&lt;Dauer&gt;''</code> || style="white-space: nowrap;" | <code>off-for-timer 120</code> || Schaltet das Gerät sofort mit dem <code>off</code>-Befehl aus und nach der angegebenen Dauer in Sekunden via <code>on</code> wieder ein.<br />
|-<br />
| style="white-space: nowrap;" | <code>on-till ''&lt;Zeitpunkt&gt;''</code> || style="white-space: nowrap;" | <code>on-till 16:30</code> || Schaltet das Gerät sofort mit dem <code>on</code>-Befehl ein und zum angegebenen Zeitpunkt via <code>off</code> wieder aus.<br />
|-<br />
| style="white-space: nowrap;" | <code>off-till ''&lt;Zeitpunkt&gt;''</code> || style="white-space: nowrap;" | <code>off-till 16:30</code> || Schaltet das Gerät sofort mit dem <code>off</code>-Befehl aus und zum angegebenen Zeitpunkt via <code>on</code> wieder ein.<br />
|-<br />
| style="white-space: nowrap;" | <code>on-till-overnight ''&lt;Zeitpunkt&gt;''</code> || style="white-space: nowrap;" | <code>on-till-overnight 01:00</code> || Ähnlich wie <code>on-till</code>. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.<br />
|-<br />
| style="white-space: nowrap;" | <code>off-till-overnight ''&lt;Zeitpunkt&gt;''</code> || style="white-space: nowrap;" | <code>off-till-overnight 01:00</code> || Ähnlich wie <code>off-till</code>. Der übergebene Zeitpunkt wird aber nicht geprüft, ob er für den heutigen Tag bereits überschritten wurde. Dadurch kann man Abends einen Zeitpunkt setzen, der erst am nächsten Tag zutrifft.<br />
|-<br />
| style="white-space: nowrap;" | <code>blink ''&lt;Anzahl&gt; &lt;Interval&gt;''</code> || style="white-space: nowrap;" | <code>blink 3 1</code> || Schaltet das Gerät via <code>on</code> für <code>''&lt;Interval&gt;''</code> Sekunden ein und anschließend via <code>off</code> wieder aus. Nach <code>''&lt;Interval&gt;''</code> Sekunden wird das ganze wiederholt, solange bis die angegebene Anzahl erreicht ist.<br />
|-<br />
| style="white-space: nowrap;" | <code>intervals ''&lt;Start&gt;-&lt;Ende&gt;'' ''&lt;Start&gt;-&lt;Ende&gt;'' ...</code> || style="white-space: nowrap;" | <code>intervals 07:00-08:00 16:30-18:00</code> || Schaltet das Gerät innerhalb der übergebenen Zeiträumen via <code>on</code> ein. Sobald die aktuelle Zeit ausserhalb dieser Zeiträume liegt, wird das Gerät via <code>off</code> wieder ausgeschaltet. Es können dabei beliebig viele Zeiträume angegeben werden.<br />
|-<br />
| style="white-space: nowrap;" | <code>toggle</code> || style="white-space: nowrap;" | <code>toggle</code> || Sofern der aktuelle Status <code>on</code> ist, wird das Gerät via <code>off</code> ausgeschaltet. Andernfalls wird es via <code>on</code> eingeschaltet.<br />
|}<br />
<br />
Eine kurze Beschreibung zu den möglichen Befehlen durch SetExtensions.pm gibt es auch in der commandref zum {{Link2CmdRef|Anker=set|Label=set-Befehl}}.<br />
<br />
Um SetExtensions.pm in der Set-Funktion nutzen zu können müssen folgende Aktionen durchgeführt werden:<br />
<br />
# Laden von SetExtensions.pm via <code>use SetExtensions;</code> am Anfang des Moduls<br />
# Aufruf und Rückgabe der Funktion [[DevelopmentModuleAPI#SetExtensions|SetExtensions()]] sofern die Set-Funktion mit dem übergebenen Befehl nichts anfangen kann.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
use SetExtensions;<br />
<br />
...<br />
<br />
sub X_Set($@)<br />
{<br />
my ( $hash, $name, $cmd, @args ) = @_;<br />
my $cmdList = "on off";<br />
<br />
return "\"set $name\" needs at least one argument" unless(defined($cmd));<br />
<br />
if($cmd eq "on")<br />
{<br />
# Gerät einschalten...<br />
}<br />
elsif($cmd eq "off")<br />
{<br />
# Gerät ausschalten...<br />
}<br />
...<br />
else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions()<br />
{<br />
return SetExtensions($hash, $cmdList, $name, $cmd, @args);<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Sollte der übergebene Set-Befehl auch für SetExtensions unbekannt sein (bspw. <code>set ''&lt;Name&gt;'' ?</code>), so generiert SetExtensions() eine entsprechende Usage-Meldung, welche innerhalb der Set-Funktion an FHEM zurückgegeben werden muss.<br />
<br />
Eine ausführliche Beschreibung zu der Funktion SetExtensions() gibt es in der [[DevelopmentModuleAPI#SetExtensions|API-Referenz]].<br />
<br />
<br />
<br />
<u>Nutzung von parseParams()</u><br />
<br />
Wenn in [[#X_Initialize|X_Initialize()]] <code>$hash->{parseParams} = 1;</code> gesetzt wurde dann wird [[DevelopmentModuleAPI#parseParams|parseParams()]] automatisch aufgerufen und X_Set() ändert sich wie folgt:<br />
<syntaxhighlight lang="perl"><br />
sub X_Set($$$)<br />
{<br />
my ( $hash, $a, $h ) = @_;<br />
...<br />
</syntaxhighlight><br />
<br />
Die genauen Möglichkeiten von parseParams() sind in dem entsprechenden [[DevelopmentModuleAPI#parseParams|Artikel]] dokumentiert.<br />
<br />
<br />
<u>Nutzung von FHEMWEB-Widgets</u><br />
<br />
Das GUI-Modul [[FHEMWEB]] kann für die einzelnen Set-Optionen, die das Modul versteht, automatisch Eingabehilfen wie Drop-Down Boxen oder Slider erzeugen. In der Detailansicht der GUI kann der Anwender dann die jeweiligen Werte komfortabel auswählen. Dafür muss die Set-Funktion, wenn sie mit der Option <code>?</code> aufgerufen wird, nicht nur einen Text mit <code>"Unknown ... choose one of ..."</code> zurückgeben sondern den einzelnen Set-Optionen in diesem Rückgabetext nach einem Doppelpunkt entsprechende Zusatzinformationen anhängen.<br />
Meist prüft man in den Modulen gar nicht auf die Option <code>?</code> sondern gibt generell bei unbekannten Optionen diesen Text zurück. Das Modul FHEMWEB ermittelt die Syntax eines Gerätes jedoch immer mit dem Befehl:<br />
set ''&lt;NAME&gt;'' ?<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
return "Unknown argument $cmd, choose one of status:up,down power:on,off on:noArg off:noArg";<br />
</syntaxhighlight><br />
<br />
Mit Kommata getrennte Werte ergeben eine Drop-Down Liste, mit der der User die Werte auswählen kann<br />
<pre>timer:30,120,300<br />
mode:verbose,ultra,relaxed</pre><br />
<br />
Wird kein Doppelpunkt zum Kommando angegeben, so wird eine Eingabezeile angezeigt, die die freie Eingabe eines Wertes erlaubt.<br />
<br />
Man kann jedoch die Eingabe-/Auswahlmöglichkeiten durch Widgets vereinfachen. Dazu gibt man hinter dem Doppelpunkt einen Widgetnamen und widgetspezifische Parameter an. Es existieren mehrere solcher Widgets in FHEMWEB. Die gebräuchlichsten sind:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Zusatz !! Beispiel !! Beschreibung<br />
|-<br />
| '''noArg''' || <code>reset:noArg</code>|| Es werden keine weiteren Argumente mehr benötigt. In so einem Fall wird bei der Auswahl keine Textbox oder ähnliches angezeigt, da keine weiteren Argumente für diesen Befehl notwendig sind.<br />
|-<br />
| '''slider''',<min>,<step>,<max> || <code>dim:slider,0,1,100</code>|| Es wird ein Schieberegler angezeigt um den Parameter auszuwählen. Dabei werden als Zusatzparameter Minimum, Schrittweite und Maximum angegeben.<br />
|-<br />
| '''colorpicker''' || <code>rgb:colorpicker,RGB</code>|| Es wird ein Colorpicker angezeigt, der dem Anwender die Auswahl einer Farbe ermöglicht. Die genaue Parametersyntax kann man dem Artikel zum [[Color#Colorpicker|Colorpicker]] entnehmen.<br />
|-<br />
| '''multiple''' || <code>group:multiple,Telefon,Multimedia,Licht,Heizung</code> || Es erscheint ein Auswahldialog, wo man verschiedene Werte durch klicken auswählen kann. Optional kann man in einem Freitext eigene Werte ergänzen. dieser Dialog wird bspw. bei der Raum-Auswahl (Attribut "room") oder der Gruppen-Auswahl (Attribut "group") in FHEMWEB genutzt. <br />
|-<br />
| '''sortable''' || <code>command:sortable,monday,tuesday,...</code> || Es erscheint ein Auswahldialog, wo man verschiedene Werte auswählen und sortieren kann. Man kann dabei Werte durch Klicken auswählen und durch Drag'n'Drop sortieren.<br />
|}<br />
<br />
Es gibt noch weitere solcher Widgets. Eine genaue Auflistung dazu findet sich in der {{Link2CmdRef|Anker=widgetOverride}} unter widgetOverride zu FHEMWEB.<br />
<br />
'''Hinweise'''<br />
<br />
* Damit in einer Eingabe bereits der aktuelle Wert vorbelegt bzw. in einer Auswahlliste der aktuelle Wert vorselektiert ist, muss es im Modul bzw. Gerät ein Reading mit dem gleichen Namen wie die Set-Option geben. Der Wert des gleichnamigen Readings wird dann als Vorbelegung / Vorselektion verwendet. <br />
* Der User kann sich in der Raumübersicht nach wie vor via [[WebCmd|webCmd]] eine entsprechende Steuerung anlegen.<br />
<br />
==== X_Attr ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Attr($$$$)<br />
{<br />
my ( $cmd, $name, $attrName, $attrValue ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Attr-Funktion dient der Prüfung von Attributen, welche über den <code>attr</code>-Befehl gesetzt werden können. Sobald versucht wird, ein Attribut für ein Gerät zu setzen, wird vorher die Attr-Funktion des entsprechenden Moduls aufgerufen um zu prüfen, ob das Attribut aus Sicht des Moduls korrekt ist.<br />
Liegt ein Problem mit dem Attribut bzw. dem Wert vor, so muss die Funktion eine aussagekräftige Fehlermeldung zurückgeben, welche dem User angezeigt wird.<br />
Sofern das übergebene Attribut samt Inhalt korrekt ist, gibt die Attr-Funktion den Wert <code>undef</code> zurück. Erst dann wird das Attribut in der globalen Datenstruktur <code>%attr</code> gespeichert und ist somit erst aktiv.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Attr($$$$)<br />
{<br />
my ( $cmd, $name, $aName, $aValue ) = @_;<br />
<br />
# $cmd - Vorgangsart - kann die Werte "del" (löschen) oder "set" (setzen) annehmen<br />
# $name - Gerätename<br />
# $aName/$aValue sind Attribut-Name und Attribut-Wert<br />
<br />
if ($cmd eq "set") {<br />
if ($aName eq "Regex") {<br />
eval { qr/$aValue/ };<br />
if ($@) {<br />
Log3 $name, 3, "X ($name) - Invalid regex in attr $name $aName $aValue: $@";<br />
return "Invalid Regex $aValue: $@";<br />
}<br />
}<br />
}<br />
return undef;<br />
}<br />
</syntaxhighlight><br />
<br />
Zusätzlich ist es möglich auch übergebene Attributwerte zu verändern bzw. zu korrigieren, indem man im Parameterarray <code>@_</code> den ursprünglichen Wert anpasst. Dies erfolgt im Beispiel über die Modifikation des Wertes mit Index 3 (entspricht dem 4. Element) im Parameterarray, also <code>$_[3]</code>.<br />
<br />
Da das Attribut zum Zeitpunkt des Aufrufs der Attr-Funktion noch nicht gespeichert ist, wird der neue Wert zu diesem Zeitpunkt noch nicht via [[DevelopmentModuleAPI#AttrVal|AttrVal()]] zurückgegeben. Erst, wenn die Attr-Funktion mit <code>undef</code> beendet ist, wird der neue Wert in FHEM gespeichert und steht dann via AttrVal() zur Verfügung.<br />
<br />
Die Attr-Funktion bekommt nicht den Hash der Geräteinstanz übergeben, da sie normalerweise keine Werte dort speichern muss, sondern lediglich das Attribut auf Korrektheit prüfen muss.<br />
Im obigen Beispiel wird für ein Attribut mit Namen "Regex" geprüft ob der reguläre Ausdruck fehlerhaft ist. Sofern dieser OK ist, wird <code>undef</code> zurückgegeben und fhem.pl speichert den Wert des Attributs in <code>%attr</code>.<br />
<br />
<br />
<u>Attributnamen mit Platzhaltern</u><br />
<br />
Falls man Attribute in der [[#X_Initialize|Initialize]]-Funktion mit Platzhaltern definiert (Wildcard-Attribute) wie z.B.:<br />
<syntaxhighlight lang="perl"><br />
$hash->{AttrList} =<br />
"reading[0-9]*Name " .<br />
# usw.<br />
</syntaxhighlight><br />
dann können Anwender Attribute wie reading01Name, reading02Name etc. setzen. Leider funktioniert das bisher nicht durch Klicken in der Web-Oberfläche, da FHEMWEB nicht alle denkbaren Ausprägungen in einem Dropdown anbieten kann. Der Benutzer muss solche Attribute manuell über den <code>attr</code>-Befehl eingeben.<br />
<br />
Man kann jedoch in der Attr-Funktion neu gesetzte Ausprägungen von Wildcard-Attributen an die gerätespezifische userattr-Variable anfügen. Dann können bereits gesetzte Attribute in FHEMWEB durch Klicken ausgewählt und geändert werden.<br />
Dazu reicht ein Aufruf der Funktion [[DevelopmentModuleAPI#addToDevAttrList|addToDevAttrList()]]: <br />
<br />
<syntaxhighlight lang="perl"><br />
addToDevAttrList($name, $aName);<br />
</syntaxhighlight><br />
<br />
<br />
==== X_Read ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Read ($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
Die X_Read-Funktion wird aufgerufen, wenn ein dem Gerät zugeordneter Filedeskriptor (serielle Schnittstelle, TCP-Verbindung, ...) Daten zum Lesen bereitgestellt hat. Die Daten müssen nun eingelesen und interpretiert werden.<br />
<br />
Im folgenden Beispiel wird über eine serielle Schnittstelle (beziehungsweise über einen USB-To-Serial-Konverter) von einem angeschlossenen Gerät gelesen. Dazu werden die bisher verfügbaren Daten mit der Funktion [[DevIo#DevIo_SimpleRead()|DevIo_SimpleRead()]] gelesen. Da die Übertragung möglicherweise noch nicht vollständig ist, kann es sein, dass kurz darauf die X_Read-Funktion wieder aufgerufen wird und ein weiterer Teil oder der Rest der Daten gelesen werden kann.<br />
Die Funktion muss daher prüfen ob schon alle erwarteten Daten angekommen sind und gegebenenfalls die bisher gelesenen Daten in einem eigenen Puffer (idealerweise in <code>$hash</code>) zwischenspeichern (siehe auch [[DevIo#Hinweis bei der Datenverarbeitung (Buffering)|DevIo]]). Im Beispiel ist dies <code>$hash->{helper}{BUFFER}</code> an den die aktuell gelesenen Daten angehängt werden, bis die folgende Prüfung ein für das jeweilige Protokoll vollständige Frame erkennt.<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Read($)<br />
{<br />
my ($hash) = @_;<br />
my $name = $hash->{NAME};<br />
<br />
# einlesen der bereitstehenden Daten<br />
my $buf = DevIo_SimpleRead($hash); <br />
return "" if ( !defined($buf) );<br />
Log3 $name, 5, "X ($name) - received data: ".$buf; <br />
<br />
# Daten in Hex konvertieren und an den Puffer anhängen<br />
$hash->{helper}{BUFFER} .= unpack ('H*', $buf); <br />
Log3 $name, 5, "X ($name) - current buffer content: ".$hash->{helper}{BUFFER};<br />
<br />
# prüfen, ob im Buffer ein vollständiger Frame zur Verarbeitung vorhanden ist.<br />
if ($hash->{helper}{BUFFER} =~ "ff1002(.{4})(.*)1003(.{4})ff(.*)") {<br />
...<br />
</syntaxhighlight><br />
<br />
Die zu lesenden Nutzdaten können dann je nach Protokoll des Geräts beispielsweise an einer festgelegten Stelle im Frame (dann in <code>$hash->{helper}{BUFFER}</code>) stehen oder aus dem Kontext mit einem Regex-Match extrahiert werden und via [[DevelopmentModuleAPI#Readings_.2F_Events|Reading-Funktionen]] in Readings gespeichert werden (siehe unten).<br />
<br />
Der Rückgabewert der Read-Funktion wird nicht geprüft und hat daher keinerlei Bedeutung.<br />
<br />
==== X_Ready ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Ready ($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
...<br />
<br />
return $success;<br />
}<br />
</syntaxhighlight><br />
<br />
Wird im Main-Loop aufgerufen falls das Modul in der globalen Liste <code>%readyfnlist</code> existiert. Diese Funktion hat, je nachdem auf welchem OS FHEM ausgeführt wird, unterschiedliche Aufgaben:<br />
<br />
* '''UNIX-artiges Betriebssystem:''' prüfen, ob eine Verbindung nach einem Verbindungsabbruch wieder aufgebaut werden kann. Sobald der Verbindungsaufbau erfolgreich war, muss die Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. "1") und den eigenen Eintrag entsprechend aus <code>%readyfnlist</code> löschen.<br />
* '''Windows-Betriebssystem:''' prüfen, ob lesbare Daten für ein serielles Device (via COM1, COM2, ...) vorliegen. Sofern lesbare Daten vorliegen, muss Funktion einen erfolgreichen Wahrheitswert zurückliefern (z.B. "1"). Zusätzlich dazu muss die Funktion, wie bei UNIX-artigen Betriebssystem, ebenfalls bei einem Verbindungsabbruch einen neuen Verbindungsversuch initiieren. Der Eintrag in <code>%readyfnlist</code> bleibt solange erhalten, bis die Verbindung seitens FHEM beendet wird.<br />
<br />
Der Windows-spezifische Teil zur Datenprüfung ist dabei nur zu implementieren, wenn das Modul über eine serielle Verbindung kommuniziert.<br />
<br />
Bei der Nutzung des Moduls [[DevIo]] wird dem Modulentwickler der Umgang mit <code>%readyfnlist</code> abgenommen, da DevIo sich selbst um die entsprechenden Einträge kümmert und diese selbstständig wieder entfernt.<br />
<br />
In der Regel sieht eine Ready-Funktion immer gleich aus.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Ready($)<br />
{<br />
my ($hash) = @_;<br />
<br />
# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.<br />
return DevIo_OpenDev($hash, 1, undef ) if ( $hash->{STATE} eq "disconnected" );<br />
<br />
# This is relevant for Windows/USB only<br />
if(defined($hash->{USBDev})) {<br />
my $po = $hash->{USBDev};<br />
my ( $BlockingFlags, $InBytes, $OutBytes, $ErrorFlags ) = $po->status;<br />
return ( $InBytes > 0 );<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Notify ====<br />
<br />
Die X_Notify-Funktion wird aus der Funktion [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] in fhem.pl heraus aufgerufen sobald ein Modul Events erzeugt hat. Damit kann ein Modul auf Events anderer Module reagieren. Typische Beispiele sind dabei das [[FileLog]]-Modul oder das [[notify]]-Modul.<br />
<br />
Die Notify-Funktion bekommt dafür zwei Hash-Referenzen übergeben: den Hash des eigenen Geräts und den Hash des Geräts, das die Events erzeugt hat. <br />
Über den Hash des eigenen Geräts kann die Notify-Funktion beispielsweise auf die Internals oder Attribute des eigenen Geräts zugreifen.<br />
Über den Hash des Gerätes und der [[DevelopmentModuleAPI#deviceEvents|deviceEvents()]]-Funktion kann man auf die generierten Events zugreifen. Über den zweiten Parameter dieser Routine lässt sich bestimmen ob für das Reading <code>state</code> ein 'normales' Event (d.h. in der form <code>state: <wert></code>) erzeugen soll (Wert: 1) oder ob z.b. aus Gründen der Rückwärtskompatibilität ein Event ohne <code>state: </code> erzeugt werden soll. Falls dem Anwender die Wahl des verwendeten Formats überlassen werden soll ist hierzu das {{Link2CmdRef|Anker=addStateEvent|Lang=de|Label=addStateEvent-Attribut}} vorzusehen.<br />
<br />
Der direkte Zugriff auf <code>$hash->{CHANGED}</code> ist nicht mehr zu empfehlen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Notify($$)<br />
{<br />
my ($own_hash, $dev_hash) = @_;<br />
my $ownName = $own_hash->{NAME}; # own name / hash<br />
<br />
return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled<br />
<br />
my $devName = $dev_hash->{NAME}; # Device that created the events<br />
<br />
my $events = deviceEvents($dev_hash,1);<br />
return if( !$events );<br />
<br />
foreach my $event (@{$events}) {<br />
$event = "" if(!defined($event));<br />
<br />
# Examples:<br />
# $event = "readingname: value" <br />
# or<br />
# $event = "INITIALIZED" (for $devName equal "global")<br />
#<br />
# processing $event with further code<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<u>Begrenzung der Aufrufe auf bestimmte Geräte</u><br />
<br />
Da die Notify-Funktion für jedes definierte Gerät mit all seinen Events aufgerufen wird, muss sie in einer Schleife jedesmal prüfen und entscheiden, ob es mit dem jeweiligen Event etwas anfangen kann. Ein Gerät, das die Notify-Funktion implementiert, sieht dafür typischerweise einen regulären Ausdruck vor, welcher für die Filterung verwendet wird.<br />
<br />
Wenn man nur gezielt von bestimmten Definitionen Events erhalten will, kann man diese auch in Form einer {{Link2CmdRef|Lang=de|Anker=devspec|Label=devspec}} in <code>$hash->{NOTIFYDEV}</code> angeben. Bspw. kann man in der Define-Funktion diesen Wert setzen. Dadurch wird die Notify-Funktion nur aufgerufen wenn eine der Definitionen, auf welche die devspec passt, ein Event erzeugt hat. Ein typischer Fall ist die Begrenzung von Events auf "global":<br />
<br />
<syntaxhighlight lang="perl"><br />
in der Define-Funktion:<br />
<br />
$hash->{NOTIFYDEV} = "global";<br />
$hash->{NOTIFYDEV} = "global,Definition_.*";<br />
$hash->{NOTIFYDEV} = "global,Definition_A,Definition_B";<br />
$hash->{NOTIFYDEV} = "global,TYPE=CUL_HM";<br />
</syntaxhighlight><br />
<br />
Dies schont insbesondere bei grossen Installationen Ressourcen, da die Notify-Funktion nicht sämtliche Events, sondern nur noch Events der gewünschten Definitionen erhält. Dadurch erfolgen deutlich weniger Aufrufe der Notify-Funktion, was Systemressourcen schont. Statt den Filter ''NOTIFYDEV'' direkt zu setzen, kann auch [[DevelopmentModuleAPI#setNotifyDev|setNotifyDev()]] aufgerufen werden. Letzteres ist v.a. dann zu empfehlen, wenn Änderungen zur Laufzeit erfolgen sollen.<br />
<br />
Sofern in der [[#X_Define|Define-Funktion]] eine Regexp als Argument übergeben wird, die ähnlich wie beim Modul [[notify]] auf Events wie <code>&lt;Definitionsname&gt;</code> bzw. <code>&lt;Definitionsname&gt;:&lt;Event&gt;</code> reagiert, so sollte man in der Define-Funktion die Funktion [[DevelopmentModuleAPI#notifyRegexpChanged|notifyRegexpChanged()]] verwenden. Diese versucht einen passenden Eintrag für <code>$hash->{NOTIFYDEV}</code> basierend auf der übergebenen Regexp zu setzen, sofern dies möglich ist.<br />
<br />
<u>Reihenfolge für den Aufruf der Notify-Funktion beeinflussen</u><br />
<br />
Sobald ein Event ausgelöst wurde, stellt sich FHEM eine Liste aller relevanten Geräte-Hashes zusammen, welche via Notify-Funktion prüfen müssen, ob das Event relevant ist. Dabei wird die Liste nach <code>$hash->{NTFY_ORDER}</code> sortiert. Diese enthält ein Order-Präfix in Form einer Ganzzahl, sowie den Namen der Definition (Bsp: <code>'''50'''-Lampe_Wohnzimmer</code>). Dadurch kann man jedoch nicht sicherstellen, dass Events von bestimmten Modulen zuerst verarbeitet werden.<br />
<br />
Wenn das eigene Modul bei der Eventverarbeitung gegenüber den anderen Modulen eine bestimmte Reihenfolge einhalten muss, kann man in der [[#X_Initialize|Initialize]]-Funktion durch Setzen von <code>$hash->{NotifyOrderPrefix}</code> diese Reihenfolge beeinflussen. Standardmäßig werden Module immer mit einem Order-Präfix von "50-" in FHEM registriert. Durch die Veränderung dieses Präfixes kann man das eigene Modul in der Reihenfolge gegenüber anderen Modulen bei der Eventverarbeitung beeinflussen. <br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($)<br />
{<br />
my ($hash) = @_;<br />
<br />
...<br />
<br />
$hash->{NotifyOrderPrefix} = "45-" # Alle Definitionen des Moduls X werden bei der Eventverarbeitung zuerst geprüft<br />
<br />
# oder...<br />
<br />
$hash->{NotifyOrderPrefix} = "55-" # Alle Definitionen des Moduls X werden bei der Eventverarbeitung als letztes geprüft<br />
<br />
</syntaxhighlight> <br />
<br />
Da dieses Präfix bei eventverarbeitenden Definitionen in <code>$hash->{NTFY_ORDER}</code> dem Definitionsnamen vorangestellt wird bewirkt es bei einer normalen aufsteigenden Sortierung nach <code>$hash->{NTFY_ORDER}</code> eine veränderte Reihenfolge. Alle Module die in der Initialize-Funktion nicht <code>$hash->{NotifyOrderPrefix}</code> explizit setzen, werden mit "50-" als Standardwert vorbelegt.<br />
<br />
==== X_Rename ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Rename($$)<br />
{<br />
my ( $new_name, $old_name) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Rename-Funktion wird ausgeführt, nachdem ein Gerät umbenannt wurde. Auf diese Weise kann ein Modul auf eine Namensänderung reagieren, wenn das Gerät <code>$old_name</code> in <code>$new_name</code> umbenannt wurde. Ein typischer Fall ist das Umsetzen der Namensänderungen bei Daten die mittels [[DevelopmentModuleAPI#setKeyValue|setKeyValue()]] gespeichert wurden. Hierbei müssen die Daten, welche unter dem alten Namen gespeichert sind, auf den neuen Namen geändert werden.<br />
<br />
Der Rename-Funktion wird lediglich der alte, sowie der neue Gerätename übergeben. Der Rückgabewert wird nicht ausgewertet.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Rename($$)<br />
{<br />
my ( $new_name, $old_name ) = @_;<br />
<br />
my $old_index = "Module_X_".$old_name."_data";<br />
my $new_index = "Module_X_".$new_name."_data";<br />
<br />
my ($err, $old_pwd) = getKeyValue($old_index);<br />
return undef unless(defined($old_pwd));<br />
<br />
setKeyValue($new_index, $old_pwd);<br />
setKeyValue($old_index, undef);<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_DelayedShutdown ====<br />
<syntaxhighlight lang="perl"><br />
sub X_DelayedShutdown($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
...<br />
<br />
return $delay_needed;<br />
}<br />
</syntaxhighlight><br />
Mit der X_DelayedShutdown Funktion kann eine Definition das Stoppen von FHEM verzögern um asynchron hinter sich aufzuräumen. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.), welcher mehrfache Requests/Responses benötigt. Als Übergabeparameter wird der Geräte-Hash <code>$hash</code> bereitgestellt. Je nach Rückgabewert <code>$delay_needed</code> wird der Stopp von FHEM verzögert. Ist ein verzögerter Stopp von FHEM notwendig, darf der Rückgabewert in diesem Fall nicht <code>0</code> oder <code>undef</code> sein.<br />
<br />
Im Unterschied zur [[#X_Shutdown|Shutdown]]-Funktion steht vor einem bevorstehenden Stopp von FHEM für einen User-konfigurierbaren Zeitraum (global-Attribut: <code>maxShutdownDelay</code> / Standard: 10 Sekunden) weiterhin die asynchrone FHEM Infrastruktur ([[DevIo]]/[[#X_Read|Read]]-Funktion und [[DevelopmentModuleAPI#InternalTimer|InternalTimer]]) zur Verfügung.<br />
<br />
Sobald alle nötigen Maßnahmen erledigt sind, muss der Abschluss mit [[DevelopmentModuleAPI#CancelDelayedShutdown|CancelDelayedShutdown(<code>$name</code>)]] an FHEM zurückgemeldet werden.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_DelayedShutdown($)<br />
{<br />
my ($hash) = @_;<br />
<br />
# Aufräumen starten<br />
<br />
return 1;<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Shutdown ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Shutdown ($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
Mit der X_Shutdown Funktion kann ein Modul Aktionen durchführen bevor FHEM gestoppt wird. Dies kann z.B. der ordnungsgemäße Verbindungsabbau mit dem physikalischen Gerät sein (z.B. Session beenden, Logout, etc.). Nach der Ausführung der Shutdown-Fuktion wird FHEM sofort beendet. Falls vor dem Herunterfahren von FHEM asynchrone Kommunikation (via [[DevIo]]/[[#X_Read|X_Read]]) notwendig ist um eine vorhandene Verbindung sauber zu beenden, sollte man [[#X_DelayedShutdownFn|X_DelayedShutdownFn]] verwenden.<br />
<br />
Als Übergabeparameter wird der Geräte-Hash bereitgestellt. Der Rückgabewert einer Shutdown-Funktion wird nicht ausgewertet und ist daher irrelevant.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_Shutdown($)<br />
{<br />
my ($hash) = @_;<br />
<br />
# Verbindung schließen<br />
DevIo_CloseDev($hash);<br />
return undef;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Funktionen für zweistufiges Modulkonzept ===<br />
<br />
Für das [[#Zweistufiges_Modell_für_Module|zweistufige Modulkonzept]] gibt es weiterhin:<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! style="text-align:left" | Funktionsname !! style="text-align:left" class="unsortable" | Kurzbeschreibung<br />
|-<br />
| [[#X_Parse|X_Parse]] || Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] vom physischen Modul zum logischen Modul zwecks der Verarbeitung.<br />
|-<br />
| [[#X_Write|X_Write]]|| Zustellen von Daten via [[DevelopmentModuleAPI#Dispatch|IOWrite()]] vom logischen zum physischen Modul um diese an die Hardware weiterzureichen.<br />
|-<br />
| [[#X_Fingerprint|X_Fingerprint]] || Rückgabe eines "Fingerabdrucks" einer Nachricht. Dient der Erkennung von Duplikaten im Rahmen von [[DevelopmentModuleAPI#Dispatch|Dispatch()]]. Kann im physischen, als auch logischen Modul benutzt werden.<br />
|}<br />
<br />
Für das zweistufige Modulkonzept muss in einem logischen Modul eine [[#X_Parse|Parse]]-Funktion im Modul-Hash registriert werden. In einem physikalischen Modul muss eine [[#X_Write|Write]]-Funktion registriert sein. Diese dienen dem Datenaustausch in beide Richtungen und werden von dem jeweils anderen Modul indirekt aufgerufen.<br />
<br />
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:<br />
<br />
<syntaxhighlight lang="perl"><br />
$hash->{ParseFn} = "X_Parse";<br />
$hash->{WriteFn} = "X_Write";<br />
$hash->{FingerprintFn} = "X_Fingerprint";<br />
</syntaxhighlight><br />
<br />
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.<br />
<br />
==== X_Parse ====<br />
{{Randnotiz|RNTyp=Info|RNText=<font color="red"><u>'''ACHTUNG''':</u></font><br />
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen "X" ein '''logisches Modul''' im Sinne des zweistufigen Modulkonzepts ist, also Daten mit einem übergeordneten, physikalischen Modul austauscht.}}<br />
<syntaxhighlight lang="perl"><br />
sub X_Parse ($$)<br />
{<br />
my ( $io_hash, $message) = @_;<br />
<br />
...<br />
<br />
return $found;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Funktion X_Parse wird aufgerufen, sobald von dem IO-Gerät <code>$io_hash</code> eine Nachricht <code>$message</code> via [[DevelopmentModuleAPI#Dispatch|Dispatch()]] zur Verarbeitung angefragt wird. Die Parse-Funktion muss dann prüfen, zu welcher Gerätedefinition diese Nachricht gehört und diese entsprechend verarbeiten.<br />
<br />
Üblicherweise enthält eine Nachricht immer eine Komponente durch welche sich die Nachricht einem Gerät zuordnen lässt (z.B. Adresse, ID-Nummer, ...). Eine solche Identifikation sollte man im Rahmen der [[#X_Define|Define]]-Funktion im logischen Modul an geeigneter Stelle speichern, um in der Parse-Funktion eine einfache Zuordnung von Adresse/ID einer Nachricht zur entsprechenden Gerätedefinition zu haben. Dazu wird in der Regel im Modul-Hash im modulspezifischen Bereich eine Liste <code>defptr</code> (Definition Pointer) geführt, welche jede eindeutige Adresse/ID dem entsprechenden Geräte-Hash zuordnet:<br />
<br />
<syntaxhighlight lang="perl"><br />
<br />
sub X_Define ($$)<br />
{<br />
my ( $hash, $def) = @_;<br />
my @a = split("[ \t][ \t]*", $def);<br />
my $name = $a[0];<br />
<br />
...<br />
<br />
# erstes Argument ist die eindeutige Geräteadresse<br />
my $address = $a[1];<br />
<br />
# Adresse rückwärts dem Hash zuordnen (für ParseFn)<br />
$modules{X}{defptr}{$address} = $hash;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Auf Basis dieses Definition Pointers kann die Parse-Funktion nun sehr einfach prüfen, ob für die empfangene Nachricht bereits eine entsprechende Gerätedefinition existiert. Sofern diese existiert, kann die Nachricht entsprechend verarbeitet werden. Sollte jedoch keine passende Gerätedefinition zu der empfangenen Nachricht existieren, so muss die Parse-Funktion den Gerätenamen "UNDEFINED" zusammen mit den Argumenten für einen <code>define</code>-Befehl zurückgeben, welcher ein passendes Gerät in FHEM anlegen würde (durch [[autocreate]]).<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
<br />
sub X_Parse ($$)<br />
{<br />
my ( $io_hash, $message) = @_;<br />
<br />
# Die Stellen 10-15 enthalten die eindeutige Identifikation des Geräts<br />
my $address = substr($message, 10, 5); <br />
<br />
# wenn bereits eine Gerätedefinition existiert (via Definition Pointer aus Define-Funktion)<br />
if(my $hash = $modules{X}{defptr}{$address}) <br />
{<br />
... # Nachricht für $hash verarbeiten<br />
<br />
# Rückgabe des Gerätenamens, für welches die Nachricht bestimmt ist.<br />
return $hash->{NAME}; <br />
}<br />
else<br />
{<br />
# Keine Gerätedefinition verfügbar<br />
# Daher Vorschlag define-Befehl: <NAME> <MODULNAME> <ADDRESSE><br />
return "UNDEFINED X_".$address." X $address";<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Write ====<br />
{{Randnotiz|RNTyp=Info|RNText=<font color="red"><u>'''ACHTUNG''':</u></font><br />
Dieser Abschnitt geht davon aus, dass das Modul mit dem Namen "X" ein '''physisches Modul''' im Sinne des zweistufigen Modulkonzepts ist, also Daten mit untergeordneten logischen Modulen austauscht. }}<br />
<syntaxhighlight lang="perl"><br />
sub X_Write ($$)<br />
{<br />
my ( $hash, @arguments) = @_;<br />
<br />
...<br />
<br />
return $return;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Write-Funktion wird durch die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] aufgerufen, sobald eine logische Gerätedefinition Daten per IO-Gerät an die Hardware übertragen möchte. Dazu kümmert sich die Write-Funktion um die Übertragung der Nachricht in geeigneter Form an die verbundene Hardware. Als Argumente wird der Hash des physischen Gerätes übertragen, sowie alle weiteren Argumente, die das logische Modul beim Aufruf von IOWrite() mitgegeben hat. Im Normalfall ist das ein Skalar mit der zu sendenden Nachricht in Textform. Es kann aber auch sein, dass weitere Daten zum Versand notwendig sind (evtl. Schlüssel, Session-Key, ...). Daher ist die Parametersyntax einer zu schreibenden Nachricht via IOWrite-/Write-Funktion zwischen logischem und physikalischem Modul abzustimmen.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Write ($$)<br />
{<br />
my ( $hash, $message, $address) = @_;<br />
<br />
DevIo_SimpleWrite($hash, $address.$message, 2);<br />
<br />
return undef;<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Fingerprint ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Fingerprint($$)<br />
{<br />
my ( $io_name, $msg ) = @_;<br />
<br />
...<br />
<br />
return ( $io_name, $fingerprint );<br />
}<br />
</syntaxhighlight><br />
<br />
Die Fingerprint-Funktion dient der Erkennung von Duplikaten empfangener Nachrichten. Diese Funktion kann dabei sowohl im physischen, als auch im logischen Modul implementiert sein - je nachdem auf welcher Ebene man für eine Nachricht einen Fingerprint bilden kann. <br />
<br />
Als Parameter wird der Name des IO-Geräts <code>$io_name</code> übergeben, sowie die Nachricht <code>$msg</code>, welche empfangen wurde. Nun muss aus dieser Nachricht ein eindeutiger Fingerprint gebildet werden. Dies bedeutet, dass alle variablen Inhalte, die aufgrund des Empfangs dieser Nachricht über unterschiedliche IO-Geräte enthalten sein können, entfernt werden müssen. Dies können bspw. Empfangsadressen von IO-Geräten sein oder Session-ID's die in der Nachricht enthalten sind. Alle Fingerprints sämtlicher Nachrichten, die innerhalb der letzten 500 Millisekunden (konfigurierbar via <code>global</code> Attribut <code>dupTimeout</code>) empfangen wurden, werden gegen diesen generierten Fingerprint getestet. Sollte innerhalb dieser Zeit bereits eine Nachricht mit diesem Fingerprint verarbeitet worden sein, so wird sie als Duplikat erkannt und nicht weiter verarbeitet. In diesem Fall gibt [[DevelopmentModuleAPI#Dispatch|Dispatch()]] den Namen der Gerätedefinition zurück, welche eine Nachricht mit dem selben Fingerprint bereits verarbeitet hat. Es erfolgt dann kein Aufruf der [[#X_Parse|Parse]]-Funktion.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Fingerprint($$)<br />
{<br />
my ( $io_name, $msg ) = @_;<br />
<br />
substr( $msg, 2, 2, "--" ); # entferne Empfangsadresse<br />
substr( $msg, 4, 1, "-" ); # entferne Hop-Count<br />
<br />
return ( $io_name, $msg );<br />
}<br />
</syntaxhighlight><br />
<br />
Es wird zuerst, sofern implementiert, die Fingerprint-Funktion des physischen Moduls aufgerufen. Sollte sich hierdurch kein Duplikat erkennen lassen, wird die Fingerprint-Funktion jedes möglichen geladenen logischen Moduls aufgerufen, sofern implementiert. <br />
<br />
Sollte sowohl im physischen, als auch im logischen Modul keine Fingerprint-Funktion implementiert sein, so wird keinerlei Duplikatserkennung durchgeführt.<br />
<br />
=== FHEMWEB-spezifische Funktionen ===<br />
<br />
FHEMWEB bietet Modul-Autoren die Möglichkeit an durch spezielle Funktionsaufrufe in Modulen, eigene HTML-Inhalte zu verwenden. Dadurch können in Verbindung mit zusätzlichem JavaScript komplexe Dialoge/Inhalte/Steuermöglichkeiten dargestellt werden. <br />
<br />
Eine genaue Auflistung aller FHEMWEB-spezifischen Funktionsaufrufe gibt es in dem separaten Artikel [[DevelopmentFHEMWEB]]<br />
<br />
=== sonstige Funktionen ===<br />
<br />
In diesem Abschnitt werden weitere Funktionen behandelt die zum Teil aus FHEM, aber auch aus anderen Modulen aufgerufen werden. Sie sind dabei nur in speziellen Anwendungsfällen relevant. Hier eine Auflistung aller sonstigen Modulfunktionen:<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Funktionsname !! class="unsortable" | Kurzbeschreibung<br />
|-<br />
| [[#X_DbLog_split|X_DbLog_split]] || Wird durch das Modul 93_DbLog.pm aufgerufen. Dient dem korrekten Split eines moduleigenen Events in Name/Wert/Einheit für die Nutzung einer Datenbank.<br />
|-<br />
| [[#X_Except|X_Except]]|| Wird aufgerufen, sobald ein ein geöffneter Filedescriptor in [[#Wichtige_globale_Variablen_aus_fhem.pl|<code>%selectlist</code>]], der unter <code>$hash->{EXCEPT_FD}</code> im Geräte-Hash gesetzt ist, einen Interrupt bzw. Exception auslöst.<br />
|-<br />
| [[#X_Copy|X_Copy]]|| Wird durch das Modul 98_copy.pm aufgerufen im Rahmen des <code>copy</code>-Befehls sobald ein Gerät kopiert wurde.<br />
|-<br />
| [[#X_State|X_State]]|| Wird aufgerufen im Rahmen des <code>setstate</code>-Befehls bevor der Status einer Gerätedefinition bzw. eines zugehörigen Readings gesetzt wird.<br />
|-<br />
| [[#X_AsyncOutput|X_AsyncOutput]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht die asynchrone Ausgabe von Daten via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an einen einzelnen verbundenen Client.<br />
|-<br />
| [[#X_ActivateInform|X_ActivateInform]]|| Nur relevant für Module die via [[TcpServerUtils]] eine Client-Verbindung zu FHEM ermöglichen (z.B. FHEMWEB und telnet). Ermöglicht das Aktivieren des inform-Mechanismus zum Senden von Events für einen einzelnen verbundenen Client.<br />
|-<br />
| [[#X_Authorize|X_Authorize]]|| Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authorized|Authorized()]] um eine gewünschte Vorgangs-Art zu autorisieren.<br />
|-<br />
| [[#X_Authenticate|X_Authenticate]]|| Wird aufgerufen im Rahmen von [[DevelopmentModuleAPI#Authenticate|Authenticate()]] um eine Authentifizierung zu prüfen und ggf. zu genehmigen.<br />
|}<br />
<br />
In der [[#X_Initialize|Initialize]]-Funktion werden diese wie folgt definiert:<br />
<br />
<syntaxhighlight lang="perl"><br />
$hash->{DbLog_splitFn} = "X_DbLog_split";<br />
$hash->{ExceptFn} = "X_Except";<br />
$hash->{CopyFn} = "X_Copy";<br />
$hash->{AsyncOutputFn} = "X_AsyncOutput";<br />
$hash->{ActivateInformFn} = "X_ActivateInform";<br />
$hash->{StateFn} = "X_State";<br />
$hash->{AuthorizeFn} = "X_Authorize";<br />
$hash->{AuthenticateFn} = "X_Authenticate";<br />
</syntaxhighlight><br />
<br />
<br />
Diese Funktionen werden in diesem Abschnitt genauer beschrieben.<br />
==== X_DbLog_split ====<br />
<syntaxhighlight lang="perl"><br />
sub X_DbLog_split ($$)<br />
{<br />
my ( $event, $device_name ) = @_;<br />
<br />
...<br />
<br />
return ( $reading, $value, $unit );<br />
}<br />
</syntaxhighlight><br />
<br />
Die DbLog_split-Funktion wird durch das Modul [[DbLog]] aufgerufen, sofern der Nutzer DbLog benutzt. Sofern diese Funktion implementiert ist, kann der Modul-Autor das Auftrennen von Events in den Reading-Namen, -Wert und der Einheit selbst steuern. Andernfalls nimmt DbLog diese Auftrennung selber mittels Trennung durch Leerzeichen sowie vordefinierten Regeln zu verschiedenen Modulen vor. Je nachdem, welche Readings man in seinem Modul implementiert, passt diese standardmäßige Trennung jedoch nicht immer.<br />
<br />
Der Funktion werden folgende Eingangsparameter übergeben:<br />
# Das generierte Event (Bsp: <code>temperature: 20.5 °C</code>)<br />
# Der Name des Geräts, welche das Event erzeugt hat (Bsp: <code>Temperatursensor_Wohnzimmer</code>)<br />
<br />
Es ist nicht möglich in der DbLog_split-Funktion auf die verarbeitende DbLog-Definition zu referenzieren.<br />
<br />
Als Rückgabewerte muss die Funktion folgende Werte bereitstellen:<br />
# Name des Readings (Bsp: <code>temperature</code>)<br />
# Wert des Readings (Bsp: <code>20.5</code>)<br />
# Einheit des Readings (Bsp: <code>°C</code>)<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
sub X_DbLog_splitFn($$)<br />
{<br />
my ($event, $device) = @_;<br />
my ($reading, $value, $unit);<br />
my $devhash = $defs{$device}<br />
<br />
if($event =~ m/temperature/) {<br />
$reading = 'temperature';<br />
$value = substr($event,12,4);<br />
$unit = '°C';<br />
} <br />
<br />
return ($reading, $value, $unit);<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Except ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Except ($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Die X_Except-Funktion wird durch fhem.pl aufgerufen, wenn die Gerätedefinition <code>$hash</code> in <code>[[#Wichtige_globale_Variablen_aus_fhem.pl|%selectlist]]</code> aufgeführt ist und der Filedeskriptor in <code>$hash->{EXCEPT_FD}</code> eine Exception bzw. Interrupt auslöst. <br />
<br />
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
use IO::File;<br />
<br />
...<br />
<br />
sub X_Except ($)<br />
{<br />
my ( $hash ) = @_;<br />
<br />
# Filehandle aus Filedescriptor erstellen<br />
my $filehandle = IO::File->new_from_fd($hash->{EXCEPT_FD}, 'r');<br />
seek($filehandle,0,0); <br />
<br />
# aktuellen Inhalt auslesen<br />
my $current_value = $filehandle->getline;<br />
<br />
if($current_value eq "1")<br />
{<br />
...<br />
}<br />
else<br />
{<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Copy ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Copy ($)<br />
{<br />
my ( $old_name, $new_name ) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Die X_Copy-Funktion wird durch das Modul [[copy]] aufgerufen nachdem ein Nutzer eine Gerätedefinition über den Befehl <code>copy</code> kopiert hat. Dazu werden als Funktionsparameter die Definitionsnamen der alten und neuen Gerätedefinition übergeben. Es dient dazu zusätzliche Daten aus der zu kopierenden Gerätedefinition in die neue Definition zu übernehmen. Der Befehl <code>copy</code> überträgt lediglich <code>$hash->{DEF}</code> in die neue Definition sowie sämtliche gesetzte Attribute. Weitere Daten müssen dann durch die X_Copy-Funktion übertragen werden. <br />
<br />
Die X_Copy-Funktion wird erst nach dem erfolgtem Kopiervorgang aufgerufen.<br />
<br />
Der Rückgabewert wird nicht ausgewertet und ist daher irrelevant.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
<br />
sub X_Copy ($$)<br />
{<br />
my ( $old_name, $new_name ) = @_;<br />
<br />
my $old_hash = $defs{$old_name};<br />
my $new_hash = $defs{$new_name};<br />
<br />
# copy also temporary session key<br />
$new_hash->{helper}{SESSION_KEY} = $old_hash->{helper}{SESSION_KEY};<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_AsyncOutput ====<br />
{{Randnotiz|RNTyp=Info|RNText='''ACHTUNG:''' Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}<br />
<syntaxhighlight lang="perl"><br />
sub X_AsyncOutput ($)<br />
{<br />
my ( $client_hash, $text ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Funktion X_AsyncOutput wird durch [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] von anderen Modulen aufgerufen. Es erlaubt diesen anderen Modulen die Ausgabe von asynchronen Befehlsergebnissen <code>$text</code> zuvor ausgeführter set-/get-Befehle an den entsprechenden Client (identifiziert durch den Client-Hash <code>$client_hash</code> der temporären Definition) zurückzugeben. <br />
<br />
Wenn ein Client einen set-/get-Befehl ausführt, wird der Client-Hash bei der Ausführung dieser Befehle an die jeweiligen Module übermittelt. Sobald ein Befehl ausgeführt wird, der seine Ausgabe asynchron ausführen möchte und die Client-Verbindung des Server-Moduls dies unterstützt (<code>$client_hash->{canAsyncOutput}</code> ist gesetzt), merkt sich das befehlsausführende Modul den Client-Hash und gibt das Ergebnis des Befehls zu späterer Zeit via [[DevelopmentModuleAPI#asyncOutput|asyncOutput()]] an den ursprünglichen Client zurück. Die Funktion X_AsyncOutput des Server-Moduls kümmert sich darum das Ergebnis dem entsprechenden Client in der notwendigen Form zuzustellen.<br />
<br />
Der Rückgabewert von X_AsyncOutput() wird als Rückgabewert für asyncOutput() verwendet. Man kann hier im Fehlerfall eine Fehlermeldung angeben und im Erfolgsfall <code>undef</code>. Der Rückgabewert wird aber aktuell nicht ausgewertet.<br />
<br />
==== X_ActivateInform====<br />
{{Randnotiz|RNTyp=Info|RNText='''ACHTUNG:''' Diese Funktion ist nur relevant, wenn man ein Frontend-Modul erstellt über das FHEM von einem Anwender bedient werden kann (FHEMWEB, telnet, yowsup, telegram, alexa-fhem, homebridge-fhem, tabletui, ...).}}<br />
<syntaxhighlight lang="perl"><br />
sub X_ActivateInform($$)<br />
{<br />
my ( $client_hash, $arg ) = @_;<br />
<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Funktion X_ActivateInform wird aktuell nur durch den [[update]]-Befehl aufgerufen, sofern ein Client eines Frontend-Moduls diesen Befehl aufgerufen hat um den Inform-Mechanismus (Senden von Events) zu aktivieren. Dadurch wird im Falle von [[update]] die umgehende Anzeige der Logmeldungen für den ausführenden Client aktiviert. In [[FHEMWEB]] geschieht das über den Event-Monitor, bei telnet mit der direkten Ausgabe.<br />
<br />
Da diese Funktion aktuell nur speziell für den update-Befehl implementiert ist, kann man aktuell keine genaue Angaben zu den möglichen Werten von <code>$arg</code> geben. Dieser Parameter dient dazu genauer zu spezifizieren was exakt an Events an den entsprechenden Client <code>$client_hash</code> zu senden ist. Aktuell wird dazu die Parametersyntax des inform-Befehls verwendet (on|off|log|raw|timer|status).<br />
<br />
==== X_State ====<br />
<syntaxhighlight lang="perl"><br />
sub X_State($$$$)<br />
{<br />
my ( $hash, $time, $readingName, $value ) = @_;<br />
<br />
...<br />
<br />
return $error;<br />
}<br />
</syntaxhighlight><br />
<br />
Die X_State-Funktion wird durch fhem.pl aufgerufen, sobald über den Befehl <code>setstate</code> versucht wird ein Wert für ein Reading oder den Status (<code>$hash->{STATE}</code>) einer Gerätedefinition zu setzen. Dieser Befehl wird primär beim Starten von FHEM aufgerufen sobald das State-File eingelesen wird. Je nachdem, ob im gegebenen Fall ein Reading oder der Definitionsstatus gesetzt wird, haben die Übergabeparameter verschiedene Werte:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Funktionsparameter!! Wert beim Setzen eines Readings !! Wert beim Setzen eines Definitionsstatus<br />
|-<br />
| <code>$hash</code> || colspan="2" align="center" | Die Hashreferenz der betreffenden Gerätedefinition<br />
|-<br />
| <code>$time</code>|| Der Zeitstempel auf welchen das Reading <code>$readingName</code> gesetzt werden soll. Das Ergebnis entspricht dem Rückgabewert der Funktion || Der aktuelle Zeitstempel zum jetzigen Zeitpunkt.<br />
|-<br />
| <code>$readingName</code>|| Der Name des Readings, welches auf einen neuen Wert gesetzt werden soll. || Statischer Wert "STATE" um anzuzeigen, dass es sich um den Definitionsstatus handelt, welcher gesetzt werden soll (<code>$hash->{STATE}</code>).<br />
|-<br />
| <code>$value</code> || Den Wert, welchen das Reading <code>$readingName</code> annehmen soll. || Den Wert, welchen die Gerätedefinition als Status annehmen soll.<br />
|}<br />
<br />
Wenn via <code>setstate</code> ein Reading gesetzt wird, kann die X_State-Funktion das Setzen dieses Readings durch die Rückgabe einer aussagekräftigen Fehlermeldung unterbinden. Sofern <code>undef</code> zurückgegeben wird, wird das entsprechende Reading auf den übergebenen Status gesetzt.<br />
<br />
Wenn via <code>setstate</code> der Definitionsstatus gesetzt wird, wird die X_State-Funktion erst nach dem Setzen des Status aufgerufen. Man kann dabei zwar eine Fehlermeldung zurückgeben, der Status wird aber dennoch übernommen. Die Fehlermeldung wird lediglich dem Nutzer angezeigt.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_State($$$$)<br />
{<br />
my ( $hash, $time, $readingName, $value ) = @_;<br />
<br />
return undef if($readingName "STATE" || $value ne "inactive");<br />
readingsSingleUpdate($hash, "state", "inactive", 1);<br />
return undef;<br />
}<br />
</syntaxhighlight><br />
<br />
==== X_Authorize ====<br />
<syntaxhighlight lang="perl"><br />
sub X_Authorize($$$$)<br />
{<br />
my ( $hash, $client_hash, $type, $arg ) = @_;<br />
<br />
...<br />
<br />
return $authorized;<br />
}<br />
</syntaxhighlight><br />
<br />
Die Authorize-Funktion wird von fhem.pl aufgerufen um zu erfragen, ob ein bestimmter Client <code>$client_hash</code> die Aktion <code>$type</code>/<code>$arg</code> ausführen darf. Auf diese Weise können Module Einfluss nehmen, welcher User welche Funktionen in FHEM nutzen darf. Wenn ein Client eine Aktion ausführen möchte, werden alle Module, die eine Authorize-Funktion implementiert haben, gefragt, ob diese Aktion ausgeführt werden darf. Als Rückgabewert wird das Ergebnis der Überprüfung zurückgegeben, wobei <code>0</code> (unbekannt / nicht zuständig), <code>1</code> (erlaubt) oder <code>2</code> (verboten) zurückgegeben werden können.<br />
<br />
Es gibt aktuell folgende <code>$type</code>/<code>$arg</code> Kombinationen, mit denen die Authorize-Funktion aufgerufen werden:<br />
<br />
{| class="wikitable"<br />
|-<br />
! $type !! $arg !! Überschrift<br />
|- <br />
| rowspan="3" style="white-space: nowrap;" | <code>'''$type''' = "cmd"</code><br />
<br />
<br />
''Befehlsausführung''<br />
| style="white-space: nowrap;" | <code>'''$arg''' = "set Lampe on"</code> || Jeglicher FHEM-Befehl, der ausgeführt werden soll, wird in <code>$arg</code> hinterlegt, sodass innerhalb einer Authorize-Funktion der Befehl genauer geparst werden kann um zu entscheiden, ob dieser Befehl erlaubt ist, oder nicht.<br />
|-<br />
| style="white-space: nowrap;" | <code>'''$arg''' = "perl"</code> || Ausführen von Perl-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.<br />
<br />
Bsp: <code>{ReadingsVal("Lampe", "state", "off"}</code><br />
|-<br />
| style="white-space: nowrap;" | <code>'''$arg''' = "shell"</code> || Ausführen von Shell-Befehlen jeglicher Art. Der genaue Befehl wird dabei nicht an die Authorize-Funktion übergeben.<br />
<br />
Bsp: <code>"/opt/fhem/myScript.sh"</code><br />
|-<br />
| style="white-space: nowrap;" | <code>'''$type''' = "devicename"</code><br />
<br />
<br />
''Sichtbarkeit von Geräten/Definitionen'' <br />
| style="white-space: nowrap;" | <code>'''$arg''' = "Licht_Wohnzimmer"</code> || Sichtbarkeit des jeweiligen Gerät/Definition in FHEM. Dies bedeutet konkret die Auffindbarkeit im <code>list</code>-Befehl, sowie der Suche via [[DevelopmentModuleAPI#devspec2array|devspec2array()]]. Wird eine solche Anfrage durch die Authorize-Funktion abgelehnt, ist das entsprechende Gerät bzw. Definition für den jeweiligen Client nicht sichtbar.<br />
|}<br />
<br />
==== X_Authenticate ====<br />
{{Link2Forum|Topic=72757|Message=644098}}<br />
<br />
== Bereitstellen eines eigenen Befehls (Befehlsmodul) ==<br />
<br />
Ein Modul kann primär einen neuen FHEM-Befehl bereitstellen. Man spricht in so einem Fall nicht von einem Gerätemodul, sondern einem Befehlsmodul. Ein solches Befehlsmodul stellt nur einen einzelnen Befehl bereit, der dem Modulnamen entsprechen muss. Nur, wenn der Modulname dem Befehlsname entspricht, kann FHEM das Modul beim ersten Ausführen dieses unbekannten Befehls finden und nachladen.<br />
<br />
Der entsprechende Befehl wird dazu in der [[#X_Initialize|Initialize]]-Funktion im globalen Hash <code>[[DevelopmentModuleIntro#Wichtige_globale_Variablen_aus_fhem.pl|%cmds]]</code> registriert:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($$) {<br />
<br />
$cmds{X} = { Fn => "CommandX",<br />
Hlp => "<argument1> [optional_argument2], print something very useful",<br />
<br />
# optionaler Filter für Clientmodule als regulärer Ausdruck<br />
ClientFilter => "FHEMWEB"<br />
};<br />
}<br />
</syntaxhighlight><br />
<br />
Damit wird der neue Befehl <code>X</code> in FHEM registriert. Die Funktion mit dem Namen <code>CommandX</code> setzt diesen Befehl innerhalb des Moduls um. Desweiteren wird eine kurze Aufrufsyntax mitgegeben, welche beim Aufruf des <code>help</code>-Befehls dem Nutzer angezeigt wird um als Gedankenstütze zu dienen. Optional kann man mittels <code>ClientFilter</code> (regulärer Ausdruck für Modulnamen) die Ausführbarkeit nur auf bestimmte Client-Module (wie FHEMWEB oder telnet) beschränken. <br />
<br />
Nun muss noch die Funktion <code>CommandX</code> im Rahmen des Moduls implementiert werden, welche den Befehl <code>X</code> umsetzt:<br />
<br />
<syntaxhighlight lang="Perl"><br />
sub CommandX($$)<br />
{<br />
my ($client_hash, $arguments) = @_;<br />
<br />
...<br />
<br />
return $output;<br />
}<br />
</syntaxhighlight><br />
<br />
Dabei werden der Befehlsfunktion zwei Parameter übergeben. Zuerst die Hash-Referenz des aufrufenden Clients (sofern manuell ausgeführt, ansonsten <code>undef</code>) zwecks Rechteprüfung via [[allowed|allowed-Definitionen]]. Anschließend folgen die Aufrufparameter als zusammenhängende Zeichenkette. Die Trennung der einzelnen Argumente obligt der Funktion (bspw. via [[DevelopmentModuleAPI#parseParams|parseParams()]]). Als Funktionsrückgabewert wird eine Ausgabemeldung erwartet, die dem Nutzer angezeigt werden soll.<br />
<br />
== Pollen von Geräten ==<br />
Wenn Geräte von sich aus keine Informationen senden sondern abgefragt werden müssen, kann man im Modul die Funktion [[DevelopmentModuleAPI#InternalTimer|InternalTimer()]] verwenden um einen Funktionsaufruf zu einem späteren Zeitpunkt durchführen zu können. Man übergibt dabei den Zeitpunkt für den nächsten Aufruf, den Namen der Funktion, die aufgerufen werden soll, sowie den zu übergebenden Parameter. Als zu übergebender Parameter wird üblicherweise der Hash der betroffenen Geräteinstanz verwendet. Damit hat die aufgerufene Funktion Zugriff auf alle wichtigen Daten der Geräteinstanz. Eventuell zusätzlich benötigte Werte können einfach als weitere Internals über den Hash zugänglich gemacht werden.<br />
<br />
Beispielsweise könnte man für das Abfragen eines Geräts in der [[#X_Define|Define]]-Funktion den Timer folgendermaßen setzen:<br />
<br />
<syntaxhighlight lang="perl"><br />
InternalTimer(gettimeofday()+2, "X_GetUpdate", $hash); <br />
</syntaxhighlight><br />
<br />
Alternativ kann man auch in der [[#X_Notify|Notify]]-Funktion auf das Event <code>global:INITIALIZED</code> bzw. <code>global:REREADCFG</code> reagieren und erst dort, den Timer anstoßen, sobald die Konfiguration komplett eingelesen wurde. Dies ist insbesondere notwendig, wenn man sicherstellen will, dass alle Attribute aus der Konfiguration gesetzt sind, sobald man einen Status-Update initiiert.<br />
<br />
In der Funktion <code>X_GetUpdate</code> selbst wird dann der Timer neu gesetzt, so dass nach einem Intervall die Funktion erneut aufgerufen wird:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_GetUpdate($)<br />
{<br />
my ($hash) = @_;<br />
my $name = $hash->{NAME};<br />
Log3 $name, 4, "X: GetUpdate called ...";<br />
<br />
...<br />
<br />
# neuen Timer starten in einem konfigurierten Interval.<br />
InternalTimer(gettimeofday()+$hash->{Interval}, "X_GetUpdate", $hash);<br />
}<br />
</syntaxhighlight><br />
<br />
Innerhalb der Funktion kann man nun das Gerät abfragen und die abgefragten Werte in Readings speichern. Falls das Abfragen der Werte jedoch zu einer Verzögerung und damit zu einer Blockade von FHEM führen kann, ist es möglich, in der GetUpdate-Funktion nur die Aufforderung zum Senden bestimmter Daten an das angeschlossene Gerät zu senden und dann das Lesen über die oben beschriebene [[#X_Read|Read]]-Funktion zu implementieren.<br />
<br />
Eine genaue Beschreibung der Timer-Funktion gibt es [[DevelopmentModuleAPI#Timer|hier im Wiki]]<br />
<br />
== Logging / Debugging ==<br />
Um Innerhalb eines Moduls eine Log-Meldung in die FHEM-Logdatei zu schreiben, wird die Funktion [[DevelopmentModuleAPI#Log3|Log3()]] aufgerufen.<br />
<syntaxhighlight lang="perl"><br />
Log3 $name, 3, "X ($name) - Problem erkannt ...";<br />
</syntaxhighlight><br />
Eine genaue Beschreibung zu der Funktion inkl. Aufrufparameter findet man [[DevelopmentModuleAPI#Log3|hier]]. Es ist generell ratsam in der Logmeldung sowohl den Namen des eigenen Moduls zu schreiben, sowie den Namen des Geräts, welche diese Logmeldung produziert, da die Meldung, so wie sie ist, direkt in das Logfile wandert und es für User ohne diese Informationen schwierig ist, die Meldungen korrekt zuzuordnen.<br />
<br />
Die Funktion Log3() verwendet den Namen der Geräteinstanz um das <code>verbose</code>-Attribut zu prüfen. In der Regel wird bei Modulfunktionen jedoch immer nur der Gerätehash <code>$hash</code> übergeben. Um den Namen der Definition zu ermitteln ist es daher notwendig sich diesen aus dem Hash extrahieren:<br />
<br />
<syntaxhighlight lang="perl"><br />
my $name = $hash->{NAME};<br />
</syntaxhighlight><br />
<br />
Um für eine einzelne Geräteinstanz das Verbose-Level zu erhöhen, ohne gleich für das gesamte FHEM den globalen Verbose-Level zu erhöhen und damit alle Meldungen zu erzeugen, kann man den Befehl <br />
<code>attr <NAME> verbose</code> verwenden. Beispielsweise <code>attr Lichtschalter_Wohnzimmer verbose 5</code><br />
<br />
Logmeldungen sollten je nach Art und Wichtigkeit für den Nutzer in unterschiedlichen Loglevels erzeugt werden. Es gibt insgesamt 5 Stufen in denen geloggt werden kann. Standardmäßig steht der systemweite Loglevel (<code>global</code>-Attribut <code>verbose</code>) auf der Stufe 3. Die Bedeutung der jeweiligen Stufen ist in der {{Link2CmdRef|Lang=de|Anker=verbose}} beschrieben.<br />
<br />
Während der Entwicklung eines Moduls kann man für eigene Debug-Zwecke auch die Funktion [[DevelopmentModuleAPI#Debug|Debug()]] verwenden um schnell und einfach Debug-Ausgaben in das Log zu schreiben. Diese sollten in der endgültigen Fassung jedoch nicht mehr vorhanden sein. Sie dienen ausschließlich zum Debugging während der Entwicklung.<br />
<br />
Eine genaue Beschreibung der Log-Funktion gibt es [[DevelopmentModuleAPI#Logging|hier im Wiki]].<br />
<br />
== Zweistufiges Modell für Module ==<br />
[[Datei:Zweistufiges Modulkonzept.jpg|mini|rechts|Schematische Darstellung am Beispiel CUL]]<br />
Es gibt viele Geräte, welche die Kommunikation mit weiteren Geräten mit tlw. unterschiedlichen Protokollen ermöglichen. Das typischste Beispiel bietet hier der [[CUL]], welcher via Funk mit verschiedenen Protokollen weitere Geräte ansprechen kann (z.B. Aktoren, Sensoren, ...). Hier bildet ein Gerät eine Brücke durch die weitere Geräte in FHEM zugänglich gemacht werden können. Dabei werden über einen Kommunikationsweg (z.B. serielle Schnittstelle, TCP, ...) beliebig viele Geräte gesteuert. Typische Beispiele dazu sind:<br />
<br />
* [[CUL]]: stellt Geräte mit verschiedenen Kommunikationsprotokollen via Funk bereit (u.a. [[FS20]], [[HomeMatic]], [[Funk-Heizkörperregler_Kurz-Bedienungsanleitung_FHT|FHT]], [[MAX]], ...)<br />
* [[HMLAN]]: stellt HomeMatic Geräte via Funk bereit<br />
* [[MAX#MAXLAN|MAXLAN]]: stellt [[MAX|MAX!]] Geräte via Funk bereit<br />
* [[PanStamp#panStick.2FShield|panStamp]]: stellt weitere panStamp Geräte via Funk bereit<br />
<br />
Dabei wird die Kommunikation in 2 Stufen unterteilt:<br />
* physisches Modul - z.B. 00_CUL.pm - zuständig für die physikalische Kommunikation mit der Hardware. Empfangene Daten müssen einem logischen Modul zugeordnet werden.<br />
* logische Modul(e) - z.B. 10_FS20.pm - interpretiert protokollspezifische Nachrichten. Sendet protokollspezifische Daten über das physische Modul an die Hardware.<br />
<br />
<u>physisches Modul</u><br />
<br />
Das physische Modul öffnet die Datenverbindung zum Gerät (z.B. CUL) und verarbeitet sämtliche Daten. Es kümmert sich um den Erhalt der Verbindung (bsp. durch Keep-Alives) und konfiguriert das Gerät so, dass eine Kommunikation mit allen weiteren Geräten möglich ist (bsp. Frequenz, Modulation, Kanal, etc.).<br />
<br />
Empfangene Nutzdaten werden als Zeichenkette über die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] an logische Module weitergegeben.<br />
<br />
Das Modul stellt eine [[#Die_Match-Liste|Match-Liste]] bereit, anhand FHEM die Nachricht einem Modul zuordnen kann, sofern dieses noch nicht geladen sein sollte. Die Match-Liste enthält eine Liste von regulären Ausdrücken und ordnet diese einem Modul zu. Wenn eine Nachricht auf einen solchen regulären Ausdruck passt und das Modul noch nicht geladen ist, lädt FHEM dieses automatisch nach, zwecks Verarbeitung der Nachricht. <br />
<br />
Anhand einer bereitgestellten [[#Die_Client-Liste|Client-Liste]] (Auflistung von logischen Modulen) kann FHEM feststellen, welche logischen Module mit dem physischen Modul kommunizieren können. Nur die hier aufgelisteten, logischen Module werden beim Aufruf von [[DevelopmentModuleAPI#Dispatch|Dispatch()]] angesprochen.<br />
<br />
Das Modul stellt eine [[#X_Write|Write]]-Funktion zur Verfügung, über die logische Module Daten in beliebiger Form an die Hardware übertragen können. <br />
<br />
<u>logisches Modul</u><br />
<br />
Das logische Modul interpretiert die via Dispatch() übergebene Nachricht (Zeichenkette) durch eine bereitgestellte [[#X_Parse|Parse]]-Funktion und erzeugt entsprechende Readings/Events. Es stellt über <code>set</code>-/<code>get</code>-Kommandos Steuerungsmöglichkeiten dem Nutzer zur Verfügung.<br />
<br />
Es stellt FHEM einen [[#Der_Match-Ausdruck|Match-Ausdruck]] (regulärer Ausdruck) zur Verfügung anhand [[DevelopmentModuleAPI#Dispatch|Dispatch()]] ermitteln kann, ob die Nachricht durch das logische Modul verarbeitet werden kann. Nur Nachrichten, welche auf diesen Ausdruck passen, werden an das logische Modul weitergegeben (Aufruf [[#X_Parse|Parse]]-Funktion).<br />
<br />
=== Die Client-Liste ===<br />
<br />
Die Client-Liste ist eine Auflistung von Modulnamen (genauer: regulären Ausdrücken die auf Modulnamen passen) die in einem physischen Modul gesetzt ist. Damit wird definiert, mit welchen logischen Modulen das physikalische Modul kommunizieren kann. <br />
<br />
Eine Client-Liste ist eine Zeichenkette, welche aus allen logischen Modulnamen besteht. Die einzelnen Namen werden durch einen Doppelpunkt getrennt. Anstatt kompletter Modulnamen können auch reguläre Ausdrücke verwendet werden, die auf mehrere Modulnamen passen (z.B. <code>CUL_.*</code> um die logischen Module CUL_HM, CUL_MAX, etc. zu verwenden).<br />
<br />
Bsp.: Die Client-Liste von dem Modul CUL lautet daher wie folgt:<br />
<pre><br />
FS20:FHT.*:KS300:USF1000:BS:HMS:CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN:ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY:STACKABLE_CC:CUL_RFR:CUL_TCM97001:CUL_REDIRECT<br />
</pre><br />
Alle hier aufgelisteten Module können über das Modul CUL Daten empfangen bzw. senden.<br />
<br />
Die Client-Liste hat generell folgende Funktion:<br />
* Die Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur Module, welche in der Client-Liste enthalten sind, ob diese die Nachricht verarbeiten können (Prüfung via [[#Der Match-Ausdruck|Match-Ausdruck]])<br />
* Die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] prüft anhand sämtlicher Client-Listen in FHEM, welches IO-Gerät für ein logisches Gerät nutzbar ist.<br />
<br />
Üblicherweise wird die Client-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($)<br />
{<br />
my ($hash) = @_;<br />
...<br />
$hash->{Clients} = "FS20:KS300:FHT.*";<br />
}<br />
</syntaxhighlight><br />
<br />
Man kann die Client-Liste jedoch auch pro physikalisches Gerät setzen. Eine gesetzte Client-Liste in einem Gerät hat immer Vorrang vor der Liste im Modul-Hash. Eine gerätespezifische Client-Liste wird dann verwendet, wenn bspw. ein Gerät je nach Konfiguration nur bestimmte logische Module bedienen kann. Bspw. kann ein CUL je nach RF-Einstellungen FS20, uvm. oder nur HomeMatic bedienen. In einem solchen Fall wird die Client-Liste im Geräte-Hash gesetzt:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$)<br />
{<br />
my ( $hash, $def ) = @_;<br />
...<br />
$hash->{Clients} = "CUL_HM";<br />
<br />
# ggf.<br />
$hash->{ClientsKeepOrder} = 1<br />
}<br />
</syntaxhighlight><br />
<br />
In vielen Modulen, welche nach dem zweistufigem Konzept arbeiten, beginnt und endet die Client-Liste mit einem Doppelpunkt. Dies ist ein historisches Überbleibsel, da der Prüfmechanismus die Client-Liste früher auf das Vorhandensein von <code>'''<u><font color="red">:</font></u>'''&lt;Modulname&gt;'''<u><font color="red">:</font></u>'''</code> prüfte. Dies ist nun nicht mehr notwendig. Die einzelnen Modulnamen müssen lediglich durch einen Doppelpunkt getrennt werden.<br />
<br />
Wird das Internal "ClientsKeepOrder" auf 1 gesetzt, können in "Clients" keine regulären Ausdrücke mehr angegeben werden. Dies hat einen erheblichen Einfluss, auf die Verarbeitungsdauer und sollte in Betracht gezogen werden.<br />
<br />
=== Die Match-Liste ===<br />
{{Randnotiz|RNTyp=Info|RNText=<font color="red"><u>'''ACHTUNG''':</u></font><br />
Sämtliche regulären Ausdrücke in der Match-Liste werden "case insensitive" überprüft. Das bedeutet, dass Groß-/Kleinschreibung nicht berücksichtigt wird.<br />
<br />
Um dennoch in einem regulären Ausdruck auf Groß-/Kleinschreibung zu prüfen, kann man dieses mit dem Modifizierer <code>(?-i)</code> wieder aktivieren:<br />
<br />
<syntaxhighlight lang="perl"><br />
my %matchListFHEMduino = (<br />
....<br />
"5:FHEMduino_PT2262" => "^(?-i)IR.*\$",<br />
....<br />
"13:IT" => "^(?-i)i......\$",<br />
);<br />
</syntaxhighlight><br />
<br />
Siehe dazu Forumsbeitrag: {{Link2Forum|Topic=33422}}<br />
}}<br />
Die Match-Liste ordnet eine Nachrichtensyntax (regulärer Ausdruck) einem Modulnamen zu und wird in einem physikalischen Modul gesetzt. Sollte eine Nachricht vom physikalischen Gerät empfangen werden, die durch kein geladenes Modul verarbeitet werden kann ([[DevelopmentModuleAPI#Dispatch|Dispatch()]] prüft nur alle bisher geladenen Module aus der [[#Die Client-Liste|Client-Liste]]), so wird über die Match-Liste geprüft, welches Modul diese Nachricht verarbeiten kann. Dieses Modul wird anschließend geladen und die Nachricht durch dieses direkt durch Aufruf der [[#X_Parse|Parse]]-Funktion verarbeitet. In dieser Liste findet mittels regulärem Ausdruck eine Zuordnung der Nachrichtenstruktur zum verarbeitenden logischen Modul statt.<br />
<br />
Diese Liste wird ausschließlich in der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion verwendet. Sollte keine passendes Modul, welches bereits geladen ist, zur Verarbeitung einer Nachricht gefunden werden, so wird mithilfe der Match-Liste aufgrund der vorliegenden Nachricht das entsprechende Modul ermittelt. Dieses Modul wird dann direkt geladen und die Nachricht wird via [[#X_Parse|Parse]]-Funktion verarbeitet.<br />
<br />
Die Match-Liste ist eine Zuordnung von einem Sortierpräfix + Modulname zu einem regulären Ausdruck:<br />
<br />
<syntaxhighlight lang="perl"><br />
{<br />
"1:FS20" => "^81..(04|0c)..0101a001",<br />
"2:KS300" => "^810d04..4027a001",<br />
"3:FHT" => "^81..(04|09|0d)..(0909a001|83098301|c409c401).."<br />
}<br />
</syntaxhighlight><br />
<br />
Das Sortierpräfix (<code><u>1:</u><font color="grey">FS20</font></code>) dient als Sortierhilfe um so die Reihenfolge der Prüfung festzulegen. Bei der Prüfung wird die Match-Liste mittels sort() nach dem Schlüssel (Sortierpräfix + Modulname) sortiert und die regulären Ausdrücke werden dann nacheinander getestet. Daher sollten die präzisesten Ausdrücke immer zuerst getestet werden, sofern es weniger präzise Ausdrücke in der Match-Liste gibt. Dabei ist zu beachten, dass der Sortierpräfix nicht nach numerischen Regeln sortiert wird, sondern zeichenbasierend.<br />
<br />
Üblicherweise wird die Match-Liste in der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($)<br />
{<br />
my ($hash) = @_;<br />
<br />
...<br />
<br />
$hash->{MatchList} = { "1:FS20" => "^81..(04|0c)..0101a001",<br />
"2:KS300" => "^810d04..4027a001",<br />
"3:FHT" => "^81..(04|09|0d)..(0909a001|83098301|c409c401).." };<br />
}<br />
</syntaxhighlight><br />
<br />
Man kann die Match-Liste, ähnlich wie bei der Client-Liste, auch pro physikalisches Gerät setzen. Dabei hat auch hier die Match-Liste eines Gerätes immer Vorrang vor der Match-Liste aus dem Modul-Hash:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Define($$)<br />
{<br />
my ($hash, $def) = @_;<br />
<br />
...<br />
<br />
$hash->{MatchList} = { "1:CUL_HM" => "^A...................." };<br />
}<br />
</syntaxhighlight><br />
<br />
=== Der Match-Ausdruck ===<br />
<br />
Ein Match-Ausdruck wird in einem logischen Modul gesetzt und dient der Prüfung, ob eine Nachricht durch das eigene Modul via [[#X_Parse|Parse]]-Funktion verarbeitet werden kann. Es handelt sich hierbei um einen einzelnen regulären Ausdruck, den FHEM innerhalb der [[DevelopmentModuleAPI#Dispatch|Dispatch()]]-Funktion prüft. Nur wenn eine Nachricht via Dispatch() auf diesen Audruck matcht, wird die Parse-Funktion des eigenen Moduls aufgerufen um die Nachricht zu verarbeiten. <br />
<br />
Der Hintergrund, warum man den Aufruf mit einem solchen Ausdruck vorher abprüft, liegt in der Möglichkeit, dass ein physikalisches Modul mehrere unterschiedliche logische Module ansprechen kann. So kann FHEM jedes geladene Modul durch diesen Match-Ausdruck prüfen, ob es diese Nachricht verarbeiten kann. Erst, wenn alle geladenen Module, aufgrund einer Prüfung des Ausdrucks, die Nachricht nicht verarbeiten können, wird via [[#Die_Match-Liste|Match-Liste]] ermittelt, welches Modul geladen werden muss um die Nachricht zu verarbeiten. <br />
<br />
Der Match-Ausdruck wird in der [[#X_Initialize|Initialize]]-Funktion zur Verfügung gestellt:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($)<br />
{<br />
my ($hash) = @_;<br />
<br />
...<br />
<br />
# Dieses Modul verarbeitet FS20 Nachrichten<br />
$hash->{Match} = "^81..(04|0c)..0101a001"; <br />
}<br />
</syntaxhighlight><br />
=== Die vollständige Implementierung ===<br />
<br />
Hier nun eine Zusammenfassung beim zweistufigen Modulkonzept in der jeweiligen Stufe implementiert werden muss, damit die Kommunikation funktioniert.<br />
<br />
==== physisches Modul ====<br />
<br />
Das physische Modul, welches als Kommunikationsbrücke zwischen der Hardware und logischen Modulen fungieren wird, sollte mindestens folgende Funktionen implementieren:<br />
<br />
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.<br />
* [[#X_Define|Define]]-Funktion - Zum öffnen der Datenverbindung zur Hardware (IP-Adresse/serielle Schnittstelle/...).<br />
* [[#X_Read|Read]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.<br />
* [[#X_Read|Ready]]-Funktion - Zum Wiederaufbau der Verbindung bei Verbindungsabbruch, bzw. Prüfung auf lesbare Daten bei serieller Schnittstelle unter Windows.<br />
* [[#X_Write|Write]]-Funktion - Zum Senden von Daten, welche logische Module via [[DevelopmentModuleAPI#IOWrite|IOWrite()]] an die Hardware übertragen möchten.<br />
* [[#X_Undef|Undef]]-Funktion - Schließen der Verbindung zur Hardware beim Löschen via <code>delete</code> bzw. <code>rereadcfg</code>.<br />
* [[#X_Shutdown|Shutdown]]-Funktion - Schließen der Verbindung zur Hardware beim Stopp von FHEM via <code>shutdown</code>.<br />
* [[#X_DelayedShutdown | DelayedShutdown]]-Funktion - Verzögertes beenden zum Schließen der Verbindung zur Hardware beim Stopp von FHEM via <code>shutdown</code>.<br />
<br />
<br />
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:<br />
<br />
* [[#Die_Client-Liste|Client-Liste]] - Auflistung aller logischen Module, die über dieses Modul kommunizieren können<br />
* [[#Die_Match-Liste|Match-Liste]] - Zuordnung von Nachrichtensyntax zu Modul zwecks Autoload-Funktionalität.<br />
<br />
==== logisches Modul ====<br />
<br />
Das logische Modul, bildet ein einzelnes Gerät ab, über das mit einem physikalisches Modul kommuniziert werden kann. Es sollte mindestens folgende Funktionen implementieren:<br />
<br />
* [[#X_Initialize|Initialize]]-Funktion - Zum Registrieren des Moduls in FHEM.<br />
* [[#X_Define|Define]]-Funktion - Speichern des Definition Pointers (siehe [[#X_Parse|Parse-Funktion]])<br />
* [[#X_Parse|Parse]]-Funktion - Zum Lesen von Daten, welche die Hardware übermittelt.<br />
* [[#X_Undef|Undef]]-Funktion - Löschen des Definition Pointers beim Löschen via <code>delete</code> bzw. <code>rereadcfg</code>.<br />
<br />
Desweiteren müssen in der [[#X_Initialize|Initialize]]-Funktion folgende Daten bereitgestellt werden:<br />
<br />
* [[#Der_Match-Ausdruck|Match-Ausdruck]] - Prüfausdruck, ob eine Nachricht durch dieses Modul verarbeitet werden kann.<br />
<br />
=== Kommunikation von der Hardware bis zu den logischen Modulen ===<br />
<br />
Die Gerätedefinition des physischen Moduls öffnet eine Verbindung zur Hardware (z.B. via [[DevIo]]). Die [[#X_Read|Read]]-Funktion wird bei anstehenden Daten aus der Hauptschleife von fhem.pl aufgerufen.<br />
<br />
Die Read-Funktion stellt dabei sicher, dass die Daten<br />
* komplett (in der Regel über einen internen Puffer in <code>$hash</code>) und<br />
* korrekt (z.B. via Prüfung mittels regulärem Ausdruck)<br />
sind und ruft die globale Funktion [[DevelopmentModuleAPI#Dispatch|Dispatch()]] mit einer kompletten Nachricht auf.<br />
<br />
Die Funktion Dispatch() prüft alle geladenen Module aus der [[#Die_Client-Liste|Client-Liste]] des physikalischen Moduls nach möglichen logischen Modulen zur Verarbeitung. Alle zum Zeitpunkt geladenen Module, die in der Client-Liste aufgeführt sind, werden über den [[#Der_Match-Ausdruck|Match-Ausdruck]] geprüft, ob sie mit der Nachricht etwas anfangen können. Sollte bei einem logischen Modul der Match-Ausdruck passen, so wird die entsprechende [[#X_Parse|Parse]]-Funktion des logischen Moduls aufgerufen. Sofern keine passendes Modul gefunden wurde, um die Nachricht zu verarbeiten, wird in der [[#Die_Match-Liste|Match-Liste]] im Geräte- bzw. Modul-Hash der physischen Gerätedefinition nach dem passenden Modul gesucht. Sollte es darin ein Modul geben, was diese Art von Nachricht verarbeiten kann, so wird versucht dieses Modul zu laden um nun die Nachricht via Parse-Funktion zu verarbeiten. Es erfolgt in diesem Fall keine Vorprüfung durch den Match-Ausdruck.<br />
<br />
Durch Dispatch() wird nun die [[#X_Parse|Parse]]-Funktion des gefundenen logischen Moduls aufgerufen. Diese<br />
* interpretiert die übergebene Nachricht,<br />
* versucht eine existierende Gerätedefinition in FHEM zu finden (z.B. mittels Definition Pointer), für welche die Nachricht addressiert ist,<br />
* setzt alle [[#Readings|Readings]] für die gefundene Gerätedefinition via [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen,<br />
* gibt den Namen der logischen Definition zurück, welche die Nachricht verarbeitet hat.<br />
<br />
Sollte keine passende Gerätedefinition für die entsprechende Nachricht existieren (Adresse/ID/Kanal/...), wird der Gerätename "UNDEFINED" inkl. einem passenden <code>define</code>-Statement zurückgegeben, um die Definition durch [[autocreate]] erzeugen zu lassen.<br />
<br />
Es findet während der Verarbeitung einer Nachricht durch Dispatch()/Parse-Funktion keine sofortige Eventverarbeitung (via [[DevelopmentModuleAPI#Dispatch|DoTrigger()]]) statt, wenn die [[DevelopmentModuleAPI#Readings_.2F_Events|readings*update]]()-Funktionen verwendet werden.<br />
(Im Gegensatz zum direkten Aufrufen der readings*update Funktionen ohne vorhergehendes Dispatch() )<br />
<br />
Die Funktion Dispatch() triggert das Event-Handling für das von der Parse-Funktion zurückgegebene logische Device selbstständig nach Abschluss der Parse-Funktion.<br />
<br />
Optional führt die Funktion Dispatch() eine Überprüfung auf Nachrichtenduplikate beim Einsatz von mehreren IO-Geräten durch. Dazu wird eine implementierte [[#X_Fingerprint|Fingerprint]]-Funktion im physischen oder logischen Modul benötigt. Sollte der Fingerprint einer Nachricht innerhalb einer bestimmten Zeit (globales Attribut <code>dupTimeout</code>, standardmäßig 500ms) bereits empfangen worden sein, so wird die Nachricht verworfen. Dies ist insbesondere bei funkbasierter Hardware notwendig, wenn mehrere Empfänger die selbe Nachricht empfangen.<br />
<br />
=== Kommunikation von den logischen Modulen bis zur Hardware ===<br />
<br />
Um von einem logischen Modul eine Nachricht an die Hardware senden zu können, muss zunächst im logischen Gerät ein passenden IO-Gerät ausgewählt sein. Dazu muss die Funktion [[DevelopmentModuleAPI#AssignIoPort|AssignIoPort()]] ein entsprechendes IO-Gerät auswählen und in <code>$hash->{IODev}</code> setzen. Dieser Aufruf wird üblicherweise in der [[#X_Define|Define]]-Funktion des logischen Moduls ausgeführt. Erst, wenn ein IO-Gerät ausgewählt wurde, können Daten über das physikalische Gerät an die Hardware übermittelt werden.<br />
<br />
Zum Senden von Daten ruft das logische Modul die Funktion [[DevelopmentModuleAPI#IOWrite|IOWrite()]] samt Daten auf. Diese ruft für das entsprechende IO-Gerät die [[#X_Write|Write]]-Funktion auf und übergibt die Daten zum Schreiben an das physikalische Modul. Die Write-Funktion kümmert sich nun um die Übertragung der Daten an die Hardware. <br />
<br />
Keine direkten Zugriffe zwischen dem logischen und dem physischen Gerät gibt (d.h. keine direkten Aufrufe von Funktionen, kein direktes Überprüfen von <code>$hash</code>-Inhalten, ...), so können die Module hintereinander geschaltet werden (z.B. für Routerfunktionen wie bei der [[RFR_CUL|RFR]]-Funktionalität) oder mittels [[FHEM2FHEM]] im RAW-Modus zwei FHEM-Installationen verbunden werden und die logischen Geräte können dennoch kommunizieren.<br />
<br />
=== Automatisches Anlegen von logischen Gerätedefinitionen (autocreate) ===<br />
<br />
Das logische Modul kann im Rahmen der [[#X_Parse|Parse]]-Funktion eine neue Gerätedefinition anlegen, sofern eine passende Definition nicht existieren sollte. Die Parse-Funktion gibt generell den Namen der logischen Gerätedefinition zurück, für welche die Nachricht verarbeitet wurde. Sollte keine passende Definition gefunden werden, so muss die Parse-Funktion folgenden Rückgabewert liefern (zusammenhängende Zeichenkette):<br />
<br />
UNDEFINED ''&lt;Namensvorschlag&gt;'' ''&lt;Modulname&gt;'' ''&lt;Define-Parameter...&gt;''<br />
<br />
Sollte also bspw. im Rahmen der Parse-Funktion zu Modul X eine Nachricht nicht einer existierenden Gerätedefinition zugeordnet werden können, so muss ein Namensvorschlag erstellt werden der eine eindeutige Komponente wie bspw. eine Adresse/ID/Kanal-Nr enthält. In der Regel wird hier immer der Modulname zusammen mit der eindeutigen Komponente, durch einen Unterstrich getrennt, verwendet (Bsp: <code>X_4834</code>). Der Modulname ist in der Regel immer der, des eigenen Moduls. In besonderen Fällen kann man hier auch einen abweichenden Modulnamen angeben. Dies wird bspw. bei den [[PanStamp#FHEM-Module.2FDevice_Definition_Files|SWAP-Modulen]] eingesetzt. Als Define-Parameter müssen alle notwendigen Parameter angegeben werden, die beim Aufruf des <code>define</code>-Befehls notwendig sind, damit eine neu angelegte Gerätedefinition Nachrichten zu dieser eindeutigen Adresse Daten verarbeitet. Dazu muss mind. die eindeutige Adresse mitgegeben werden.<br />
<br />
Beispiel für FS20:<br />
<br />
UNDEFINED FS20_0ae42f8 FS20 0ae42 f8<br />
<br />
Sobald [[DevelopmentModuleAPI#Dispatch|Dispatch()]] einen solchen Rückgabewert von einer [[#X_Parse|Parse]]-Funktion erhält, wird diese Zeichenkette so wie sie ist via [[DevelopmentModuleAPI#DoTrigger|DoTrigger()]] als Event für die Definition <code>global</code> getriggert.<br />
<br />
Sofern der Nutzer das Modul [[autocreate]] verwendet (definiert hat), kümmert sich dieses nun um das Anlegen einer entsprechenden Gerätedefinition. Es lauscht dabei auf generierte Events der Definition <code>global</code> via [[#X_Notify|Notify]]-Funktion. Der Nutzer kann dabei das Verhalten von autocreate durch entsprechende Parameter beeinflussen.<br />
<br />
Das Modul, für welches autocreate eine neue Definition anlegen möchte, kann das Verhalten durch entsprechende Parameter im Modul-Hash beeinflussen. Dabei gilt, dass gesetzte Attribute durch den Nutzer generell Vorrang haben. Die entsprechenden Parameter werden dabei im Rahmen der [[#X_Initialize|Initialize]]-Funktion im Modul-Hash gesetzt:<br />
<br />
<syntaxhighlight lang="perl"><br />
sub X_Initialize($)<br />
{<br />
my ($hash) = @_;<br />
<br />
...<br />
<br />
$hash->{AutoCreate} = {"X_.*" => { ATTR => "event-on-change-reading:.* event-min-interval:.*:300",<br />
FILTER => "%NAME",<br />
GPLOT => "temp4hum4:Temp/Hum,",<br />
autocreateThreshold => "2:140"<br />
}<br />
};<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei wird unterhalb von <code>$hash->{AutoCreate}</code> eine Liste angelegt, wo einem regulären Ausdruck für einen anzulegenden Definitionsnamen entsprechende Optionen zugeordnet werden. Sobald durch autocreate eine Gerätedefintion angelegt wird, auf den ein hier gelisteter Ausdruck matcht, so werden die zugeordneten Optionen berücksichtigt.<br />
<br />
Hier eine Auflistung aller möglichen Optionen und ihrer Bedeutung:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Optionsname !! Beispiel !! Bedeutung<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | <code>ATTR</code>|| style="vertical-align:top; white-space: nowrap;" | <code>"event-on-change-reading:.* event-min-interval:.*:300"</code> || Eine Auflistung von Attributen, die nach dem Anlegen einer Definition zusätzlich gesetzt werden. Es handelt sich hierbei um eine Leerzeichen-separierte Liste von Doppelpunkt-getrennten Tupels mit Attributname und -wert.<br />
<br />
Für das dargestellte Beispiel bedeutet dies, dass nach dem Anlegen der Definition folgende FHEM-Befehle zusätzlich ausgeführt werden:<br />
<br />
attr ''&lt;Name&gt;'' event-on-change-reading .*<br />
attr ''&lt;Name&gt;'' event-min-interval .*:300<br />
<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | <code>FILTER</code> || style="vertical-align:top; white-space: nowrap;" | <code>"%NAME"</code>|| Sofern in der autocreate-Definiton das Attribut <code>filelog</code> entsprechend durch den Nutzer gesetzt ist, wird eine zugehörige FileLog-Definition angelegt. Diese Option setzt den dabei benutzten Filter-Regexp, der beim Anlegen der FileLog-Definition gesetzt wird. <br />
<br />
Dabei werden folgende Platzhalter durch die entsprechenden Werte der neu angelegten Gerätedefinition ersetzt:<br />
<br />
* <code>%NAME</code> - wird ersetzt durch den Definitionsnamen<br />
* <code>%TYPE</code> - wird ersetzt durch den Modulnamen<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | <code>GPLOT</code> || style="vertical-align:top; white-space: nowrap;" | <code>"temp4hum4:Temp/Hum,"</code> || Sofern eine FileLog-Definition angelegt wurde, kann man weiterführend dazu eine passende SVG-Definition erzeugen um Daten aus dem erzeugten FileLog zu visualisieren. Ein typischer Fall sind hierbei Temperatursensoren, wo es sinnvoll sein kann, einen passenden SVG-Plot mit Temperatur/Luftfeuchtigkeit direkt anzulegen.<br />
<br />
Es handelt sich hierbei um eine kommaseparierte Auflistung von gplot-Dateinamen und optionalen Label-Texten durch einen Doppelpunkt getrennt. Im genannten Beispiel entspricht <code>temp4hum4</code> der zu verwendenden GnuPlot-Datei und <code>Temp/Hum</code> dem zu verwendenden Label ([[SVG]] Attribut <code>label</code>). Das Label wird auch durch FileLog verwendet als Link-Text zum entsprechenden SVG Plot. Alternativ kann auch nur die entsprechende GnuPlot-Datei anegeben werden ohne Label. Für jede angegebene GnuPlot-Datei wird anschließend eine entsprechende SVG-Definition erzeugt mit der vorher erzeugten FileLog-Definition als Datenquelle.<br />
<br />
Der gesamte Inhalt der <code>GPLOT</code>-Option wird beim Anlegen einer FileLog-Definition dem Attribut <code>logtype</code> als Wert plus dem Text <code>text</code> zugewiesen. Daher muss der Inhalt der Option <code>GPLOT</code> immer mit einem Komma enden. <br />
<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | <code>autocreateThreshold</code> || style="vertical-align:top; white-space: nowrap;" | <code>"2:10"</code> || Definiert, wie viele Aufrufe (im Bsp: <code>2</code>) von autocreate innerhalb welcher Zeit (im Bsp: <code>10</code> Sek.) stattfinden müssen, bevor die Gerätedefinition tatsächlich durch autocreate angelegt wird. Dadurch kann das ungewollte Anlegen von Geräten verhindert werden die tatsächlich nicht in Echt existieren. Aufgrund von Funkstörungen kann es durchaus zum ungewollten Anlegen einer Definition kommen. Diese Funktion lässt eine Definition erst zu wenn innerhalb einer vorgegeben Zeit eine Mindestzahl an Nachrichten eintrifft.<br />
<br />
Die erste Zahl stellt dabei die Mindestanzahl an Nachrichten dar. Die Zweite Zahl stellt die Zeit in Sekunden dar, in der die Mindestanzahl an Nachrichten erreicht werden muss um eine entsprechende Gerätedefinition anzulegen. <br />
<br />
Sofern diese Option nicht gesetzt ist, wird standardmäßig <code>2:60</code> verwendet.<br />
<br />
Diese Option kann durch den Anwender über das Attribut <code>autocreateThreshold</code> übersteuert werden.<br />
|-<br />
| style="vertical-align:top; white-space: nowrap;" | <code>noAutocreatedFilelog</code>|| style="vertical-align:top; white-space: nowrap;" | <code>1</code>|| Flag. Sofern gesetzt, wird keine FileLog- und ggf. SVG-Definition erzeugt. Selbst wenn der Nutzer durch entsprechende Attribute das Anlegen wünscht. Diese Option ist sinnvoll für Module bzw. Geräte die keine Readings erzeugen.<br />
|}<br />
<br />
== Ergänzende Hinweise ==<br />
Die Wahl der vorangestellten Nummer für den Dateinamen eines neuen Moduls hat keine Bedeutung mehr, es sei denn die Nummer ist 99. Module, die mit 99_ beginnen, werden von FHEM automatisch geladen. Module mit einer anderen Nummer nur wenn ein <code>define</code>-Befehl dafür sorgt, dass das Modul geladen wird.<br />
<br />
Wenn ein Modul Initialisierungsdaten benötigt, sollten diese im Modul selbst enthalten sein. Eine zusätzliche Datei oder sogar ein Unterverzeichnis mit mehreren Dateien ist bei FHEM nicht üblich und sollte bei Modulen, die mit FHEM ausgeliefert werden nur in Rücksprache mit Rudolf König angelegt werden, da sie sonst bei einem Update nicht verteilt werden.<br />
<br />
== Weitere Informationen ==<br />
Wenn man weitere Details wissen möchte, ist ein erster sinnvoller Schritt ein Blick in die Datei fhem.pl. Dort sieht man im Perl-Code wie die Module aufgerufen werden, was vorher passiert und was danach. Am Anfang der Datei (ca. ab Zeile 130) findet man beispielsweise eine Liste der globalen Variablen, die den Modulen zur Verfügung stehen sowie Details zu den wichtigen Hashes %modules und %defs. Wer mit Perl noch nicht so gut klar kommt, dem hilft eventuell ein Blick auf die Perldoc Website[http://perldoc.perl.org/] oder in das Perl-Buch seiner Wahl. Auch die FHEM {{Link2CmdRef}} sollte nicht unterschätzt werden. Es stehen oft mehr interessante Details auch für Modulentwickler darin als man zunächst vermuten könnte.<br />
<br />
<br />
== "Hello World" Beispiel ==<br />
<br />
98_Hello.pm<br />
<br />
<syntaxhighlight lang="perl" line="1"><br />
package main;<br />
use strict;<br />
use warnings;<br />
<br />
my %Hello_gets = (<br />
"whatyouwant" => "can't",<br />
"whatyouneed" => "try sometimes",<br />
"satisfaction" => "no"<br />
);<br />
<br />
sub Hello_Initialize {<br />
my ($hash) = @_;<br />
<br />
$hash->{DefFn} = \&Hello_Define;<br />
$hash->{UndefFn} = \&Hello_Undef;<br />
$hash->{SetFn} = \&Hello_Set;<br />
$hash->{GetFn} = \&Hello_Get;<br />
$hash->{AttrFn} = \&Hello_Attr;<br />
$hash->{ReadFn} = \&Hello_Read;<br />
<br />
$hash->{AttrList} =<br />
"formal:yes,no "<br />
. $readingFnAttributes;<br />
}<br />
<br />
sub Hello_Define {<br />
my ($hash, $def) = @_;<br />
my @param = split('[ \t]+', $def);<br />
<br />
if(int(@param) < 3) {<br />
return "too few parameters: define <name> Hello <greet>";<br />
}<br />
<br />
$hash->{name} = $param[0];<br />
$hash->{greet} = $param[2];<br />
<br />
return ;<br />
}<br />
<br />
sub Hello_Undef {<br />
my ($hash, $arg) = @_; <br />
# nothing to do<br />
return ;<br />
}<br />
<br />
sub Hello_Get {<br />
my ($hash, @param) = @_;<br />
<br />
return '"get Hello" needs at least one argument' if (int(@param) < 2);<br />
<br />
my $name = shift @param;<br />
my $opt = shift @param;<br />
if(!$Hello_gets{$opt}) {<br />
my @cList = keys %Hello_gets;<br />
return "Unknown argument $opt, choose one of " . join(" ", @cList);<br />
}<br />
<br />
if($attr{$name}{formal} eq 'yes') {<br />
return $Hello_gets{$opt}.', sir';<br />
}<br />
return $Hello_gets{$opt};<br />
}<br />
<br />
sub Hello_Set {<br />
my ($hash, @param) = @_;<br />
<br />
return '"set Hello" needs at least one argument' if (int(@param) < 2);<br />
<br />
my $name = shift @param;<br />
my $opt = shift @param;<br />
my $value = join("", @param);<br />
<br />
if(!defined($Hello_gets{$opt})) {<br />
my @cList = keys %Hello_gets;<br />
return "Unknown argument $opt, choose one of " . join(" ", @cList);<br />
}<br />
$hash->{STATE} = $Hello_gets{$opt} = $value;<br />
<br />
return "$opt set to $value. Try to get it.";<br />
}<br />
<br />
<br />
sub Hello_Attr {<br />
my ($cmd,$name,$attr_name,$attr_value) = @_;<br />
if($cmd eq "set") {<br />
if($attr_name eq "formal") {<br />
if($attr_value !~ /^yes|no$/) {<br />
my $err = "Invalid argument $attr_value to $attr_name. Must be yes or no.";<br />
Log 3, "Hello: ".$err;<br />
return $err;<br />
}<br />
} else {<br />
return "Unknown attr $attr_name";<br />
}<br />
}<br />
return ;<br />
}<br />
<br />
1;<br />
<br />
=pod<br />
=begin html<br />
<br />
<a name="Hello"></a><br />
<h3>Hello</h3><br />
<ul><br />
<i>Hello</i> implements the classical "Hello World" as a starting point for module development. <br />
You may want to copy 98_Hello.pm to start implementing a module of your very own. See <br />
<a href="http://wiki.fhem.de/wiki/DevelopmentModuleIntro">DevelopmentModuleIntro</a> for an <br />
in-depth instruction to your first module.<br />
<br><br><br />
<a name="Hellodefine"></a><br />
<b>Define</b><br />
<ul><br />
<code>define &lt;name&gt; Hello &lt;greet&gt;</code><br />
<br><br><br />
Example: <code>define HELLO Hello TurnUrRadioOn</code><br />
<br><br><br />
The "greet" parameter has no further meaning, it just demonstrates<br />
how to set a so called "Internal" value. See <a href="http://fhem.de/commandref.html#define">commandref#define</a> <br />
for more info about the define command.<br />
</ul><br />
<br><br />
<br />
<a name="Helloset"></a><br />
<b>Set</b><br><br />
<ul><br />
<code>set &lt;name&gt; &lt;option&gt; &lt;value&gt;</code><br />
<br><br><br />
You can <i>set</i> any value to any of the following options. They're just there to <br />
<i>get</i> them. See <a href="http://fhem.de/commandref.html#set">commandref#set</a> <br />
for more info about the set command.<br />
<br><br><br />
Options:<br />
<ul><br />
<li><i>satisfaction</i><br><br />
Defaults to "no"</li><br />
<li><i>whatyouwant</i><br><br />
Defaults to "can't"</li><br />
<li><i>whatyouneed</i><br><br />
Defaults to "try sometimes"</li><br />
</ul><br />
</ul><br />
<br><br />
<br />
<a name="Helloget"></a><br />
<b>Get</b><br><br />
<ul><br />
<code>get &lt;name&gt; &lt;option&gt;</code><br />
<br><br><br />
You can <i>get</i> the value of any of the options described in <br />
<a href="#Helloset">paragraph "Set" above</a>. See <br />
<a href="http://fhem.de/commandref.html#get">commandref#get</a> for more info about <br />
the get command.<br />
</ul><br />
<br><br />
<br />
<a name="Helloattr"></a><br />
<b>Attributes</b><br />
<ul><br />
<code>attr &lt;name&gt; &lt;attribute&gt; &lt;value&gt;</code><br />
<br><br><br />
See <a href="http://fhem.de/commandref.html#attr">commandref#attr</a> for more info about <br />
the attr command.<br />
<br><br><br />
Attributes:<br />
<ul><br />
<li><i>formal</i> no|yes<br><br />
When you set formal to "yes", all output of <i>get</i> will be in a<br />
more formal language. Default is "no".<br />
</li><br />
</ul><br />
</ul><br />
</ul><br />
<br />
=end html<br />
<br />
=cut<br />
</syntaxhighlight><br />
<br />
Der HTML-Code zwischen den Tags <code>=pod</code> und <code>=cut</code> dient zur Generierung der commandref.html. Der HTML-Inhalt wird automatisch beim Verteilen des Moduls im Rahmen des Update-Mechanismus aus jedem Modul extrahiert und daraus die Commandref in verschiedenen Sprachen erstellt. Eine detaillierte Beschreibung wie ein Commandref-Abschnitt in einem Modul definiert wird, siehe: [[Guidelines zur Dokumentation]]<br />
<br />
==== Entwicklungsumgebung ====<br />
Eine vorbereite Entwicklungsumgebung steht in Github in Form eines Vorlagen Repository bereit: <br />
<br />
Es beinhaltet eine CI/CD Pipeline um das eigene Modul automatisiert zu testen: https://github.com/fhem/mod_template<br />
[[Kategorie:Development]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&diff=37712MQTT2-Module - Praxisbeispiele2022-11-24T20:26:06Z<p>Sailor: /* Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server */</p>
<hr />
<div>== Einführung: MQTT bzw. MQTT2 in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. <br />
<br />
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht<ref>Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden</ref>. MQTT2_DEVICE unterstützt u.a. auch die ''setExtensions'' direkt, also z.B. ''on-for-timer<ref>Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die ''split''-Varianten der attrTemplate-Einrichtung zu verwenden.</ref>'' sowie ''[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]''<ref>Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden</ref>.<br />
<br />
=== Allgemeine Einstellungen und Hinweise ===<br />
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER '''zwingend''' jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch "Wegwerf"-ClientID's. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit '''MQTT2_SERVER als Server ("Broker")''', für diesen sollte dabei ''autocreate'' '''nicht deaktiviert''' sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden<ref>Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') ebenfalls aktiv ist.</ref> . <br />
<br />
Beispiel<ref>MQTT2_SERVER verwendet als default-Einstellung für ''autocreate'' ''simple'', ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung ''complex'' empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.</ref>:<br />
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global<br />
<br />
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.<br />
<br />
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die "\" entfernen!}}<br />
<br />
=== MQTT-Einstellungen in den Geräten ===<br />
Die Beispiele gehen davon aus, dass die einzubindenden Geräte '''''mit den default-Einstellungen''''' für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere '''keine Veränderungen der topic-Pfade''' vorgenommen werden.<br />
<br />
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen. }}<br />
<br />
=== auto-Konfigurations-features ===<br />
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features '''abzuschalten'''. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!<br />
<br />
=== Schritt für Schritt ===<br />
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.<br />
<br />
== zigbee2mqtt ==<br />
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]<br />
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.<br />
<br />
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.<br />
<br />
== Tasmota ==<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] ('''T'''heo '''A'''rends '''S'''onoff '''M'''QTT '''O'''ver '''T'''he '''A'''ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. <br />
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter ''<nowiki>topic = %topic% (tasmota)</nowiki>'' ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung ''DVES_%06X'' zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem Eingabefeld für ''"client ..."'', siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem "sprechenden Namen" kann dann innerhalb von FHEM - mittels ''rename'' oder ggf. mit einem ''alias'' - erfolgen.}}<br />
=== MQTT2_DEVICE ===<br />
Dieses sollte bei aktiviertem ''autocreate'' am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.<br />
<br />
=== Manuelle Anpassungen - Schalter ===<br />
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden: <br />
<syntaxhighlight lang="perl"><br />
defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD<br />
attr MQTT2_DVES_9B01BD IODev m2server<br />
attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on<br />
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\<br />
DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }<br />
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE<br />
attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\<br />
off cmnd/DVES_9B01BD/POWER off\<br />
reboot cmnd/DVES_9B01BD/Restart 1<br />
attr MQTT2_DVES_9B01BD webCmd on:off:reboot<br />
</syntaxhighlight><br />
<br />
=== Manuelle Anpassungen - Dimmer ===<br />
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings <i>FHEM-typische</i> Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. <i>pct</i> (oder <i>brightness</i>) heißt, oder eine abzufragende Temperatur <i>temperature</i>. Entsprechendes gilt im Rahmen von <i>devspec-Abfragen</i>.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über '''POWER''' geschaltet und über '''Dimmer''' gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:<br />
<syntaxhighlight lang="perl"><br />
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off<br />
attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,"POWER",0)eq"off"){0}else{ReadingsVal($name,"Dimmer",0)}}<br />
</syntaxhighlight><br />
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.<br />
<br />
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:<br />
<syntaxhighlight lang="text"><br />
attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\<br />
off cmnd/dimmer/POWER off\<br />
Dimmer cmnd/dimmer/Dimmer<br />
attr MQTT2_DVES_2DF34D webCmd Dimmer<br />
attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100<br />
</syntaxhighlight><br />
<br />
=== attrTemplate ===<br />
===== Allgemeines =====<br />
Für gängige Tasmota-Geräte stehen ''templates'' bereit, mit denen sich diese schnell konfigurieren lassen. <br />
Beachten Sie dazu den Abschnitt ''attrTemplate'' in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}<br />
<br />
===== Kein passendes attrTemplate vorhanden? =====<br />
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das "''tasmota_basic''" anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults "ON" bzw. "OFF".<br />
<br />
Allerdings stellt dieses das ''autocreate'' an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das ''autocreate''-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im ''jsonMap''-Attribut nur die Angabe "''POWER1:state''" zu belassen.<br />
<br />
=== on-for-timer ===<br />
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen ''setter'' in der ''setList'' werden die '''SetExtensions''' verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.<br />
<br />
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:<br />
<br />
==== delay ==== <br />
Zeile zur Erweiterung der ''setList'' (Attributeingabe via FHEMWEB!):<br />
on-for-timer {my $duration = $EVTPART1*10; 'cmnd/DVES_575127/Backlog POWER1 1; delay '.$duration.'; POWER1 0'}<br />
<br />
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.<br />
<br />
====pulseTime ====<br />
Zeile zur Erweiterung der ''setList'' (s.o.):<br />
on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100; 'CMNDTOPIC/Backlog pulseTime1 '.$duration.'; POWER1 1'}<br />
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit ''delay''. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren "normalen" Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites ''save'' nur bis zum nächsten reboot des Microcontrollers.<br />
<br />
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.<br />
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.<br />
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: "pulseTime 0"<br />
Hier ein Beispiel: (das entsprechende device "DEV_611F3E" muss gegen das eigene ersetzt werden)<br />
off:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0<br />
on:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 <br />
toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2<br />
<br />
=== zigbee2tasmota ===<br />
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.<br />
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}<br />
Auch für diese Lösung stehen einige ''attrTemplate'' zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.<br />
<br />
== ESPurna ==<br />
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.<br />
<br />
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool'sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als "on" oder "off" oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.<br />
<br />
== Shelly ==<br />
=== Vorbemerkung ===<br />
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.<br />
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.<br />
<br />
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter ''mqtt_update_period'' in den ''settings'' ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:<br />
http://<ip-des-shelly>/settings?mqtt_update_period=0, <br />
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.<br />
<br />
=== Shelly1 ===<br />
<br />
=== Shellybulb ===<br />
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
Internals:<br />
CFGFN <br />
CID shellybulb_3CC533<br />
DEF shellybulb_3CC533<br />
DEVICETOPIC MQTT2_shellybulb_3CC533<br />
IODev MQTT2_FHEM_Server<br />
NAME MQTT2_shellybulb_3CC533<br />
NR 246<br />
STATE ???<br />
TYPE MQTT2_DEVICE<br />
READINGS:<br />
2018-12-12 19:28:08 status_blue 0<br />
2018-12-12 19:28:08 status_brightness 61<br />
2018-12-12 19:28:08 status_effect 0<br />
2018-12-12 19:28:08 status_gain 26<br />
2018-12-12 19:28:08 status_green 0<br />
2018-12-12 19:28:08 status_ison true<br />
2018-12-12 19:28:08 status_mode color<br />
2018-12-12 19:28:08 status_red 255<br />
2018-12-12 19:28:08 status_temp 3250<br />
2018-12-12 19:28:08 status_white 0<br />
Attributes:<br />
IODev MQTT2_FHEM_Server<br />
readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }<br />
room MQTT2_DEVICE<br />
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.<br />
<br />
=== Shelly Plug S ===<br />
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb > 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:<br />
attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state => $EVTPART0<100?"off":"on" } }<br />
Der Status des MQTT2 Devices zeigt dann bei <100W "off" und sonst "on" an.<br />
<br />
=== HTTP-Commands ===<br />
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.<br />
<br />
== Shelly Gen2 ==<br />
=== Vorbereitung ===<br />
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. <br />
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.<br />
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.<br />
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.<br />
=== Shelly Plus 1 ===<br />
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
<syntaxhighlight lang="text"><br />
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044<br />
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }<br />
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE<br />
<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7<br />
</syntaxhighlight><br />
<br />
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1<br />
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.<br />
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.<br />
<br />
=== Tipps ===<br />
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder APP) unter „Channel settings“.<br />
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.<br />
}}<br />
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.<br />
<br />
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.<br />
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.<br />
<br />
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.<br />
<br />
== OpenMQTTGateway ==<br />
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).<br />
<br />
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.<br />
<br />
== 8-Port-Ethernet Board ==<br />
<gallery><br />
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse<br />
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse<br />
</gallery><br />
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.<br />
<br />
== Milight-Bridge ==<br />
=== Vorbemerkung ===<br />
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von ''openmili'' eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.<br />
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway<ref>Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.</ref>.<br />
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).<br />
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.<br />
<br />
=== Einstellungen am MiLight-Hub ===<br />
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.<br />
Die Einstellungen für ''MQTT topic pattern'' usw. können auf den default-Werten<ref>Diese sind: <br>''milight/:device_id/:device_type/:group_id'' für "topic pattern"<br>''milight/updates/:hex_device_id/:device_type/:group_id'' für "update topic pattern"<br>''milight/states/:hex_device_id/:device_type/:group_id'' für "state topic pattern". Der Autor hat derzeit folgende Infotypen zum Senden markiert: "status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color" (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).</ref> belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (''MQTT Client Status Topic''), tragen Sie ''milight/LWT'' ein und aktivieren ''Detailed''.<br />
<br />
=== FHEM-Devices ===<br />
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]<br />
==== Bridge ====<br />
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:<br />
defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325<br />
attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE<br />
<br />
Auf dieses Device wird nun das ''template'' '''esp_milight_hub_bridge''' angewandt.<br />
<br />
==== Einzelne Leuchtmittel ====<br />
<br />
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:<br />
defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1<br />
attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE<br />
<br />
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.<br />
<br />
Alle weiteren Devices werden genauso erstellt. <br />
<br />
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template ''X_01a_esp_milight_hub_make_rgbw_group'' verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt '''eine Kopie''', die dann modifiziert wird. Diese Kopie ist unter dem Namen ''milight_<RemoteID>_0'' im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. <br />
<br />
Weitere Beispiele:<br />
Beispiel für ein RGB-CCT-Device:<br />
defmod Licht_Wz_all MQTT2_DEVICE<br />
attr Licht_Wz_all IODev MQTT2_Broker<br />
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/<br />
attr Licht_Wz_all group Licht<br />
attr Licht_Wz_all icon light_control<br />
attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
<br />
attr Licht_Wz_all room Wohnzimmer<br />
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\<br />
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\<br />
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}<br />
attr Licht_Wz_all sortby 1<br />
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue<br />
attr Licht_Wz_all webCmdLabel command\ <br />
:brightness:saturation\<br />
:color_temp:hue<br />
==== Ein Leuchtmittel, mehrere Fernbedienungen ====<br />
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen "hört":<br />
<br />
attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\<br />
milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }<br />
<br />
==== Fernbedienung als Input-Device nutzen ====<br />
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.<br />
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem "updates"-Zweig ausgewertet werden: <br />
defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0<br />
attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}<br />
milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol('myMPD',$EVENT, 'Yamaha_Main') }\<br />
milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_links',$EVENT) }\<br />
milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_rechts',$EVENT) }\<br />
milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, 'Licht_WoZi_Vorn_Aussen', 'Licht_WoZi_Vorn_Mitte', 'Licht_WoZi_Hinten_Aussen', 'Licht_WoZi_Hinten_Mitte') }\<br />
milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Jalousie_WZ',$EVENT) }\<br />
milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSO',$EVENT) }\<br />
milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSW',$EVENT) }\<br />
milight/updates/0x5D47/fut089/7:.* {}\<br />
milight/updates/0x5D47/fut089/8:.* {}<br />
attr MiLight_RC_WZ stateFormat CommandSet<br />
<br />
<br />
== eBus ==<br />
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].<br />
<br />
=== Vorbereitung und Definition am eBus ===<br />
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.<br />
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. ''ebusd/%circuit/%name''.<br />
--accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name<br />
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic ''ebusd'' verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit ''ebus...'' zu beginnen!}}<br />
<br />
=== Vorbereitung und Definition in FHEM ===<br />
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem '''''vor''''' den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der ''readingList'' enthalten, die vom ebus stammen. Da wir die ''readingList'' anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche ''readingList''-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-"Sammeldevices" genutzt werden, und dessen ''CID'' auf ''ebusd'' geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der ''readingList'' des "Sammeldevices" gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. <br />
<br />
Sind die Vorbereitungen abgeschlossen, aktivieren wir ''autocreate'' wieder, allerdings wählen wir als autocreate-Methode ''complex'' aus, da der eBus-Dämon teilweise<ref>Dies betrifft vorrangig die Statusmeldungen</ref> eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt<ref>Bei Verwendung des MQTT2_CLIENT wird dann die ''readingList'' am bereits definierten MQTT2_DEVICE aus der Kopie des "Sammeldevice" automatisch wieder erstellt bzw. gefüllt.</ref><br />
<br />
==== "ebus-Bridge" ====<br />
Auf das von ''autocreate'' erstellte MQTT2_DEVICE wird nunmehr das template ''eBus_daemon_splitter'' angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. <br />
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen ''uptime'', alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. <br />
<br />
Das ''attrTemplate'' läd eine weitere ''attrTemplate''-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. <br />
==== "ebusd_bai" und weitere Geräte ====<br />
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}<br />
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens ''MQTT2_ebus_bai'' angelegt worden sein.<br />
<br />
== Sonos2Mqtt ==<br />
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.<br />
<br />
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.<br />
<br />
=== Setup im System ===<br />
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]<br />
<br />
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.<br />
<br />
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].<br />
<br />
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung" - muss der Parameter --mqtt gesetzt werden! <br />
<br />
Beispiele:<br />
:<code>--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800</code> # alles gesetzt<br />
:<code>--mqtt mqtt://192.168.0.3:1800</code> # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server<br />
:<code>--mqtt mqtt://192.168.0.3</code> # IP Adresse gesetzt, Port ist Standard 1883<br />
<br />
Erfolgt der Start mit pm2, werden die Parameter mit einem ''zusätzlichen'' doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800<br />
</syntaxhighlight><br />
<br />
'''Lokales Setup'''<br />
<br />
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. <syntaxhighlight lang="bash"><br />
sudo npm install -g sonos2mqtt<br />
</syntaxhighlight><br />
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -> sonosmqtt@3.1.0-beta.1<br />
<br />
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.<br />
<br />
=== Setup in FHEM ===<br />
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.<br />
<br />
Voraussetzung: <br />
* autocreate im System ist aktiv. <br />
* Der verwendete MQTT2_SERVER steht auf '''autocreate simple''' (default/Standard).<br />
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:<br />
<pre><br />
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }<br />
</pre><br />
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! <br />
<br />
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!<br />
<br />
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. <syntaxhighlight lang="perl"><br />
define SonosBridge MQTT2_DEVICE<br />
attr SonosBridge room MQTT2_DEVICE<br />
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort<br />
</syntaxhighlight><br />
Das Template sonos2mqtt_bridge_comfort:<br />
* setzt das Template sonos2mqtt_bridge auf das Device,<br />
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,<br />
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. <br />
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)<br />
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)<br />
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter<br />
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)<br />
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. <br />
<br />
==== Wozu dient die Bridge? ====<br />
Sie stellt ein paar wesentliche Funktionen zu Verfügung<br />
# Auffangen von nicht benötigten MQTT Nachrichten.<br />
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.<br />
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).<br />
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten u.ä.<br />
<br />
==== Start sonos2mqtt lokal ====<br />
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. <br />
<br />
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.<br />
<br />
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):<br />
<syntaxhighlight lang="bash"><br />
"pm2 start sonos2mqtt"<br />
</syntaxhighlight><br />
Tipp: Verwendet man anstatt "Befehl" den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.<br />
<br />
==== Autostart von sonos2mqtt mit FHEM ====<br />
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.<br />
<syntaxhighlight lang="perl"><br />
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"<br />
trigger n_pm2_sonos start<br />
</syntaxhighlight> <br />
<br />
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===<br />
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!<syntaxhighlight lang="perl"><br />
delete n_pm2_sonos<br />
</syntaxhighlight>Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):<syntaxhighlight lang="bash"><br />
pm2 start sonos2mqtt<br />
pm2 startup<br />
</syntaxhighlight><br />
Der letzte Befehl "redet", d.h. es gibt eine Ausgabe in der Art:<br />
<syntaxhighlight lang="bash"><br />
[PM2] To setup the Startup Script, copy/paste the following command:<br />
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi<br />
</syntaxhighlight><br />
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:<br />
<syntaxhighlight lang="bash"><br />
pm2 save<br />
</syntaxhighlight><br />
<br />
=== Verwendung des Docker Containers ===<br />
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]<br />
<br />
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:<br />
<syntaxhighlight lang="perl"><br />
environment:<br />
- SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen<br />
- SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben<br />
- SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP<br />
</syntaxhighlight><br />
<br />
=== Sonos2mqtt mit mehr Komfort ===<br />
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.<br />
<br />
== Owntracks GPS Tracking in FHEM über MQTT - Cloud ==<br />
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)<br />
<br />
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: host.cloud.com <br />
** Port: 8883 <br />
** ClientID: ID vom Provider <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: user-name <br />
** Passwort: user-password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)<br />
* Sicherheit -> <br />
** TLS aktivieren<br />
=== Definition in FHEM ===<br />
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.<syntaxhighlight lang="perl"><br />
MQTT2_CLIENT einrichten, autocreate simpel<br />
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883<br />
attr mqtt2Cloud SSL 1<br />
attr mqtt2Cloud autocreate simple<br />
attr mqtt2Cloud clientId fhem1<br />
attr mqtt2Cloud room MQTT2_IO<br />
attr mqtt2Cloud username user-name<br />
set mqtt2Cloud password user-password<br />
</syntaxhighlight>Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:<syntaxhighlight lang="perl"><br />
define MQTT2_Cloud_bridge MQTT2_DEVICE<br />
attr MQTT2_Cloud_bridge IODev mqtt2Cloud<br />
attr MQTT2_Cloud_bridge autocreate 1<br />
attr MQTT2_Cloud_bridge room MQTT2_DEVICE<br />
</syntaxhighlight>Dies wird entweder mit dem Template allgemein konfiguriert<syntaxhighlight lang="perl"><br />
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge<br />
</syntaxhighlight>oder manuell nur für owntracks eingerichtet<syntaxhighlight lang="perl"><br />
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* "owntracks_$1"<br />
</syntaxhighlight>MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_<GeräteID> erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.<br />
<br />
==== Anwesenheitserkennung ====<br />
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: <syntaxhighlight lang="perl"><br />
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.<Home><br />
</syntaxhighlight>Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.<br />
<br />
== Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server ==<br />
Dieses Beispiel beschreibt den direkten MQTT2 Zugang wobei das IODev dann der MQTT2_SERVER ist. Hierzu bitte {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}} lesen.<br />
<br />
=== SSL - Zertifikate fuer fhem erstellen. ===<br />
Zunächst erstellen wir fuer den MQTT - Server CA zertifizierte SSL Zertifikate. Diese sind identisch mit den SSL - Zertifikaten, welche man evtl. schon fuer den SSL - Zugang seines FHEMWEB - Device erstellt hat. <br />
<br />
Hat man den FHEMWEB schon mit eiem SSL Zertifikat (http'''<u>s</u>'''://) abgesichert, muss man daraus nur noch den .p12 - Container erstellen. <br />
<br />
Hat man den FHEMWEB noch nicht abgesichert (http://), dann wir es höchste Zeit! <br />
<br />
Für die Erstellung dieser SSL Zertifikate folgt dem Wiki-Beitrag [[FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle]]. <br />
<br />
Die darin beschriebenen Dateien, das cacert.pem sowie den server.p12 - Container müsst ihr nun an euer Mobiltelefon senden.<br />
<br />
=== Definition in FHEM ===<br />
Der MQTT2_Server wird wie folgt eingerichtet.<syntaxhighlight lang="perl"><br />
define myMQTT2Server_extern MQTT2_SERVER IPV6:1884 global<br />
attr MQTTBroker_extern SSL 1<br />
attr MQTTBroker_extern autocreate complex<br />
attr MQTTBroker_extern event-on-change-reading .*<br />
attr MQTTBroker_extern group MQTT2<br />
attr MQTTBroker_extern icon mqtt_broker<br />
attr MQTTBroker_extern room MQTT2<br />
</syntaxhighlight><br />
<br />
Der MQTT2_Server wird zusätzlich über "allowed" abgesichert:<syntaxhighlight lang="perl"><br />
define allowed_MQTT2Server_extern allowed<br />
attr allowed_MQTT2Server_extern DbLogExclude .*<br />
attr allowed_MQTT2Server_extern group MQTT2<br />
attr allowed_MQTT2Server_extern room MQTT2<br />
attr allowed_MQTT2Server_extern validFor myMQTT2Server_extern<br />
</syntaxhighlight>Jetzt vergeben wir noch einen Usernamen und ein Passwort für dieses "allowed" - Device<syntaxhighlight lang="perl"><br />
set allowed_MQTT2Server_extern basicAuth MyMQTT2Username MyMQTT2Password<br />
<br />
</syntaxhighlight>Denkt bitte daran einen eigenen Usernamen und ein eigenes langes, kompliziertes Passwort zu verwenden. Vorsicht bei Sonderzeichen!<br />
<br />
=== Port-Freigaben im Router ===<br />
An dieser Stelle müssen wir den Port 1884 in den Internet - Freigaben eures Routers freigeben.<br />
<br />
Bei der Fritz!Box wird dies beispielsweise unter Internet -> Freigaben -> Port-Freigaben gemacht. Die Details hierzu entnehmt bitte der Bedienungsanleitung eures Routers.<br />
<br />
Wichtig ist dabei, das ihr das Protokol "TCP" verwendet und der Port 1884 extern nach Port 1884 intern an die IP - Adresse des jeweiligen fhem-Servers übermittelt wird.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: subdomain.dyndns.com <br />
** Port: 1884 <br />
** ClientID: Vorname_Nachname <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: MyMQTT2Username <br />
** Passwort: MyMQTT2Password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte. Empfehlung: Die Initialien verwenden.)<br />
* Sicherheit -> <br />
** TLS aktivieren<br />
** CA-Zertifikat: cacert.pem<br />
** Client-Zertifikat: server.p12<br />
** Passwort fuer Client-Zertifikat: Passwort für den server.p12 - Container<br />
<br />
Wenn alles richtig gemacht wurde, dann erstellt das myMQTT2Server_extern - Device automatisch ein neues Device für jede owntracks-App, die sich an dem myMQTT2Server_extern - Device meldet.<br />
<br />
Übrigens: Will man seine gesamte Familie ebenfalls über owntracks tracken, so muss man in den jeweiligen APPs nur die Werte für ClientID, GeräteID und TrackerID individuell gestalten. <br />
<br />
An den fhem- Einstellungen müssen keine weiteren Änderungen vorgenommen werden.<br />
== Allgemeine Hinweise ==<br />
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===<br />
Nutzt man das rawEvents-Attribut am MQTT2-IO<ref>z.B. <code>attr MQTT2_FHEM_Server rawEvents .*</code>, der regex-Filter kann wie üblich angepasst werden</ref>, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.<br />
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit <code>attr mqtt2_server verbose 5</code> auch alles ins FHEM-Log schreiben lassen.<br />
<br />
=== autocreate funktioniert anscheinend nicht? ===<br />
In der Regel wird bei neu eingehenden MQTT-Messages über ''autocreate'' ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:<br />
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von ''mosquito_sub'' entsprechen.<br />
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') muss vorhanden und aktiv sein.<br />
# ''autocreate'' am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf "0" stehen darf (hier ist dann ''simple'' die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls ''simple'' verwendet werden; dies muss hier allerdings explizit gesetzt werden.<br />
<br />
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).<br />
<br />
Das ''autocreate'' am Device schließlich bestimmt, ob die ''readingsList'' erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.<br />
<br />
=== attrTemplate ===<br />
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}<br />
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion ''[[AttrTemplate|attrTemplate]]'' genutzt werden. <br />
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.<br />
<br />
<br />
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}<br />
<br />
=== attrTemplate: Es werden nicht alle templates angezeigt ===<br />
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]<br />
<br />
=== attrTemplate und Sprachsteuerung ===<br />
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von ''[[AttrTemplate|attrTemplate]]'' dem betreffenden Hauptartikel zu entnehmen.<br />
<br />
=== bridgeRegexp ===<br />
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch '''''einem''''' ''MQTT2_DEVICE'' zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte ''A'' bis ''D''. Das '''Attribut''' ''bridgeRegexp'' kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem '''anderen Device''' (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als ''newClientId'' hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe ''D'' mit dem ''bridge''-Device ''D'' und dessen ''Satelliten'' ''D1'' bis ''D4'' dargestellt.<br />
Dementsprechend sind in den hier aufgeführten Beispielen ''bridgeRegexp''-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten ''zigbee2mqtt'' oder ''zigbee2tasmota''. Ein Sonderfall hierbei ist das template ''MQTT2_CLIENT_general_bridge'' zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem ''mosquitto''-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.<br />
<br />
=== Ständig neue Devices? ===<br />
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:<br />
==== Vergabe einer ClientID ====<br />
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). <br />
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID's. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.<br />
<br />
==== Löschen der ClientID aus der readingList usw. ====<br />
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den ''default'' "sonoff" zu ändern).<br />
Beispielsweise wäre <code>attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }</code> zu ändern in <code>attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }</code><br />
Die über ''attrTemplate'' verfügbaren Konfigurationen verwenden in der Regel keine ClientID's bzw. entfernen diese.<br />
<br />
=== Wildcards in readingList und setList ===<br />
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:<br />
<br />
In ''readingList'' werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen "/") kann man so schreiben: "[^/]+" (entspricht: "Mindestens ein Zeichen, das kein Schrägstrich ist"). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).<br />
<br />
In ''setList'' gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht "+" für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es "Gruppen-Topics", auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.<br />
<br />
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===<br />
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }<br />
</pre><br />
wird dann:<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\<br />
owntracks/clouduser/mi6/waypoints:.* json_waypoints\<br />
owntracks/clouduser/mi6/event:.* json_event<br />
</pre><br />
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.<br />
<br />
=== Die JSON-Daten vor dem auspacken manipulieren ===<br />
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.<br />
Z.B. sendet ein Client statt eines Messwertes die Info "bad". Dieser Fehlerwert soll aus der JSON-Payload "ausgefiltert" werden:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { 'bad' ne $rets->{$_} } keys %{$rets};; return \%cleaned }<br />
</pre><br />
<br />
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}<br />
</pre><br />
<br />
=== Unnötige Konfigurationsinformationen verwerfen ===<br />
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].<br />
<br />
=== Weiterführende Themen ===<br />
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====<br />
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein ''notify'' iVm. einer einfachen ''publish''-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.<br />
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten ''bridgeRegexp'' automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:<br />
attr MQTT2_myMqttServer bridgeRegexp \<br />
SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* "mgb2_$1"<br />
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema ''SmartHome/MqttGenericBridge2/<Device-Name>/<Reading-Name>'' versendet.<br />
<br />
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====<br />
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}<br />
<br />
näher erläutert.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}<br />
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}<br />
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}<br />
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}<br />
<br />
== Hinweise ==<br />
<references /><br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:MQTT]]<br />
[[Kategorie:IP Components|IP Komponenten]]<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Interfaces]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=MQTT2-Module_-_Praxisbeispiele&diff=37711MQTT2-Module - Praxisbeispiele2022-11-24T20:11:06Z<p>Sailor: /* owntracks auf dem Smartphone konfigurieren */ Neue Anleitung fuer den internen - direkten Zugang</p>
<hr />
<div>== Einführung: MQTT bzw. MQTT2 in FHEM ==<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT verwenden, beachten Sie bitte, dass der MQTT2_CLIENT die ursprüngliche Herkunft der über MQTT verteilten Informationen nicht kennt. Daher ergeben sich in der Anwendung kleinere Unterschiede, zu deren Verständnis die diesbezüglichen [[MQTT2_CLIENT#Anwendung|Hinweise zu MQTT2_CLIENT]] bekannt sein sollten.}}Zur Einbindung von Geräten, welche zur Nutzung des MQTT-Protokols konfiguriert werden können und darüber mit einem MQTT-Server (früher: Broker) kommunizieren, stehen unter FHEM verschiedene Optionen zur Verfügung, wobei nicht alle Module beliebig miteinander verwendet werden können. Details hierzu sind dieser [[MQTT|Übersicht]] zu entnehmen. <br />
<br />
Im Rahmen dieses Artikels wird für die eigentlichen Geräte [[MQTT2 DEVICE|MQTT2_DEVICE]] verwendet, damit wird als IO-Device entweder {{Link2CmdRef|Anker=MQTT2_SERVER|Lang=en|Label=MQTT2_SERVER}} oder [[MQTT2 CLIENT|MQTT2_CLIENT]] benötigt, mit einem IO-Device des Typs [[MQTT (Modul)|MQTT]] funktioniert die nachfolgende Darstellung dagegen nicht<ref>Allerdings können die Konfigurationen in der Regel recht einfach auf die bisherige MQTT-Implementierung übertragen werden</ref>. MQTT2_DEVICE unterstützt u.a. auch die ''setExtensions'' direkt, also z.B. ''on-for-timer<ref>Beachten Sie bei mehrkanaligen Geräten, dass jeweils nur ein Hauptkanal mittels setExtensions verwaltet werden kann! U.a. aus diesen Grund ist es meist sinnvoller, die ''split''-Varianten der attrTemplate-Einrichtung zu verwenden.</ref>'' sowie ''[[MQTT2-Module - Praxisbeispiele#attrTemplate_2|attrTemplate]]''<ref>Auch MQTT_DEVICE unterstützt SetExtensions, allerdings muss dies dort per Attribut eingeschaltet werden</ref>.<br />
<br />
=== Allgemeine Einstellungen und Hinweise ===<br />
{{Randnotiz|RNTyp=r|RNText=Beachten Sie, dass für [[autocreate]] in Verbindung mit MQTT2_SERVER '''zwingend''' jeder über MQTT kommunizierende Client eine ClientID angeben muss. Passen Sie daher ggf. die Einstellungen Ihres Geräts an. Manche Geräte verwenden auch "Wegwerf"-ClientID's. Für diese empfiehlt es sich, ggf. dann die durch autocreate erstellten Geräte nachzubearbeiten und die ClientID-Angabe v.a. aus den Inhalten des readingList-Attributs zu entfernen.}}Die nachfolgenden Beispiele gelingen am einfachsten mit '''MQTT2_SERVER als Server ("Broker")''', für diesen sollte dabei ''autocreate'' '''nicht deaktiviert''' sein, damit die erforderlichen MQTT2_DEVICES soweit möglich automatisiert erstellt werden<ref>Dabei wird vorausgesetzt, dass ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') ebenfalls aktiv ist.</ref> . <br />
<br />
Beispiel<ref>MQTT2_SERVER verwendet als default-Einstellung für ''autocreate'' ''simple'', ohne dass ein entsprechendes Attribut gesetzt werden müsste. Die Einstellung ''complex'' empfiehlt sich in der Regel nicht; diese ist jedoch dann zu empfehlen, wenn das Device entweder verschachtelte JSON-Array-Strukturen liefert oder bestimmte Readings nicht gefüllt werden sollen.</ref>:<br />
define MQTT2_FHEM_Server MQTT2_SERVER 1883 global<br />
<br />
Falls der MQTT Broker mit Hilfe von [[allowed]] abgesichert wurde, muss in den Geräten ebenfalls User bzw. Passwort eingetragen werden, damit eine MQTT Kommunikation möglich ist.<br />
<br />
{{Hinweis|Die Code-Darstellung in diesem Beitrag entspricht jeweils dem RAW-Format zum [[Import von Code Snippets]]. Wer die Attribute direkt und einzeln bearbeitet, muss ggf. die "\" entfernen!}}<br />
<br />
=== MQTT-Einstellungen in den Geräten ===<br />
Die Beispiele gehen davon aus, dass die einzubindenden Geräte '''''mit den default-Einstellungen''''' für MQTT betrieben werden, wenn man von den Angaben zum Server und ggf. der Gerätekennung absieht. Es sollten also insbesondere '''keine Veränderungen der topic-Pfade''' vorgenommen werden.<br />
<br />
{{Hinweis|Einige der hier beschriebenen Einstellungen haben Änderungen der sich durch die jeweiligen Automatismen eigentlich jeweils ergebenden Standard-Werte zur Folge, insbesondere, was Reading-Namen und von den Geräten gesendete Werte angeht. Sie sollten daher zunächst die Konfiguration des jeweiligen MQTT2-DEVICE-Geräts abschließen, und erst anschließend die weitere Integration mit Event-Handlern, logging usw. vornehmen. }}<br />
<br />
=== auto-Konfigurations-features ===<br />
Viele firmwares und Dienste bieten Möglichkeiten an, einer Controller-Software (insbesondere homeassistant) Hilfsdaten zur automatisierten Konfiguration bereitzustellen. Da FHEM diese Daten nicht zu ihrem ursprünglichen Zweck verwenden kann, werden hierdurch lediglich zusätzliche Readings erzeugt, mit denen man als User in der Regel wenig anfangen kann. Es wird daher empfohlen, derartige features '''abzuschalten'''. Wo dies nicht möglich ist, sollte man eine passende [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp]] setzen bzw. diese passend erweitern!<br />
<br />
=== Schritt für Schritt ===<br />
Hier werden in der Regel fertige Konfigurationen für häufige Anwendungsfälle (beispielhaft) dargestellt. In [[MQTT2_DEVICE - Schritt für Schritt]] ist etwas mehr über die Vorgehensweise bei der Zusammenstellung der verschiedenen Attribute und deren Zusammenwirken zu erfahren.<br />
<br />
== zigbee2mqtt ==<br />
[[Bild:MQTT2_zigbee2mqtt_Bulbs.png|400px|thumb|Darstellung in FHEMWEB]]<br />
[https://www.zigbee2mqtt.io zigbee2mqtt] ist ein open-source Projekt, mit dem zigbee-Geräte über MQTT direkt angesprochen werden können, ohne dass hierfür eine Bridge eines Herstellers benötigt wird.<br />
<br />
Einzelheiten zur Vorgehensweise sind auf der Detailseite [[Zigbee2mqtt|zigbee2mqtt]] zu finden.<br />
<br />
== Tasmota ==<br />
{{Randnotiz|RNTyp=r|RNText=Bitte beachten Sie, dass versicherungsrechtliche Probleme entstehen können, wenn die herstellereigene Firmware ersetzt wird!}}[https://github.com/arendst/Sonoff-Tasmota Tasmota] ('''T'''heo '''A'''rends '''S'''onoff '''M'''QTT '''O'''ver '''T'''he '''A'''ir - einer offenen Firmware von [https://github.com/arendst arendst]) ist eine open-source Software für ESP8266-Geräte, die z.B. statt der originalen Firmware für Sonoff-Geräte und andere ESP8266-basierte WLAN-Steckdosen usw. verwendet werden kann. <br />
{{Hinweis|[[Datei:Tasmota mqtt config.png|120px|thumb|right]]Vor allem, aber nicht nur bei Verwendung des MQTT2_CLIENT als IO, ist es empfehlenswert, in der MQTT-Konfiguration der tasmota-Geräte für den Parameter ''<nowiki>topic = %topic% (tasmota)</nowiki>'' ebenfalls die dynamisch aus der Chip-ID erzeugte Kennung ''DVES_%06X'' zu verwenden. (Kopieren Sie einfach diese Zeichenkette aus dem Eingabefeld für ''"client ..."'', siehe nebenstehende Abbildung). Die eigentliche Umbenennung zu einem "sprechenden Namen" kann dann innerhalb von FHEM - mittels ''rename'' oder ggf. mit einem ''alias'' - erfolgen.}}<br />
=== MQTT2_DEVICE ===<br />
Dieses sollte bei aktiviertem ''autocreate'' am MQTT2_SERVER-Device automatisch angelegt werden, sobald das betreffende Gerät eingesteckt oder neu gestartet oder an einem evtl. vorhandenen Taster geschalten wird. Bislang wurden Tasmota version(en) ab 6.1.1 bis min. 8.1.0 getestet, dies auf verschiedener Hardware, zunächst mit Sonoff Touch und S20, zwischenzeitlich mit einer Vielzahl von Geräten, die per USB-Adapter oder mit der Methode aus dem [https://www.heise.de/ct/artikel/Tuya-Convert-IoT-Geraete-ohne-Loeten-vom-Cloud-Zwang-befreien-4283623.html Tuya-Convert]-Projekt des heise-Verlags auf Tasmota umgeflasht wurden.<br />
<br />
=== Manuelle Anpassungen - Schalter ===<br />
Die RAW-Definition kann dann beispielsweise wie folgt ergänzt werden: <br />
<syntaxhighlight lang="perl"><br />
defmod MQTT2_DVES_9B01BD MQTT2_DEVICE DVES_9B01BD<br />
attr MQTT2_DVES_9B01BD IODev m2server<br />
attr MQTT2_DVES_9B01BD devStateIcon on:FS20.on:off off:FS20.off:on<br />
attr MQTT2_DVES_9B01BD readingList DVES_9B01BD:tele/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/LWT:.* LWT\<br />
DVES_9B01BD:tele/DVES_9B01BD/UPTIME:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/SENSOR:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO1:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO2:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:tele/DVES_9B01BD/INFO3:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/RESULT:.* { json2nameValue($EVENT) }\<br />
DVES_9B01BD:stat/DVES_9B01BD/STATE:.* { json2nameValue($EVENT) }<br />
attr MQTT2_DVES_9B01BD room MQTT2_DEVICE<br />
attr MQTT2_DVES_9B01BD setList on cmnd/DVES_9B01BD/POWER on\<br />
off cmnd/DVES_9B01BD/POWER off\<br />
reboot cmnd/DVES_9B01BD/Restart 1<br />
attr MQTT2_DVES_9B01BD webCmd on:off:reboot<br />
</syntaxhighlight><br />
<br />
=== Manuelle Anpassungen - Dimmer ===<br />
{{Randnotiz|RNTyp=r|RNText=Dieses Beispiel ist nur bedingt zur Nachahmung zu empfehlen: Prinzipiell kann man Readings und setter in MQTT2_DEVICE fast nach Belieben benennen. Wählt man allerdings <i>FHEM-typische</i> Namen, kann dies sehr zur Vereinfachung beitragen. Z.B. wird eine Sprachssteuerung bei einem Dimmer üblicherweise automatisch korrekt eingestellt werden, wenn der für die Helligkeit zuständige setter z.B. <i>pct</i> (oder <i>brightness</i>) heißt, oder eine abzufragende Temperatur <i>temperature</i>. Entsprechendes gilt im Rahmen von <i>devspec-Abfragen</i>.}}Bei einem Dimmer sind einige zusätzliche Anpassungen vorzunehmen. Ein Dimmer wird über '''POWER''' geschaltet und über '''Dimmer''' gedimmt. Damit das funktioniert, müssen ein stateFormat und devStateIcon zusammenarbeiten:<br />
<syntaxhighlight lang="perl"><br />
attr MQTT2_DVES_2DF34D devStateIcon 10\d.*:dim100%@orange:off 1\d.*:dim12%@orange:off 2\d.*:dim18%@orange:off 3\d.*:dim31%@orange:off 4\d.*:dim43%@orange:off 5\d.*:dim50%@orange:off 6\d.*:dim62%@orange:off 7\d.*:dim68%@orange:off 8\d.*:dim81%@orange:off 9\d.*:dim93%@orange:off 0:FS20.off:on .*:FS20.off@orange:off<br />
attr MQTT2_DVES_2DF34D stateFormat {if(ReadingsVal($name,"POWER",0)eq"off"){0}else{ReadingsVal($name,"Dimmer",0)}}<br />
</syntaxhighlight><br />
Nun kann man über das Icon ein- und ausschalten und der Zustand des Dimmers wird korrekt angezeigt.<br />
<br />
Es fehlt noch ein Slider, um auch dimmen zu können. Zusätzlich muss setList noch um Dimmer erweitert werden:<br />
<syntaxhighlight lang="text"><br />
attr MQTT2_DVES_2DF34D setList on cmnd/dimmer/POWER on\<br />
off cmnd/dimmer/POWER off\<br />
Dimmer cmnd/dimmer/Dimmer<br />
attr MQTT2_DVES_2DF34D webCmd Dimmer<br />
attr MQTT2_DVES_2DF34D widgetOverride Dimmer:slider,0,1,100<br />
</syntaxhighlight><br />
<br />
=== attrTemplate ===<br />
===== Allgemeines =====<br />
Für gängige Tasmota-Geräte stehen ''templates'' bereit, mit denen sich diese schnell konfigurieren lassen. <br />
Beachten Sie dazu den Abschnitt ''attrTemplate'' in [[MQTT2 DEVICE#attrTemplate|MQTT2_DEVICE]]. Bei Anwendung eines template mit "split" im Namen werden dabei weitere Geräte angelegt und konfiguriert.{{Hinweis|Bitte attrTemplates nicht verwechseln mit templates, die auf den Tasmota- bzw. Blackadder-Seiten angeboten werden, welche zur Konfiguration der firmware genutzt werden können! Es sollte zunächst die firmware korrekt eingerichtet werden, so dass das Gerät selbst direkt auf dessen Web-Interface korrekt bedient werden kann.}}<br />
<br />
===== Kein passendes attrTemplate vorhanden? =====<br />
Exisitert (noch) kein passendes attrTemplate, ist zu empfehlen, zunächst das "''tasmota_basic''" anzuwenden. Dieses führt einige Basiskonfigurationen durch, die für FHEM hilfreich sind, z.B. wird die firmware so eingestellt, dass Schaltzustände in Kleinschreibung übermittelt werden, statt der defaults "ON" bzw. "OFF".<br />
<br />
Allerdings stellt dieses das ''autocreate'' an dem MQTT2_DEVICE auf 0, was dann nicht optimal ist, wenn man weitere Readings aus dem Gerät erwartet, etwa, weil zusätzliche Sensoren vorhanden sind. In diesem Fall empfiehlt es sich, das ''autocreate''-Attribut an dem MQTT2_DEVICE zu löschen, damit alle weiteren Informationen verarbeitet werden und ggf. im ''jsonMap''-Attribut nur die Angabe "''POWER1:state''" zu belassen.<br />
<br />
=== on-for-timer ===<br />
Um z.B. ein Relais nur für einen Zeitraum anzuschalten, kann man bei Tasmota-Geräten zwischen mehrere Varianten wählen. Ohne speziellen ''setter'' in der ''setList'' werden die '''SetExtensions''' verwendet. Timer laufen damit innerhalb FHEM. Da diese intern als temporäres [[at]] ausgeführt werden, sind diese auch noch nach einem FHEM-Neustart vorhanden, sofern FHEM ordnungsgemäß beendet und neu gestartet wird.<br />
<br />
Die Tasmota-firmware bietet ergänzend dazu zwei Möglichkeiten an, bei denen der Timer direkt auf dem ESP-Microcontroller verwaltet wird:<br />
<br />
==== delay ==== <br />
Zeile zur Erweiterung der ''setList'' (Attributeingabe via FHEMWEB!):<br />
on-for-timer {my $duration = $EVTPART1*10; 'cmnd/DVES_575127/Backlog POWER1 1; delay '.$duration.'; POWER1 0'}<br />
<br />
Ohne Auswirkungen auf alles, was danach kommt, hat aber den Nachteil, dass die möglichen Zeitspannen auf 3600 1/10 Sekunden begrenzt sind (siehe [https://tasmota.github.io/docs/Commands/#delay Commands - Tasmota Delay]), also 6 Minuten.<br />
<br />
====pulseTime ====<br />
Zeile zur Erweiterung der ''setList'' (s.o.):<br />
on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100; 'CMNDTOPIC/Backlog pulseTime1 '.$duration.'; POWER1 1'}<br />
Auch hier sind die möglichen längsten Einschaltdauern begrenzt, allerdings ist diese mit 18h deutlich länger als mit ''delay''. Diese Implementierung hat den Nachteil, dass der ESP-Microcontroller die jeweils letzte pulseTime auch für alle weiteren "normalen" Einschaltvorgänge berücksichtigt, das Relais also ebenfalls nach Ablauf der übermittelten pulseTime abgeschaltet wird; dies gilt allerdings ohne explizites ''save'' nur bis zum nächsten reboot des Microcontrollers.<br />
<br />
Da nach dem ersten pulseTime setzten, diese immer benutzt wird, kann man mit einem kleine Workaround das Device normal arbeiten lassen. Dafür wird bei jedem anderem Befehl, aus der PulseTime, der Timer deaktiviert.<br />
Hierfür machen wir uns zu nutzen, dass man mehrere Befehle gleichzeitig an Tasmota senden kann (backlog). Ob diese Lösung auch mit anderen MQTT Firmwares funktioniert, kann ich nicht sagen. Es wurde lediglich mit Tasmota getestet.<br />
Wir senden also, bevor wir den eigentlich Tasmota Befehl zum Ein- oder Ausschalten schicken, einen Befehl zum deaktivieren des Timers: "pulseTime 0"<br />
Hier ein Beispiel: (das entsprechende device "DEV_611F3E" muss gegen das eigene ersetzt werden)<br />
off:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 0<br />
on:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 1 <br />
toggle:noArg cmnd/DVES_611F3E/backlog pulseTime 0; POWER1 2<br />
<br />
=== zigbee2tasmota ===<br />
[https://tasmota.github.io/docs/Zigbee/ zigbee2tasmota] ist eine Erweiterung der Tasmota-firmware für Microcontroller, insbesondere dem ESP8266 (und ESP32)(link), über die einige ZigBee-Chipsätze (insbesondere TI CC2530) als [[ZigBee#Koordinator_.28ZigBee_coordinator.2C_ZC.29|Coordinator]] eingebunden werden können, um ein ZigBee-Netzwerk aufzubauen.<br />
{{Hinweis|Stand 08/2020 war die Einbindung anderer Chipsätze erst in einem Alpha-Stadium; die Zahl der über einen CC2530 einbindbaren ZigBee-Geräte ist daher derzeit relativ begrenzt (ca. 16)!}}<br />
Auch für diese Lösung stehen einige ''attrTemplate'' zur Verfügung. Nähere Informationen hierzu sind dem Artikel [[Zigbee2Tasmota-MQTT]] zu entnehmen.<br />
<br />
== ESPurna ==<br />
ESPurna ist eine weitere alternative firmware für ESP8266-basierte Geräte, Details sind der [https://github.com/xoseperez/espurna/wiki Projektseite] zu entnehmen.<br />
<br />
Das Format, in dem ESPurna Daten sendet, unterscheidet sich v.a. darin, dass bool'sche Werte als 0 oder 1 gesendet werden, und nicht wie sonst üblich als "on" oder "off" oä.. Es stehen einige Mustertemplates zur Verfügung, um diese Art der Payload in FHEM-konforme Werte zu überführen.<br />
<br />
== Shelly ==<br />
=== Vorbemerkung ===<br />
Auch für Shelly-Geräte steht eine Auswahl an [[MQTT2-Module - Praxisbeispiele#attrTemplate_2|templates]] bereit.<br />
Beachten Sie auch hier, dass uU. bei Anwendung eines template mit "split" im Namen weitere Geräte angelegt und konfiguriert werden.<br />
<br />
Standardmäßig senden die Shelly-Geräte ihren kompletten Status alle 30 Sekunden. Dies kann man über den Parameter ''mqtt_update_period'' in den ''settings'' ändern, allerdings ist dieser nur über die HTTP-Schnittstelle des Shelly verfügbar. Um diese Statusupdates abzustellen, kann über den Browser folgender Befehl verwendet werden:<br />
http://<ip-des-shelly>/settings?mqtt_update_period=0, <br />
Soweit bekannt, werden dann nur statische updates ausgeschaltet, z.B. für das Relay bzw. angeschlossene Taster oder Schalter; insbesondere Verbrauchswerte werden dennoch aktualisiert.<br />
<br />
=== Shelly1 ===<br />
<br />
=== Shellybulb ===<br />
Zunächst muss man einen Statusupdate des Shellybulb erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
Internals:<br />
CFGFN <br />
CID shellybulb_3CC533<br />
DEF shellybulb_3CC533<br />
DEVICETOPIC MQTT2_shellybulb_3CC533<br />
IODev MQTT2_FHEM_Server<br />
NAME MQTT2_shellybulb_3CC533<br />
NR 246<br />
STATE ???<br />
TYPE MQTT2_DEVICE<br />
READINGS:<br />
2018-12-12 19:28:08 status_blue 0<br />
2018-12-12 19:28:08 status_brightness 61<br />
2018-12-12 19:28:08 status_effect 0<br />
2018-12-12 19:28:08 status_gain 26<br />
2018-12-12 19:28:08 status_green 0<br />
2018-12-12 19:28:08 status_ison true<br />
2018-12-12 19:28:08 status_mode color<br />
2018-12-12 19:28:08 status_red 255<br />
2018-12-12 19:28:08 status_temp 3250<br />
2018-12-12 19:28:08 status_white 0<br />
Attributes:<br />
IODev MQTT2_FHEM_Server<br />
readingList shellybulb_3CC533:shellies/shellybulb-3CC533/color/0/status:.* { json2nameValue($EVENT, 'status_') }<br />
room MQTT2_DEVICE<br />
[[Bild:MQTT2 Shellybulb.png|400px|thumb|Darstellung in FHEMWEB nach Anwendung des template]]Dann bei den set-Anweisungen das attrTemplate "shellybulb" auswählen und setzen. Es erscheint eine Abfrage, ob die vorhandenen Readings gelöscht werden sollen. Diese bitte bestätigen und die Seite neu laden. Danach einmal An- und Ausschalten, damit die Readings auch durch einen neuen Status initialisiert werden und die Seite im Browser neu laden.<br />
<br />
=== Shelly Plug S ===<br />
Über die Leistungsmessung des Shelly Plug S lässt sich sehr einfach auch eine Erkennung des Betriebszustandes des angeschlossenen Gerätes realisieren. Dazu stellt man zuerst fest, wieviel Leistung das Gerät in jedem Betriebszustand verbraucht und kann dann z.B. für einen angeschlossenen Fernseher, der im Standby 1 Watt und im Betrieb > 100 Watt verbraucht, den Zustand erkennen und als on/off Status anzeigen. Dazu wird das state Reading wie folgt definiert:<br />
attr readingList shellies/shellyplug-s-123456/relay/0/power:.* { { state => $EVTPART0<100?"off":"on" } }<br />
Der Status des MQTT2 Devices zeigt dann bei <100W "off" und sonst "on" an.<br />
<br />
=== HTTP-Commands ===<br />
In diesem {{Link2Forum|Topic=102369|LinkText=Forumsbeitrag}} wird eine Lösung vorgestellt, um über [[99 myUtils anlegen|myUtils-Code]] weitere Kommandos bereitzustellen, die sonst nur direkt über das Web-Interface zu erreichen sind.<br />
<br />
== Shelly Gen2 ==<br />
=== Vorbereitung ===<br />
Shelly mit dem WLAN verbinden, entweder über die Shelly APP oder per Laptop auf den Offenen AP des Shelly verbinden und dann übers WebUI des Shelly mit dem Heimischen WLAN verbinden. Über die APP geht dies meist etwas einfach und schneller, besonders wenn man mehrere Shelly Geräte hinzufügen möchte. Durch die BT Unterstützung der Gen2 Geräte, klappt dies meist auch deutlich schneller und zuverlässiger als noch bei Gen 1 Geräten. <br />
Nachdem der Shelly mit dem WLAN verbunden ist, sollte die Firmware überprüft und gegebenenfalls aktualisiert werden (Stand Anfang 2022 scheint die firmware noch nicht voll ausgereift gewesen zu sein, da dass insbesondere die MQTT-Schnittstelle immer wieder überarbeitet wurde). Bitte KEINE BETA Versionen installieren, wenn nicht dazu aufgefordert wurde.<br />
Nach dem, durch das Update ausgelösten, Neustart kurz Prüfen ob die Uhrzeit passt, wenn trotz richtiger Zeitzone die Uhrzeit nicht stimmt hilft ein weiterer Neustart.<br />
Nun auf Networks| Internet (leider in APP und WebUI unterschiedlich), hier auf MQTT und die Einstellungen für den verwendeten MQTT Server treffen. Diese Einstellungen werden auch wieder durch Neustart übernommen.<br />
=== Shelly Plus 1 ===<br />
Zunächst muss man einen Statusupdate des Shelly erzwingen (Aus- und Einschalten, physikalisch oder per Web-UI), damit das Gerät bei eingeschaltetem autocreate angelegt wird. Dies sieht zunächst so aus:<br />
<syntaxhighlight lang="text"><br />
defmod MQTT2_shellyplus1_441793a34044 MQTT2_DEVICE shellyplus1_441793a34044<br />
attr MQTT2_shellyplus1_441793a34044 readingList shellyplus1_441793a34044:shellyplus1-441793a34044/online:.* online\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/mqtt:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/events/rpc:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/sys:.* { json2nameValue($EVENT) }\<br />
shellyplus1_441793a34044:shellyplus1-441793a34044/status/switch_0:.* { json2nameValue($EVENT) }<br />
attr MQTT2_shellyplus1_441793a34044 room MQTT2_DEVICE<br />
<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 IODev m2s<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 cfg_rev 7<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 dst shellyplus1-441793a34044/events<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_free 237568<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 fs_size 458752<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 mac 441793A34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 method NotifyStatus<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 online true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_mqtt_connected true<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_id 0<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_output false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_switch_0_source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tC 39.88<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_switch_0_temperature_tF 103.78<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 params_sys_available_updates_beta_version 0.10.0-beta6<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 params_ts 1646474952.66<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_rssi -57<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_ssid WLAN-Alex<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_sta_ip 192.168.177.167<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:24 params_wifi_status got ip<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_free 179764<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 ram_size 249456<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 restart_required false<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 source WS_in<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 src shellyplus1-441793a34044<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tC 39.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:09:12 temperature_tF 103.9<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 time 11:08<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 unixtime 1646474911<br />
setstate MQTT2_shellyplus1_441793a34044 2022-03-05 11:08:31 uptime 7<br />
</syntaxhighlight><br />
<br />
Über die set Anweisung unterhalb der Device Übersicht können wir ein attrTemplate wählen; shellyPlus_1<br />
Es erscheint eine kurze Übersicht was im Template enthalten ist, dieses befindet sich noch im Aufbau und wird aktuell von der Community aufgebaut und weiterentwickelt. Mit einem Klick auf „set“ laden wir das Template und übernehmen die Einstellungen für den Shelly Plus 1.<br />
Damit ist der Shelly bereit, im Status wird neben dem Namen auch der Onlinestatus des Shellys (grüner | roter Punkt) so wie eine Lampe mit Toggle (on | off) Funktion und die Temperatur des Shellys angezeigt. Darüber hinaus verschwindet die Lampe und wird durch einen klickbaren Hinweis ersetzt, wenn ein Neustart des Shellys nötig ist.<br />
<br />
=== Tipps ===<br />
{{Randnotiz|RNTyp=g|RNText=So nimmt man bei Verwendung eines normalen Schalters (eine Stellung EIN eine AUS) gerne den „Flip“ Mode – damit wird der Shelly IMMER umgeschaltet, egal in welche Stellung der Schalter sich bewegt („Kreuzschaltung“). Diese Einstellungen trifft man grundlegend im WebUI des Shelly (oder APP) unter „Channel settings“.<br />
Für den „Flip“ müssen wir die Grundeinstellung des „Power on default“ auch ändern (gleiche Seite) - persönlich wähle ich „Restore last“, also: nach Stromausfall wird der letzte Zustand wieder hergestellt; grundsätzlich gehen alle Modi außer „Match input“.<br />
}}<br />
Das aktuelle Template wurde um die Funktion erweitert, den Button Mode umzuschalten. In den meisten Fällen legt man sich auf eine Schaltmethode fest, welche zum Hardware Setup passt.<br />
<br />
Manchmal will man aber vielleicht den Hardware Schalter deaktivieren, nennen wir es „Kindersicherung“. Bei Shelly heißt das „detached“.<br />
Diese Funktion wurde ins Template als „in_mode“ Übernommen. Mögliche set Befehle sind „flip“, „detached“ „toggle“. Bedingung zur Verwendung ist: „relay power on default“ darf NICHT „Match input“ sein. Sollte Follow statt Flip bevorzugt werden, müsste entsprechende Zeile in der setList von „flip“ auf „follow“ angepasst werden.<br />
<br />
Der Befehlt lässt sich mit dem webCmd in_mode auch schnell zugänglich in die Übersicht vom Shelly setzen, so erhält man neben dem Status ein Dropdown mit flip detached und toggle zum schnellen umschalten. Mit webCmdLabel kann man noch einen Namen für das Dropdown setzen.<br />
<br />
== OpenMQTTGateway ==<br />
Um verschiedene Systeme wie BLE usw. auf MQTT zu bringen bietet sich [https://github.com/1technophile/OpenMQTTGateway OpenMQTTGateway] an, z.B. wird für das Auslesen vieler BLE-Seonsoren lediglich ein ESP32-Board ohne Zusatzhardware (ab ca. 5,- Euro in Fernost erhältlich) benötigt, auf das dann eine vorkompilierte firmware geflasht wird (hierfür wird ein USB-seriell-Wandler benötigt).<br />
<br />
Nähere Details sind im Artikel [[OpenMQTTGateway]] zu finden.<br />
<br />
== 8-Port-Ethernet Board ==<br />
<gallery><br />
datei:8-relais-ethernetboard closed.jpg|mit Gehäuse<br />
datei:8-Port-MQTT-Relais-Board.jpg|ohne Gehäuse<br />
</gallery><br />
In diesem {{Link2Forum|Topic=107536|Message=1016379|LinkText=Forenbeitrag}} bzw. dem betreffenden Thread wurde ein Relais-Board vorgestellt, mit dem 8 Relais über Ethernetkabel verbunden werden, die Kommunikation erfolgt dann über MQTT. Über die verwendete Software ist wenig bekannt, es könnte jedoch sein, dass diese Art der Einbindung auch bei weiteren Boards funktioniert, die einen bestimmten Ethernet-Chipset von TI (DP83848) und eine Cortex M3 MCU verwenden.<br />
<br />
== Milight-Bridge ==<br />
=== Vorbemerkung ===<br />
Der [https://github.com/sidoh/esp8266_milight_hub esp8266_milight_hub] ist ein open source- Projekt, mit dem auf Basis von ''openmili'' eine Vielzahl von MiLight-Geräten gesteuert werden können. Der MiLight-Hub erstetzt dabei eine beliebige Zahl von Milight-Bridges und ist auch zu verschiedenen Versionen des MiLight-Protokols kompatibel. Allerdings lassen sich manche MiLight-Geräte nicht an die Bridge anlernen, und es werden auch nicht alle Fernbedienungs-Typen voll unterstützt.<br />
Neben MQTT kann dieser auch mit HTTPMOD oder Wifilight (bzw. den MiLight-Modulen) gesteuert werden. Die Hardware entspricht dabei im Wesentlichen einem MySensors-Wifi-Gateway<ref>Es wird lediglich ein anderer CS-PIN genutzt. Dies kann einfach in der Web-Oberfläche der Firmware umgestellt werden.</ref>.<br />
Hier wird vorausgesetzt, dass eine funktionierende Bridge vorhanden ist und die zu steuernden Leuchtmittel mit dem Hub bereits verbunden (gepairt) sind bzw. entsprechende Fernbedienungs-Signale empfangen werden können (bei vorhandenem pairing eines Leuchtmittels an die Fernbedienung).<br />
Der Vorteil der MQTT-Lösung liegt darin, dass man bei kompatiblen Fernbedienungen auch direkt Informationen über Schaltvorgänge erhält, die mit der Fernbedienung ausgelöst werden.<br />
<br />
=== Einstellungen am MiLight-Hub ===<br />
Die zum FHEM-Server bzw. dem MQTT2_SERVER passenden Vorgaben sind im Web-Interface des Hub einzustellen. Gegebenenfalls passen Sie die vom Hub zurückzugebenden Elemente im Web-Interface des Hub an.<br />
Die Einstellungen für ''MQTT topic pattern'' usw. können auf den default-Werten<ref>Diese sind: <br>''milight/:device_id/:device_type/:group_id'' für "topic pattern"<br>''milight/updates/:hex_device_id/:device_type/:group_id'' für "update topic pattern"<br>''milight/states/:hex_device_id/:device_type/:group_id'' für "state topic pattern". Der Autor hat derzeit folgende Infotypen zum Senden markiert: "status, brightness, hue, color, mode, color_temp, bulb_mode, computed_color, hex_color" (enthält eventuell zu viele Angaben. Bei einem Eventhandler muss man uU. darauf achten, dass kurz hintereinander zweimal dasselbe Event kommen kann (für ON/OFF)).</ref> belassen werden, für die seit Mitte 2019 vorhandene Option, eine LWT-Message zu senden (''MQTT Client Status Topic''), tragen Sie ''milight/LWT'' ein und aktivieren ''Detailed''.<br />
<br />
=== FHEM-Devices ===<br />
[[Bild:MQTT2 MiLight.png|400px|thumb|Milight: Darstellung in FHEMWEB]]<br />
==== Bridge ====<br />
Wird nun über den Hub oder eine von diesem erkannte Fernbedienung ein vorhandenes Leuchtmittel geschaltet, wird bei eingeschaltetem autocreate ein erstes Device erstellt, die zunächst erstellte Definition sieht typischerweise etwa so aus:<br />
defmod MQTT2_milight_hub_1370325 MQTT2_DEVICE milight_hub_1370325<br />
attr MQTT2_milight_hub_1370325 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_hub_1370325 readingList milight_hub_1370325:milight/updates/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_hub_1370325 room MQTT2_DEVICE<br />
<br />
Auf dieses Device wird nun das ''template'' '''esp_milight_hub_bridge''' angewandt.<br />
<br />
==== Einzelne Leuchtmittel ====<br />
<br />
Wird nun nochmals das oben verwendete Leuchtmittel geschaltet, erstellt autocreate ein weiteres Device:<br />
defmod MQTT2_milight_0xBE59_1 MQTT2_DEVICE milight_0xBE59_1<br />
attr MQTT2_milight_0xBE59_1 IODev MQTT2_FHEM_Server<br />
attr MQTT2_milight_0xBE59_1 readingList milight/states/0xBE59/rgbw/1:.* { json2nameValue($EVENT, '1_', $JSONMAP) }<br />
attr MQTT2_milight_0xBE59_1 room MQTT2_DEVICE<br />
<br />
Auf dieses wird nun eines der Bulb-templates angewendet. Wählt man das template X_01_esp_milight_hub_rgbw_bulb, wird eine einfache Variante erstellt, die neben einem toggelnden Icon nur Regler für Helligkeit, die Farbe und zwei Schaltflächen für den Weiß- und Nachtmodus enthält. Wer mehr oder andere Steuerelemente erhalten möchte, verwendet ein anderes template. Nicht benötigte Elemente kann man dabei einfach aus der Definition löschen.<br />
<br />
Alle weiteren Devices werden genauso erstellt. <br />
<br />
Um ein Device zu erhalten, mit dem sich alle Kanäle gleichzeitig steuern lassen, kann das template ''X_01a_esp_milight_hub_make_rgbw_group'' verwendet werden. Dieses verändert nicht das aktuelle Device, sondern erstellt '''eine Kopie''', die dann modifiziert wird. Diese Kopie ist unter dem Namen ''milight_<RemoteID>_0'' im selben Raum zu finden wie das Ausgangsgerät und kann ebenfalls an die eigenen Wünsche angepasst werden. <br />
<br />
Weitere Beispiele:<br />
Beispiel für ein RGB-CCT-Device:<br />
defmod Licht_Wz_all MQTT2_DEVICE<br />
attr Licht_Wz_all IODev MQTT2_Broker<br />
attr Licht_Wz_all eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/on:on/off:off/ON:on/OFF:off/next_mode:Mode/mode_speed_up:Up/mode_speed_down:Down/<br />
attr Licht_Wz_all group Licht<br />
attr Licht_Wz_all icon light_control<br />
attr Licht_Wz_all readingList milight/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0x5D02/rgb_cct/0:.* { json2nameValue($EVENT) }\<br />
<br />
attr Licht_Wz_all room Wohnzimmer<br />
attr Licht_Wz_all setList on milight/0x5D02/rgb_cct/0 {"status":"ON"}\<br />
off milight/0x5D02/rgb_cct/0 {"status":"OFF"}\<br />
level milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
hue:colorpicker,HUE,0,1,359 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
command:uzsuSelectRadio,Weiss,Nacht,Mode,Up,Down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
brightness:colorpicker,BRI,0,1,255 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
next_mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_up milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode_speed_down milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
saturation:colorpicker,BRI,0,1,100 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
color_temp:colorpicker,CT,153,1,370 milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
device_id milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
effect milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
mode milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}\<br />
commands milight/0x5D02/rgb_cct/0 {"$EVTPART0":"$EVTPART1"}<br />
attr Licht_Wz_all sortby 1<br />
attr Licht_Wz_all webCmd command:brightness:saturation:color_temp:hue<br />
attr Licht_Wz_all webCmdLabel command\ <br />
:brightness:saturation\<br />
:color_temp:hue<br />
==== Ein Leuchtmittel, mehrere Fernbedienungen ====<br />
Pairt man mehrere Fernbedienungen mit einem Leuchtmittel, sollten auch alle entsprechenden Fernbedienungscodes in das readingList-Attribut übernommen werden. Dazu übernimmt man am einfachsten die Einträge aus den zusätzlichen MQTT2_DEVICEs. Benötigt man das zusätzliche Device nicht separat, um z.B. eine getrennte Gruppenschaltung zu realisieren, kann man dieses löschen. Beispiel-readingList für ein Device, das auf zwei Fernbedienungscodes und zwei Gruppen "hört":<br />
<br />
attr Licht_Wz_all readingList milight/states/0x1234/rgbw/2:.* {json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/2:.* { json2nameValue($EVENT) }\<br />
milight/states/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0x1234/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/0:.* { json2nameValue($EVENT) }\<br />
milight/states/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }\<br />
milight/updates/0xABCD/rgbw/4:.* { json2nameValue($EVENT) }<br />
<br />
==== Fernbedienung als Input-Device nutzen ====<br />
In diesem {{Link2Forum|Topic=103493|LinkText=Thread}} ist dargestellt, wie man eine Fernbedingung des Typs FUT089 dazu verwenden kann, einen [[MPD]] oder Rollladenaktoren zu steuern, oder diese Fernbedienung für [[Hue#HUE-Device|HUEDevice]]-Leuchtmittel zu nutzen.<br />
Um hier nur Differenz-Meldungen direkt an die betreffende myUtils-Funktion zu übergeben und doppelte Events zu verhindern, sollte hier die readingList so angepasst werden, dass nur Messages aus dem "updates"-Zweig ausgewertet werden: <br />
defmod MiLight_RC1_0 MQTT2_DEVICE milight_0xABCD_0<br />
attr MiLight_RC1_0 readingList milight/states/0xABCD/fut089/[0-8]:.* {}<br />
milight/updates/0xABCD/fut089/0:.* { FHEM::attrT_MiLight_Utils::MPDcontrol('myMPD',$EVENT, 'Yamaha_Main') }\<br />
milight/updates/0x5D47/fut089/1:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_links',$EVENT) }\<br />
milight/updates/0x5D47/fut089/2:.* { FHEM::attrT_MiLight_Utils::FUT_to_RGBW('Licht_Stehlampe_rechts',$EVENT) }\<br />
milight/updates/0x5D47/fut089/3:.* { FHEM::attrT_MiLight_Utils::four_Lights_matrix($EVENT, 'Licht_WoZi_Vorn_Aussen', 'Licht_WoZi_Vorn_Mitte', 'Licht_WoZi_Hinten_Aussen', 'Licht_WoZi_Hinten_Mitte') }\<br />
milight/updates/0x5D47/fut089/4:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Jalousie_WZ',$EVENT) }\<br />
milight/updates/0x5D47/fut089/5:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSO',$EVENT) }\<br />
milight/updates/0x5D47/fut089/6:.* { FHEM::attrT_MiLight_Utils::shuttercontrol('Rollladen_WZ_SSW',$EVENT) }\<br />
milight/updates/0x5D47/fut089/7:.* {}\<br />
milight/updates/0x5D47/fut089/8:.* {}<br />
attr MiLight_RC_WZ stateFormat CommandSet<br />
<br />
<br />
== eBus ==<br />
An dieser Stelle sollen lediglich die Grundzüge erläutert werden, eine ausführliche Anleitung über die Konfiguration des [[EBUS-MQTT2|eBus mit MQTT2 gibt es hier]].<br />
<br />
=== Vorbereitung und Definition am eBus ===<br />
Vorausgesetzt wird ein laufender eBus-Dämon. Dessen Einrichtung wird im Artikel [[EBUS#Software|EBUS]] beschrieben.<br />
In der Konfiguration des Dämons ( /etc/default/ebusd ) ist die Kommunikation über MQTT zu aktivieren und die Topic-Struktur festzulegen, z.B. ''ebusd/%circuit/%name''.<br />
--accesslevel=* --mqttport=1883 --mqttjson --mqtthost=IpAdresseMQTTSERVER --mqtttopic=ebusd/%circuit/%name<br />
{{Hinweis|Nachfolgend wird davon ausgegangen, dass als Vorgabe für mqtttopic ''ebusd'' verwendet wurde. Dies kann geändert werden, es wird aber dringend empfohlen, das mqtttopic in jedem Fall mit ''ebus...'' zu beginnen!}}<br />
<br />
=== Vorbereitung und Definition in FHEM ===<br />
Unabhängig von dem konkret genutzten IO-Modul (MQTT2_SERVER oder MQTT2_CLIENT) sollte an diesem '''''vor''''' den nachfolgenden Schritten zunächst das autocreate ausgeschaltet werden. Weiter sollte geprüft werden, ob es bereits MQTT2_DEVICE-Geräte gibt, die Einträge in der ''readingList'' enthalten, die vom ebus stammen. Da wir die ''readingList'' anschließend mit erweiterten JSON-Optionen erstellen wollen, müssen zumindest sämtliche ''readingList''-Attribute entsprechend bereinigt oder gelöscht werden; in der Regel ist es einfacher, diese Geräte nach dem Deaktivieren des autocreate am IO zu löschen.<br />
{{Randnotiz|RNTyp=y|RNText=Sollten Sie MQTT2_CLIENT als IO nutzen, sollte für das weitere Vorgehen eine Kopie des MQTT2-"Sammeldevices" genutzt werden, und dessen ''CID'' auf ''ebusd'' geändert werden. Nach Anwendung des ebusd-splitter-templates müssen dann alle den ebus betreffenden Einträge aus der ''readingList'' des "Sammeldevices" gelöscht werden oder diese ganz gelöscht.}}Ist der ebus-Dämon lauffähig und für MQTT konfiguriert, sendet dieser regelmäßige Messages. <br />
<br />
Sind die Vorbereitungen abgeschlossen, aktivieren wir ''autocreate'' wieder, allerdings wählen wir als autocreate-Methode ''complex'' aus, da der eBus-Dämon teilweise<ref>Dies betrifft vorrangig die Statusmeldungen</ref> eine weiter verschachtelte JSON-Struktur zum Versenden der Informationen verwendet als üblich. Danach wird wie bei den anderen o.g. Geräten automatisch ein neues MQTT2_DEVICE angelegt<ref>Bei Verwendung des MQTT2_CLIENT wird dann die ''readingList'' am bereits definierten MQTT2_DEVICE aus der Kopie des "Sammeldevice" automatisch wieder erstellt bzw. gefüllt.</ref><br />
<br />
==== "ebus-Bridge" ====<br />
Auf das von ''autocreate'' erstellte MQTT2_DEVICE wird nunmehr das template ''eBus_daemon_splitter'' angewendet. Nach einiger Zeit sollte sowohl die readingList an diesem Device erweitert worden sein, wie auch ein oder mehrere neue MQTT2_DEVICE-Geräte angelegt. <br />
Dieses Device liefert zukünftig Readings zum Dämon selbst, wie dessen ''uptime'', alle weiteren am eBus angeschlossenen Teilnehmer werden dagegen zweckmäßigerweise durch ein oder mehrere weitere MQTT2_DEVICE-Geräte dargestellt. <br />
<br />
Das ''attrTemplate'' läd eine weitere ''attrTemplate''-file und [[99 myUtils anlegen|99_myUtils-Code]] vom FHEM-Server nach. Beides steht dann auch unmittelbar zur Nutzung zur Verfügung. <br />
==== "ebusd_bai" und weitere Geräte ====<br />
{{Hinweis|Der eBus-Dämon sendet nicht alle Informationen zu allen am eBus angeschlossenen Geräte automatisch. Diese müssen teilweise erst aktiv angefragt werden. Wie das im einzelnen erfolgen kann, ist dem o.g. Detailartikel zu entnehmen.}}<br />
Funktioniert die Kommunikation zwischen dem eBus-Dämon und FHEM, sollte nach einigen Minuten zumindest ein weiteres Gerät namens ''MQTT2_ebus_bai'' angelegt worden sein.<br />
<br />
== Sonos2Mqtt ==<br />
Aus einem Versuch heraus ist ein {{Link2Forum|Topic=111711|LinkText=kleines Projekt}} geworden: Die Sonos Umgebung mit Hilfe von sonos2mqtt als generisches MQTT2_DEVICE komfortabel in FHEM einzubinden.<br />
<br />
Mit Hilfe von ein paar Templates ist die grundlegende Einbindung in FHEM nach einer kleinen Installation auf Systemebene schnell erledigt. Es läuft derzeit noch zahlreiche Entwicklung und Ideenfindung, die Fortschritte sind live im Thread oder [[Sonos2mqtt|konsolidiert im Wiki]] zu finden.<br />
<br />
=== Setup im System ===<br />
Für dies Funktion wird der nodejs Server [https://github.com/svrooij/sonos2mqtt sonos2mqtt] benötigt. Entweder installiert man den lokal, irgendwo im Netzwerk oder nutzt den [[MQTT2-Module - Praxisbeispiele#Verwendung des Docker Containers|Docker Container.]]<br />
<br />
Der nodejs Server sonos2mqtt kann aus Sicht von FHEM irgendwo im Netzwerk stehen - aber er muss im gleichen Netzwerk wie die Sonosplayer stehen. Das UPNP Sonosnetzwerk funktioniert nicht über Netzwerksegmente hinweg.<br />
<br />
Eine Beschreibung aller Startparameter für sonos2mqtt findet man [https://svrooij.io/sonos2mqtt/getting-started.html in der offiziellen Doku].<br />
<br />
Erreicht der nodejs Server sonos2mqtt den MQTT Server nicht über - default: localhost, Port 1883, keine Anmeldung" - muss der Parameter --mqtt gesetzt werden! <br />
<br />
Beispiele:<br />
:<code>--mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800</code> # alles gesetzt<br />
:<code>--mqtt mqtt://192.168.0.3:1800</code> # IP Adresse und Port gesetzt, keine Anmeldung am MQTT Server<br />
:<code>--mqtt mqtt://192.168.0.3</code> # IP Adresse gesetzt, Port ist Standard 1883<br />
<br />
Erfolgt der Start mit pm2, werden die Parameter mit einem ''zusätzlichen'' doppelten Bindestrich (--) hinter dem nodejs Modul übergeben.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="perl"><br />
pm2 start sonos2mqtt -- --mqtt mqtt://myuser:the_secret_password@192.168.0.3:1800<br />
</syntaxhighlight><br />
<br />
'''Lokales Setup'''<br />
<br />
Voraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. <syntaxhighlight lang="bash"><br />
sudo npm install -g sonos2mqtt<br />
</syntaxhighlight><br />
Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Betaversionen wird dieser Zusatz beim Setup verwendet. -> sonosmqtt@3.1.0-beta.1<br />
<br />
Wird der sonos2mqtt Server auf einer anderen Maschine eingerichtet, ist der Start entsprechend diesem Absatz [[MQTT2-Module - Praxisbeispiele#Autostart von sonos2mqtt im System mit pm2 .28Alternative.29|Autostart von Sonos2mqtt im System mit pm2]] einzurichten.<br />
<br />
=== Setup in FHEM ===<br />
Man definiert lediglich ein Bridge Device, der Rest wird automatisch erledigt.<br />
<br />
Voraussetzung: <br />
* autocreate im System ist aktiv. <br />
* Der verwendete MQTT2_SERVER steht auf '''autocreate simple''' (default/Standard).<br />
* Templates aktuell - FHEM uptodate oder bei Bedarf in der FHEM Kommandozeile aktualisieren:<br />
<pre><br />
{ Svn_GetFile("FHEM/lib/AttrTemplate/mqtt2.template", "FHEM/lib/AttrTemplate/mqtt2.template", sub(){ AttrTemplate_Initialize() }) }<br />
</pre><br />
Bei der Anwendung des Templates für die Bridge wird das Attribut devicetopic ausgelesen oder auf default sonos gesetzt! <br />
<br />
Wird ein anderer Devicetopic verwendet, muss der bei der Anlage der Bridge gesetzt werden!<br />
<br />
Diese Zeilen einzeln in der FHEM Kommandozeile oder als Block in der Raw Definition. <syntaxhighlight lang="perl"><br />
define SonosBridge MQTT2_DEVICE<br />
attr SonosBridge room MQTT2_DEVICE<br />
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort<br />
</syntaxhighlight><br />
Das Template sonos2mqtt_bridge_comfort:<br />
* setzt das Template sonos2mqtt_bridge auf das Device,<br />
* lädt die Datei 99_sonos2mqttUtils.pm aus dem contrib Ordner nach,<br />
* definiert ein notify, dies erledigt im weiteren Betrieb die automatische Konfiguration der automatisch erzeugten MQTT2_DEVICEs. <br />
** mit dem Template sonos2mqtt_speaker (das Template kann auch manuell auf vorhandene Player angewendet werden, die automatische Erzeugung der Player wird aber empfohlen)<br />
** Ermittelt Detailinformation des jeweiligen Players (vor allem IP Adresse und Modelnumber)<br />
** Lädt die Sonosgeräte Icons von den UPNP Devices herunter<br />
** erweitert das setList input Kommando um den TV Eingang (HDMI, spdif) bzw. Line_IN Eingang falls vorhanden (Modelnumber)<br />
* Die Player werden automatisch einzeln erzeugt wenn sie mqtt Nachrichten senden (Play/Stop) oder (alle sofort) wenn der sonos2mqtt Server gestartet wird. <br />
<br />
==== Wozu dient die Bridge? ====<br />
Sie stellt ein paar wesentliche Funktionen zu Verfügung<br />
# Auffangen von nicht benötigten MQTT Nachrichten.<br />
# Erzeugung/Weiterleitung von Nachrichten für die einzelnen Player - damit auch die Erzeugung von separaten Playern nach dem Schema MQTT2_RINCON12345678901234567.<br />
# Statusanzeige sonos2mqtt als Reading connected (0 offline, 1 connected, 2 Player connected).<br />
Sie kann zusätzlich als zentrales Device verwendet werden, um die Sonos Umgebung abzubilden, z.B. Readings für Favoriten u.ä.<br />
<br />
==== Start sonos2mqtt lokal ====<br />
Der Start / Stop des sonos2mqtt Servers innerhalb von FHEM ist nur lokal simpel möglich. Ist der Server irgendwo im Netzwerk oder im Docker Container, muss man andere Möglichkeiten finden. Der Neustart aus FHEM ist zwar praktisch, aber nicht erforderlich. <br />
<br />
Wird eine existierenden Sonos Landschaft inhaltlich verändert (Player dazu/weg), muss der Server neu gestartet werden. Werden Player temporär abgeschaltet, merkt das der Server nach einer Zeit selbst, oder man forciert dies mit einem CheckSubscription an der Bridge.<br />
<br />
Soll das Modul sonos2mqtt mit seinen default Einstellungen gestartet werden, genügt dieser kurze Befehl (in der FHEM Kommandozeile):<br />
<syntaxhighlight lang="bash"><br />
"pm2 start sonos2mqtt"<br />
</syntaxhighlight><br />
Tipp: Verwendet man anstatt "Befehl" den Syntax {qx(Befehl)} in der FHEM Kommandozeile, wirkt der Befehl zwar blockierend aber die Ausgabe erfolgt im Browser und nicht im Logfile. Mit dem Parameter -s erfolgt keine Ausgabe.<br />
<br />
==== Autostart von sonos2mqtt mit FHEM ====<br />
Der Code startet sowohl das sonso2mqtt Modul sofort und implementiert ein notify für den zukünftigen automatischen Start beim Start von FHEM.<br />
<syntaxhighlight lang="perl"><br />
define n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"<br />
trigger n_pm2_sonos start<br />
</syntaxhighlight> <br />
<br />
=== Autostart von sonos2mqtt im System mit pm2 (Alternative) ===<br />
Der obige Code startet das sonos2mqtt nodejs Modul mit pm2 beim Start von FHEM. Sollte das nicht funktionieren oder nicht ins gesamte Konzept passen (weil z.B. mehrere nodejs Module geladen werden) kann der automatische Start direkt im System erfolgen. Zunächst dafür das oben eventuell schon definierte notify löschen!<syntaxhighlight lang="perl"><br />
delete n_pm2_sonos<br />
</syntaxhighlight>Der Start des Modul muss nicht mit erhöhten Rechten geschehen! Im Terminal folgendes eingeben (unter dem angemeldeten Benutzer wird sonos2mqtt später immer gestartet):<syntaxhighlight lang="bash"><br />
pm2 start sonos2mqtt<br />
pm2 startup<br />
</syntaxhighlight><br />
Der letzte Befehl "redet", d.h. es gibt eine Ausgabe in der Art:<br />
<syntaxhighlight lang="bash"><br />
[PM2] To setup the Startup Script, copy/paste the following command:<br />
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi<br />
</syntaxhighlight><br />
Man tut einfach genau das, was dasteht: die letzte Zeile kopieren und wieder einfügen und ausführen. Danach muss man die Konfiguration von pm2 noch sichern:<br />
<syntaxhighlight lang="bash"><br />
pm2 save<br />
</syntaxhighlight><br />
<br />
=== Verwendung des Docker Containers ===<br />
Ergänzend zur [https://svrooij.io/sonos2mqtt/getting-started.html#run-sonos2mqtt-in-docker Original Doku:]<br />
<br />
Beim Container findet die Konfiguration der Verbindung zum FHEM in den Environment Variablen statt:<br />
<syntaxhighlight lang="perl"><br />
environment:<br />
- SONOS2MQTT_DEVICE=192.168.56.207 # hier muss einer der Sonos Lautsprecher stehen<br />
- SONOS2MQTT_MQTT=mqtt://192.168.56.121:1883 # mqtt2_server FHEM, erweiterter Syntax siehe oben<br />
- SONOS_LISTENER_HOST=192.168.56.121 # Docker host IP<br />
</syntaxhighlight><br />
<br />
=== Sonos2mqtt mit mehr Komfort ===<br />
Im Wiki Artikel [[Sonos2mqtt]] geht es weiter.<br />
<br />
== Owntracks GPS Tracking in FHEM über MQTT - Cloud ==<br />
Das hier gezeiget Beispiel verwendet eine MQTT Instanz im Internet, die mit einem MQTT2_CLIENT angebunden wird. Da wenig Traffic benötigt wird, genügt z.B. eine kostenfreie Instanz z.B. bei myqtthub (Stand. Dezember 2020)<br />
<br />
Alternativ kann man einen MQTT2_SERVER auch direkt verfügbar machen, wenn man sich sicher ist was man da tut! Siehe {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}}. Das Bridge Device wird dabei genau so benötigt, nur der IODev ist dann der MQTT2_SERVER.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: host.cloud.com <br />
** Port: 8883 <br />
** ClientID: ID vom Provider <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: user-name <br />
** Passwort: user-password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte)<br />
* Sicherheit -> <br />
** TLS aktivieren<br />
=== Definition in FHEM ===<br />
Der MQTT2_CLIENT wird so eingerichtet, man braucht eine andere ClientID als auf dem Smartphone! Stimmt alles sollte das Gerät sofort open anzeigen.<syntaxhighlight lang="perl"><br />
MQTT2_CLIENT einrichten, autocreate simpel<br />
define mqtt2Cloud MQTT2_CLIENT host.cloud.com:8883<br />
attr mqtt2Cloud SSL 1<br />
attr mqtt2Cloud autocreate simple<br />
attr mqtt2Cloud clientId fhem1<br />
attr mqtt2Cloud room MQTT2_IO<br />
attr mqtt2Cloud username user-name<br />
set mqtt2Cloud password user-password<br />
</syntaxhighlight>Für die automatische Erzeugung der Trackergeräte in FHEM richtig man zuerst ein Bridge Device ein:<syntaxhighlight lang="perl"><br />
define MQTT2_Cloud_bridge MQTT2_DEVICE<br />
attr MQTT2_Cloud_bridge IODev mqtt2Cloud<br />
attr MQTT2_Cloud_bridge autocreate 1<br />
attr MQTT2_Cloud_bridge room MQTT2_DEVICE<br />
</syntaxhighlight>Dies wird entweder mit dem Template allgemein konfiguriert<syntaxhighlight lang="perl"><br />
set MQTT2_Cloud_bridge attrTemplate MQTT2_CLIENT_general_bridge<br />
</syntaxhighlight>oder manuell nur für owntracks eingerichtet<syntaxhighlight lang="perl"><br />
attr MQTT2_Cloud_bridge bridgeRegexp owntracks/[^/]+/([^/:]+).* "owntracks_$1"<br />
</syntaxhighlight>MQTT2 Geräte für owntracks werden jetzt automatisch mit dem Namen MQTT2_owntracks_<GeräteID> erzeugt. Diese werden einfach mit dem Template owntracks_device fertig konfiguriert. Bei einem IOS Gerät kann man danach noch das Template owntracks_device_IOS als Erweiterung anwenden.<br />
<br />
==== Anwesenheitserkennung ====<br />
Die Anwesenheit kann im owntracks Device direkt für die selbst definierten Plätze abgelesen werden: entweder steht im reading place der jeweilige Ort oder away. Um hier noch eine gewisse Einheitlichkeit in der Verwendung zu bekommen kann man ein PRESENCE Device verwenden: <syntaxhighlight lang="perl"><br />
define OT_Mi6 PRESENCE event MQTT2_owntracks_mi6:place:.away MQTT2_owntracks_mi6:place:.<Home><br />
</syntaxhighlight>Im Move Modus erfolgt die Erkennung sehr schnell und damit einige Sekunden eher als eine BT Erkennung im Haus - der Akkuverbrauch steigt enorm. Im Significant Modus kann es schon mal ein paar Minuten dauern - ein relevanter Akku Verbrauch ist nicht erkennbar.<br />
<br />
== Owntracks GPS Tracking in FHEM direkt an den eigenen Fhem-Server ==<br />
Dieses Beispiel beschreibt den direkten MQTT2 Zugang wobei das IODev dann der MQTT2_SERVER ist. Hierzu bitte {{Link2Forum|Topic=99666|Message=1028576|LinkText=diesen Forenbeitrag}} lesen.<br />
<br />
=== SSL - Zertifikate fuer fhem erstellen. ===<br />
Zunächst erstellen wir fuer den MQTT - Server CA zertifizierte SSL Zertifikate. Diese sind identisch mit den SSL - Zertifikaten, welche man evtl. schon fuer den SSL - Zugang seines FHEMWEB - Device erstellt hat. <br />
<br />
Hat man den FHEMWEB schon mit eiem SSL Zertifikat (http'''<u>s</u>'''://) abgesichert, muss man daraus nur noch den .p12 - Container erstellen. <br />
<br />
Hat man den FHEMWEB noch nicht abgesichert (http://), dann wir es höchste Zeit! <br />
<br />
Für die Erstellung dieser SSL Zertifikate folgt dem Wiki-Beitrag [[FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle]]. <br />
<br />
Die darin beschriebenen Dateien, das cacert.pem sowie den server-cert.p12 - Container müsst ihr nun an euer Mobiltelefon senden.<br />
<br />
=== Definition in FHEM ===<br />
Der MQTT2_Server wird wie folgt eingerichtet.<syntaxhighlight lang="perl"><br />
define myMQTT2Server_extern MQTT2_SERVER IPV6:1884 global<br />
attr MQTTBroker_extern SSL 1<br />
attr MQTTBroker_extern autocreate complex<br />
attr MQTTBroker_extern event-on-change-reading .*<br />
attr MQTTBroker_extern group MQTT2<br />
attr MQTTBroker_extern icon mqtt_broker<br />
attr MQTTBroker_extern room MQTT2<br />
</syntaxhighlight><br />
<br />
Der MQTT2_Server wird zusätzlich über "allowed" abgesichert:<syntaxhighlight lang="perl"><br />
define allowed_MQTT2Server_extern allowed<br />
attr allowed_MQTT2Server_extern DbLogExclude .*<br />
attr allowed_MQTT2Server_extern group MQTT2<br />
attr allowed_MQTT2Server_extern room MQTT2<br />
attr allowed_MQTT2Server_extern validFor myMQTT2Server_extern<br />
</syntaxhighlight>Jetzt vergeben wir noch einen Usernamen und ein Passwort für dieses "allowed" - Device<syntaxhighlight lang="perl"><br />
set allowed_MQTT2Server_extern basicAuth MyMQTT2Username MyMQTT2Password<br />
<br />
</syntaxhighlight>Denkt bitte daran einen eigenen Usernamen und ein eigenes langes, kompliziertes Passwort zu verwenden. Vorsicht bei Sonderzeichen!<br />
<br />
=== Port-Freigaben im Router ===<br />
An dieser Stelle müssen wir den Port 1884 in den Internet - Freigaben eures Routers freigeben.<br />
<br />
Bei der Fritz!Box wird dies beispielsweise unter Internet -> Freigaben -> Port-Freigaben gemacht. Die Details hierzu entnehmt bitte der Bedienungsanleitung eures Routers.<br />
<br />
Wichtig ist dabei, das ihr das Protokol "TCP" verwendet und der Port 1884 extern nach Port 1884 intern an die IP - Adresse des jeweiligen fhem-Servers übermittelt wird.<br />
<br />
=== owntracks auf dem Smartphone konfigurieren ===<br />
Menü / Einstellung / Verbindung <br />
<br />
Dort sind insgesamt 4 Registerkarten mit Werten zu füllen (Beispiel):<br />
* Modus -> MQTT<br />
* Hostname -> <br />
** Hostnamen: subdomain.dyndns.com <br />
** Port: 1884 <br />
** ClientID: Vorname_Nachname <br />
** WebSockets (nicht nutzen)<br />
* Identifikation -> <br />
** Benutzername: MyMQTT2Username <br />
** Passwort: MyMQTT2Password <br />
** GeräteID: mi6 (erscheint in FHEM im Device Namen verwendet)<br />
** TrackerID: hk (nur zweistellig, erscheint als ID in der owntracks Karte. Empfehlung: Die Initialien verwenden.)<br />
* Sicherheit -> <br />
** TLS aktivieren<br />
** CA-Zertifikat: cacert.pem<br />
** Client-Zertifikat: server-cert.p12<br />
** Passwort fuer Client-Zertifikat: Passwort für den server-cert.p12 - Container<br />
<br />
Wenn alles richtig gemacht wurde, dann erstellt das myMQTT2Server_extern - Device automatisch ein neues Device für jede owntracks-App, die sich an dem myMQTT2Server_extern - Device meldet.<br />
<br />
Übrigens: Will man seine gesamte Familie ebenfalls über owntracks tracken, so muss man in den jeweiligen APPs nur die Werte für ClientID, GeräteID und TrackerID individuell gestalten. <br />
<br />
An den fhem- Einstellungen müssen keine weiteren Änderungen vorgenommen werden.<br />
== Allgemeine Hinweise ==<br />
=== MQTT2_SERVER und MQTT2_CLIENT für Debugging nutzen ===<br />
Nutzt man das rawEvents-Attribut am MQTT2-IO<ref>z.B. <code>attr MQTT2_FHEM_Server rawEvents .*</code>, der regex-Filter kann wie üblich angepasst werden</ref>, kann man den Datenverkehr des Servers am Event-Monitor mitschneiden. Dies ist insbesondere für unbekannte Geräte nützlich, deren Topic- und Payload-Struktur noch nicht bekannt ist.<br />
Um den kompletten MQTT Datenaustausch mitzuschneiden, kann man mit <code>attr mqtt2_server verbose 5</code> auch alles ins FHEM-Log schreiben lassen.<br />
<br />
=== autocreate funktioniert anscheinend nicht? ===<br />
In der Regel wird bei neu eingehenden MQTT-Messages über ''autocreate'' ein neues Device erstellt, wenn Nachrichten von einem bisher unbekannten Gerät kommen. Geschieht dies nicht, sollten folgende Punkte geprüft werden:<br />
# (nur bei MQTT2_SERVER:) Der Client muss eine ClientID angeben, diese darf nicht den defaults von ''mosquito_sub'' entsprechen.<br />
# Ein allgemeines {{Link2CmdRef|Anker=autocreate|Lang=en|Label=autocreate}}-Device (''TYPE=autocreate'') muss vorhanden und aktiv sein.<br />
# ''autocreate'' am IO muss eingeschaltet sein, was für MQTT2_SERVER bedeutet, dass es nicht auf "0" stehen darf (hier ist dann ''simple'' die aktive Voreinstellung), für MQTT2_CLIENT sollte ebenfalls ''simple'' verwendet werden; dies muss hier allerdings explizit gesetzt werden.<br />
<br />
Wird dann immer noch kein Device erstellt, gibt es in aller Regel ein Device, das bereits einen entsprechenden Eintrag in der readingList enthält, oder es sind keine Nachrichten eingegangen. Überprüfen Sie daher dann ggf. die Einstellungen am Client-Gerät (z.B. im Web-Interface des Shelly oder Tasmota-geflashten ESP8266).<br />
<br />
Das ''autocreate'' am Device schließlich bestimmt, ob die ''readingsList'' erweitert werden darf, wenn Informationen über bisher nicht über die readingList abgedeckte Topics empfangen werden und vom MQTT2-IO als zu diesem Device/ClientID gehörend identifiziert wurden.<br />
<br />
=== attrTemplate ===<br />
{{Randnotiz|RNTyp=Info|RNText=Die per attrTemplate jeweils erzeugten Konfigurationen sind Einrichtungsbeispiele, die v.a. eine in sich konsistenze Zusammenstellung der verschiedenen Attribute enthalten. Es steht jedem User frei, diese Ausgangsbasis dann nach seinem Belieben zu ändern. Spätere Änderungen des verwendeten attrTemplate wirken sich nicht automatisch auf die durch frühere Versionen oder den User nachkonfigurierte Geräte aus! Da es vorkommen kann, dass sich die per MQTT übermittelten Daten und Topics ändern, wenn z.B. eine firmware aktualisiert wurden, kann dies Anpassungen am jeweiligen Template erforderlich machen. Grundsätzlich sollen die per attrTemplate für MQTT2_DEVICE verfügbaren attrTemplate jeweils für die aktuellste verfügbare stabile firmware-Version passen.}}<br />
Zur Konfiguration von MQTT2_DEVICE-Geräten kann die Funktion ''[[AttrTemplate|attrTemplate]]'' genutzt werden. <br />
Die Anwendung für MQTT2_DEVICE ist [[MQTT2 DEVICE#attrTemplate|hier]] beschrieben.<br />
<br />
<br />
{{Hinweis|In einigen Fällen kann es vorkommen, dass die template-Bezeichnung zwischenzeitlich geändert wurde. Seit 21.09.2019 erfolgt die Sortierung der auswählbaren templates nicht mehr nur nach den Namen, so dass die entsprechenden Namensbestandteile entfallen sind, die einer besseren Sortierung dienten.}}<br />
<br />
=== attrTemplate: Es werden nicht alle templates angezeigt ===<br />
Siehe Beitrag [[AttrTemplate#Warum finde ich das Template xyz nicht.3F|AttrTemplate: Warum finde ich das Template xyz nicht.]]<br />
<br />
=== attrTemplate und Sprachsteuerung ===<br />
Konfiguriert man MQTT2_DEVICE-Geräte mit attrTemplate, werden in der Regel auch direkt die für die Sprachsteuerung der Geräte erforderlichen Attribute mit gesetzt. Weiterführende Hinweise sind auch zu diesem Teilaspekt von ''[[AttrTemplate|attrTemplate]]'' dem betreffenden Hauptartikel zu entnehmen.<br />
<br />
=== bridgeRegexp ===<br />
[[Datei:Mqtt2 server.png|300px|thumb|left|Logische Verortung der bridgeRegexp-Angaben]]{{Randnotiz|RNTyp=y|RNText=Beachten Sie, dass aufgrund des geschilderten Prinzips eine Änderung einer bridgeRegexp bei einem Gerät auch dazu führt, dass alle Readings eines Geräts und alle readingList-Einträge gelöscht werden.}}Üblicherweise werden alle Informationen, die aus einer Quelle stammen auch '''''einem''''' ''MQTT2_DEVICE'' zugeordnet, wobei im Falle des dort nicht aktivierten autocreate-Attributs entsprechende readingList-Einträge erzeugt werden. In dem nebenstehenden Schaubild wären dies die Geräte ''A'' bis ''D''. Das '''Attribut''' ''bridgeRegexp'' kann dazu genutzt werden, um neue, bisher unbekannte Topic-Strukturen im Rahmen des autocreate-Vorgangs anders zu strukturieren. Diese werden dabei im Ergebnis einem '''anderen Device''' (das ggf. erst erstellt wird) zugeschlagen, sollte eine zu der topic-Struktur passende regex in diesem Attribut gesetzt sein. Für dessen CID und die Bildung des Names wird die im 2. Teil jedes Eintrags als ''newClientId'' hinterlegte Angabe verwendet. In nebenstehendem Schaubild ist dies exemplarisch für die Gerätegruppe ''D'' mit dem ''bridge''-Device ''D'' und dessen ''Satelliten'' ''D1'' bis ''D4'' dargestellt.<br />
Dementsprechend sind in den hier aufgeführten Beispielen ''bridgeRegexp''-Attribute immer dort zu finden, wo ein Gerät oder Dienst dazu dient, mit weiteren, ggf. auf andere Weise kommunizierende Geräte oder Baugruppen zu kommunizieren, wie z.B. für über hier dargestellten ''zigbee2mqtt'' oder ''zigbee2tasmota''. Ein Sonderfall hierbei ist das template ''MQTT2_CLIENT_general_bridge'' zur Verwendung mit dem [[MQTT2_CLIENT#Anwendung|MQTT2_CLIENT]], denn aus dessen Sicht stammen alle Informationen aus derselben Quelle, nämlich z.B. dem ''mosquitto''-Server und würden sonst alle einem einem MQTT2_DEVICE zugewiesen.<br />
<br />
=== Ständig neue Devices? ===<br />
MQTT2_SERVER kann zwischen verschiedenen Geräten auch anhand der ClientID unterscheiden. Für jedes neu erkannte Gerät wird auch ein eigenes MQTT2_DEVICE angelegt. Abhilfemaßnahmen:<br />
==== Vergabe einer ClientID ====<br />
Die meisten MQTT-fähigen Geräte enthalten Optionen zur Vergabe einer eindeutigen ClientID (siehe das Beispiel des zigbee2mqtt-Dienstes oben). <br />
Wird keine ClientID vergeben, verwenden manche Clients für jede Verbindung wieder neue ID's. Es wird empfohlen, möglichst von diesen Einstelloptionen Gebrauch zu machen.<br />
<br />
==== Löschen der ClientID aus der readingList usw. ====<br />
Ist dies nicht möglich oder erwünscht, kann man auch die ClientID aus den readingList-, setList- und getList-Attributen entfernen. Dies ist jedenfalls solange unschädlich als nicht mehrere Geräte identische Topic-Pfade verwenden (daher die Empfehlung, insbesondere bei Tasmota-Geräten den ''default'' "sonoff" zu ändern).<br />
Beispielsweise wäre <code>attr Milight_Bridge readingList milight_hub_1370325:milight/LWT:.* {json2nameValue($EVENT) }</code> zu ändern in <code>attr Milight_Bridge readingList milight/LWT:.* {json2nameValue($EVENT) }</code><br />
Die über ''attrTemplate'' verfügbaren Konfigurationen verwenden in der Regel keine ClientID's bzw. entfernen diese.<br />
<br />
=== Wildcards in readingList und setList ===<br />
Auch in readingList und in setList sollten sich sog. wildcards verwenden lassen. Die Vorgehensweise ist jedoch unterschiedlich:<br />
<br />
In ''readingList'' werden normale regex-Ausdrücke verwendet. Ein Punkt steht daher z.B. für ein beliebiges Zeichen, alles zwischen zwei Topic-Tree-Elementen (getrennt typischerweise durch einen "/") kann man so schreiben: "[^/]+" (entspricht: "Mindestens ein Zeichen, das kein Schrägstrich ist"). Ergänzender Hinweis: Will man z.B. Informationen aus einem beliebigen Teil des Topic-trees extrahieren und als Reading-Namen verwenden, kann dies im Rahmen eines Perl-Aufrufs geschehen. Beispiele aus der mqtt2.template-file: OpenMQTTGateway_BT_scanner und OpenMQTTGateway_BT_gtag (letzteres überführt die Information, über welches Gateway bestimmte Informationen eingegangen ist jeweils in eigene Readings pro Gateway).<br />
<br />
In ''setList'' gelten dagegen die wildcard-Konventionen aus der MQTT-Welt. Dort steht "+" für einen austauschbaren Teil des Topic-Trees (zwischen zwei Schrägstrichen). Anmerkung: Bitte vorher prüfen, ob es wirklich sinnvoll ist, derart unspezifische Publishes vorzunehmen. Meist gibt es "Gruppen-Topics", auf die mehrere Geräte eines bestimmten Typs hören bzw. man kann dies dort (in der firmware bzw. auf den Konfigurationsseiten der Geräte) einstellen.<br />
<br />
=== Die JSON-Daten sollen ausnahmsweise nicht ausgepackt werden ===<br />
In manchen Fällen ist das automatische Auspacken der JSON-Payload nicht erwünscht. In diesen Fällen kann man einfach den gewünschten Reading-Namen in die readingList eintragen, statt der Anweisung, den JSON an json2NameValue() zu übergeben. Aus<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/waypoints:.* { json2nameValue($EVENT) }\<br />
owntracks/clouduser/mi6/event:.* { json2nameValue($EVENT) }<br />
</pre><br />
wird dann:<br />
<pre><br />
attr MQTT_OwnTracks readingList owntracks/clouduser/mi6:.* json_mi6\<br />
owntracks/clouduser/mi6/waypoints:.* json_waypoints\<br />
owntracks/clouduser/mi6/event:.* json_event<br />
</pre><br />
Erforderlichenfalls kann man die Einträge auch doppelt erstellen, um sowohl den JSON wie auch die ausgepackten Readings zu erhalten.<br />
<br />
=== Die JSON-Daten vor dem auspacken manipulieren ===<br />
Aus diversen Gründen kann es zweckmäßig sein, einen bestimmten Wert der JSON-Payload zu ignorieren.<br />
Z.B. sendet ein Client statt eines Messwertes die Info "bad". Dieser Fehlerwert soll aus der JSON-Payload "ausgefiltert" werden:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* { my $rets = json2nameValue($EVENT,'',$JSONMAP);; my %cleaned = map { $_,$rets->{$_} } grep { 'bad' ne $rets->{$_} } keys %{$rets};; return \%cleaned }<br />
</pre><br />
<br />
Oder auch einen Wert umzubenennen wenn die JSON-Payload nur ein Objekt beinhaltet:<br />
<pre><br />
attr DEVICE readingList <your topic>:.* {my %h=(0=>'SofortLaden',1=>'MinPV',2=>'NurPV',3=>'Stop',4=>'Standby');; return {ChargeMode=>$h{$EVENT}}}<br />
</pre><br />
<br />
=== Unnötige Konfigurationsinformationen verwerfen ===<br />
Siehe Einleitung und den [[MQTT2_CLIENT#ignoreRegexp|ignoreRegexp-Abschnitt zu MQTT2_CLIENT]].<br />
<br />
=== Weiterführende Themen ===<br />
==== Verbinden mehrerer FHEM-Instanzen über MQTT ====<br />
Wie im Hauptartikel zu [[MQTT#Kommunikation zu sonstigen FHEM-Geräten über MQTT|MQTT]] erläutert, gibt es mehrere Varianten, wie man mit Hilfe von FHEM aus Events an beliebigen Geräten MQTT-Messages erzeugen kann. So kann man z.B. Messdaten eines Systems über ein ''notify'' iVm. einer einfachen ''publish''-Anweisung an ein zweites FHEM schicken, das diese Daten dann z.B. mit Hilfe der MQTT2-Module auswerten kann.<br />
Damit dabei Nachrichten unterschiedlicher Quellen auch als getrennte Readings bzw. ggf. auch gesonderten MQTT2_DEVICE-Instanzen zugeordnet werden, sollte man entsprechende Topic-Strukturen wählen, die dann auch mit Hilfe einer geeigneten ''bridgeRegexp'' automatisiert ausgewertet werden kann, siehe z.B. dieser {{Link2Forum|Topic=107145|LinkText=Forumsthread}}:<br />
attr MQTT2_myMqttServer bridgeRegexp \<br />
SmartHome/MqttGenericBridge2/([A-Za-z0-9]*)/.*:.* "mgb2_$1"<br />
Dabei werden die betreffenden Informationen der entfernten FHEM-Instanz alle nach dem Schema ''SmartHome/MqttGenericBridge2/<Device-Name>/<Reading-Name>'' versendet.<br />
<br />
==== Umstellung von MQTT_DEVICE (und Derivaten wie XiaomiMQTTDevice) zu MQTT2_DEVICE ====<br />
Wer beabsichtigt, von der Implementierung MQTT+MQTT_DEVICE zu MQTT2-IO und MQTT2_DEVICE zu wechseln, sollte einige Punkte beachten. Viele diesbezügliche Fragen sind vor allem in {{Link2Forum|Topic=103762|LinkText=diesem Foren-Thread}}<br />
<br />
näher erläutert.<br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=91394|LinkText=Thread, aus dem diese Anleitung ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=91807|LinkText=Thread zum Tasmota-Device}}<br />
* {{Link2Forum|Topic=97989|LinkText=Thread, aus dem diese Anleitung für den eBus ursprünglich entstanden ist}}<br />
* {{Link2Forum|Topic=94495|LinkText=Neue templates einreichen}}<br />
* {{Link2Forum|Topic=94494|LinkText=Fragen, Wünsche und Kritik zu mqtt2.template}}<br />
* {{Link2Forum|Topic=116162|LinkText=Der MQTT-Workshop für MQTT2-Module}}<br />
<br />
== Hinweise ==<br />
<references /><br />
[[Kategorie:HOWTOS]]<br />
[[Kategorie:MQTT]]<br />
[[Kategorie:IP Components|IP Komponenten]]<br />
[[Kategorie:Other Components]]<br />
[[Kategorie:Interfaces]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_mit_HTTPS_SSL-Zertifikat_und_eine_eigene_Zertifizierungsstelle&diff=37706FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle2022-11-24T15:23:09Z<p>Sailor: /* Serverzertifikat signieren */ Hinweis eingefuegt</p>
<hr />
<div>== Vorwort ==<br />
=== Dein Anliegen ===<br />
Du möchtest FHEM mit HTTPS betreiben, hasst es aber, ständig von Deinem Browser darauf aufmerksam gemacht zu werden, dass dies "keine sichere Verbindung" ist. <br />
Oder Du möchtest einen weiteren Serverdienst aufsetzen, welcher verschlüsselte SSL oder TLS-Verbindungen anbietet (z.B. HTTPS, POP3S, IMAPS, LDAPS, SMTP mit TLS).<br />
<br />
=== Die Schwierigkeit dabei ===<br />
Um eine mit SSL/TLS abgesicherte Verbindung anzubieten, benötigst Du ein Serverzertifikat. Dieses muss von einer Zertifizierungsstelle (Certification Authority oder kurz CA) signiert sein.<br />
Ein offizielles Serverzertifikat, welches von einer offiziellen Stelle signiert ist, ist leider nicht kostenlos. Meist werden jährliche Gebühren in Höhe von mehreren hundert Euro fällig.<br />
<br />
=== Eine mögliche Lösung ===<br />
Unter Linux kann man mit Bordmitteln eine eigene CA aufsetzen und selbst ein Zertifikate erstellen und signieren. Das ist ein Vorgang von wenigen Minuten. Alle Einzelheiten beschreibt dieser Artikel.<br />
Der einzige Unterschied zu einem von einer anerkannten Stelle signierten Zertifikat ist, dass der Client (Emailprogramm, Browser, etc.) einmalig das root CA importieren muß.<br />
<br />
== Genaues Vorgehen ==<br />
=== OpenSSL installieren ===<br />
Für die Verwaltung der Zertifikate und im übrigen auch für die Verschlüsselung der Verbindungen mit SSL und TLS kommt unter Linux fast immer OpenSSL zum Einsatz. Wahrscheinlich ist das auf Deinem Sytem deshalb bereits installiert, wenn nicht, musst Du das Paket openssl nachinstallieren. Du benötigst aus diesem Paket den Kommandozeilenbefehl openssl.<br />
<br />
=== Erstellen der CA ===<br />
Lege zunächst ein Verzeichnis an, in dem Du das Zertifikat ablegen willst. Wir nehmen in unserem Beispiel /root/ca:<br />
<syntaxhighlight lang="bash"><br />
root@linux# mkdir /root/ca<br />
root@linux# cd /root/ca</syntaxhighlight><br />
Die Gültigkeit setzen wir mit 10 Jahren bewusst sehr hoch an. Läuft die CA aus, so werden nämlich auch alle damit signierten Serverzertifikate ungültig. Die CA enthält einen geheimen Schlüssel, welcher automatisch erzeugt und in der Datei cakey.pem abgelegt wird. Das CA-Zertifikat wird nach cacert.pem geschrieben. Der folgende Befehl erzeugt das einen Schlüssel für das Zertifikat mit einer Länge von 2048 Bit:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 3650<br />
Generating a 2048 bit RSA private key<br />
..............................................................<br />
..............................................................<br />
.........................................+++<br />
......................................+++<br />
writing new private key to 'cakey.pem'</syntaxhighlight><br />
<br />
Wer den geheimen Schlüssel der CA kennt, kann damit beliebige Serverzertifikate signieren. Deshalb wird diese Schlüsseldatei nicht im Klartext auf der Festplatte abgelegt, sondern mit einer Passphrase verschlüsselt. Diese Passphrase benötigst Du immer dann, wenn Du mit der CA neue Zertifikate ausstellen willst:<br />
<nowiki><br />
Enter PEM pass phrase: sehrlangesgeheimespasswort<br />
Verifying - Enter PEM pass phrase: sehrlangesgeheimespasswort</nowiki><br />
Nun werden wir gebeten, Daten einzugeben, welche die CA identifizieren. Diese werden dem Client angezeigt, wenn er aufgefordert wird, das Zertifikat zu akzeptieren oder abzulehnen. Der Code für Deutschland ist DE. Wenn Du ein Feld leer lassen möchtest, so gib einen Punkt ein. Ansonsten wird der in eckigen Klammern stehende Defaultwert eingetragen:<br />
<nowiki><br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [AU]: DE<br />
State or Province Name (full name) [Some-State]:Brandenburg<br />
Locality Name (eg, city) []:Potsdam<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Familie AG<br />
Organizational Unit Name (eg, section) []:EDV</nowiki><br />
Das Feld Common Name (CN) ist hier der offizielle Name der Zertifizierungsstelle. Für Dein eigenes CA kannst Du einfach Deinen eigenen Namen eintragen:<br />
<nowiki><br />
Common Name (eg, YOUR name) []: Cool Tux<br />
Email Address []: cooltux@gmail.tada</nowiki><br />
Fertig. Folgende zwei Dateien sind entstanden:<br />
<nowiki><br />
root@linux# ll<br />
insgesamt 9<br />
drwxr-xr-x 2 root root 112 2006-04-30 12:08 .<br />
drwx------ 12 root root 600 2006-04-30 11:54 ..<br />
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem<br />
-rw-r--r-- 1 root root 963 2006-04-30 12:08 cakey.pem</nowiki><br />
Vorsichtshalber solltest Du die Rechte so setzen, dass die Schlüsseldatei nur für root lesbar ist:<br />
<nowiki><br />
root@linux# chmod 600 cakey.pem</nowiki><br />
Du kannst nun ausprobieren, ob Du den Schlüssel mit der Passphrase wieder öffnen kannst:<br />
<nowiki><br />
root@linux# openssl rsa -in cakey.pem -noout -text<br />
Enter pass phrase for cakey.pem: wrzlprmpft<br />
Private-Key: (1024 bit)<br />
modulus:<br />
00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a:<br />
b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:84:<br />
53:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:46:<br />
58:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04:<br />
cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d:</nowiki><br />
usw...<br />
<br />
=== Schlüssel für das Serverzertifikat erzeugen ===<br />
Nachdem wir nun eine eigene CA haben, kann diese nun endlich für unseren Server ein Zertifikat herausgeben. Dazu erzeugen wir zunächst einen 2048 Bit langen RSA Schlüssel, der mit AES 128 verschlüsselt auf der Platte abgelegt wird (ja wirklich, auch hier wieder ein verschlüsselter Schlüssel). Die Passphrase muss diesmal nicht sonderlich geheim sein, da wir sie ohnehin im Anschluss wieder entfernen werden. OpenSSL lässt allerdings keine leere Phrase zu:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl genrsa -out server-key.pem -aes128 2048<br />
Generating RSA private key, 2048 bit long modulus<br />
....+++<br />
.......................................+++<br />
e is 65537 (0x10001)<br />
Enter pass phrase for server-key.pem: test<br />
Verifying - Enter pass phrase for server-key.pem: test</syntaxhighlight><br />
So. Nun entfernen wir die Passphrase wieder. Warum? Der Serverdienst (Apache, Cyrus, etc.) muss schließlich in der Lage sein, den Schlüssel ohne Dein Zutun zu lesen. Oder möchtest Du bei jedem Booten des Servers ein Passwort eingeben müssen?<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl rsa -in server-key.pem -out server-key.pem<br />
Enter pass phrase for server-key.pem: jaja<br />
writing RSA key</syntaxhighlight><br />
<br />
=== Certificate Signing Request erzeugen ===<br />
Der nächste Schritt zum eigenen Zertifikat ist ein CSR. Dies muss dann nur noch von der CA signiert werden. Hier sind wieder Angaben analog zum Erstellen der CA nötig, was oft Verwirrung stiftet. Die allgemeinen Daten kann man ggfl. gleich wie oben eingeben:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl req -new -key server-key.pem -out req.pem -nodes<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [AU]: DE<br />
State or Province Name (full name) [Some-State]:Brandenburg<br />
Locality Name (eg, city) []:Potsdam<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Familie AG<br />
Organizational Unit Name (eg, section) []:EDV</syntaxhighlight><br />
ACHTUNG, jetzt kommt das Wichtige: Beim Serverzertifikat ist der Common Name von entscheidender Bedeutung. Hier muss der DNS-Name stehen, unter dem der Client den Server anspricht! Wird das Zertifikat für eine HTTPS-Verbindung zu fhem.local verwendet, so muss der Common Name eben genau fhem.local heißen. Anderfalls wird der Browser das Zertifikat nicht akzeptieren, da er davon ausgehen muss, auf dem falschen Server gelandet zu sein.<br />
<nowiki><br />
Common Name (eg, YOUR name) []: fhem.local<br />
Email Address []: admin.fhem.local</nowiki><br />
Weitere Optionen kann man einfach leer lassen:<br />
<nowiki><br />
A challenge password []:<br />
An optional company name []:</nowiki><br />
Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis:<br />
<syntaxhighlight lang="bash"><br />
root@linux# ll<br />
insgesamt 17<br />
drwxr-xr-x 2 root root 168 2006-04-30 12:29 .<br />
drwx------ 12 root root 600 2006-04-30 11:54 ..<br />
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem<br />
-rw------- 1 root root 963 2006-04-30 12:08 cakey.pem<br />
-rw-r--r-- 1 root root 1017 2006-04-30 12:29 req.pem<br />
-rw-r--r-- 1 root root 1679 2006-04-30 12:21 server-key.pem</syntaxhighlight><br />
<br />
=== OpenSSL-Konfiguration anpassen ===<br />
Leider kann man bei OpenSSL nicht alle Daten als Kommandozeilenargumente übergeben. Einige Einstellungen muss man lästigerweise in der Datei /etc/ssl/openssl.cnf ändern, bevor man signieren kann. Öffne diese Datei und passe folgende Zeilen in der Sektion [ CA_default ] an:<br />
<syntaxhighlight lang="bash"><br />
/etc/ssl/openssl.cnf:<br />
dir = . # Where everything is kept<br />
new_certs_dir = $dir # default place for new certs<br />
private_key = $dir/cakey.pem # The private key<br />
RANDFILE = $dir/.rand # private random number file<br />
default_days = 3650 # how long to certify for</syntaxhighlight><br />
Das Feld default_days ist auf 365 Tage voreingestellt und gibt die Gültigkeit des Zertifikates an. Abgelaufene Zertifikate sind im Übrigen ein sehr häufiges Problem. Wenn es soweit ist, kennt sich damit nämlich schon lange keiner mehr aus. Deswegen kannst Du wie im Beispiel angegeben die Lebensdauer z.B. auf 10 Jahre heraufsetzen.<br />
<br />
Nun muss man noch einige Dateien anlegen:<br />
<syntaxhighlight lang="bash"><br />
root@linux# echo 01 > serial<br />
root@linux# touch index.txt</syntaxhighlight><br />
<br />
=== Serverzertifikat signieren ===<br />
Kommen wir zum feierlichen Abschluss: Unsere CA signiert nun das Zertifikat:<br />
<br />
''(Hinweis: Vor Ausführung das Kapitel "Bekannte Probleme" beachten)''<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl ca -in req.pem -notext -out server-cert.pem<br />
Enter pass phrase for ./cakey.pem: langesgeheimespasswort<br />
<br />
...<br />
<br />
Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 days)<br />
Sign the certificate? [y/n]: y<br />
<br />
<br />
1 out of 1 certificate requests certified, commit? [y/n] y<br />
Write out database with 1 new entries<br />
Data Base Updated</syntaxhighlight><br />
<br />
=== Zertifikate installieren ===<br />
Wie Du das Zertifikat in FHEM installierst, findest Du [[Raspberry_Pi_%26_HTTPS|hier]] und wenn Du ein Server Zertifikat für NGINX installieren möchtest, findest Du Infos dazu [[HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver|hier]]<br />
<br />
=== Schlüsselcontainer erstellen ===<br />
Für externe Applikationen wie "owntracks" müssen die erstellten Zertifikate und Keys in einen .p12 - Schlüsselcontainer verpackt werden<syntaxhighlight><br />
root@linux# openssl pkcs12 -export -out server.p12 -in server-cert.pem -inkey server-key.pem<br />
<br />
Enter Export Password:<br />
Verifying - Enter Export Password:<br />
</syntaxhighlight>Das dort vergebene Passwort unbedingt sichern!<br />
<br />
Die Dateien server.p12 sowie die cacert.pem zusammen mit dem vergebenen Passwort für die .p12 Datei , können nun auf der externen Applikation verwendet werden um von extern auf den Server per SSL zugreifen zu können.<br />
<br />
Bitte hierbei unbedingt auch den Punkt unter "Bekannte Probleme" beachten!<br />
<br />
== Nachwort ==<br />
=== Einbinden der root CA in die Zertifizierungsstelle des Browsers ===<br />
Beim Firefox importieren wir unsere cacert.pem unter Einstellungen -> Erweitert -> Zertifikate -> Zertifikate anzeigen -> Zertifizierungsstellen ein.<br />
Unter Chrome/Chromium finden wir die Zertifikatsverwaltung unter Einstellungen -> Erweitert -> Zertifikate verwalten HTTPS/SSL-Zertifikate und -Einstellungen verwalten -> Zertifizierungsstellen<br />
<br />
=== Bekannte Probleme ===<br />
Für den Chrome/Chromium und externen Applikationen wie "owntracks" müssen wir zusätzlich "Subject Alternative Names (SAN)" in unser Zertifikat eintragen. Dies geschieht beim Serverzertifikat signieren. Dazu müssen wir uns eine weitere Datei anlegen:<br />
<syntaxhighlight lang="bash"><br />
root@linux# vim oats.extensions.cnf<br />
<br />
basicConstraints=CA:FALSE<br />
subjectAltName=@my_subject_alt_names<br />
subjectKeyIdentifier = hash<br />
<br />
[ my_subject_alt_names ]<br />
DNS.1 = localhost<br />
DNS.2 = localhost.local<br />
DNS.3 = localhost.fritz.box<br />
<br />
DNS.4 = HomeServer<br />
DNS.5 = HomeServer.local<br />
DNS.6 = HomeServer.fritz.box<br />
<br />
# [Optional] Address of your dynamic DNS subdomain<br />
DNS.7 = homeserver.domain.de<br />
<br />
# IPv4 local host<br />
IP.1 = 127.0.0.1<br />
<br />
# your local IPv4 address of your fhem Server<br />
IP.2 = 192.168.178.200<br />
<br />
# [Optional] IPv6 Link local address of your fhem Server if available<br />
IP.3 = fe80::dea1:dea2:dea3:dead<br />
<br />
# [Optional] local IPv6 address of your fhem Server without network prefix if available<br />
# The difference to the above address is the missing "fe80" reference<br />
IP.4 = ::dea1:dea2:dea3:dead</syntaxhighlight><br />
<br />
Dabei die DNS.x Namen durch die DNS Namen (bzw. IP Addressen) ersetzen, womit man Fhem aufruft.<br />
<br />
Die Signierung unseres Serverzertifikates erfolgt dann mit folgendem Befehl:<br />
<syntaxhighlight lang="bash"><br />
openssl ca -in req.pem -notext -extfile oats.extensions.cnf -out server-cert.pem</syntaxhighlight><br />
<br />
=== Prüfen von Zertifikaten ===<br />
Zertifikate kann man im übrigen auf dieser [https://tools.keycdn.com/ssl| Seite] prüfen lassen.<br />
Dazu kopiert man den Inhalt der server-cert.pem in das Eingabefeld der Seite und klickt dann auf Check.<br />
<br />
[[Kategorie:HOWTOS]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_mit_HTTPS_SSL-Zertifikat_und_eine_eigene_Zertifizierungsstelle&diff=37705FHEM mit HTTPS SSL-Zertifikat und eine eigene Zertifizierungsstelle2022-11-24T15:20:17Z<p>Sailor: /* Schlüssel für das Serverzertifikat erzeugen */ Zusaetzliche Erstellung der .p12 Datei fuer externen Zugriff auf den fhem-Server.</p>
<hr />
<div>== Vorwort ==<br />
=== Dein Anliegen ===<br />
Du möchtest FHEM mit HTTPS betreiben, hasst es aber, ständig von Deinem Browser darauf aufmerksam gemacht zu werden, dass dies "keine sichere Verbindung" ist. <br />
Oder Du möchtest einen weiteren Serverdienst aufsetzen, welcher verschlüsselte SSL oder TLS-Verbindungen anbietet (z.B. HTTPS, POP3S, IMAPS, LDAPS, SMTP mit TLS).<br />
<br />
=== Die Schwierigkeit dabei ===<br />
Um eine mit SSL/TLS abgesicherte Verbindung anzubieten, benötigst Du ein Serverzertifikat. Dieses muss von einer Zertifizierungsstelle (Certification Authority oder kurz CA) signiert sein.<br />
Ein offizielles Serverzertifikat, welches von einer offiziellen Stelle signiert ist, ist leider nicht kostenlos. Meist werden jährliche Gebühren in Höhe von mehreren hundert Euro fällig.<br />
<br />
=== Eine mögliche Lösung ===<br />
Unter Linux kann man mit Bordmitteln eine eigene CA aufsetzen und selbst ein Zertifikate erstellen und signieren. Das ist ein Vorgang von wenigen Minuten. Alle Einzelheiten beschreibt dieser Artikel.<br />
Der einzige Unterschied zu einem von einer anerkannten Stelle signierten Zertifikat ist, dass der Client (Emailprogramm, Browser, etc.) einmalig das root CA importieren muß.<br />
<br />
== Genaues Vorgehen ==<br />
=== OpenSSL installieren ===<br />
Für die Verwaltung der Zertifikate und im übrigen auch für die Verschlüsselung der Verbindungen mit SSL und TLS kommt unter Linux fast immer OpenSSL zum Einsatz. Wahrscheinlich ist das auf Deinem Sytem deshalb bereits installiert, wenn nicht, musst Du das Paket openssl nachinstallieren. Du benötigst aus diesem Paket den Kommandozeilenbefehl openssl.<br />
<br />
=== Erstellen der CA ===<br />
Lege zunächst ein Verzeichnis an, in dem Du das Zertifikat ablegen willst. Wir nehmen in unserem Beispiel /root/ca:<br />
<syntaxhighlight lang="bash"><br />
root@linux# mkdir /root/ca<br />
root@linux# cd /root/ca</syntaxhighlight><br />
Die Gültigkeit setzen wir mit 10 Jahren bewusst sehr hoch an. Läuft die CA aus, so werden nämlich auch alle damit signierten Serverzertifikate ungültig. Die CA enthält einen geheimen Schlüssel, welcher automatisch erzeugt und in der Datei cakey.pem abgelegt wird. Das CA-Zertifikat wird nach cacert.pem geschrieben. Der folgende Befehl erzeugt das einen Schlüssel für das Zertifikat mit einer Länge von 2048 Bit:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 3650<br />
Generating a 2048 bit RSA private key<br />
..............................................................<br />
..............................................................<br />
.........................................+++<br />
......................................+++<br />
writing new private key to 'cakey.pem'</syntaxhighlight><br />
<br />
Wer den geheimen Schlüssel der CA kennt, kann damit beliebige Serverzertifikate signieren. Deshalb wird diese Schlüsseldatei nicht im Klartext auf der Festplatte abgelegt, sondern mit einer Passphrase verschlüsselt. Diese Passphrase benötigst Du immer dann, wenn Du mit der CA neue Zertifikate ausstellen willst:<br />
<nowiki><br />
Enter PEM pass phrase: sehrlangesgeheimespasswort<br />
Verifying - Enter PEM pass phrase: sehrlangesgeheimespasswort</nowiki><br />
Nun werden wir gebeten, Daten einzugeben, welche die CA identifizieren. Diese werden dem Client angezeigt, wenn er aufgefordert wird, das Zertifikat zu akzeptieren oder abzulehnen. Der Code für Deutschland ist DE. Wenn Du ein Feld leer lassen möchtest, so gib einen Punkt ein. Ansonsten wird der in eckigen Klammern stehende Defaultwert eingetragen:<br />
<nowiki><br />
-----<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [AU]: DE<br />
State or Province Name (full name) [Some-State]:Brandenburg<br />
Locality Name (eg, city) []:Potsdam<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Familie AG<br />
Organizational Unit Name (eg, section) []:EDV</nowiki><br />
Das Feld Common Name (CN) ist hier der offizielle Name der Zertifizierungsstelle. Für Dein eigenes CA kannst Du einfach Deinen eigenen Namen eintragen:<br />
<nowiki><br />
Common Name (eg, YOUR name) []: Cool Tux<br />
Email Address []: cooltux@gmail.tada</nowiki><br />
Fertig. Folgende zwei Dateien sind entstanden:<br />
<nowiki><br />
root@linux# ll<br />
insgesamt 9<br />
drwxr-xr-x 2 root root 112 2006-04-30 12:08 .<br />
drwx------ 12 root root 600 2006-04-30 11:54 ..<br />
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem<br />
-rw-r--r-- 1 root root 963 2006-04-30 12:08 cakey.pem</nowiki><br />
Vorsichtshalber solltest Du die Rechte so setzen, dass die Schlüsseldatei nur für root lesbar ist:<br />
<nowiki><br />
root@linux# chmod 600 cakey.pem</nowiki><br />
Du kannst nun ausprobieren, ob Du den Schlüssel mit der Passphrase wieder öffnen kannst:<br />
<nowiki><br />
root@linux# openssl rsa -in cakey.pem -noout -text<br />
Enter pass phrase for cakey.pem: wrzlprmpft<br />
Private-Key: (1024 bit)<br />
modulus:<br />
00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a:<br />
b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:84:<br />
53:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:46:<br />
58:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04:<br />
cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d:</nowiki><br />
usw...<br />
<br />
=== Schlüssel für das Serverzertifikat erzeugen ===<br />
Nachdem wir nun eine eigene CA haben, kann diese nun endlich für unseren Server ein Zertifikat herausgeben. Dazu erzeugen wir zunächst einen 2048 Bit langen RSA Schlüssel, der mit AES 128 verschlüsselt auf der Platte abgelegt wird (ja wirklich, auch hier wieder ein verschlüsselter Schlüssel). Die Passphrase muss diesmal nicht sonderlich geheim sein, da wir sie ohnehin im Anschluss wieder entfernen werden. OpenSSL lässt allerdings keine leere Phrase zu:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl genrsa -out server-key.pem -aes128 2048<br />
Generating RSA private key, 2048 bit long modulus<br />
....+++<br />
.......................................+++<br />
e is 65537 (0x10001)<br />
Enter pass phrase for server-key.pem: test<br />
Verifying - Enter pass phrase for server-key.pem: test</syntaxhighlight><br />
So. Nun entfernen wir die Passphrase wieder. Warum? Der Serverdienst (Apache, Cyrus, etc.) muss schließlich in der Lage sein, den Schlüssel ohne Dein Zutun zu lesen. Oder möchtest Du bei jedem Booten des Servers ein Passwort eingeben müssen?<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl rsa -in server-key.pem -out server-key.pem<br />
Enter pass phrase for server-key.pem: jaja<br />
writing RSA key</syntaxhighlight><br />
<br />
=== Certificate Signing Request erzeugen ===<br />
Der nächste Schritt zum eigenen Zertifikat ist ein CSR. Dies muss dann nur noch von der CA signiert werden. Hier sind wieder Angaben analog zum Erstellen der CA nötig, was oft Verwirrung stiftet. Die allgemeinen Daten kann man ggfl. gleich wie oben eingeben:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl req -new -key server-key.pem -out req.pem -nodes<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter '.', the field will be left blank.<br />
-----<br />
Country Name (2 letter code) [AU]: DE<br />
State or Province Name (full name) [Some-State]:Brandenburg<br />
Locality Name (eg, city) []:Potsdam<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Familie AG<br />
Organizational Unit Name (eg, section) []:EDV</syntaxhighlight><br />
ACHTUNG, jetzt kommt das Wichtige: Beim Serverzertifikat ist der Common Name von entscheidender Bedeutung. Hier muss der DNS-Name stehen, unter dem der Client den Server anspricht! Wird das Zertifikat für eine HTTPS-Verbindung zu fhem.local verwendet, so muss der Common Name eben genau fhem.local heißen. Anderfalls wird der Browser das Zertifikat nicht akzeptieren, da er davon ausgehen muss, auf dem falschen Server gelandet zu sein.<br />
<nowiki><br />
Common Name (eg, YOUR name) []: fhem.local<br />
Email Address []: admin.fhem.local</nowiki><br />
Weitere Optionen kann man einfach leer lassen:<br />
<nowiki><br />
A challenge password []:<br />
An optional company name []:</nowiki><br />
Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis:<br />
<syntaxhighlight lang="bash"><br />
root@linux# ll<br />
insgesamt 17<br />
drwxr-xr-x 2 root root 168 2006-04-30 12:29 .<br />
drwx------ 12 root root 600 2006-04-30 11:54 ..<br />
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem<br />
-rw------- 1 root root 963 2006-04-30 12:08 cakey.pem<br />
-rw-r--r-- 1 root root 1017 2006-04-30 12:29 req.pem<br />
-rw-r--r-- 1 root root 1679 2006-04-30 12:21 server-key.pem</syntaxhighlight><br />
<br />
=== OpenSSL-Konfiguration anpassen ===<br />
Leider kann man bei OpenSSL nicht alle Daten als Kommandozeilenargumente übergeben. Einige Einstellungen muss man lästigerweise in der Datei /etc/ssl/openssl.cnf ändern, bevor man signieren kann. Öffne diese Datei und passe folgende Zeilen in der Sektion [ CA_default ] an:<br />
<syntaxhighlight lang="bash"><br />
/etc/ssl/openssl.cnf:<br />
dir = . # Where everything is kept<br />
new_certs_dir = $dir # default place for new certs<br />
private_key = $dir/cakey.pem # The private key<br />
RANDFILE = $dir/.rand # private random number file<br />
default_days = 3650 # how long to certify for</syntaxhighlight><br />
Das Feld default_days ist auf 365 Tage voreingestellt und gibt die Gültigkeit des Zertifikates an. Abgelaufene Zertifikate sind im Übrigen ein sehr häufiges Problem. Wenn es soweit ist, kennt sich damit nämlich schon lange keiner mehr aus. Deswegen kannst Du wie im Beispiel angegeben die Lebensdauer z.B. auf 10 Jahre heraufsetzen.<br />
<br />
Nun muss man noch einige Dateien anlegen:<br />
<syntaxhighlight lang="bash"><br />
root@linux# echo 01 > serial<br />
root@linux# touch index.txt</syntaxhighlight><br />
<br />
=== Serverzertifikat signieren ===<br />
Kommen wir zum feierlichen Abschluss: Unsere CA signiert nun das Zertifikat:<br />
<syntaxhighlight lang="bash"><br />
root@linux# openssl ca -in req.pem -notext -out server-cert.pem<br />
Enter pass phrase for ./cakey.pem: langesgeheimespasswort<br />
<br />
...<br />
<br />
Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 days)<br />
Sign the certificate? [y/n]: y<br />
<br />
<br />
1 out of 1 certificate requests certified, commit? [y/n] y<br />
Write out database with 1 new entries<br />
Data Base Updated</syntaxhighlight><br />
<br />
=== Zertifikate installieren ===<br />
Wie Du das Zertifikat in FHEM installierst, findest Du [[Raspberry_Pi_%26_HTTPS|hier]] und wenn Du ein Server Zertifikat für NGINX installieren möchtest, findest Du Infos dazu [[HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver|hier]]<br />
<br />
=== Schlüsselcontainer erstellen ===<br />
Für externe Applikationen wie "owntracks" müssen die erstellten Zertifikate und Keys in einen .p12 - Schlüsselcontainer verpackt werden<syntaxhighlight><br />
root@linux# openssl pkcs12 -export -out server.p12 -in server-cert.pem -inkey server-key.pem<br />
<br />
Enter Export Password:<br />
Verifying - Enter Export Password:<br />
</syntaxhighlight>Das dort vergebene Passwort unbedingt sichern!<br />
<br />
Die Dateien server.p12 sowie die cacert.pem zusammen mit dem vergebenen Passwort für die .p12 Datei , können nun auf der externen Applikation verwendet werden um von extern auf den Server per SSL zugreifen zu können.<br />
<br />
Bitte hierbei unbedingt auch den Punkt unter "Bekannte Probleme" beachten!<br />
<br />
== Nachwort ==<br />
=== Einbinden der root CA in die Zertifizierungsstelle des Browsers ===<br />
Beim Firefox importieren wir unsere cacert.pem unter Einstellungen -> Erweitert -> Zertifikate -> Zertifikate anzeigen -> Zertifizierungsstellen ein.<br />
Unter Chrome/Chromium finden wir die Zertifikatsverwaltung unter Einstellungen -> Erweitert -> Zertifikate verwalten HTTPS/SSL-Zertifikate und -Einstellungen verwalten -> Zertifizierungsstellen<br />
<br />
=== Bekannte Probleme ===<br />
Für den Chrome/Chromium und externen Applikationen wie "owntracks" müssen wir zusätzlich "Subject Alternative Names (SAN)" in unser Zertifikat eintragen. Dies geschieht beim Serverzertifikat signieren. Dazu müssen wir uns eine weitere Datei anlegen:<br />
<syntaxhighlight lang="bash"><br />
root@linux# vim oats.extensions.cnf<br />
<br />
basicConstraints=CA:FALSE<br />
subjectAltName=@my_subject_alt_names<br />
subjectKeyIdentifier = hash<br />
<br />
[ my_subject_alt_names ]<br />
DNS.1 = localhost<br />
DNS.2 = localhost.local<br />
DNS.3 = localhost.fritz.box<br />
<br />
DNS.4 = HomeServer<br />
DNS.5 = HomeServer.local<br />
DNS.6 = HomeServer.fritz.box<br />
<br />
# [Optional] Address of your dynamic DNS subdomain<br />
DNS.7 = homeserver.domain.de<br />
<br />
# IPv4 local host<br />
IP.1 = 127.0.0.1<br />
<br />
# your local IPv4 address of your fhem Server<br />
IP.2 = 192.168.178.200<br />
<br />
# [Optional] IPv6 Link local address of your fhem Server if available<br />
IP.3 = fe80::dea1:dea2:dea3:dead<br />
<br />
# [Optional] local IPv6 address of your fhem Server without network prefix if available<br />
# The difference to the above address is the missing "fe80" reference<br />
IP.4 = ::dea1:dea2:dea3:dead</syntaxhighlight><br />
<br />
Dabei die DNS.x Namen durch die DNS Namen (bzw. IP Addressen) ersetzen, womit man Fhem aufruft.<br />
<br />
Die Signierung unseres Serverzertifikates erfolgt dann mit folgendem Befehl:<br />
<syntaxhighlight lang="bash"><br />
openssl ca -in req.pem -notext -extfile oats.extensions.cnf -out server-cert.pem</syntaxhighlight><br />
<br />
=== Prüfen von Zertifikaten ===<br />
Zertifikate kann man im übrigen auf dieser [https://tools.keycdn.com/ssl| Seite] prüfen lassen.<br />
Dazu kopiert man den Inhalt der server-cert.pem in das Eingabefeld der Seite und klickt dann auf Check.<br />
<br />
[[Kategorie:HOWTOS]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI_v3&diff=37207FHEM Tablet UI v32022-02-07T15:06:14Z<p>Sailor: FTUI3 die erste Fassung</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Oberfläche für FHEM v3<br />
|ModType=x<br />
|ModFTopic=115259<br />
|ModForumArea=TabletUI<br />
|ModTechName=n.a.<br />
|ModOwner=setstate ({{Link2FU|7023|Forum}})<br />
}}<br />
[[FHEM Tablet UI v3]] (FTUI3) ist ein funktionsreiches Frontend-Framework zum Steuern und Überwachen von in FHEM integrierten Geräten. Es basiert auf HTML/CSS/JavaScript und stellt somit keine zusätzlichen Anforderungen an den FHEM-Server. Es ist die Nachfolgeversion von FHEM Tablet UI v2 aber nicht abwärtskompatibel. Ein Umstieg auf FTUI3 hat eine Neu-Programmierung der Oberfläche zur Folge.<br />
<br />
Mit Hilfe zahlreicher Komponenten, die sehr leicht mit HTML Code konfiguriert werden können, ist es möglich, innerhalb kurzer Zeit ein den eigenen Wünschen entsprechendes User-Interface aufzubauen.<br />
<br />
== Installation ==<br />
Die Installation von FHEM Tablet UI v3 (FTUI3) erzeugt keinen großen Aufwand und besteht im Großen und Ganzen aus zwei Schritten:<br />
*Dateien aus dem GitHub-Repository herunterladen<br />
*Eine Beispieldatei anlegen<br />
<br />
{{Hinweis|Diese Anleitung geht davon aus, dass FHEM unter Debian nach der Anleitung [https://debian.fhem.de Stable build using apt] installiert wurde.<br />
Ist dies nicht der Fall, muss der Pfad '''/opt/fhem''' dementsprechend angepasst werden.}}<br />
<br />
<br />
'''1.''' Zuerst müssen alle Dateien von FHEM Tablet UI in das FHEM-Verzeichnis '''/opt/fhem/www/ftui''' kopiert werden. Das geht mit folgendem '''update'''-Befehl über die FHEM-Befehlszeile.<br />
:<code>update all https://raw.githubusercontent.com/knowthelist/ftui/master/controls_ftui.txt</code><br />
<br />
:[[Datei:FTUI3_Installation_01.png|thumb|none|Schritt 1: Dateien kopieren]]<br />
<br />
<br />
{{FTUI3 kann in weiterer Folge unter der URL '''<nowiki>http(s)://<fhem-server>:8083/fhem/ftui/index.html</nowiki>''' aufgerufen werden.<br />
<br />
'''2.''' Damit FHEM Tablet UI mit FHEM kommunizieren kann, ist noch die '''longpoll'''-Einstellung im [[FHEMWEB]] Device festzulegen.<br />
<br />
:<code>attr WEB longpoll websocket</code><br />
:bzw. bei Problemen mit ''websocket''<br />
:<code>attr WEB longpoll 1</code><br />
<br />
:[[Datei:FTUI3_Installation_03.png|thumb|none|Schritt 3: longpoll einstellen]]<br />
<br />
<br />
'''3.''' Weil FTUI noch nichts anzuzeigen hat, wird die Datei '''/opt/fhem/www/ftui/index-example.html''' nach '''/opt/fhem/www/ftui/index.html''' kopiert.<br />
:<code>sudo cp -a /opt/fhem/www/ftui/index-example.html /opt/fhem/www/ftui/index.html</code><br />
<br />
:[[Datei:FTUI3_Installation_04.png|thumb|none|Schritt 4: index.html erstellen]]<br />
<br />
<br />
'''4.''' Abschließend muss FHEM noch '''neu gestartet''' werden (''shutdown restart'') da das Attribut '''longpoll''' geändert wurde.<br />
<br />
<br />
Somit ist FHEM Tablet UI bereit zur Verwendung und kann durch Aufruf der URL '''<nowiki>http://<fhem-server>:8083/fhem/ftui/</nowiki>''' oder den Link im FHEM-Menü geöffnet werden<br />
<br />
== Update ==<br />
Ein Update von FTUI kann ebenfalls über die FHEM-Kommandozeile erfolgen.<br />
<br />
'''1.''' Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von:<br />
:<code><nowiki>update check https://raw.githubusercontent.com/knowthelist/ftui/master/controls_ftui.txt</nowiki></code><br />
<br />
<br />
'''2.''' Update der geänderten Dateien durch Eingabe von:<br />
:<code><nowiki>update all https://raw.githubusercontent.com/knowthelist/ftui/master/controls_ftui.txt</nowiki></code><br />
<br />
<br />
Eine weitere Option ist das Hinzufügen des FTUI-Git-Repositories zum allgemeinem Update-Vorgang von FHEM. Dabei wird dann bei einem FHEM-Update auch gleich FHEM Tablet UI aktualisiert, bzw. die Änderungen angezeigt.<br />
:<code><nowiki>update add https://raw.githubusercontent.com/knowthelist/ftui/master/controls_ftui.txt</nowiki></code><br />
<br />
Beachte: Das Ergebnis des o.g. Befehls wird in FHEM/controls.txt eingetragen, siehe auch [[Update#update_add]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&diff=37206FHEM Tablet UI2022-02-07T14:36:24Z<p>Sailor: Versionsnummer eingefuegt</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Oberfläche für FHEM<br />
|ModType=x<br />
|ModFTopic=34233<br />
|ModForumArea=TabletUI<br />
|ModTechName=n.a.<br />
|ModOwner=setstate ({{Link2FU|7023|Forum}})<br />
}}<br />
[[FHEM Tablet UI v2]] (FTUI2) ist ein leichtgewichtiges aber funktionsreiches Frontend-Framework zum Steuern und Überwachen von in FHEM integrierten Geräten. Es basiert auf HTML/CSS/JavaScript und stellt somit keine zusätzlichen Anforderungen an den FHEM-Server.<br />
<br />
Mit Hilfe zahlreicher Widgets, die sehr leicht mit HTML Code konfiguriert werden können, ist es möglich, innerhalb kurzer Zeit ein den eigenen Wünschen entsprechendes User-Interface aufzubauen.<br />
<br />
Für den Betrieb ist nur eine FHEM-Installation mit [[HTTPSRV|HTTPSRV-Modul]] sowie ein gängiger Webbrowser notwendig.<br />
<br />
Mit wenigen Anpassungen ist es auch möglich, das UI auf anderen Webservern (Apache, u.a.) zu betreiben. Somit können FHEM und FHEM Tablet UI auch auf getrennten Systemen ausgeführt werden.<br />
<br />
[[File:tablet_ui.png|thumb|500px|center|Beispiel für ein mit [[FHEM Tablet UI]] erstelltes User-Interface]]<br />
<br />
{{Todo|Design-Möglichkeiten erklären, Navigationsmethoden ausformulieren}} <br />
<br />
== Installation ==<br />
Die Installation von FHEM Tablet UI v2 erzeugt keinen großen Aufwand und besteht im Großen und Ganzen aus drei Schritten:<br />
*Dateien aus dem GitHub-Repository herunterladen<br />
*FHEM konfigurieren ([[HTTPSRV]]-Device erstellen, [[FHEMWEB]]-Attribut longpoll einstellen)<br />
*Eine Beispieldatei anlegen<br />
<br />
<br />
{{Hinweis|Diese Anleitung geht davon aus, dass FHEM unter Debian nach der Anleitung [https://debian.fhem.de Stable build using apt] installiert wurde.<br />
Ist dies nicht der Fall, muss der Pfad '''/opt/fhem''' dementsprechend angepasst werden.}}<br />
<br />
<br />
'''1.''' Zuerst müssen alle Dateien von FHEM Tablet UI in das FHEM-Verzeichnis '''/opt/fhem/www''' kopiert werden. Das geht mit folgendem '''update'''-Befehl über die FHEM-Befehlszeile.<br />
:<code>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</code><br />
<br />
:[[Datei:FTUI_Installation_01.png|thumb|none|Schritt 1: Dateien kopieren]]<br />
<br />
<br />
'''2.''' Anschließend ist ein neues [[HTTPSRV]]-Device in FHEM anzulegen, welches auf den Ordner mit den gerade heruntergeladenen Dateien verweist.<br />
:<code>define TABLETUI HTTPSRV ftui/ ./www/tablet/ Tablet-UI</code><br />
<br />
:[[Datei:FTUI_Installation_02.png|thumb|none|Schritt 2: HTTPSRV-Device anlegen]]<br />
<br />
{{Hinweis|Dieser Schritt kann ausgelassen werden, wenn die Funktionalitäten von [[FHEMWEB]] ausreichend sind. Dann muss FTUI aber in weiterer Folge unter der URL '''<nowiki>http(s)://<fhem-server>:8083/fhem/tablet/index.html</nowiki>''' aufgerufen werden und es wird kein Link auf FTUI in der FHEM GUI erstellt. Vorteil ist aber, dass das FHEMWEB-Caching verwendet werden kann. Siehe dieser {{Link2Forum|Topic=86362|Message=788258}}.}}<br />
<br />
'''3.''' Damit FHEM Tablet UI mit FHEM kommunizieren kann, ist noch die '''longpoll'''-Einstellung im [[FHEMWEB]] Device festzulegen.<br />
<br />
:<code>attr WEB longpoll websocket</code><br />
:bzw. bei Problemen mit ''websocket''<br />
:<code>attr WEB longpoll 1</code><br />
<br />
:[[Datei:FTUI_Installation_03.png|thumb|none|Schritt 3: longpoll einstellen]]<br />
<br />
<br />
'''4.''' Weil FTUI noch nichts anzuzeigen hat, wird die Datei '''/opt/fhem/www/tablet/index-example.html''' nach '''/opt/fhem/www/tablet/index.html''' kopiert.<br />
:<code>sudo cp -a /opt/fhem/www/tablet/index-example.html /opt/fhem/www/tablet/index.html</code><br />
<br />
:[[Datei:FTUI_Installation_04.png|thumb|none|Schritt 4: index.html erstellen]]<br />
<br />
<br />
'''5.''' Abschließend muss FHEM noch '''neu gestartet''' werden (''shutdown restart'') da das Attribut '''longpoll''' geändert wurde.<br />
<br />
<br />
Somit ist FHEM Tablet UI bereit zur Verwendung und kann durch Aufruf der URL '''<nowiki>http://<fhem-server>:8083/fhem/ftui/</nowiki>''' oder den Link im FHEM-Menü geöffnet werden<br />
<br />
== Update ==<br />
Ein Update von FTUI kann ebenfalls über die FHEM-Kommandozeile erfolgen.<br />
<br />
'''1.''' Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von:<br />
:<code><nowiki>update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
<br />
'''2.''' Update der geänderten Dateien durch Eingabe von:<br />
:<code><nowiki>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
<br />
Eine weitere Option ist das Hinzufügen des FTUI-Git-Repositories zum allgemeinem Update-Vorgang von FHEM. Dabei wird dann bei einem FHEM-Update auch gleich FHEM Tablet UI aktualisiert, bzw. die Änderungen angezeigt.<br />
:<code><nowiki>update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
Beachte: Das Ergebnis des o.g. Befehls wird in FHEM/controls.txt eingetragen, siehe auch [[Update#update_add]]<br />
<br />
== Konfiguration ==<br />
===DOCTYPE===<br />
In allen HTML-Dateien, die im Browser geladen werden und das typische HTML-Gerüst besitzen (also alle Hauptseiten, jedoch keine Template-Dateien), sollte eine ''Document Type Declaration'' (DTDT) eingefügt werden. Mit ihr wird festgelegt, welche ''Document Type Definition'' hier verwendet wird (das kommt aus der Metasprache XML), konkret also, in welcher Version der nachfolgende HTML-Code vom Browser interpretiert werden soll. Lässt man die DTDT weg, oder definiert sie auf verschiedenen Seiten unterschiedlich, kann ein und der selbe HTML-Code zu unterschiedlichen Darstellungen führen. Die DTDT erfolgt immer auf der ersten Zeile, noch vor dem <code><html></code>-Tag. Nachfolgend wird HTML5 verwendet.<br />
<br />
<syntaxhighlight lang="html"><br />
<!DOCTYPE html><br />
<html><br />
<head>...</head><br />
<body>...</body><br />
</html><br />
</syntaxhighlight><br />
<br />
===META-Parameter===<br />
Das Tablet UI lässt sich über die META-Parameter konfigurieren. Diese Parameter sind in jeder '''.html''' Datei (z.B. index.html) im Abschnitt '''<head>''' einzutragen. Ausgenommen davon sind Dateien, die als Template, Pagebutton-Zielseiten oder ähnliches eingebunden werden.<br />
<br />
Die Parameter sind immer nach diesem Schema aufgebaut:<br />
<meta name="[Parameter-Name]" content="[Parameter-Wert]"><br />
<br />
===Verbindung zu FHEM===<br />
{| class="wikitable"<br />
|-<br />
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung<br />
|-<br />
|web_device||WEB||String||FHEM-Device, welches für das Polling verwendet wird<br />
|-<br />
|longpoll||1||0, 1||<br />
'''0''': Longpoll deaktiviert; alle 30s ein Shortpoll (Neuladen der gesamten Statusänderungen)<br />
<br />
'''1''': Longpoll aktiv; geänderte Stati werden sofort aktualisiert, zusätzlich werden alle 15min die gesamten Statusänderungen geladen.<br />
|-<br />
|longpoll_type||websocket||websocket, ajax, 0||<br />
'''websocket''': Für die Aktualisierung der Daten wird das Websocket-Protokoll verwendet. Werden vom Browser keine Websockets unterstützt, gibt es einen automatischen Fallback auf Ajax.<br />
<br />
'''ajax''': Ajax wird für die Aktualisierung verwendet.<br />
<br />
'''0''': Longpoll deaktiviert, Shortpoll wird verwendet.<br />
|-<br />
|longpoll_filter||.*||RegEx||Event-Filter. Kann verwendet werden, wenn z.B. Devices, die in FTUI angezeigt werden, in einem eigenen FHEM-Room sind.<br />
|-<br />
|longpoll_maxage||240||Integer||Kommen in diesem Zeitraum (Sekunden) keine Longpoll-Events bei FTUI an, wird die Verbindung als "disconnected" angesehen und ein neuer Verbindungsversuch wird gestartet.<br />
|-<br />
|shortpoll_interval||900||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet<br />
|-<br />
|shortpoll_only_interval||30||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet, sollte Longpoll deaktiviert sein<br />
|-<br />
|fhemweb_url||/fhem/||Integer||URL zu FHEM. Wird benötigt wenn FTUI auf einem anderen als dem FHEM Server läuft oder nicht im Standard-Pfad installiert ist. <br />
Hinweis: Wenn FHEM auf einem anderem Server/Domain läuft muss man das "CORS" Attribut im FHEMWEB Modul (s.o.) auf 1 setzen, sonst bekommt man Cross Origin Fehler. <br />
|}<br />
<br />
===Funktionalität===<br />
{| class="wikitable"<br />
|-<br />
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung<br />
|-<br />
|debug||0||0 - 5||Log-Level<br />
|-<br />
|toast||5||Integer||Anzahl an gleichzeitig angezeigten Toast-Nachrichten. Um keine anzuzeigen, ist der Wert auf 0 zu setzen.<br />
|-<br />
|toast_position||bottom-left||||Position im Browserfenster, wo die Toast-Nachrichten angezeigt werden.<br />
|-<br />
|lang||de||de||Sprache der Oberfläche (für z.B. Datums-/Zeitfunktionen)<br />
|-<br />
|username||||String||Benutzername für eine Basic-Authentifierung *<br />
|-<br />
|password||||String||Passwort für eine Basic-Authentifizierung *<br />
|}<br />
'''*''' Derzeit wird die Basic-Authentifizierung in Kombination mit WebSockets nicht unterstützt. Die Verwendung von '''longpoll=1''' (ajax) ist daher notwendig.<br />
<br />
===Toast-Nachrichten===<br />
[[Datei:Ftui_toast.png|thumb|Toast-Nachrichten]]<br />
Tablet-UI liefert Informationen darüber, was im Moment gerade passiert. Das geschieht über Toast-Nachrichten, die in der Standardeinstellung unten links im Browser auftauchen.<br />
<br />
Wird beispielsweise ein Gerät eingeschaltet, so erscheint eine kleine Nachricht mit dem abgesetzten Befehl. Auch Fehlermeldungen und Statusinformationen werden angezeigt. Ob überhaupt und was konkret angezeigt wird, richtet sich nach dem eingestellten Debug-Level (siehe oben). Beim Debug-Level 5 werden alle Nachrichten angezeigt, bei 0 keine.<br />
<br />
Die Position der Toast-Nachrichten kann über den Meta-Tag <code>meta name='toast_position'</code> festgelegt werden. Für oben-mittig müsste folgender Code eingefügt werden:<br />
<pre><meta name='toast_position' content='top-center'></pre><br />
<br />
Möglich sind folgende Positionen:<br />
* <code>top-left</code><br />
* <code>top-right</code><br />
* <code>bottom-left</code><br />
* <code>bottom-right</code><br />
* <code>top-center</code><br />
* <code>bottom-center</code><br />
* <code>mid-center</code><br />
<br />
Die maximale Anzahl an Nachrichten, die gleichzeitig angezeigt werden können, lässt sich mit <code>meta name='toast'</code> Sind maximal 2 Nachrichten gewünscht, muss folgender Meta-Tag gesetzt werden:<br />
<pre><meta name='toast' content='2'></pre><br />
<br />
==Navigationsmethoden==<br />
{{Todo|Dieser Abschnitt dient derzeit lediglich als Sammlung von Stichpunkten und muss vollständig überarbeitet werden.}} <br />
<br />
'''Unterschied zwischen Pagetab und Pagebutton:'''<br />
<br />
'''Pagetab:''' Ganze Seite austauschen -> Menü muss auf jede Seite<br />
[[FTUI_Widget_Pagetab]]<br />
<br />
'''Pagebutton:''' Teil der Seite austauschen -> Menü nur in erster Seite<br />
[[FTUI_Widget_Pagebutton]]<br />
<br />
'''Pagelink:''' damit kann man beliebige Widgets kapseln und vorhandene Pagebutton-Seiten ansteuern <br />
[[FTUI Widget Link]]<br />
<br />
==Gestaltung==<br />
===Layout-Optionen===<br />
* [[FTUI Layout Gridster|Gridster]]<br />
* [[FTUI Layout Flex|Flex]]<br />
* [[FTUI Layout Sheet|Tabelle]]<br />
* [[FTUI Layout Row|Reihen]]<br />
<br />
=== Farben ===<br />
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form, als RGB-Wert oder mit dem Farbnamen anzugeben. Zum Beispiel: <br />
<br />
*HEX: #ADD8E6<br />
*RBG: rgb(173, 216, 230)<br />
*Namen: lightblue<br />
<br />
Knallige Farben wie '''<span style="color: #ff0000;">#ff0000</span>''' für Rot oder '''<span style="color: #00ff00;">#00ff00</span>''' für Grün sollten vermieden werden.<br />
Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.<br />
<br />
Empfohlene Farben sind z.B.:<br />
<br />
*Orange: <span style="color: #aa6900;">#aa6900</span><br />
*Rot: <span style="color: #ad3333;">#ad3333</span><br />
*Grün: <span style="color: #32a054;">#32a054</span><br />
*Blau: <span style="color: #6699FF;">#6699FF</span><br />
*Grau: <span style="color: #8C8C8C;">#8C8C8C</span><br />
<br />
Hilfreich bei der Suche nach den Farbwerten ist zum Beispiel der Color-Picker auf dieser Seite: http://www.colorpicker.com. Für die Suche nach Farben, die einen guten Kontrast bilden, diese Webseite: http://vanisoft.pl/~lopuszanski/public/colors/<br />
<br />
Im Ordner ''css'' der FTUI Installation finden sich einige vorbereitete Farbschemata. Diese können mit einem zusätzlichen Eintrag im <nowiki><head></nowiki>-Bereich der FTUI-Seite(n) aktiviert werden.<br />
<br />
Hier am Beispiel eines blauen Farbschemas:<br />
<syntaxhighlight lang="html"><br />
<html><br />
<head><br />
[...]<br />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-blue-ui.css" /><br />
[...]<br />
</head><br />
</syntaxhighlight><br />
<br />
Diese Schema-Dateien ändern alle Widgets. <br />
<gallery><br />
File:Theme_default.png|default<br />
File:Theme_blue.png|fhem-blue-ui.css<br />
File:Theme_green.png|fhem-green-ui.css<br />
File:Theme_mobile.png|fhem-mobile-ui.css<br />
File:Theme_darkblue.png|fhem-darkblue-ui.css<br />
File:Theme_darkgreen.png|fhem-darkgreen-ui.css<br />
</gallery><br />
<br />
Einzelne Widgets können durch Hinzufügen der jeweiligen [[#CSS-Klassen|CSS-Klasse]] geändert werden.<br />
<br />
===CSS-Styles===<br />
Das Layout und das Aussehen des UI kann durch diverse vorgegebene CSS-Klassen beeinflusst werden. Die verfügbaren Klassen sind im Abschnitt [[#CSS-Klassen|CSS-Klassen]] aufgeführt.<br />
<br />
Soll das Aussehen des UI durch eigene CSS-Klassen oder durch Überschreiben der vorhandenen verändert werden, kann eine eigene CSS-Datei erstellt werden, die dann bei einem eventuellen Update von FTUI nicht überschrieben wird. Diese Datei muss den Dateinamen '''fhem-tablet-ui-user.css''' haben und im Ordner '''/fhem/tablet/css''' abgelegt werden. Sie wird dann beim Aufruf von FTUI automatisch mitgeladen.<br />
<br />
=== CSS-Klassen ===<br />
Nicht alle Widgets unterstützen alle hier angegebenen Klassen. Welche genau unterstützt werden, kann auf der jeweiligen Widget-Seite nachgelesen werden.<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |sheet/row/cell-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|sheet}}{{FTUI Klasse|row}}{{FTUI Klasse|cell}}{{FTUI Klasse|cell-1-x}}{{FTUI Klasse|cell-x}}{{FTUI Klasse|left-align}}{{FTUI Klasse|right-align}}{{FTUI Klasse|bottom-align}}{{FTUI Klasse|top-align}}{{FTUI Klasse|center-align}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |row/col-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|col}}{{FTUI Klasse|col-1-x}}{{FTUI Klasse|col-x}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |hbox/vbox-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|vbox}}{{FTUI Klasse|hbox}}{{FTUI Klasse|card}}{{FTUI Klasse|phone-width}}{{FTUI Klasse|full-height}}{{FTUI Klasse|full-width}}{{FTUI Klasse|grow-0}}{{FTUI Klasse|grow-1}}{{FTUI Klasse|grow-2}}{{FTUI Klasse|grow-x}}{{FTUI Klasse|items-top}}{{FTUI Klasse|items-center}}{{FTUI Klasse|items-bottom}}{{FTUI Klasse|items-space-between}}{{FTUI Klasse|items-space-around}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Generelle Klassen für die Positionierung<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|inline}}{{FTUI Klasse|newline}}{{FTUI Klasse|top-space}}{{FTUI Klasse|top-space-2x}}{{FTUI Klasse|top-space-3x}}{{FTUI Klasse|left-space}}{{FTUI Klasse|left-space-2x}}{{FTUI Klasse|left-space-3x}}{{FTUI Klasse|right-space}}{{FTUI Klasse|right-space-2x}}{{FTUI Klasse|right-space-3x}}{{FTUI Klasse|top-narrow}}{{FTUI Klasse|top-narrow-2x}}{{FTUI Klasse|top-narrow-10}}{{FTUI Klasse|left-narrow}}{{FTUI Klasse|left-narrow-2x}}{{FTUI Klasse|left-narrow-3x}}{{FTUI Klasse|right-narrow}}{{FTUI Klasse|right-narrow-2x}}{{FTUI Klasse|right-narrow-3x}}{{FTUI Klasse|centered}}{{FTUI Klasse|wider}}{{FTUI Klasse|narrow}}{{FTUI Klasse|fullsize}}{{FTUI Klasse|compressed}}{{FTUI Klasse|height-narrow}}{{FTUI Klasse|w1x}}{{FTUI Klasse|w2x}}{{FTUI Klasse|w3x}}{{FTUI Klasse|maxw40}}{{FTUI Klasse|doublebox-v}}{{FTUI Klasse|doublebox-h}}{{FTUI Klasse|triplebox-v}}{{FTUI Klasse|right}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Vordergrundfarben<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|red}}{{FTUI Klasse|green}}{{FTUI Klasse|blue}}{{FTUI Klasse|lightblue}}{{FTUI Klasse|orange}}{{FTUI Klasse|gray}}{{FTUI Klasse|lightgray}}{{FTUI Klasse|white}}{{FTUI Klasse|black}}{{FTUI Klasse|mint}}{{FTUI Klasse|yellow}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Hintergrundfarben<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|bg-red}}{{FTUI Klasse|bg-green}}{{FTUI Klasse|bg-blue}}{{FTUI Klasse|bg-lightblue}}{{FTUI Klasse|bg-orange}}{{FTUI Klasse|bg-gray}}{{FTUI Klasse|bg-lightgray}}{{FTUI Klasse|bg-white}}{{FTUI Klasse|bg-black}}{{FTUI Klasse|bg-mint}}{{FTUI Klasse|bg-yellow}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Rahmen<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|verticalLine}}{{FTUI Klasse|border-black}}{{FTUI Klasse|border-white}}{{FTUI Klasse|border-orange}}{{FTUI Klasse|border-red}}{{FTUI Klasse|border-green}}{{FTUI Klasse|border-mint}}{{FTUI Klasse|border-lightblue}}{{FTUI Klasse|border-blue}}{{FTUI Klasse|border-gray}}{{FTUI Klasse|border-yellow}}{{FTUI Klasse|border-lightgray}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Größen<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|mini}}{{FTUI Klasse|tiny}}{{FTUI Klasse|small}}{{FTUI Klasse|normal}}{{FTUI Klasse|large}}{{FTUI Klasse|big}}{{FTUI Klasse|bigger}}{{FTUI Klasse|tall}}{{FTUI Klasse|great}}{{FTUI Klasse|grande}}{{FTUI Klasse|gigantic}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Schriftstil<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|thin}}{{FTUI Klasse|bold}}{{FTUI Klasse|darker}}{{FTUI Klasse|truncate}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Sonstiges<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|blank}}{{FTUI Klasse|transparent}}{{FTUI Klasse|half-transparent}}{{FTUI Klasse|blurry}}{{FTUI Klasse|shake}}{{FTUI Klasse|fail-shake}}{{FTUI Klasse|marquee}}{{FTUI Klasse|icon round}}{{FTUI Klasse|icon square}}{{FTUI Klasse|readonly}}{{FTUI Klasse|blink}}{{FTUI Klasse|rotate-90}}{{FTUI Klasse|horizontal}}{{FTUI Klasse|circleborder}}{{FTUI Klasse|autohide}}{{FTUI Klasse|notransmit}}{{FTUI Klasse|tap}}{{FTUI Klasse|FS20}}{{FTUI Klasse|value}}{{FTUI Klasse|novalue}}{{FTUI Klasse|timestamp}}{{FTUI Klasse|percent}}{{FTUI Klasse|nocache}}{{FTUI Klasse|fade}}{{FTUI Klasse|rotate}}{{FTUI Klasse|nolabels}}{{FTUI Klasse|default}}{{FTUI Klasse|prefetch}}{{FTUI Klasse|circulate}}{{FTUI Klasse|valueonly}}{{FTUI Klasse|positiononly}}{{FTUI Klasse|lineIndicator}}{{FTUI Klasse|barIndicator}}{{FTUI Klasse|roundIndicator}}{{FTUI Klasse|dim-tick}}{{FTUI Klasse|dim-front}}{{FTUI Klasse|dim-back}}{{FTUI Klasse|hue-tick}}{{FTUI Klasse|hue-front}}{{FTUI Klasse|hue-back}}{{FTUI Klasse|warn}}{{FTUI Klasse|activate}}{{FTUI Klasse|labelright}}{{FTUI Klasse|interlock}}{{FTUI Klasse|keepopen}}{{FTUI Klasse|noshade}}<br />
|}<br />
<br />
=== Überlagerung von Text und Bild ===<br />
[[Datei:FTUI_Text_auf_Bild.png||thumb|right]]<br />
Texte können auf Bildern positioniert werden:<br />
<syntaxhighlight lang="html5"><br />
<li data-row="1" data-col="4" data-sizey="4" data-sizex="6"><br />
<div class="display"><br />
<div data-type="image" data-url="https://picsum.photos/200/125/?random" data-size="100%"></div><br />
<div class="display-center bigger" data-type="label">Text1</div><br />
<div class="display-topright bigger right-space top-space" data-type="label">Text2</div><br />
<div class="ontop bigger" style="left: 120px; top: 50px">Text3</div><br />
</div><br />
</li><br />
</syntaxhighlight><br />
<br />
Zur Verfügung stehen folgende Grundpositionen:<br />
* <code>display-topleft</code><br />
* <code>display-topcenter</code><br />
* <code>display-topright</code><br />
* <code>display-centerleft</code><br />
* <code>display-left</code><br />
* <code>display-centerright</code><br />
* <code>display-right</code><br />
* <code>display-bottomleft</code><br />
* <code>display-bottomcenter</code><br />
* <code>display-bottomright</code><br />
<br />
Feinjustage ist möglich über<br />
<br />
* <code>right-space</code><br />
* <code>top-space</code><br />
* <code>left-space</code><br />
* <code>bottom-space</code><br />
* <code>right-space-2</code><br />
* <code>top-space-2</code><br />
* <code>left-space-2</code><br />
* <code>bottom-space-2</code><br />
* <code>right-space-3</code><br />
* <code>top-space-3</code><br />
* <code>left-space-3</code><br />
* <code>bottom-space-3</code><br />
<br />
<br />
[[Datei:FTUI_Beispiel_Positionierung.png|200px|thumb|right]]<br />
Verallgemeinert lassen sich auf diese Weise '''Objekte frei im Elternelement positionieren''':<br />
<syntaxhighlight lang="html5"><br />
<div class="display" data-type="html"><br />
<div class="display-topcenter top-space big">Fenster</div><br />
<div class="display-center fa fa-4x ftui-window"></div><br />
<div class="display-bottomleft bottom-space left-space" data-type="label">Text</div><br />
</div><br />
</syntaxhighlight><br />
=== Icons ===<br />
FTUI bringt einige Icons-"Schriftarten" mit, die für die Darstellung genützt werden können. Diese werden automatisch beim Start des UI eingebunden, sobald ein entsprechendes Icon-Präfix im Code der Seite vorkommt.<br />
<br />
Verfügbare Icon-Schriftarten sind:<br />
* Eingebaute Icons ''ftui-window'' und ''ftui-door''. Präfix '''ftui-'''. Beispiel: <code>data-icon="ftui-door"</code><br />
* [http://fontawesome.io/icons/ Font-Awesome]: Mehr als 500 Icons zur Auswahl. Präfix '''fa-'''. Beispiel: <code>data-icon="fa-volume-up"</code><br />
* [https://material.io/icons/ Material Icons]: Mehr als 900 Icons zur Auswahl. Präfix '''mi-'''. Beispiel: <code>data-icon="mi-local_gas_station"</code><br />
* FHEM und OpenAutomation Icons: Präfix '''fs-''' und '''oa-'''. Beispiel: <code>data-icon="oa-secur_locked"</code><br />
* [https://erikflowers.github.io/weather-icons/ Weather-Icons]: Präfix '''wi '''. Beispiel: <code>data-icon="wi wi-day-rain-mix"</code><br />
<br />
Alternativ können auch Bilder Icons (bspw. png) über CSS verwendet werden. Bspw:<br />
<syntaxhighlight lang="html5"><br />
<head><br />
<style type="text/css"><br />
.logo-fhem {<br />
background: url(https://wiki.fhem.de/fhemlogo.png) no-repeat;<br />
width: 120px;<br />
height: 132px;<br />
background-size: contain;<br />
}<br />
</style><br />
</head><br />
<body><br />
<div data-type="symbol" data-icon="logo-fhem"></div><br />
</body><br />
</syntaxhighlight><br />
<br />
== Widgets ==<br />
===Allgemeine Attribute===<br />
Jedes Widget kann über verschiedene Attribute konfiguriert werden. Folgende Attribute gelten für alle Widgets:<br />
<br />
{| class="wikitable"<br />
|+allgemeine Attribute<br />
|-<br />
! align="right" |data-type<br />
|Widget-Typ<br />
|-<br />
! align="right" |data-device<br />
|FHEM-Name des Gerätes (mit dem Befehl 'list' bekommt man im FHEM die kpl. Liste)<br />
|-<br />
! align="right" |class<br />
|CSS-Klassen für Aussehen und Formatierung des Widgets<br />
|-<br />
|}<br />
<br />
{| class="wikitable"<br />
|+Daten Empfangen<br />
|-<br />
! align="right" |data-get<br />
|Reading Name<br />
|-<br />
! align="right" |data-get-on<br />
|Wert für den Status on<br />
|-<br />
! align="right" |data-get-off<br />
|Wert für den Status off<br />
|-<br />
|}<br />
<br />
{| class="wikitable"<br />
|+Daten Senden<br />
|-<br />
! align="right" |data-set<br />
|Reading Name<br />
|-<br />
! align="right" |data-set-on<br />
|Wert für den Status on<br />
|-<br />
! align="right" |data-set-off<br />
|Wert für den Status off<br />
|-<br />
|}<br />
<br />
Widget-spezifische Attribute können auf der jeweiligen Widget-Seite nachgelesen werden.<br />
<br />
=== Integrierte Widgets ===<br />
Folgende Widgets sind direkt in FHEM Tablet UI integriert und können "out of the box" verwendet werden.<br />
<br />
* [[FTUI Widget Button|button]]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen FHEM-Befehl absetzen kann<br />
* [[FTUI Widget Checkbox|checkbox]]: Umschalter zwischen zwei definierten Zuständen<br />
* [[FTUI Widget Circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des 'circle' im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden <br />
* [[FTUI Widget Clock|clock]]: Stellt eine einfache Uhr zur Verfügung<br />
* [[FTUI Widget Colorwheel|colorwheel]]: Farbpalette zur Auswahl von Farben<br />
* [[FTUI Widget Controlbutton|controlbutton]]: iOS-ähnlicher Button zum Schalten zwischen zwei Zuständen (z.B. on / off)<br />
* [[FTUI Widget Controller|controller]]: iOS-ähnlicher vertikaler Schieberegler zum Einstellen eines Wertes<br />
* [[FTUI Widget Datetimepicker|datetimepicker]]: Erstellt eine Auswahl für Datum/Uhrzeit<br />
* [[FTUI Widget Departure|departure]]: Abfahrtszeiten öffentlicher Verkehrsmittel<br />
* [[FTUI Widget Dimmer|dimmer]]: Ein-/Aus-Button mit integriertem Schieberegler für z.B. einen Dim-Wert<br />
* [[FTUI Widget Eventmonitor|eventmonitor]]:<br />
* [[FTUI Widget Homestatus|homestatus]]: Auswahl für vier oder fünf definierte Zustände eines Objects (z.B.: FHEM Residents)<br />
* [[FTUI Widget Html|html]]:<br />
* [[FTUI Widget Iframe|iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe<br />
* [[FTUI Widget Image|image]]: Zeigt ein Bild, dessen URL fest vorgegeben oder aus einem Device-Reading gelesen werden kann<br />
* [[FTUI Widget Input|input]]: Erstellen eines Texteingabefeldes<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld<br />
* [[FTUI Widget Klimatrend|klimatrend]]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt<br />
* [[FTUI Widget Knob|knob]]: Erstellt einen Statusbalken auf einer Kreisbahn<br />
* [[FTUI Widget Label|label]]: Reading als Text anzeigen<br />
* [[FTUI Widget Level|level]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert<br />
* [[FTUI Widget Link|link]]: Erstellt einen Link oder Button zum Aufrufen von URLs oder Senden von Befehlen an FHEM<br />
* [[FTUI Widget Medialist|medialist]]:<br />
* [[FTUI Widget Multistatebutton|multistatebutton]]: Variante des push-Widgets, welches den set-Befehl abhängig vom gelesenen Status ändert<br />
* [[FTUI Widget Notify|notify]]: Blendet ein Hinweisfenster im Browser ein<br />
* [[FTUI Widget Pagebutton|pagebutton]]: Button, mit dem auf andere Seiten gesprungen werden kann. Eignet sich gut für eine Navigation<br />
* [[FTUI Widget Pagetab|pagetab]]: Tauscht den Inhalt einer Seite durch den einer anderen. Eignet sich gut für ein Navigationsmenü<br />
* [[FTUI Widget Playstream|playstream]]: Abspielen eines Webradio-Streams per Button<br />
* [[FTUI Widget Popup|popup]]: Öffnet ein Popup nach einem Klick auf ein Widget oder HTML-Element <br />
* [[FTUI Widget Progress|progress]]: Zeigt einen Prozentwert in Form einer runden Fortschrittsleiste<br />
* [[FTUI_Widget_Push|push]]: Button, mit dem ein Befehl an FHEM gesendet werden kann<br />
* [[FTUI Widget Range|range]]: Erstellt vertikale Balken, die einen Wertebereich in unterschiedlichen Farben darstellen<br />
* [[FTUI Widget Readingsgroup|readingsgroup]]: Zeigt eine Readingsgroup an, wie sie in FHEM definiert wurde<br />
* [[FTUI Widget Rotor|rotor]]: Animiertes Umschalten von zwei oder mehr Widgets an einer Position<br />
* [[FTUI Widget Scale|scale]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert<br />
* [[FTUI_Widget_Select|select]]: Combobox, die eine Liste an Werten zur Auswahl anzeigt<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: Zum Anzeigen und Einstellen einer Uhrzeit<br />
* [[FTUI Widget Simplechart|simplechart]]: Einfaches XY-Diagramm zur Anzeige eines Wertes, der direkt aus einem FHEM-Logfile gelesen wird<br />
* [[FTUI Widget Slideout|slideout]]:<br />
* [[FTUI Widget Slider|slider]]: Vertikaler Schieberegler zum Einstellen eines Wertes <br />
* [[FTUI Widget Spinner|spinner]]: Element, um Werte durch Drücken auf Plus-/Minus- oder Höher-/Tiefer-Icons zu ändern<br />
* [[FTUI Widget Swiper|swiper]]: Bietet die Möglichkeit, durch Wischen zwischen verschiedenen Seiten zu wechseln<br />
* [[FTUI Widget Switch|switch]]: Button, um zwischen zwei Zuständen zu schalten (z.B. on / off)<br />
* [[FTUI Widget Symbol|symbol]]: Status eines Devices als Symbol darstellen (z.B. Fenster offen)<br />
* [[FTUI Widget Theme|theme]]: Kontextspezifisches Design<br />
* [[FTUI Widget Thermostat|thermostat]]: Anzeige für Heizungsthermostate, mit der die gewünschte Temperatur eingestellt werden kann<br />
* [[FTUI Widget Volume|volume]]: Einstellscheibe zur Änderung eines einzelnen Wertes<br />
* [[FTUI Widget Weather|weather]]: Wettersymbol anzeigen<br />
* [[FTUI Widget WindDirection|wind_direction]]: Anzeige der Windrichtung auf einer Windrose<br />
<br />
===3rd Party Widgets===<br />
Für diese Widgets kann nicht sichergestellt werden, dass sie mit der jeweils aktuellen Version von FTUI funktionieren.<br />
* [[FTUI Widget Agenda|agenda]]: Zeigt Kalendereinträge in einer Listenform an<br />
* [[FTUI_Widget_Analogclock|analogclock]]: Analoguhr<br />
* [[FTUI Widget Calview|calview]]: Zeigt Einträge aus einem [[CALVIEW]]-Device an<br />
* [[FTUI Widget Chart|chart]]: Diagramm mit ähnlichen Möglichkeiten wie die FHEM-Plots<br />
* [[FTUI Widget Classchanger|classchanger]]: Ändert seine CSS-Klassen je nach Status eines Devices<br />
* [[FTUI Widget Clicksound|clicksound]]: Mit dem Widget "clicksound" können Sounds an Click-Events von Elementen gebunden werden.<br />
* [[FTUI Widget Dwdweblink|dwdweblink]]: Grafische Anzeige DWD-Wetter-Weblink<br />
* [[FTUI Widget Filelog|filelog]]: Teile aus einem FHEM Logfile anzeigen<br />
* [[FTUI Widget Fullcalview|fullcalview]]:<br />
* [[FTUI Widget Gds|gds]]:<br />
* [[FTUI Widget Maps|maps]]: Kartendarstellung mit Google Maps API<br />
* [[FTUI Widget Highchart|highchart]]:<br />
* [[FTUI Widget Highchart3d|highchart3d]]:<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.<br />
* [[FTUI Widget Loading|loading]]:<br />
* [[FTUI Widget Meteogram|meteogram]]:<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: Zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an.<br />
* [https://forum.fhem.de/index.php/topic,79283.msg712855.html#msg712855 pinpad]: Pinpad für z.B. eine Alarmanlage<br />
* [https://forum.fhem.de/index.php/topic,76643.msg685472.html#msg685472 postme]: Liste des PostMe-Devices anzeigen<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads<br />
* [[FTUI Widget Screensaver|screensaver]]:<br />
* [[FTUI Widget SMAPortalSPG|smaportalspg]]: Anzeige von SMAPortal-Daten im FHEM Tablet UI<br />
* [[FTUI Widget für SSCam Streaming Devices (SSCamSTRM)|sscamstrm]]: Integration von SSCam Streaming-Devices (Synology Surveillance Station Kameras) im FHEM Tablet UI<br />
* [https://forum.fhem.de/index.php/topic,73497.0.html scrolllabel]: Texte in Laufschrift darstellen<br />
* [[FTUI Widget Svgplot|svgplot]]: Unveränderte Übernahme eine bestehenden SVG-Plots<br />
* [https://forum.fhem.de/index.php?topic=82883.msg750237#msg750237 todoist]: einfaches widget für todoist<br />
* [[FTUI Widget Tts|tts]]: Sprachausgabe eines Textes aus einem Reading auf dem Endgerät.<br />
* [[FTUI Widget UWZ|uwz]]: Anzeige der Warnungen der Unwetterzentrale<br />
* [[FTUI Widget Wakeup|wakeup]]:<br />
* [https://github.com/svenson08/ftui-weekdaytimer-widget wdtimer]: Visualisierung des [[WeekdayTimer]] Modul<br />
* [[FTUI Widget Weekprofile|weekprofile]]: Visualisierung des [[weekprofile]] Moduls<br />
* [[FTUI Widget Weatherdetail|weatherdetail]]: Detaillierte Wettervorhersage über 4 Tage (Nutzt das Proplanta Modul)<br />
* [[FTUI Widget Video|videodetail]]: Video Widget für die FTUI<br />
<br />
===Anwendungsbeispiele===<br />
Durch die Verbindung von Widgets mit dem FHEM-Umfeld entstehen Lösungen für typische Anwendungen.<br />
* [[FTUI_Beispiel_Datetimepicker_für_Timer|Datetimepicker für Timer]]: Oberfläche für Timereinstellungen<br />
* [[FTUI_Beispiel_Mondphase|Mondphase]]: Visuelle Darstellung der Mondphase<br />
* [[FTUI_Beispiel_Webradio|Webradio]]<br />
* [[FTUI Beispiel Zeitschaltung|Verschiedene Zeitschaltungen]]<br />
<br />
==Templates==<br />
Kommt ein bestimmtes "Code-Fragment" auf mehreren Seiten oder öfter pro Seite vor, bietet FTUI die Option, Templates zu erstellen. Diese werden einmal gebaut und können dann mit dem Attribut '''data-template''' nach Belieben in eine Seite eingefügt werden. Dabei besteht auch die Möglichkeit, Variablen zu verwenden.<br />
<br />
Die Variablennamen sollten möglichst eindeutig und unverwechselbar gewählt werden, da bei der Verwendung von Templates im Prinzip Suchen & Ersetzen angewendet wird. Verwendet man beispielsweise die Variablen '''dev:Thermostat_Kueche''' und '''dev_temp:temperatue''', so kann es passieren, dass die Ergebnisse im erzeugten Code dann '''Thermostat_Kueche''' und '''Thermostat_Kueche_temp''' lauten, statt wie gewünscht '''Thermostat_Kueche''' und '''temperature'''. Um dies zu vermeiden, sollten die Variablen besser '''device:Thermostat_Kueche''' und '''temp:temperature''' lauten.<br />
<br />
Im Folgenden ein paar Beispiele, wie Templates verwendet werden können.<br />
<br />
===Einzelnes Widget===<br />
Soll ein Widget an mehreren Stellen in exakt der selben Ausführung eingebunden werden, kann diese Widget in einer eigenen Datei erstellt und diese dann auf den Zielseiten automatisch mitgeladen werden.<br />
<br />
;Template-Seite<br />
Die Template-Seite soll in diesem Beispiel ''template_symbol.html'' genannt werden. Diese wird daher zuerst im FTUI-Verzeichnis erstellt.<br />
<syntaxhighlight lang="html"><br />
<div data-type="symbol"<br />
data-device="dummy1"><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
Die oben erstellte Template-Seite kann nun in jeder gewünschten Seite eingebunden werden.<br />
<syntaxhighlight lang="html" highlight="6"><br />
[...]<br />
<body><br />
<div class="gridster"><br />
<ul><br />
<li data-row="1" data-col="1" data-sizey="1" data-sizex="1"><br />
<div data-template="template_symbol.html"></div><br />
</li><br />
</ul><br />
</div><br />
</body><br />
[...]<br />
</syntaxhighlight><br />
<br />
===Gridster-Element===<br />
Natürlich kann auch ein ganzes Gridster-Element - in diesem Fall ein Menü - als Template eingebunden werden.<br />
<syntaxhighlight lang="html"><br />
<li data-row="1" data-col="1" data-sizex="1" data-sizey="4" data-template="menu.html"></li><br />
</syntaxhighlight><br />
<br />
=== Widget-Gruppen ===<br />
Die Template-Datei des [[#Einzelnes Widget|ersten Beispiels]] kann natürlich auch mehrere Widgets auf einmal enthalten.<br />
<br />
=== Verwendung von Variablen ===<br />
==== Einfaches Beispiel ====<br />
Oft wird ein und dasselbe Widget für verschiedenen Devices verwendet. Um nicht für jedes Device das Widget neu kopieren zu müssen (bzw. bei Änderungen alle Seiten ausbessern zu müssen), kann ein Template verwendet werden, dem einfach per Parameter mitgeteilt wird, von welchem Device es gerade die Daten empfangen soll.<br />
<br />
In diesem Beispiel wird ein Template erzeugt, dass nur die Temperatur verschiedenen Thermostate mittels eines [[FTUI Widget Label|Label-Widgets]] anzeigt.<br />
<br />
;Template-Seite<br />
Die Template-Seite enthält nur ein einfaches Label-Widget und wird in diesem Beispiel ''template_label.html'' genannt. Um sie für mehrere Devices verwenden zu können, wird im Attribut '''data-device''' der Name des eigentlichen Devices durch den Parameter '''par01''' ersetzt.<br />
<syntaxhighlight lang="html" highlight="2"><br />
<div data-type="label"<br />
data-device="par01"<br />
data-get="measured-temp"></div><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
Auf der Haupt-Seite wird die Template-Seite mit dem Attribut '''data-template''' eingebunden und ihr via Attribut '''data-parameter''' das jeweils gewünschte Device übergeben.<br />
<syntaxhighlight lang="html"><br />
[...]<br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat1"}'></div><br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat2"}'></div><br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat3"}'></div><br />
[...]<br />
</syntaxhighlight><br />
<br />
==== Wetter-Slider mit Template ====<br />
In diesem Beispiel wird ein [[FTUI Widget Slider|Slider-Widget]] erstellt, welches die verschiedenen Tage eines Wetterberichtes anzeigt. Dabei wird für den Wetterbericht des jeweiligen Tages immer dasselbe Template verwendet um nicht für jeden Tag ein eigenes Widget schreiben zu müssen.<br />
<br />
;Template-Seite<br />
<syntaxhighlight lang="html"><br />
<div class="left"><br />
<div data-type="label" data-device="AgroWeather" data-get="par01" data-unit="&deg;C"></div><br />
<div class="inline"><br />
<div data-type="label" data-device="AgroWeather" data-get="par02"></div><br />
<div data-type="weather" data-device="AgroWeather" data-get="par02"></div><br />
min:&nbsp;<div data-type="label" data-device="AgroWeather" data-get="par03" data-unit="&deg;C"></div><br />
</div><br />
</div><br />
<div class="left"><br />
<div data-type="label" data-device="AgroWeather" data-get="par04" data-substitution="toDate().eeee()+','"></div><br />
<div data-type="label" data-device="AgroWeather" data-get="par04" data-substitution="toDate().ddmm()"></div><br />
</div><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
In der Haupt-Seite wird das Template dann für jede Slider-Seite eingebunden und das Reading für den jeweiligen Tag via Parameter übergeben.<br />
<syntaxhighlight lang="html"><br />
[...]<br />
<div data-type="swiper"><br />
<ul><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc0_tempMax","par02":"fc0_weatherDay","par03":"fc0_tempMin","par04":"fc0_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc1_tempMax","par02":"fc1_weatherDay","par03":"fc1_tempMin","par04":"fc1_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc2_tempMax","par02":"fc2_weatherDay","par03":"fc2_tempMin","par04":"fc2_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc3_tempMax","par02":"fc3_weatherDay","par03":"fc3_tempMin","par04":"fc3_date"}'></li><br />
</ul><br />
</div><br />
[...]<br />
</syntaxhighlight><br />
<br />
== JavaScript-Funktionen ==<br />
Neben den Widgets können auch einige JavaScript-Funktionen verwendet werden, um Befehle an FHEM zu senden.<br />
<br />
<br />
Folgende Zeile setzt einen direkten Befehl an FHEM ab (<code>set dummy1 off</code>):<br />
<syntaxhighlight lang="html"><div onclick="ftui.setFhemStatus('set dummy1 off')">Dummy1 aus</div></syntaxhighlight><br />
<br />
<br />
Diese Zeile veranlasst FHEM dazu, eine Funktion aus der 99_myUtils.pm auszuführen (<code>myUtils_HeizungUpDown("WZ.Thermostat_Climate","up")</code>):<br />
<syntaxhighlight lang="html"><div onclick="ftui.setFhemStatus('{myUtils_HeizungUpDown(&quot;WZ.Thermostat_Climate&quot;,&quot;up&quot;)}')">+</div></syntaxhighlight><br />
<br />
<br />
Ein Beispiel, wie ein Kommando an FHEM gesendet wird und gleichzeitig der Wert eines bereits in FTUI angezeigten Readings verwendet werden kann:<br />
<syntaxhighlight lang="html"><br />
<div data-type="label" data-device="dummy1" data-get="temperature"></div><br />
<div onClick="ftui.setFhemStatus('set dummy2 '+ftui.getDeviceParameter('dummy1','temperature').val);">Senden</div><br />
</syntaxhighlight><br />
<br />
== Eigene Widgets erstellen ==<br />
Wie eigenen Widgets für FTUI erstellt werden können, ist auf der Seite [[FTUI eigene Widgets]] beschrieben.<br />
<br />
Eine Schritt für Schritt Anleitung für das erste eigene Widget gibts hier [[FTUI eigene Widgets - Beispiel]]<br />
<br />
== FAQ ==<br />
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM Tablet UI FAQ]] zusammengestellt.<br />
<br />
== Links ==<br />
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]<br />
* {{Link2Forum|Topic=34233|LinkText=Forums-Beitrag}}<br />
* [[FTUI_Snippets|Snippets]]<br />
* [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Live-Demos]<br />
* [https://waschto.eu/fhem-und-tabletui-livedemo/ FHEM und TabletUI Live-Demo]<br />
* {{Link2Forum|Topic=37378|LinkText=User-Demos}}<br />
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]<br />
<br />
[[Kategorie:FHEM Tablet UI|!]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=FHEM_Tablet_UI&diff=37205FHEM Tablet UI2022-02-07T14:34:15Z<p>Sailor: Versionsnummer angefuegt</p>
<hr />
<div>{{Infobox Modul<br />
|ModPurpose=Oberfläche für FHEM<br />
|ModType=x<br />
|ModFTopic=34233<br />
|ModForumArea=TabletUI<br />
|ModTechName=n.a.<br />
|ModOwner=setstate ({{Link2FU|7023|Forum}})<br />
}}<br />
[[FHEM Tablet UI v2]] (FTUI2) ist ein leichtgewichtiges aber funktionsreiches Frontend-Framework zum Steuern und Überwachen von in FHEM integrierten Geräten. Es basiert auf HTML/CSS/JavaScript und stellt somit keine zusätzlichen Anforderungen an den FHEM-Server.<br />
<br />
Mit Hilfe zahlreicher Widgets, die sehr leicht mit HTML Code konfiguriert werden können, ist es möglich, innerhalb kurzer Zeit ein den eigenen Wünschen entsprechendes User-Interface aufzubauen.<br />
<br />
Für den Betrieb ist nur eine FHEM-Installation mit [[HTTPSRV|HTTPSRV-Modul]] sowie ein gängiger Webbrowser notwendig.<br />
<br />
Mit wenigen Anpassungen ist es auch möglich, das UI auf anderen Webservern (Apache, u.a.) zu betreiben. Somit können FHEM und FHEM Tablet UI auch auf getrennten Systemen ausgeführt werden.<br />
<br />
[[File:tablet_ui.png|thumb|500px|center|Beispiel für ein mit [[FHEM Tablet UI]] erstelltes User-Interface]]<br />
<br />
{{Todo|Design-Möglichkeiten erklären, Navigationsmethoden ausformulieren}} <br />
<br />
== Installation ==<br />
Die Installation von FHEM Tablet UI erzeugt keinen großen Aufwand und besteht im Großen und Ganzen aus drei Schritten:<br />
*Dateien aus dem GitHub-Repository herunterladen<br />
*FHEM konfigurieren ([[HTTPSRV]]-Device erstellen, [[FHEMWEB]]-Attribut longpoll einstellen)<br />
*Eine Beispieldatei anlegen<br />
<br />
<br />
{{Hinweis|Diese Anleitung geht davon aus, dass FHEM unter Debian nach der Anleitung [https://debian.fhem.de Stable build using apt] installiert wurde.<br />
Ist dies nicht der Fall, muss der Pfad '''/opt/fhem''' dementsprechend angepasst werden.}}<br />
<br />
<br />
'''1.''' Zuerst müssen alle Dateien von FHEM Tablet UI in das FHEM-Verzeichnis '''/opt/fhem/www''' kopiert werden. Das geht mit folgendem '''update'''-Befehl über die FHEM-Befehlszeile.<br />
:<code>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</code><br />
<br />
:[[Datei:FTUI_Installation_01.png|thumb|none|Schritt 1: Dateien kopieren]]<br />
<br />
<br />
'''2.''' Anschließend ist ein neues [[HTTPSRV]]-Device in FHEM anzulegen, welches auf den Ordner mit den gerade heruntergeladenen Dateien verweist.<br />
:<code>define TABLETUI HTTPSRV ftui/ ./www/tablet/ Tablet-UI</code><br />
<br />
:[[Datei:FTUI_Installation_02.png|thumb|none|Schritt 2: HTTPSRV-Device anlegen]]<br />
<br />
{{Hinweis|Dieser Schritt kann ausgelassen werden, wenn die Funktionalitäten von [[FHEMWEB]] ausreichend sind. Dann muss FTUI aber in weiterer Folge unter der URL '''<nowiki>http(s)://<fhem-server>:8083/fhem/tablet/index.html</nowiki>''' aufgerufen werden und es wird kein Link auf FTUI in der FHEM GUI erstellt. Vorteil ist aber, dass das FHEMWEB-Caching verwendet werden kann. Siehe dieser {{Link2Forum|Topic=86362|Message=788258}}.}}<br />
<br />
'''3.''' Damit FHEM Tablet UI mit FHEM kommunizieren kann, ist noch die '''longpoll'''-Einstellung im [[FHEMWEB]] Device festzulegen.<br />
<br />
:<code>attr WEB longpoll websocket</code><br />
:bzw. bei Problemen mit ''websocket''<br />
:<code>attr WEB longpoll 1</code><br />
<br />
:[[Datei:FTUI_Installation_03.png|thumb|none|Schritt 3: longpoll einstellen]]<br />
<br />
<br />
'''4.''' Weil FTUI noch nichts anzuzeigen hat, wird die Datei '''/opt/fhem/www/tablet/index-example.html''' nach '''/opt/fhem/www/tablet/index.html''' kopiert.<br />
:<code>sudo cp -a /opt/fhem/www/tablet/index-example.html /opt/fhem/www/tablet/index.html</code><br />
<br />
:[[Datei:FTUI_Installation_04.png|thumb|none|Schritt 4: index.html erstellen]]<br />
<br />
<br />
'''5.''' Abschließend muss FHEM noch '''neu gestartet''' werden (''shutdown restart'') da das Attribut '''longpoll''' geändert wurde.<br />
<br />
<br />
Somit ist FHEM Tablet UI bereit zur Verwendung und kann durch Aufruf der URL '''<nowiki>http://<fhem-server>:8083/fhem/ftui/</nowiki>''' oder den Link im FHEM-Menü geöffnet werden<br />
<br />
== Update ==<br />
Ein Update von FTUI kann ebenfalls über die FHEM-Kommandozeile erfolgen.<br />
<br />
'''1.''' Prüfen der Änderungen seit dem letzten Download/Update durch Eingabe von:<br />
:<code><nowiki>update check https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
<br />
'''2.''' Update der geänderten Dateien durch Eingabe von:<br />
:<code><nowiki>update all https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
<br />
Eine weitere Option ist das Hinzufügen des FTUI-Git-Repositories zum allgemeinem Update-Vorgang von FHEM. Dabei wird dann bei einem FHEM-Update auch gleich FHEM Tablet UI aktualisiert, bzw. die Änderungen angezeigt.<br />
:<code><nowiki>update add https://raw.githubusercontent.com/knowthelist/fhem-tablet-ui/master/controls_fhemtabletui.txt</nowiki></code><br />
<br />
Beachte: Das Ergebnis des o.g. Befehls wird in FHEM/controls.txt eingetragen, siehe auch [[Update#update_add]]<br />
<br />
== Konfiguration ==<br />
===DOCTYPE===<br />
In allen HTML-Dateien, die im Browser geladen werden und das typische HTML-Gerüst besitzen (also alle Hauptseiten, jedoch keine Template-Dateien), sollte eine ''Document Type Declaration'' (DTDT) eingefügt werden. Mit ihr wird festgelegt, welche ''Document Type Definition'' hier verwendet wird (das kommt aus der Metasprache XML), konkret also, in welcher Version der nachfolgende HTML-Code vom Browser interpretiert werden soll. Lässt man die DTDT weg, oder definiert sie auf verschiedenen Seiten unterschiedlich, kann ein und der selbe HTML-Code zu unterschiedlichen Darstellungen führen. Die DTDT erfolgt immer auf der ersten Zeile, noch vor dem <code><html></code>-Tag. Nachfolgend wird HTML5 verwendet.<br />
<br />
<syntaxhighlight lang="html"><br />
<!DOCTYPE html><br />
<html><br />
<head>...</head><br />
<body>...</body><br />
</html><br />
</syntaxhighlight><br />
<br />
===META-Parameter===<br />
Das Tablet UI lässt sich über die META-Parameter konfigurieren. Diese Parameter sind in jeder '''.html''' Datei (z.B. index.html) im Abschnitt '''<head>''' einzutragen. Ausgenommen davon sind Dateien, die als Template, Pagebutton-Zielseiten oder ähnliches eingebunden werden.<br />
<br />
Die Parameter sind immer nach diesem Schema aufgebaut:<br />
<meta name="[Parameter-Name]" content="[Parameter-Wert]"><br />
<br />
===Verbindung zu FHEM===<br />
{| class="wikitable"<br />
|-<br />
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung<br />
|-<br />
|web_device||WEB||String||FHEM-Device, welches für das Polling verwendet wird<br />
|-<br />
|longpoll||1||0, 1||<br />
'''0''': Longpoll deaktiviert; alle 30s ein Shortpoll (Neuladen der gesamten Statusänderungen)<br />
<br />
'''1''': Longpoll aktiv; geänderte Stati werden sofort aktualisiert, zusätzlich werden alle 15min die gesamten Statusänderungen geladen.<br />
|-<br />
|longpoll_type||websocket||websocket, ajax, 0||<br />
'''websocket''': Für die Aktualisierung der Daten wird das Websocket-Protokoll verwendet. Werden vom Browser keine Websockets unterstützt, gibt es einen automatischen Fallback auf Ajax.<br />
<br />
'''ajax''': Ajax wird für die Aktualisierung verwendet.<br />
<br />
'''0''': Longpoll deaktiviert, Shortpoll wird verwendet.<br />
|-<br />
|longpoll_filter||.*||RegEx||Event-Filter. Kann verwendet werden, wenn z.B. Devices, die in FTUI angezeigt werden, in einem eigenen FHEM-Room sind.<br />
|-<br />
|longpoll_maxage||240||Integer||Kommen in diesem Zeitraum (Sekunden) keine Longpoll-Events bei FTUI an, wird die Verbindung als "disconnected" angesehen und ein neuer Verbindungsversuch wird gestartet.<br />
|-<br />
|shortpoll_interval||900||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet<br />
|-<br />
|shortpoll_only_interval||30||Integer||Zeitraum in Sekunden, nach dem ein vollständiger Refresh stattfindet, sollte Longpoll deaktiviert sein<br />
|-<br />
|fhemweb_url||/fhem/||Integer||URL zu FHEM. Wird benötigt wenn FTUI auf einem anderen als dem FHEM Server läuft oder nicht im Standard-Pfad installiert ist. <br />
Hinweis: Wenn FHEM auf einem anderem Server/Domain läuft muss man das "CORS" Attribut im FHEMWEB Modul (s.o.) auf 1 setzen, sonst bekommt man Cross Origin Fehler. <br />
|}<br />
<br />
===Funktionalität===<br />
{| class="wikitable"<br />
|-<br />
!Parameter-Name!!Standard-Wert!!Mögliche Werte!!Beschreibung<br />
|-<br />
|debug||0||0 - 5||Log-Level<br />
|-<br />
|toast||5||Integer||Anzahl an gleichzeitig angezeigten Toast-Nachrichten. Um keine anzuzeigen, ist der Wert auf 0 zu setzen.<br />
|-<br />
|toast_position||bottom-left||||Position im Browserfenster, wo die Toast-Nachrichten angezeigt werden.<br />
|-<br />
|lang||de||de||Sprache der Oberfläche (für z.B. Datums-/Zeitfunktionen)<br />
|-<br />
|username||||String||Benutzername für eine Basic-Authentifierung *<br />
|-<br />
|password||||String||Passwort für eine Basic-Authentifizierung *<br />
|}<br />
'''*''' Derzeit wird die Basic-Authentifizierung in Kombination mit WebSockets nicht unterstützt. Die Verwendung von '''longpoll=1''' (ajax) ist daher notwendig.<br />
<br />
===Toast-Nachrichten===<br />
[[Datei:Ftui_toast.png|thumb|Toast-Nachrichten]]<br />
Tablet-UI liefert Informationen darüber, was im Moment gerade passiert. Das geschieht über Toast-Nachrichten, die in der Standardeinstellung unten links im Browser auftauchen.<br />
<br />
Wird beispielsweise ein Gerät eingeschaltet, so erscheint eine kleine Nachricht mit dem abgesetzten Befehl. Auch Fehlermeldungen und Statusinformationen werden angezeigt. Ob überhaupt und was konkret angezeigt wird, richtet sich nach dem eingestellten Debug-Level (siehe oben). Beim Debug-Level 5 werden alle Nachrichten angezeigt, bei 0 keine.<br />
<br />
Die Position der Toast-Nachrichten kann über den Meta-Tag <code>meta name='toast_position'</code> festgelegt werden. Für oben-mittig müsste folgender Code eingefügt werden:<br />
<pre><meta name='toast_position' content='top-center'></pre><br />
<br />
Möglich sind folgende Positionen:<br />
* <code>top-left</code><br />
* <code>top-right</code><br />
* <code>bottom-left</code><br />
* <code>bottom-right</code><br />
* <code>top-center</code><br />
* <code>bottom-center</code><br />
* <code>mid-center</code><br />
<br />
Die maximale Anzahl an Nachrichten, die gleichzeitig angezeigt werden können, lässt sich mit <code>meta name='toast'</code> Sind maximal 2 Nachrichten gewünscht, muss folgender Meta-Tag gesetzt werden:<br />
<pre><meta name='toast' content='2'></pre><br />
<br />
==Navigationsmethoden==<br />
{{Todo|Dieser Abschnitt dient derzeit lediglich als Sammlung von Stichpunkten und muss vollständig überarbeitet werden.}} <br />
<br />
'''Unterschied zwischen Pagetab und Pagebutton:'''<br />
<br />
'''Pagetab:''' Ganze Seite austauschen -> Menü muss auf jede Seite<br />
[[FTUI_Widget_Pagetab]]<br />
<br />
'''Pagebutton:''' Teil der Seite austauschen -> Menü nur in erster Seite<br />
[[FTUI_Widget_Pagebutton]]<br />
<br />
'''Pagelink:''' damit kann man beliebige Widgets kapseln und vorhandene Pagebutton-Seiten ansteuern <br />
[[FTUI Widget Link]]<br />
<br />
==Gestaltung==<br />
===Layout-Optionen===<br />
* [[FTUI Layout Gridster|Gridster]]<br />
* [[FTUI Layout Flex|Flex]]<br />
* [[FTUI Layout Sheet|Tabelle]]<br />
* [[FTUI Layout Row|Reihen]]<br />
<br />
=== Farben ===<br />
Es besteht die Möglichkeit, die Farbwerte in hexadezimaler Form, als RGB-Wert oder mit dem Farbnamen anzugeben. Zum Beispiel: <br />
<br />
*HEX: #ADD8E6<br />
*RBG: rgb(173, 216, 230)<br />
*Namen: lightblue<br />
<br />
Knallige Farben wie '''<span style="color: #ff0000;">#ff0000</span>''' für Rot oder '''<span style="color: #00ff00;">#00ff00</span>''' für Grün sollten vermieden werden.<br />
Es ist besser unterhalb von #D0 (208) für die Grundfarben zu bleiben.<br />
<br />
Empfohlene Farben sind z.B.:<br />
<br />
*Orange: <span style="color: #aa6900;">#aa6900</span><br />
*Rot: <span style="color: #ad3333;">#ad3333</span><br />
*Grün: <span style="color: #32a054;">#32a054</span><br />
*Blau: <span style="color: #6699FF;">#6699FF</span><br />
*Grau: <span style="color: #8C8C8C;">#8C8C8C</span><br />
<br />
Hilfreich bei der Suche nach den Farbwerten ist zum Beispiel der Color-Picker auf dieser Seite: http://www.colorpicker.com. Für die Suche nach Farben, die einen guten Kontrast bilden, diese Webseite: http://vanisoft.pl/~lopuszanski/public/colors/<br />
<br />
Im Ordner ''css'' der FTUI Installation finden sich einige vorbereitete Farbschemata. Diese können mit einem zusätzlichen Eintrag im <nowiki><head></nowiki>-Bereich der FTUI-Seite(n) aktiviert werden.<br />
<br />
Hier am Beispiel eines blauen Farbschemas:<br />
<syntaxhighlight lang="html"><br />
<html><br />
<head><br />
[...]<br />
<link rel="stylesheet" href="/fhem/tablet/css/fhem-blue-ui.css" /><br />
[...]<br />
</head><br />
</syntaxhighlight><br />
<br />
Diese Schema-Dateien ändern alle Widgets. <br />
<gallery><br />
File:Theme_default.png|default<br />
File:Theme_blue.png|fhem-blue-ui.css<br />
File:Theme_green.png|fhem-green-ui.css<br />
File:Theme_mobile.png|fhem-mobile-ui.css<br />
File:Theme_darkblue.png|fhem-darkblue-ui.css<br />
File:Theme_darkgreen.png|fhem-darkgreen-ui.css<br />
</gallery><br />
<br />
Einzelne Widgets können durch Hinzufügen der jeweiligen [[#CSS-Klassen|CSS-Klasse]] geändert werden.<br />
<br />
===CSS-Styles===<br />
Das Layout und das Aussehen des UI kann durch diverse vorgegebene CSS-Klassen beeinflusst werden. Die verfügbaren Klassen sind im Abschnitt [[#CSS-Klassen|CSS-Klassen]] aufgeführt.<br />
<br />
Soll das Aussehen des UI durch eigene CSS-Klassen oder durch Überschreiben der vorhandenen verändert werden, kann eine eigene CSS-Datei erstellt werden, die dann bei einem eventuellen Update von FTUI nicht überschrieben wird. Diese Datei muss den Dateinamen '''fhem-tablet-ui-user.css''' haben und im Ordner '''/fhem/tablet/css''' abgelegt werden. Sie wird dann beim Aufruf von FTUI automatisch mitgeladen.<br />
<br />
=== CSS-Klassen ===<br />
Nicht alle Widgets unterstützen alle hier angegebenen Klassen. Welche genau unterstützt werden, kann auf der jeweiligen Widget-Seite nachgelesen werden.<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |sheet/row/cell-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|sheet}}{{FTUI Klasse|row}}{{FTUI Klasse|cell}}{{FTUI Klasse|cell-1-x}}{{FTUI Klasse|cell-x}}{{FTUI Klasse|left-align}}{{FTUI Klasse|right-align}}{{FTUI Klasse|bottom-align}}{{FTUI Klasse|top-align}}{{FTUI Klasse|center-align}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |row/col-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|col}}{{FTUI Klasse|col-1-x}}{{FTUI Klasse|col-x}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |hbox/vbox-Layout<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|vbox}}{{FTUI Klasse|hbox}}{{FTUI Klasse|card}}{{FTUI Klasse|phone-width}}{{FTUI Klasse|full-height}}{{FTUI Klasse|full-width}}{{FTUI Klasse|grow-0}}{{FTUI Klasse|grow-1}}{{FTUI Klasse|grow-2}}{{FTUI Klasse|grow-x}}{{FTUI Klasse|items-top}}{{FTUI Klasse|items-center}}{{FTUI Klasse|items-bottom}}{{FTUI Klasse|items-space-between}}{{FTUI Klasse|items-space-around}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Generelle Klassen für die Positionierung<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|inline}}{{FTUI Klasse|newline}}{{FTUI Klasse|top-space}}{{FTUI Klasse|top-space-2x}}{{FTUI Klasse|top-space-3x}}{{FTUI Klasse|left-space}}{{FTUI Klasse|left-space-2x}}{{FTUI Klasse|left-space-3x}}{{FTUI Klasse|right-space}}{{FTUI Klasse|right-space-2x}}{{FTUI Klasse|right-space-3x}}{{FTUI Klasse|top-narrow}}{{FTUI Klasse|top-narrow-2x}}{{FTUI Klasse|top-narrow-10}}{{FTUI Klasse|left-narrow}}{{FTUI Klasse|left-narrow-2x}}{{FTUI Klasse|left-narrow-3x}}{{FTUI Klasse|right-narrow}}{{FTUI Klasse|right-narrow-2x}}{{FTUI Klasse|right-narrow-3x}}{{FTUI Klasse|centered}}{{FTUI Klasse|wider}}{{FTUI Klasse|narrow}}{{FTUI Klasse|fullsize}}{{FTUI Klasse|compressed}}{{FTUI Klasse|height-narrow}}{{FTUI Klasse|w1x}}{{FTUI Klasse|w2x}}{{FTUI Klasse|w3x}}{{FTUI Klasse|maxw40}}{{FTUI Klasse|doublebox-v}}{{FTUI Klasse|doublebox-h}}{{FTUI Klasse|triplebox-v}}{{FTUI Klasse|right}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Vordergrundfarben<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|red}}{{FTUI Klasse|green}}{{FTUI Klasse|blue}}{{FTUI Klasse|lightblue}}{{FTUI Klasse|orange}}{{FTUI Klasse|gray}}{{FTUI Klasse|lightgray}}{{FTUI Klasse|white}}{{FTUI Klasse|black}}{{FTUI Klasse|mint}}{{FTUI Klasse|yellow}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Hintergrundfarben<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|bg-red}}{{FTUI Klasse|bg-green}}{{FTUI Klasse|bg-blue}}{{FTUI Klasse|bg-lightblue}}{{FTUI Klasse|bg-orange}}{{FTUI Klasse|bg-gray}}{{FTUI Klasse|bg-lightgray}}{{FTUI Klasse|bg-white}}{{FTUI Klasse|bg-black}}{{FTUI Klasse|bg-mint}}{{FTUI Klasse|bg-yellow}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Rahmen<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|verticalLine}}{{FTUI Klasse|border-black}}{{FTUI Klasse|border-white}}{{FTUI Klasse|border-orange}}{{FTUI Klasse|border-red}}{{FTUI Klasse|border-green}}{{FTUI Klasse|border-mint}}{{FTUI Klasse|border-lightblue}}{{FTUI Klasse|border-blue}}{{FTUI Klasse|border-gray}}{{FTUI Klasse|border-yellow}}{{FTUI Klasse|border-lightgray}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Größen<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|mini}}{{FTUI Klasse|tiny}}{{FTUI Klasse|small}}{{FTUI Klasse|normal}}{{FTUI Klasse|large}}{{FTUI Klasse|big}}{{FTUI Klasse|bigger}}{{FTUI Klasse|tall}}{{FTUI Klasse|great}}{{FTUI Klasse|grande}}{{FTUI Klasse|gigantic}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Schriftstil<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|thin}}{{FTUI Klasse|bold}}{{FTUI Klasse|darker}}{{FTUI Klasse|truncate}}<br />
|}<br />
<br />
{| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;"<br />
! colspan="2" style="text-align: left;" |Sonstiges<br />
|-<br />
!class="mw-collapsible-content"|Klasse!!Beschreibung<br />
{{FTUI Klasse|blank}}{{FTUI Klasse|transparent}}{{FTUI Klasse|half-transparent}}{{FTUI Klasse|blurry}}{{FTUI Klasse|shake}}{{FTUI Klasse|fail-shake}}{{FTUI Klasse|marquee}}{{FTUI Klasse|icon round}}{{FTUI Klasse|icon square}}{{FTUI Klasse|readonly}}{{FTUI Klasse|blink}}{{FTUI Klasse|rotate-90}}{{FTUI Klasse|horizontal}}{{FTUI Klasse|circleborder}}{{FTUI Klasse|autohide}}{{FTUI Klasse|notransmit}}{{FTUI Klasse|tap}}{{FTUI Klasse|FS20}}{{FTUI Klasse|value}}{{FTUI Klasse|novalue}}{{FTUI Klasse|timestamp}}{{FTUI Klasse|percent}}{{FTUI Klasse|nocache}}{{FTUI Klasse|fade}}{{FTUI Klasse|rotate}}{{FTUI Klasse|nolabels}}{{FTUI Klasse|default}}{{FTUI Klasse|prefetch}}{{FTUI Klasse|circulate}}{{FTUI Klasse|valueonly}}{{FTUI Klasse|positiononly}}{{FTUI Klasse|lineIndicator}}{{FTUI Klasse|barIndicator}}{{FTUI Klasse|roundIndicator}}{{FTUI Klasse|dim-tick}}{{FTUI Klasse|dim-front}}{{FTUI Klasse|dim-back}}{{FTUI Klasse|hue-tick}}{{FTUI Klasse|hue-front}}{{FTUI Klasse|hue-back}}{{FTUI Klasse|warn}}{{FTUI Klasse|activate}}{{FTUI Klasse|labelright}}{{FTUI Klasse|interlock}}{{FTUI Klasse|keepopen}}{{FTUI Klasse|noshade}}<br />
|}<br />
<br />
=== Überlagerung von Text und Bild ===<br />
[[Datei:FTUI_Text_auf_Bild.png||thumb|right]]<br />
Texte können auf Bildern positioniert werden:<br />
<syntaxhighlight lang="html5"><br />
<li data-row="1" data-col="4" data-sizey="4" data-sizex="6"><br />
<div class="display"><br />
<div data-type="image" data-url="https://picsum.photos/200/125/?random" data-size="100%"></div><br />
<div class="display-center bigger" data-type="label">Text1</div><br />
<div class="display-topright bigger right-space top-space" data-type="label">Text2</div><br />
<div class="ontop bigger" style="left: 120px; top: 50px">Text3</div><br />
</div><br />
</li><br />
</syntaxhighlight><br />
<br />
Zur Verfügung stehen folgende Grundpositionen:<br />
* <code>display-topleft</code><br />
* <code>display-topcenter</code><br />
* <code>display-topright</code><br />
* <code>display-centerleft</code><br />
* <code>display-left</code><br />
* <code>display-centerright</code><br />
* <code>display-right</code><br />
* <code>display-bottomleft</code><br />
* <code>display-bottomcenter</code><br />
* <code>display-bottomright</code><br />
<br />
Feinjustage ist möglich über<br />
<br />
* <code>right-space</code><br />
* <code>top-space</code><br />
* <code>left-space</code><br />
* <code>bottom-space</code><br />
* <code>right-space-2</code><br />
* <code>top-space-2</code><br />
* <code>left-space-2</code><br />
* <code>bottom-space-2</code><br />
* <code>right-space-3</code><br />
* <code>top-space-3</code><br />
* <code>left-space-3</code><br />
* <code>bottom-space-3</code><br />
<br />
<br />
[[Datei:FTUI_Beispiel_Positionierung.png|200px|thumb|right]]<br />
Verallgemeinert lassen sich auf diese Weise '''Objekte frei im Elternelement positionieren''':<br />
<syntaxhighlight lang="html5"><br />
<div class="display" data-type="html"><br />
<div class="display-topcenter top-space big">Fenster</div><br />
<div class="display-center fa fa-4x ftui-window"></div><br />
<div class="display-bottomleft bottom-space left-space" data-type="label">Text</div><br />
</div><br />
</syntaxhighlight><br />
=== Icons ===<br />
FTUI bringt einige Icons-"Schriftarten" mit, die für die Darstellung genützt werden können. Diese werden automatisch beim Start des UI eingebunden, sobald ein entsprechendes Icon-Präfix im Code der Seite vorkommt.<br />
<br />
Verfügbare Icon-Schriftarten sind:<br />
* Eingebaute Icons ''ftui-window'' und ''ftui-door''. Präfix '''ftui-'''. Beispiel: <code>data-icon="ftui-door"</code><br />
* [http://fontawesome.io/icons/ Font-Awesome]: Mehr als 500 Icons zur Auswahl. Präfix '''fa-'''. Beispiel: <code>data-icon="fa-volume-up"</code><br />
* [https://material.io/icons/ Material Icons]: Mehr als 900 Icons zur Auswahl. Präfix '''mi-'''. Beispiel: <code>data-icon="mi-local_gas_station"</code><br />
* FHEM und OpenAutomation Icons: Präfix '''fs-''' und '''oa-'''. Beispiel: <code>data-icon="oa-secur_locked"</code><br />
* [https://erikflowers.github.io/weather-icons/ Weather-Icons]: Präfix '''wi '''. Beispiel: <code>data-icon="wi wi-day-rain-mix"</code><br />
<br />
Alternativ können auch Bilder Icons (bspw. png) über CSS verwendet werden. Bspw:<br />
<syntaxhighlight lang="html5"><br />
<head><br />
<style type="text/css"><br />
.logo-fhem {<br />
background: url(https://wiki.fhem.de/fhemlogo.png) no-repeat;<br />
width: 120px;<br />
height: 132px;<br />
background-size: contain;<br />
}<br />
</style><br />
</head><br />
<body><br />
<div data-type="symbol" data-icon="logo-fhem"></div><br />
</body><br />
</syntaxhighlight><br />
<br />
== Widgets ==<br />
===Allgemeine Attribute===<br />
Jedes Widget kann über verschiedene Attribute konfiguriert werden. Folgende Attribute gelten für alle Widgets:<br />
<br />
{| class="wikitable"<br />
|+allgemeine Attribute<br />
|-<br />
! align="right" |data-type<br />
|Widget-Typ<br />
|-<br />
! align="right" |data-device<br />
|FHEM-Name des Gerätes (mit dem Befehl 'list' bekommt man im FHEM die kpl. Liste)<br />
|-<br />
! align="right" |class<br />
|CSS-Klassen für Aussehen und Formatierung des Widgets<br />
|-<br />
|}<br />
<br />
{| class="wikitable"<br />
|+Daten Empfangen<br />
|-<br />
! align="right" |data-get<br />
|Reading Name<br />
|-<br />
! align="right" |data-get-on<br />
|Wert für den Status on<br />
|-<br />
! align="right" |data-get-off<br />
|Wert für den Status off<br />
|-<br />
|}<br />
<br />
{| class="wikitable"<br />
|+Daten Senden<br />
|-<br />
! align="right" |data-set<br />
|Reading Name<br />
|-<br />
! align="right" |data-set-on<br />
|Wert für den Status on<br />
|-<br />
! align="right" |data-set-off<br />
|Wert für den Status off<br />
|-<br />
|}<br />
<br />
Widget-spezifische Attribute können auf der jeweiligen Widget-Seite nachgelesen werden.<br />
<br />
=== Integrierte Widgets ===<br />
Folgende Widgets sind direkt in FHEM Tablet UI integriert und können "out of the box" verwendet werden.<br />
<br />
* [[FTUI Widget Button|button]]: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen FHEM-Befehl absetzen kann<br />
* [[FTUI Widget Checkbox|checkbox]]: Umschalter zwischen zwei definierten Zuständen<br />
* [[FTUI Widget Circlemenu|circlemenu]]: Mehrere Widgets hinter einem Widget verborgen, trotz des 'circle' im Namen kann das Menue jetzt auch horizontal oder vertikal ausgeklappt werden <br />
* [[FTUI Widget Clock|clock]]: Stellt eine einfache Uhr zur Verfügung<br />
* [[FTUI Widget Colorwheel|colorwheel]]: Farbpalette zur Auswahl von Farben<br />
* [[FTUI Widget Controlbutton|controlbutton]]: iOS-ähnlicher Button zum Schalten zwischen zwei Zuständen (z.B. on / off)<br />
* [[FTUI Widget Controller|controller]]: iOS-ähnlicher vertikaler Schieberegler zum Einstellen eines Wertes<br />
* [[FTUI Widget Datetimepicker|datetimepicker]]: Erstellt eine Auswahl für Datum/Uhrzeit<br />
* [[FTUI Widget Departure|departure]]: Abfahrtszeiten öffentlicher Verkehrsmittel<br />
* [[FTUI Widget Dimmer|dimmer]]: Ein-/Aus-Button mit integriertem Schieberegler für z.B. einen Dim-Wert<br />
* [[FTUI Widget Eventmonitor|eventmonitor]]:<br />
* [[FTUI Widget Homestatus|homestatus]]: Auswahl für vier oder fünf definierte Zustände eines Objects (z.B.: FHEM Residents)<br />
* [[FTUI Widget Html|html]]:<br />
* [[FTUI Widget Iframe|iframe]]: Widget zum Einbinden externer Inhalte in einem Iframe<br />
* [[FTUI Widget Image|image]]: Zeigt ein Bild, dessen URL fest vorgegeben oder aus einem Device-Reading gelesen werden kann<br />
* [[FTUI Widget Input|input]]: Erstellen eines Texteingabefeldes<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/joinedlabel joinedlabel]: verbindet mehrere Readings zu einem Feld<br />
* [[FTUI Widget Klimatrend|klimatrend]]: wandelt Daten aus dem statistics-Modul in einen Pfeil um, der den aktuellen Trend anzeigt<br />
* [[FTUI Widget Knob|knob]]: Erstellt einen Statusbalken auf einer Kreisbahn<br />
* [[FTUI Widget Label|label]]: Reading als Text anzeigen<br />
* [[FTUI Widget Level|level]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert<br />
* [[FTUI Widget Link|link]]: Erstellt einen Link oder Button zum Aufrufen von URLs oder Senden von Befehlen an FHEM<br />
* [[FTUI Widget Medialist|medialist]]:<br />
* [[FTUI Widget Multistatebutton|multistatebutton]]: Variante des push-Widgets, welches den set-Befehl abhängig vom gelesenen Status ändert<br />
* [[FTUI Widget Notify|notify]]: Blendet ein Hinweisfenster im Browser ein<br />
* [[FTUI Widget Pagebutton|pagebutton]]: Button, mit dem auf andere Seiten gesprungen werden kann. Eignet sich gut für eine Navigation<br />
* [[FTUI Widget Pagetab|pagetab]]: Tauscht den Inhalt einer Seite durch den einer anderen. Eignet sich gut für ein Navigationsmenü<br />
* [[FTUI Widget Playstream|playstream]]: Abspielen eines Webradio-Streams per Button<br />
* [[FTUI Widget Popup|popup]]: Öffnet ein Popup nach einem Klick auf ein Widget oder HTML-Element <br />
* [[FTUI Widget Progress|progress]]: Zeigt einen Prozentwert in Form einer runden Fortschrittsleiste<br />
* [[FTUI_Widget_Push|push]]: Button, mit dem ein Befehl an FHEM gesendet werden kann<br />
* [[FTUI Widget Range|range]]: Erstellt vertikale Balken, die einen Wertebereich in unterschiedlichen Farben darstellen<br />
* [[FTUI Widget Readingsgroup|readingsgroup]]: Zeigt eine Readingsgroup an, wie sie in FHEM definiert wurde<br />
* [[FTUI Widget Rotor|rotor]]: Animiertes Umschalten von zwei oder mehr Widgets an einer Position<br />
* [[FTUI Widget Scale|scale]]: Vertikale oder horizontale Leiste zur Anzeige von Werten zwischen einem Minimal- und einem Maximalwert<br />
* [[FTUI_Widget_Select|select]]: Combobox, die eine Liste an Werten zur Auswahl anzeigt<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/settimer settimer]: Zum Anzeigen und Einstellen einer Uhrzeit<br />
* [[FTUI Widget Simplechart|simplechart]]: Einfaches XY-Diagramm zur Anzeige eines Wertes, der direkt aus einem FHEM-Logfile gelesen wird<br />
* [[FTUI Widget Slideout|slideout]]:<br />
* [[FTUI Widget Slider|slider]]: Vertikaler Schieberegler zum Einstellen eines Wertes <br />
* [[FTUI Widget Spinner|spinner]]: Element, um Werte durch Drücken auf Plus-/Minus- oder Höher-/Tiefer-Icons zu ändern<br />
* [[FTUI Widget Swiper|swiper]]: Bietet die Möglichkeit, durch Wischen zwischen verschiedenen Seiten zu wechseln<br />
* [[FTUI Widget Switch|switch]]: Button, um zwischen zwei Zuständen zu schalten (z.B. on / off)<br />
* [[FTUI Widget Symbol|symbol]]: Status eines Devices als Symbol darstellen (z.B. Fenster offen)<br />
* [[FTUI Widget Theme|theme]]: Kontextspezifisches Design<br />
* [[FTUI Widget Thermostat|thermostat]]: Anzeige für Heizungsthermostate, mit der die gewünschte Temperatur eingestellt werden kann<br />
* [[FTUI Widget Volume|volume]]: Einstellscheibe zur Änderung eines einzelnen Wertes<br />
* [[FTUI Widget Weather|weather]]: Wettersymbol anzeigen<br />
* [[FTUI Widget WindDirection|wind_direction]]: Anzeige der Windrichtung auf einer Windrose<br />
<br />
===3rd Party Widgets===<br />
Für diese Widgets kann nicht sichergestellt werden, dass sie mit der jeweils aktuellen Version von FTUI funktionieren.<br />
* [[FTUI Widget Agenda|agenda]]: Zeigt Kalendereinträge in einer Listenform an<br />
* [[FTUI_Widget_Analogclock|analogclock]]: Analoguhr<br />
* [[FTUI Widget Calview|calview]]: Zeigt Einträge aus einem [[CALVIEW]]-Device an<br />
* [[FTUI Widget Chart|chart]]: Diagramm mit ähnlichen Möglichkeiten wie die FHEM-Plots<br />
* [[FTUI Widget Classchanger|classchanger]]: Ändert seine CSS-Klassen je nach Status eines Devices<br />
* [[FTUI Widget Clicksound|clicksound]]: Mit dem Widget "clicksound" können Sounds an Click-Events von Elementen gebunden werden.<br />
* [[FTUI Widget Dwdweblink|dwdweblink]]: Grafische Anzeige DWD-Wetter-Weblink<br />
* [[FTUI Widget Filelog|filelog]]: Teile aus einem FHEM Logfile anzeigen<br />
* [[FTUI Widget Fullcalview|fullcalview]]:<br />
* [[FTUI Widget Gds|gds]]:<br />
* [[FTUI Widget Maps|maps]]: Kartendarstellung mit Google Maps API<br />
* [[FTUI Widget Highchart|highchart]]:<br />
* [[FTUI Widget Highchart3d|highchart3d]]:<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/itunes_artwork itunes_artwork]: itunes_artwork durchsucht die iTunes-Datenbank anhand eines Arrays von beliebigen Suchworten nach einem Cover-Artwork und zeigt dieses an. <br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/javascript javascript]: Ermöglicht die Ausführung beliebigen Javascript-Codes aus einem Reading.<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/kodinowplaying kodinowplaying]: zeigt Informationen zu grade in KODI gespielten Medien in Form eines Labels an.<br />
* [[FTUI Widget Loading|loading]]:<br />
* [[FTUI Widget Meteogram|meteogram]]:<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/mpdnowplaying mpdnowplaying]: Zeigt Titelinformationen eines per MPD-Modul angebundenen Music Player Daemon an.<br />
* [https://forum.fhem.de/index.php/topic,79283.msg712855.html#msg712855 pinpad]: Pinpad für z.B. eine Alarmanlage<br />
* [https://forum.fhem.de/index.php/topic,76643.msg685472.html#msg685472 postme]: Liste des PostMe-Devices anzeigen<br />
* [https://github.com/nesges/Widgets-for-fhem-tablet-ui/wiki/reload reload]: auslösen eine Pagereloads<br />
* [[FTUI Widget Screensaver|screensaver]]:<br />
* [[FTUI Widget SMAPortalSPG|smaportalspg]]: Anzeige von SMAPortal-Daten im FHEM Tablet UI<br />
* [[FTUI Widget für SSCam Streaming Devices (SSCamSTRM)|sscamstrm]]: Integration von SSCam Streaming-Devices (Synology Surveillance Station Kameras) im FHEM Tablet UI<br />
* [https://forum.fhem.de/index.php/topic,73497.0.html scrolllabel]: Texte in Laufschrift darstellen<br />
* [[FTUI Widget Svgplot|svgplot]]: Unveränderte Übernahme eine bestehenden SVG-Plots<br />
* [https://forum.fhem.de/index.php?topic=82883.msg750237#msg750237 todoist]: einfaches widget für todoist<br />
* [[FTUI Widget Tts|tts]]: Sprachausgabe eines Textes aus einem Reading auf dem Endgerät.<br />
* [[FTUI Widget UWZ|uwz]]: Anzeige der Warnungen der Unwetterzentrale<br />
* [[FTUI Widget Wakeup|wakeup]]:<br />
* [https://github.com/svenson08/ftui-weekdaytimer-widget wdtimer]: Visualisierung des [[WeekdayTimer]] Modul<br />
* [[FTUI Widget Weekprofile|weekprofile]]: Visualisierung des [[weekprofile]] Moduls<br />
* [[FTUI Widget Weatherdetail|weatherdetail]]: Detaillierte Wettervorhersage über 4 Tage (Nutzt das Proplanta Modul)<br />
* [[FTUI Widget Video|videodetail]]: Video Widget für die FTUI<br />
<br />
===Anwendungsbeispiele===<br />
Durch die Verbindung von Widgets mit dem FHEM-Umfeld entstehen Lösungen für typische Anwendungen.<br />
* [[FTUI_Beispiel_Datetimepicker_für_Timer|Datetimepicker für Timer]]: Oberfläche für Timereinstellungen<br />
* [[FTUI_Beispiel_Mondphase|Mondphase]]: Visuelle Darstellung der Mondphase<br />
* [[FTUI_Beispiel_Webradio|Webradio]]<br />
* [[FTUI Beispiel Zeitschaltung|Verschiedene Zeitschaltungen]]<br />
<br />
==Templates==<br />
Kommt ein bestimmtes "Code-Fragment" auf mehreren Seiten oder öfter pro Seite vor, bietet FTUI die Option, Templates zu erstellen. Diese werden einmal gebaut und können dann mit dem Attribut '''data-template''' nach Belieben in eine Seite eingefügt werden. Dabei besteht auch die Möglichkeit, Variablen zu verwenden.<br />
<br />
Die Variablennamen sollten möglichst eindeutig und unverwechselbar gewählt werden, da bei der Verwendung von Templates im Prinzip Suchen & Ersetzen angewendet wird. Verwendet man beispielsweise die Variablen '''dev:Thermostat_Kueche''' und '''dev_temp:temperatue''', so kann es passieren, dass die Ergebnisse im erzeugten Code dann '''Thermostat_Kueche''' und '''Thermostat_Kueche_temp''' lauten, statt wie gewünscht '''Thermostat_Kueche''' und '''temperature'''. Um dies zu vermeiden, sollten die Variablen besser '''device:Thermostat_Kueche''' und '''temp:temperature''' lauten.<br />
<br />
Im Folgenden ein paar Beispiele, wie Templates verwendet werden können.<br />
<br />
===Einzelnes Widget===<br />
Soll ein Widget an mehreren Stellen in exakt der selben Ausführung eingebunden werden, kann diese Widget in einer eigenen Datei erstellt und diese dann auf den Zielseiten automatisch mitgeladen werden.<br />
<br />
;Template-Seite<br />
Die Template-Seite soll in diesem Beispiel ''template_symbol.html'' genannt werden. Diese wird daher zuerst im FTUI-Verzeichnis erstellt.<br />
<syntaxhighlight lang="html"><br />
<div data-type="symbol"<br />
data-device="dummy1"><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
Die oben erstellte Template-Seite kann nun in jeder gewünschten Seite eingebunden werden.<br />
<syntaxhighlight lang="html" highlight="6"><br />
[...]<br />
<body><br />
<div class="gridster"><br />
<ul><br />
<li data-row="1" data-col="1" data-sizey="1" data-sizex="1"><br />
<div data-template="template_symbol.html"></div><br />
</li><br />
</ul><br />
</div><br />
</body><br />
[...]<br />
</syntaxhighlight><br />
<br />
===Gridster-Element===<br />
Natürlich kann auch ein ganzes Gridster-Element - in diesem Fall ein Menü - als Template eingebunden werden.<br />
<syntaxhighlight lang="html"><br />
<li data-row="1" data-col="1" data-sizex="1" data-sizey="4" data-template="menu.html"></li><br />
</syntaxhighlight><br />
<br />
=== Widget-Gruppen ===<br />
Die Template-Datei des [[#Einzelnes Widget|ersten Beispiels]] kann natürlich auch mehrere Widgets auf einmal enthalten.<br />
<br />
=== Verwendung von Variablen ===<br />
==== Einfaches Beispiel ====<br />
Oft wird ein und dasselbe Widget für verschiedenen Devices verwendet. Um nicht für jedes Device das Widget neu kopieren zu müssen (bzw. bei Änderungen alle Seiten ausbessern zu müssen), kann ein Template verwendet werden, dem einfach per Parameter mitgeteilt wird, von welchem Device es gerade die Daten empfangen soll.<br />
<br />
In diesem Beispiel wird ein Template erzeugt, dass nur die Temperatur verschiedenen Thermostate mittels eines [[FTUI Widget Label|Label-Widgets]] anzeigt.<br />
<br />
;Template-Seite<br />
Die Template-Seite enthält nur ein einfaches Label-Widget und wird in diesem Beispiel ''template_label.html'' genannt. Um sie für mehrere Devices verwenden zu können, wird im Attribut '''data-device''' der Name des eigentlichen Devices durch den Parameter '''par01''' ersetzt.<br />
<syntaxhighlight lang="html" highlight="2"><br />
<div data-type="label"<br />
data-device="par01"<br />
data-get="measured-temp"></div><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
Auf der Haupt-Seite wird die Template-Seite mit dem Attribut '''data-template''' eingebunden und ihr via Attribut '''data-parameter''' das jeweils gewünschte Device übergeben.<br />
<syntaxhighlight lang="html"><br />
[...]<br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat1"}'></div><br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat2"}'></div><br />
<div data-template="template_label.html" data-parameter='{"par01":"Thermostat3"}'></div><br />
[...]<br />
</syntaxhighlight><br />
<br />
==== Wetter-Slider mit Template ====<br />
In diesem Beispiel wird ein [[FTUI Widget Slider|Slider-Widget]] erstellt, welches die verschiedenen Tage eines Wetterberichtes anzeigt. Dabei wird für den Wetterbericht des jeweiligen Tages immer dasselbe Template verwendet um nicht für jeden Tag ein eigenes Widget schreiben zu müssen.<br />
<br />
;Template-Seite<br />
<syntaxhighlight lang="html"><br />
<div class="left"><br />
<div data-type="label" data-device="AgroWeather" data-get="par01" data-unit="&deg;C"></div><br />
<div class="inline"><br />
<div data-type="label" data-device="AgroWeather" data-get="par02"></div><br />
<div data-type="weather" data-device="AgroWeather" data-get="par02"></div><br />
min:&nbsp;<div data-type="label" data-device="AgroWeather" data-get="par03" data-unit="&deg;C"></div><br />
</div><br />
</div><br />
<div class="left"><br />
<div data-type="label" data-device="AgroWeather" data-get="par04" data-substitution="toDate().eeee()+','"></div><br />
<div data-type="label" data-device="AgroWeather" data-get="par04" data-substitution="toDate().ddmm()"></div><br />
</div><br />
</syntaxhighlight><br />
<br />
;Haupt-Seite<br />
In der Haupt-Seite wird das Template dann für jede Slider-Seite eingebunden und das Reading für den jeweiligen Tag via Parameter übergeben.<br />
<syntaxhighlight lang="html"><br />
[...]<br />
<div data-type="swiper"><br />
<ul><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc0_tempMax","par02":"fc0_weatherDay","par03":"fc0_tempMin","par04":"fc0_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc1_tempMax","par02":"fc1_weatherDay","par03":"fc1_tempMin","par04":"fc1_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc2_tempMax","par02":"fc2_weatherDay","par03":"fc2_tempMin","par04":"fc2_date"}'></li><br />
<li data-template="templates/wetter.html" data-parameter='{"par01":"fc3_tempMax","par02":"fc3_weatherDay","par03":"fc3_tempMin","par04":"fc3_date"}'></li><br />
</ul><br />
</div><br />
[...]<br />
</syntaxhighlight><br />
<br />
== JavaScript-Funktionen ==<br />
Neben den Widgets können auch einige JavaScript-Funktionen verwendet werden, um Befehle an FHEM zu senden.<br />
<br />
<br />
Folgende Zeile setzt einen direkten Befehl an FHEM ab (<code>set dummy1 off</code>):<br />
<syntaxhighlight lang="html"><div onclick="ftui.setFhemStatus('set dummy1 off')">Dummy1 aus</div></syntaxhighlight><br />
<br />
<br />
Diese Zeile veranlasst FHEM dazu, eine Funktion aus der 99_myUtils.pm auszuführen (<code>myUtils_HeizungUpDown("WZ.Thermostat_Climate","up")</code>):<br />
<syntaxhighlight lang="html"><div onclick="ftui.setFhemStatus('{myUtils_HeizungUpDown(&quot;WZ.Thermostat_Climate&quot;,&quot;up&quot;)}')">+</div></syntaxhighlight><br />
<br />
<br />
Ein Beispiel, wie ein Kommando an FHEM gesendet wird und gleichzeitig der Wert eines bereits in FTUI angezeigten Readings verwendet werden kann:<br />
<syntaxhighlight lang="html"><br />
<div data-type="label" data-device="dummy1" data-get="temperature"></div><br />
<div onClick="ftui.setFhemStatus('set dummy2 '+ftui.getDeviceParameter('dummy1','temperature').val);">Senden</div><br />
</syntaxhighlight><br />
<br />
== Eigene Widgets erstellen ==<br />
Wie eigenen Widgets für FTUI erstellt werden können, ist auf der Seite [[FTUI eigene Widgets]] beschrieben.<br />
<br />
Eine Schritt für Schritt Anleitung für das erste eigene Widget gibts hier [[FTUI eigene Widgets - Beispiel]]<br />
<br />
== FAQ ==<br />
Häufig gestellte Fragen zum FHEM Tablet UI sind in der [[FHEM Tablet UI FAQ]] zusammengestellt.<br />
<br />
== Links ==<br />
* [https://github.com/knowthelist/fhem-tablet-ui Projekt auf Github]<br />
* {{Link2Forum|Topic=34233|LinkText=Forums-Beitrag}}<br />
* [[FTUI_Snippets|Snippets]]<br />
* [http://knowthelist.github.io/fhem/tablet/demo_widgets.html Live-Demos]<br />
* [https://waschto.eu/fhem-und-tabletui-livedemo/ FHEM und TabletUI Live-Demo]<br />
* {{Link2Forum|Topic=37378|LinkText=User-Demos}}<br />
* [https://github.com/ovibox/fhem-ftui-user-demos Download der User-Demo-Dateien]<br />
<br />
[[Kategorie:FHEM Tablet UI|!]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=36095DoorBird2021-10-05T09:23:55Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev && sudo apt-get install -y gstreamer1.0-tools</Code><br />
:<Code> wget http://ftp.us.debian.org/debian/pool/main/libs/libsodium/libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo dpkg -i ./libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo apt-get install libyaml-appconfig-perl</Code><br />
<br />
:<Code> sudo nano /etc/ssh/sshd_config</Code><br />
Uncomment<br />
:<Code> #PermitRootLogin without-password</Code><br />
into<br />
:<Code> PermitRootLogin yes</Code><br />
<br />
:<Code> sudo passwd</Code><br />
Choose Root password which is different than pi password and really save!<br />
Close ssh session reboot (sudo reboot) and reenter as root<br />
<br />
:<Code> cd /root/.cpan/build/Alien-Sodium-2.000-1</Code><br />
<br />
:<Code> make uninstall</Code><br />
Copy all the unlink entries shown in the screen above at once and paste (execute) them in the command line below<br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
:<Code> rm -r Alien-Sodium-*</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> install AJGB/Alien-Sodium-1.0.8.0.tar.gz</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> find /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0* -name Makefile</Code><br />
:<Code> /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code> <br />
:<Code> cd /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code><br />
:<Code> make uninstall</Code><br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
<br />
:<Code> rm -r Crypt-NaCl-Sodium-1.0.8.0*</Code><br />
<br />
:<Code> cd /usr/local/lib/aarch64-linux-gnu/perl/5.28.1/auto/share/dist</Code><br />
<br />
:<Code> rm -fr Alien-Sodium</Code><br />
<br />
:<Code> ln -s /usr/local/share/perl/5.28.1/auto/share/dist/Alien-Sodium Alien-Sodium</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> force install Crypt::NaCl::Sodium</Code><br />
:<Code> install IO:String</Code><br />
:<Code> install Crypt::Argon2</Code><br />
:<Code> install Alien::Base::ModuleBuild</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> nano /etc/ssh/sshd_config</Code><br />
:<Code> Swap PermitRootLogin yes</Code><br />
:<Code> into #PermitRootLogin yes</Code><br />
<br />
:<Code> /etc/init.d/ssh restart</Code><br />
<br />
:<Code> Close ssh session and reenter as pi</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=HM-CFG-LAN_LAN_Konfigurations-Adapter&diff=36001HM-CFG-LAN LAN Konfigurations-Adapter2021-09-19T10:42:23Z<p>Sailor: /* Bekannte Probleme */</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=HM-CFG-LAN.jpg<br />
|Bildbeschreibung=HM-CFG-LAN, Draufsicht und Seitenansicht<br />
|HWProtocol=HomeMatic<br />
|HWType=[[Interface]]<br />
|HWCategory=<br />
|HWComm=868,3&nbsp;MHz<br />
|HWChannels=n/a<br />
|HWVoltage=7,5&nbsp;VDC<br />
|HWPowerConsumption=ca.&nbsp;100&nbsp;mA<br />
|HWPoweredBy=Steckernetzteil<br />
|HWSize=100x30mm (ø&nbsp;x&nbsp;H)<br />
|HWDeviceFHEM= {{Link2CmdRef|Anker=HMLAN|Label= 00_HMLAN.pm}}<br />
|ModOwner={{Link2FU|251|Martin / martinp876}}<br />
|HWManufacturer=ELV / eQ-3<br />
}}<br />
<br />
Der [[HM-CFG-LAN LAN Konfigurations-Adapter]] ([http://www.eq-3.de/produkt-detail-zentralen-und-gateways/items/hm-cfg-lan.html HM-CFG-LAN]), kurz HMLAN Konfigurator, ist ein [[Interface|Schnittstellengerät]] (IO) ohne wesentliche Intelligenz. Die Aufgabe ist, ein Interface von der Zentrale zu den Geräten bereitzustellen. Ein HMLAN Konfigurator selbst steuert keine Geräte, er überträgt nur Nachrichten in beide Richtungen.<br />
<br />
== Alternativen ==<br />
Alternativen zu einem HMLAN Konfigurator sind [[HM-CFG-USB USB Konfigurations-Adapter]], [[CUN]], [[CUNO]] und [[CUL]].<br />
<br />
;HMUSB<br />
:Ein HMUSB hat nahezu identische Eigenschaften wie ein HMLAN Konfigurator. Der wesentliche Unterschied ist die Anbindung über USB anstatt Ethernet. Es hat sich erwiesen, dass USB eine bessere Latenz hat als LAN - also eine kürzere Verzögerung. Damit hat ein HMUSB leichte Vorteile zu HMLAN Konfigurator, was aber in den bei Weitem meisten Fällen durch die interne Timing Kalkulation abgefangen wird. Zudem können über den HMUSB (ab Version 2) auch Firmware-Updates OTA (over-the-air, also per Funkverbindung) auf entsprechende HM-Geräte (z.B. den HM-CC-RT-DN) durchgeführt werden.<br />
:Dafür bietet der HMLAN Konfigurator mit seinem Netzwerkanschluss Vorteile bei der Platzierung und bei der Ansteuerung (teilweise Timing-Probleme beim Anschluss von USB-Geräten an langsamere Raspberrys und beim Durchschleifen von USB an FHEM in einer virtuellen Maschine).<br />
<br />
; CUL/CUN(O)<br />
* Die Devices liefern keine eigenen Zeitstempel, wodurch eine Timingkorrektur durch FHEM nicht möglich ist. Je nach Systemgeschwindigkeit kann dies zu Problemen, Nachrichtenwiederholung und ggf. auch Nachrichtenverlust führen<br />
* Da USB kurze Reaktionszeiten und geringe Timingschwankungen hat, ist der Einsatz von [[CUL]] und [[CUNO]] mit HM möglich. <br>Die Timingschwankungen der Ethernet-Schnittstelle hingegen können in FHEM nicht ausgeglichen werden. Daher kann der Einsatz der [[CUNO]] über Ethernet '''nicht empfohlen''' werden.<br />
* Der Übertragungsmodus ''lazyConfig'' wird nicht unterstützt<br />
<br />
== Funktionen ==<br />
=== AES ===<br />
siehe [[AES Encryption]].<br />
<br />
=== Übertragungsmodus ===<br />
Es werden alle HM-Modi unterstützt. Diese sind Always, Burst, Wakeup und Config. Weiter gibt es lazyConfig und conditionalBurst. Siehe [[HomeMatic]] für Details.<br />
<br />
=== KeepAlive ===<br />
Der HMLAN Konfigurator baut eine Verbindung zur Zentrale über das LAN Interface auf. Der HMLAN Konfigurator erwartet alle 30 Sekunden eine keep-alive Nachricht von der Zentrale. Sollte diese ausbleiben, baut der HMLAN Konfigurator die LAN-Verbindung ab. Das führt zu einem Disconnect, der in State gemeldet wird. Die Verbindung wird automatisch wieder aufgebaut. <br />
FHEM sendet den keep-alive alle 25 Sekunden, was einen 5 Sekunden Puffer einräumt. In Internals '''msgKeepAlive''' kann man sehen, wie hoch die maximale Verzögerung der Zentrale beim Senden war und wie viel Puffer (in Sekunden) noch verfügbar war. <br />
Die Wiederholrate von 25 Sekunden des keep-alive kann mit dem Attribut '''wdTimer''' reduziert werden, was den Puffer erhöht. Es wird jedoch dringend geraten, im Problemfall die Ursache der Verzögerung zu suchen und zu eliminieren.<br />
<br />
=== Nachrichtenübertragung - Performance ===<br />
* Mit Internal ''msgParseDly'' kann man ablesen, welche Verzögerung eine Nachricht vom Empfang im HMLAN Konfigurator bis zur Verarbeitung in der Zentrale hat.<br />
* Der HMLAN Konfigurator hält sich an den Funkstandard, der einem Sender maximal 36 Sekunden Sendezeit je Stunde erlaubt ([[1%25_Regel]]). Wird dieser Wert überschritten, stellt der HMLAN Konfigurator das Senden ein. Empfangen wird weiter. Ist eine Nutzung des Zeitslots zu 90% erreicht, wird im Reading ''cond'' ''Warning-HighLoad'' gemeldet. Bei cond ''ERROR-Overload'' wird das Senden eingestellt.<br />
<br />
=== Loggen/Mitschneiden ===<br />
Es stehen die üblichen Funktionen des Attribute [[verbose]] zu Verfügung. Darüber hinaus gibt es die Attribute ''hmProtocolEvents'' und ''logIDs''. Siehe auch [[Homematic Nachrichten sniffen]].<br />
<br />
== Vorbereitung ==<br />
{{Randnotiz|RNText='''"Usersoftware"/Firmware'''<br />
* V1.520 / 10.12.2015 / [https://www.eq-3.de/downloads/software/konfigurationsadapter/Konfigurationsadapter_LAN/hm-cfg-lan_usersoftware_v1_520_eq-3_151207.zip Download]<br />
'''Firmware Update Tool / Firmware / Datum'''<br />
* V1.2 / 0.965 / 11.02.2016 / [https://www.eq-3.de/downloads/software/firmware_update_tool/hm-firmware-update-tool_v1_2_eq-3_160211.zip Download]<br />
<br />
}}<br />
[[Datei:HMLAN_CONFIG_IP_AES.png|300px|thumb|right|HomeMatic Lan-Interface Configurator]][[Datei:HMLAN_CONFIG_AES.png|300px|thumb|right|HomeMatic Konfigurator]]<br />
Bevor man den HMLAN mit FHEM nutzen kann, müssen noch Einstellungen vorgenommen werden. Dazu braucht man die Konfigurationsadapter-LAN-Usersoftware, die bei [http://www.eq-3.de/service/downloads.html HomeMatic] herunter zu laden ist und nach der Installation mit der Verknüpfung "HomeMatic-Lan-Interface konfigurieren" oder "HomeMatic-Komponenten konfigurieren" gestartet wird und unter Windows läuft. Für andere Betriebssysteme (siehe Anhang im Beitrag {{Link2Forum|Topic=11506|Message=67417|LinkText=Anleitung für OS X}}) braucht man eine Windows-Emulation. Dem HMLAN liegen zwei Konfigurationsprogramme bei, bitte darauf achten, das richtige zu verwenden. Wenn das Konfigurationsprogramm den HMLAN-Konfigurator nicht findet, sollten alle nicht benutzten Netzwerkinterfaces vorübergehend deaktiviert werden, siehe {{Link2Forum|Topic=10933|Message=62960|LinkText=Beitrag im FHEM Forum}} und [[HM-CFG-LAN_LAN_Konfigurations-Adapter#Bekannte_Probleme|bekannte Probleme]].<br />
<br />
Sollte das Firmwarepdate abbrechen, ist die LAN Verbindung des PC's zu prüfen: ordentliche LAN Verbindung verwenden! Wlan ausschalten!<br />
<br />
=== Firmware ===<br />
Die aktuelle Firmware Version des HMLAN Konfigurators ist 0.965 (Stand Februar 2016). Ein Update ist mit dem ''"Firmware Update Tool"'' möglich, die aktuelle Firmware ist Bestandteil des Tools.<br />
<br />
'''Achtung''': Das zum download angebotene '''Firmware Update Tool''' installiert drei Tools:<br />
* Home Matic Firmware Updater Tool - das ist zum Firmware Update von Komponenten mittels CFG-USB!<br />
* '''HomeMatic-Lan-Interface konfigurieren''' - damit kann man auch die '''Firmware des CFG-LAN aktualisieren''' (Rechts im Bild)<br />
* HomeMatic-CFG-USB aktualiseren -- damit kann man auch die Firmware des CFG-USB aktualisieren<br />
Um einen mit FHEM benutzten HM-LAN zu aktualisieren, reicht es,<br />
# im HMLAN-Device mit <code>attr <myHMLAN> dummy 1</code> den Adapter vorübergehend zu deaktivieren,<br />
# mit dem (Windows) Firmware Update Tool die Firmware auf den HM-LAN aufzuspielen<br />
# nach dem Stoppen des Update Tools mit <code>deleteattr <myHMLAN> dummy</code> das Device in FHEM wieder zu aktivieren.<br />
<br />
Version 1.2 des Firmware Update Tools läuft auch unter Windows 10. <br />
<br />
Allerdings kann es unter Umständen passieren, dass sich das Programm mit folgender Fehlermeldung nicht starten lässt:<br />
"Die Anwendung konnte nicht gestartet werden, da die Side-by-Side Konfiguration ungültig ist."<br />
<br />
Dann fehlt die Microsoft Visual C++ 2008 SP1 Redistributable Package (x86). Diese kann dann unter dieser Adresse heruntergeladen und anschließend installiert werden: https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe<br />
<br />
=== IP Adresse ===<br />
Der HMLAN Konfigurator ist ähnlich wie der CUN(O) ein Netzwerkgerät. Er beherrscht DHCP und bezieht bei einem im Netzwerk erreichbaren DHCP Server von diesem eine IP-Adresse. Da FHEM zwecks Kommunikation die IP-Adresse wissen muss, ist es sinnvoll, dem HMLAN Konfigurator eine statische (feste) Adresse zuzuweisen. <br />
* mit der auf der CD mitgelieferten ''"HomeMatic Lan-Interface Configurator"'' Software unter ''"Change IP Settings"'' oder<br />
* im DHCP-Server (sofern dies vom gegebenen DHCP Server als Konfigurationsoption unterstützt wird).<br />
<br />
=== AES Encrypted LAN Communication ===<br />
Wichtig ist, dass vor Verwendung die "AES Encrypted LAN Communication" abgeschaltet wird, da diese von FHEM nicht unterstützt wird. Dies ist unter ''"Change IP Settings"'' der ''"HomeMatic Lan-Interface Configurator"'' Software möglich. AES auf dem LAN ist zu unterscheiden von HMLAN auf der Funkschnittstelle. siehe [[AES Encryption]].<br />
<br />
== Einbindung in FHEM ==<br />
Der HMLAN-Konfigurator muss in FHEM [[Konfiguration|konfiguriert]] werden. Das erfolgt mit diesen Befehlen:<br />
:<code>define HMLAN1 HMLAN <IP Adresse>:1000</code><br />
Der Name (im obigen Beispiel ''HMLAN1'') kann frei vergeben werden. Standard IP-Port des HMLAN-Konfigurators ist 1000.<br />
<br />
HMLAN kennt mehrere Attribute ({{Link2CmdRef|Anker=HMLAN}}). <br />
Äußerst wichtig ('''''Sicherheit!!''''') ist es außerdem, die '''hmId''' zu vergeben, siehe [[HomeMatic_Devices_pairen#hmId]]. <br />
<br />
Ein '''gleichzeitiger''' Zugriff von FHEM und der HomeMatic-Software auf den HMLAN-Konfigurator ist nicht möglich, da letzterer nur eine einzige Verbindung zulässt. Wollen Sie temporär z.B. mit der Windows-Software von HomeMatic zugreifen, ist FHEM zu deaktivieren.<br />
Sinnvoll ist es, die hmId mit der hmId der PC-Software gleichzusetzen. Dann kann man von beiden Zentralen alternativ zugreifen ohne pairen zu müssen.<br />
<br />
=== Nutzung mehrere IOs ===<br />
==== Empfangen ====<br />
Man kann an einem FHEM mehrere IOs (HMLAN/USB, CUL/CUNO) betreiben. Generell empfangen alle IOs von allen Geräten in ihrem Empfangsbereich - unabhängig von der hmId. <br />
<br />
==== Senden ====<br />
An ein Gerät wird nur über das IO gesendet, das in Internals->IODev angezeigt wird. Nutzt man mehrere IOs sollte man im HM Device das Attribut IODev auf das gewünschte IO setzen. Ansonsten sucht FHEM zufällig ein IO aus.<br />
<br />
==== hmId bei mehreren IOs ====<br />
Man kann allen IOs die gleiche hmId setzen. Das erlaubt die wahlfreie Umschaltung des Sende-IOs für das Device. Sollte man unterschiedliche hmIds wählen, simuliert dies mehrere Zentralen. Das Device, an das man sendet, muss über ein IO angesprochen werden, mit einer hmId, auf die das Device gepairt ist. <br />
<br />
<br />
=== Virtueller Controller VCCU ===<br />
Speziell wenn mehrere IOs verwendet werden sollen, empfiehlt sich die Verwendung einer [[Virtueller Controller VCCU|VCCU]], da eine redundante Nutzung mehrerer Schnittstellen dann wesentlich einfacher einzurichten ist. Das Einrichten einer VCCU lohnt sich aber schon bei der Benutzung nur eines HomeMatic I/O, also wenn man z.B. nur einen HMLAN Konfigurator einsetzen will. Zum Einen ist es wesentlich einfacher ggf. später weitere Schnittstellen dazu zu konfigurieren, zum Anderen adressiert die VCCU die auch bereits bei einer Schnittstelle auftauchenden Probleme wie die "<code>Unknown code</code>" Meldungen im Log.<br />
<br />
Die Einrichtung einer VCCU ist nicht sehr aufwändig und wird dringend empfohlen.<br />
<br />
=== Attribute ===<br />
* '''hmId''': Adresse, die das IO auf der Funkstrecke nutzt. Siehe [[HomeMatic_Devices_pairen#hmId]].<br />
* '''hmKey, hmKey2..3''': bis zu 3 AES keys, die auf der Funkstrecke genutzt werden. Siehe [[AES Encryption]]<br />
* '''hmLanQlen''' legt fest, wie viele Nachrichten parallel gesendet werden dürfen, also auf wie viele Antworten die Zentrale parallel warten darf. Ein Wert von 1 ist max defensiv, erzeugt aber eine höhere Verzögerung. Wählt man einen höheren Wert kann es zu Nachrichten-Wiederholungen kommen. <br />
* '''hmProtocolEvents''': alle Nachrichten werden dekodiert ausgegeben. Diese Einstellung benötigt einige Performance insbesondere bei höherem Level. Man sollte es vorsichtig nutzen. <br />
* '''logIDs''': zeichnet Rohmessages auf und bietet die genaueste Methode bei der Fehlersuche. Da Nachrichten undekodiert ausgegeben werden, ist es im Wesentlichen für Spezialisten von Bedeutung. Man gibt eine Komma-getrennte Liste von IDs an, die geloggt werden sollen. Mit '''all''' werden alle IDs aufgezeichnet. '''sys''' zeichnet zusätzlich Systemmessages auf. '''sys,all''' somit alles.<br />
* '''respTime''': Antwortzeit des HMLAN auf ein keep-alive kann hier eingestellt werden. Normalerweise sollte das HMLAN innerhalb einer Sekunde der Zentrale antworten. Sollte dies nicht passieren, wird die Message wiederholt. Der Wert sollte nur in Ausnahmefällen verändert werden.<br />
<br />
=== Readings ===<br />
* '''Xmit-Events''': Anzahl der Ereignisse <br />
* '''cond''': aktueller Zustand des IO. <br />
** ok<br />
** Warning-HighLoad: 90% der 1h Sendekapazität sind erreicht<br />
** ERROR-Overload: 100% der Sendekapazität sind erreicht, '''das IO sendet nicht mehr'''<br />
** timeout<br />
** disconnected: die Verbindung FHEM / IO ist unterbrochen<br />
** Overload-released: das IO ist aus ERROR-Overload zurück im Sendebetrieb<br />
** init: Das IO wurde neu initialisiert. <br />
* '''prot_ERROR-Overload''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_Warning-HighLoad''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_disconnected''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_init''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_ok''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_timeout''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
<br />
=== Internals ===<br />
* '''XmitOpen''': 1 = HMLAN ist sendebereit<br />
* '''assignedIDs''': hmIds der HM Devices, die über dieses IO bedient werden<br />
* '''assignedIDsCnt''': Anzahl der zugewiesenen hmIds von FHEM<br />
* '''assignedIDsReport''': Anzahl der hmIds, die das HMLAN angibt zu bedienen. Die Zahl sollte identisch sein mit assignedIDsCnt<br />
* '''msgKeepAlive''': dlyMax: maximale Verzögerung, die ein keep-alive hatte. bufferMin: der minimale Zeitpuffer, der übrig blieb, bis das keep-alive zu spät gekommen wäre. Der Puffer sollte 2 oder größer sein, sonst könnte man gelegentlich disconnects bekommen. <br />
* '''msgLoadEst''': Funkbelastung des HMLAN. Der Wert wird über 1 Stunde akkumuliert. Sollten 100% erreicht sein, wird das HMLAN den Sendebetrieb einstellen. Der Wert ist eine Hochrechnung in FHEM. Es ist möglich, dass das HMLAN mehr belastet ist. Die 10 min Werte zeigen die Belastung in den letzten 10min Perioden an.<br />
* '''msgParseDly''': Verzögerung der Message Verarbeitung vom Empfang im IO bis zur Verarbeitung in FHEM, gemessen in Millisekunden. Eine Verzögerung kann durch Prozesse an LAN, durch FHEM Prozesse oder sonstige Prozesse/Applikationen der CPU hervorgerufen werden.<br />
<br />
== Pairen von Geräten ==<br />
Jedes HM Gerät muss vor Verwendung mit der HM-Zentrale [[Pairing (HomeMatic)|gepairt]] werden. Hierfür ist Wahl einer hmId nötig (alle Details siehe [[HomeMatic_Devices_pairen#hmId]]).<br />
Alle Geräte haben eine eigene Seriennummer, die nicht änderbar ist. Details zum Pairen auf der Seite [[HomeMatic Devices pairen]].<br />
<br />
== Bekannte Probleme ==<br />
=== Verbindung wird abgelehnt ===<br />
Selten lehnt der HMLAN-Adapter ohne erkennbaren Grund nach monatelangem störungsfreiem Betrieb die Verbindung ab:<br />
<pre style="width:400px;"><br />
Opening HMLAN1 device 192.168.168.60:1000<br />
192.168.168.60:1000 connection refused<br />
</pre><br />
Der HMLAN-Adapter kann aber über die mitgelieferte Konfigurationssoftware problemlos erreicht werden. Der Zustand lässt sich auch durch einen Reboot des HMLAN-Adapters (oder FHEM) nicht beheben, wohl aber durch eine Aktualisierung der Firmware des HMLAN-Adapters, '''selbst wenn die installierte Version aktuell ist'''.<br />
<br />
=== Homematic-Geräte-Konfigurationsprogramm verbindet sich nicht mit LAN-Adapter ===<br />
Damit das Konfigurationsprogramm auf den LAN-Adapter zugreifen kann, muss das FHEM-Modul deaktiviert werden. (Attribute dummy=1 oder FHEM herunterfahren) Hat das Konfigurationsprogramm trotzdem Probleme, den LAN-Adapter zu finden, sollten vorübergehend alle bis auf das aktuell genutze Netzwerkinterfaces deaktiviert werden. Unter Windows 7 reicht es eventuell nicht, die Netzwerkverbindungen im "Netzwerk- und Freigabecenter" zu deaktivieren, sondern die Netzwerkadapter müssen auch im Gerätemanager deaktiviert werden.<br />
<br />
Unter Windows 10 scheint das Programm nicht mehr zu funktionieren. Der Konfigurationsadapter wird nicht gefunden. Auch nicht bei deaktivierten Netzwerkverbindungen.<br />
<br />
=== Häufiger automatischer Neustart ("Reboot") ===<br />
Der HMLAN Adapter startet ohne erkennbaren äußeren Anlass häufig neu. Das Problem ist auch im Forum unter der Überschrift {{Link2Forum|Topic=20776|LinkText=HMLAN Adapter wechselt permanent zwischen disconnected / connected}} beschrieben. Im FHEM Log erscheinen in diesem Fall folgende Meldungen:<br />
<pre style="width:600px;"><br />
... HMLAN_Parse: myHMLAN new condition timeout (je nach Timing, manchmal)<br />
... HMLanHostname:1000 disconnected, waiting to reappear (myHMLAN)<br />
... HMLAN_Parse: myHMLAN new condition disconnected<br />
... HMLanHostname:1000 reappeared (myHMLAN)<br />
... HMLAN_Parse: myHMLAN new condition init<br />
... HMLAN_Parse: myHMLAN new condition ok<br />
</pre><br />
Dieses Problem ist bei ELV [http://www.elv.de/topic/hm-lan-reboots.html bekannt] und soll mit der [http://www.eq-3.de/Downloads/Software/Konfigurationsadapter/Konfigurationsadapter_LAN/HM-CFG-LAN_Usersoftware_V1_520_eQ-3_151207.zip Konfigurationsadapter LAN Usersoftware V1.520 (10.12.2015)], bzw. der darin enthaltenen Firmware Version, behoben sein. Stand 05.08.2016 12:32 Auch mit der aktuellen Firmware (v0.965 - Link siehe oben) und der aktuellen Version von HMLAN (Rev 11645 vom 2016-06-11) tritt der Fehler noch auf.<br />
<br />
=== Kompletter und/oder sporadischer Totalausfall ===<br />
Sollten die oben genannten softwareseitigen Problemlösungen zu keinem erwünschten Ergebnis führen, kann gegebenenfalls ein Austausch der verbauten Elektrolytkondensatoren (Elkos) Abhilfe schaffen.<BR><br />
Zumindest ist dies eine Alternative zur Verschrottung. <BR><br />
Siehe Forumsbeitrag https://forum.fhem.de/index.php/topic,62442.msg538982.html#msg538982<BR><br />
<br />
=== Pairing von Geräten in räumlich dichter Nähe zum HMLAN endet bei den neuen Geräten im "Missing Ack" ===<br />
Sollte bei einem Pairing-Versuch die Geräte dies mit einer dauerhaft blinkenden LED quittieren und somit den Pairing-Prozess nicht abschließen, sollte die Distanz zum HMLAN überprüft werden.<br />
Es ist im Forum mehrfach darüber berichtet worden, das diese Pairing-Vorhaben gescheitert sind weil die Geräte schlichtweg zu dicht am HMLAN gelegen haben.<br />
Insbesondere beim ersten Testaufbau passiert dies immer mal wieder gerne.<br />
Hierzu einfach eine räumlich größere Entfernung herstellen und erneut versuchen.<br />
<br />
== Verbesserung der Antennenleistung ==<br />
Die Sende- und Empfangsleistung kann man verbessern. <br />
<br />
Ein relativ einfache Methode ist, die Antenne aus dem Gehäuse herauszuführen. Dies bringt in der Regel bereits einen spürbar verbesserten RSSI und eine verminderte Einstrahlung der Elektronik in die Antenne. Als Kosten fallen der Kaufpreis des 5er TORX an, der üblicherweise nicht vorhanden ist und ca. 6 € kostet (es ist u.U. empfehlenswert, gleich ein ganzes Kombi-Set für Handy-Reparatur etc. zu kaufen).<br />
<br />
* HM-CFG-LAN aufschrauben. Innen sieht er so aus:<br />
<br />
[[Datei:HM-CFG-LAN Innen.jpeg]]<br />
<br />
Der schwarze Draht im oberen Bereich unter den Lichtleitern ist die Antenne.<br />
<br />
* Lichtleiter entfernen (Bleibt machmal auch im Deckel hängen)<br />
<br />
[[Datei:HMLAN Antenne.JPG]]<br />
<br />
Rechts ist das Funkmodull zu erkennen, der schwarze Draht ist die Antenne. Es ist gut zu sehen, dass die Antenne sehr nahe an der Elektronik ist, die HF-Signale in die Antenne einstrahlt und die Empfangsleistung dadurch vermindert.<br />
<br />
* Das Gehäuse an passender Stelle mit einer kleinen Feile oder einem Drehmel oder ähnlich einkerben.<br />
<br />
[[Datei:HMLAN schlitz.JPG]]<br />
<br />
<br />
<br />
* Die Antenne einfach nach aussen biegen. Der Winkel ist egal, und kann später durch die Positionierung des HM-CFG-LAN optimal eingestellt werden. Der Draht sollte aber gerade sein, also keinen Knick oder keine Krümmung haben.<br />
<br />
[[Datei:Antenne nach aussen.JPG]]<br />
<br />
Man kann die Antenne auch verlängern, sinnvoll ist aber nur eine Verdopplung (von L/4 auf L/2). Geringere Verlängerungen verschlechtern die Leistung.<br />
<br />
<br />
* Gehäuse wieder zusammenbauen und zuschrauben, fertig.<br />
<br />
[[Datei:HMLANAntenneextern.JPG]]<br />
<br />
<br />
Dieser Umbau (ohne Antennenverlängerung) bringt in der Regel einen um 4-5 Zähler verbesserten RSSI und verringert die Einstrahlung der Elektronik. Dies ist nur der einfachste Schritt eines Antennenumbaus. Mit nur wenig mehr Aufwand lassen sich wesentlich bessere Ergebnisse erzielen.<br />
<br />
Links zu weitergehenden Maßnahmen [[Trick_der_Woche#HM_LAN_Konfig-Adapter_Antenne_verbessern|hier]].<br />
<br />
== Wechsel von CUL zu HMLAN ==<br />
{{Randnotiz|RNTyp=y|RNText=Der hier beschriebene Wechsel sollte mittlerweile einfacher über die [[Virtueller Controller VCCU|VCCU]] realisierbar sein, indem erst ein weiteres IO-Device hinzugefügt und anschließend das zu ersetzende entfernt wird.}}<br />
Sollten ein [[CUL]] als IO für HomeMatic-Geräte dienen und ein Wechsel auf den HMLAN Konfigurator geplant sein, kann die folgende Vorgehensweise gewählt werden:<br />
<br />
* deaktivieren Sie das CUL in der ''fhem.cfg''.<br />
* konfigurieren Sie den HMLAN Konfigurator '''von Hand''' <br />
* Ändern Sie das Attribut IODev aller HM-Devices vom Namen der CUL auf den Namen des HMLAN<br />
* sollten Sie das Attribut IODev nicht nutzen (nicht empfohlen), achten Sie darauf, dass im fhem.cfg das IO vor allen HM-devices definiert wird. Eine automatischen Zuweisung des IO zu den Devices ist sonst nicht möglich. <br />
** der HMLAN '''muss''' die gleiche ''hmId'' wie das bisherige CUL erhalten. Ansonsten müssen alle Geräte neu gepairt / angelernt werden.<br />
** AES muss im HMLAN abgeschaltet werden.<br />
* verbinden Sie den HMLAN Konfigurator mit ihrem Netzwerk und ziehen das CUL aus der USB-Buchse.<br />
* geben Sie in der FHEM-Befehlszeile ''shutdown restart'' gefolgt von &lt;Enter&gt; (nicht "save") ein (evtl. reicht auch ein ''rereadcfg'').<br />
* kontrollieren Sie im Event-Monitor und in den HM-Device-Logs von FHEM die Kommunikation.<br />
<br />
Bitte beachten: Falls dem CUL keine explizite hmId per Attribut zugewiesen wurde, wird diese ID aus "F1&lt;FHT-ID&gt;" zusammengebaut. Die hmId muss auf dem HMLAN explizit gesetzt werden.<br />
<br />
== Deregistrierung (Unpair) von Geräten ==<br />
Manche HomeMatic Geräte lassen sich nur dann am neuen Gateway anlernen, wenn sie zuerst vom alten abgelernt wurden. Dies wird zum Beispiel beim Umzug auf ccu3 erforderlich und insbesondere durch nicht immer funktionierende Konfigurationssoftware erschwert.<br />
<br />
Vorgehensweise:<br />
* FHEM GUI in zwei Browser-Tabs öffnen - eines für das abzulernende Gerät, ein zweites für HMLAN.<br />
* ein <code>set unpair</code> an das Gerät absetzen und warten, bis der Status von CMD_pending wechselt, dabei beginnt üblicherweise die orangefarbene LED zu blinken wie bei "Factory Reset" (das Abholen der Befehle kann durch das Drücken der Knöpfe am Gerät meistens beschleunigt werden)<br />
* sobald das Unpair und Reset am Gerät angelaufen ist, muss der HMLAN auf <code>set close</code> auf "close" gesetzt werden; damit wird verhindert, dass das Gerät neu gepaired wird<br />
* jetzt kann das Gerät an ein anderes Gateway neu angelernt werden.<br />
<br />
== Links ==<br />
<!-- Produkt derzeit nicht im Sortiment - * [http://www.elv.de/homematic-lan-konfigurations-adapter.html Produktseite] bei ELV --><br />
* [http://www.eq-3.de/service/downloads.html Software] für den Konfigurationsadapter von der eQ-3 Site<br />
* [https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe Download] für das Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)<br />
* [[Trick_der_Woche#HM_LAN_Konfig-Adapter_Antenne_verbessern|HM LAN Konfig-Adapter Antenne verbessern]]<br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:868MHz]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=HM-CFG-LAN_LAN_Konfigurations-Adapter&diff=36000HM-CFG-LAN LAN Konfigurations-Adapter2021-09-19T10:42:08Z<p>Sailor: /* Bekannte Probleme */ Zu geringe Entfernung</p>
<hr />
<div>{{Infobox Hardware<br />
|Bild=HM-CFG-LAN.jpg<br />
|Bildbeschreibung=HM-CFG-LAN, Draufsicht und Seitenansicht<br />
|HWProtocol=HomeMatic<br />
|HWType=[[Interface]]<br />
|HWCategory=<br />
|HWComm=868,3&nbsp;MHz<br />
|HWChannels=n/a<br />
|HWVoltage=7,5&nbsp;VDC<br />
|HWPowerConsumption=ca.&nbsp;100&nbsp;mA<br />
|HWPoweredBy=Steckernetzteil<br />
|HWSize=100x30mm (ø&nbsp;x&nbsp;H)<br />
|HWDeviceFHEM= {{Link2CmdRef|Anker=HMLAN|Label= 00_HMLAN.pm}}<br />
|ModOwner={{Link2FU|251|Martin / martinp876}}<br />
|HWManufacturer=ELV / eQ-3<br />
}}<br />
<br />
Der [[HM-CFG-LAN LAN Konfigurations-Adapter]] ([http://www.eq-3.de/produkt-detail-zentralen-und-gateways/items/hm-cfg-lan.html HM-CFG-LAN]), kurz HMLAN Konfigurator, ist ein [[Interface|Schnittstellengerät]] (IO) ohne wesentliche Intelligenz. Die Aufgabe ist, ein Interface von der Zentrale zu den Geräten bereitzustellen. Ein HMLAN Konfigurator selbst steuert keine Geräte, er überträgt nur Nachrichten in beide Richtungen.<br />
<br />
== Alternativen ==<br />
Alternativen zu einem HMLAN Konfigurator sind [[HM-CFG-USB USB Konfigurations-Adapter]], [[CUN]], [[CUNO]] und [[CUL]].<br />
<br />
;HMUSB<br />
:Ein HMUSB hat nahezu identische Eigenschaften wie ein HMLAN Konfigurator. Der wesentliche Unterschied ist die Anbindung über USB anstatt Ethernet. Es hat sich erwiesen, dass USB eine bessere Latenz hat als LAN - also eine kürzere Verzögerung. Damit hat ein HMUSB leichte Vorteile zu HMLAN Konfigurator, was aber in den bei Weitem meisten Fällen durch die interne Timing Kalkulation abgefangen wird. Zudem können über den HMUSB (ab Version 2) auch Firmware-Updates OTA (over-the-air, also per Funkverbindung) auf entsprechende HM-Geräte (z.B. den HM-CC-RT-DN) durchgeführt werden.<br />
:Dafür bietet der HMLAN Konfigurator mit seinem Netzwerkanschluss Vorteile bei der Platzierung und bei der Ansteuerung (teilweise Timing-Probleme beim Anschluss von USB-Geräten an langsamere Raspberrys und beim Durchschleifen von USB an FHEM in einer virtuellen Maschine).<br />
<br />
; CUL/CUN(O)<br />
* Die Devices liefern keine eigenen Zeitstempel, wodurch eine Timingkorrektur durch FHEM nicht möglich ist. Je nach Systemgeschwindigkeit kann dies zu Problemen, Nachrichtenwiederholung und ggf. auch Nachrichtenverlust führen<br />
* Da USB kurze Reaktionszeiten und geringe Timingschwankungen hat, ist der Einsatz von [[CUL]] und [[CUNO]] mit HM möglich. <br>Die Timingschwankungen der Ethernet-Schnittstelle hingegen können in FHEM nicht ausgeglichen werden. Daher kann der Einsatz der [[CUNO]] über Ethernet '''nicht empfohlen''' werden.<br />
* Der Übertragungsmodus ''lazyConfig'' wird nicht unterstützt<br />
<br />
== Funktionen ==<br />
=== AES ===<br />
siehe [[AES Encryption]].<br />
<br />
=== Übertragungsmodus ===<br />
Es werden alle HM-Modi unterstützt. Diese sind Always, Burst, Wakeup und Config. Weiter gibt es lazyConfig und conditionalBurst. Siehe [[HomeMatic]] für Details.<br />
<br />
=== KeepAlive ===<br />
Der HMLAN Konfigurator baut eine Verbindung zur Zentrale über das LAN Interface auf. Der HMLAN Konfigurator erwartet alle 30 Sekunden eine keep-alive Nachricht von der Zentrale. Sollte diese ausbleiben, baut der HMLAN Konfigurator die LAN-Verbindung ab. Das führt zu einem Disconnect, der in State gemeldet wird. Die Verbindung wird automatisch wieder aufgebaut. <br />
FHEM sendet den keep-alive alle 25 Sekunden, was einen 5 Sekunden Puffer einräumt. In Internals '''msgKeepAlive''' kann man sehen, wie hoch die maximale Verzögerung der Zentrale beim Senden war und wie viel Puffer (in Sekunden) noch verfügbar war. <br />
Die Wiederholrate von 25 Sekunden des keep-alive kann mit dem Attribut '''wdTimer''' reduziert werden, was den Puffer erhöht. Es wird jedoch dringend geraten, im Problemfall die Ursache der Verzögerung zu suchen und zu eliminieren.<br />
<br />
=== Nachrichtenübertragung - Performance ===<br />
* Mit Internal ''msgParseDly'' kann man ablesen, welche Verzögerung eine Nachricht vom Empfang im HMLAN Konfigurator bis zur Verarbeitung in der Zentrale hat.<br />
* Der HMLAN Konfigurator hält sich an den Funkstandard, der einem Sender maximal 36 Sekunden Sendezeit je Stunde erlaubt ([[1%25_Regel]]). Wird dieser Wert überschritten, stellt der HMLAN Konfigurator das Senden ein. Empfangen wird weiter. Ist eine Nutzung des Zeitslots zu 90% erreicht, wird im Reading ''cond'' ''Warning-HighLoad'' gemeldet. Bei cond ''ERROR-Overload'' wird das Senden eingestellt.<br />
<br />
=== Loggen/Mitschneiden ===<br />
Es stehen die üblichen Funktionen des Attribute [[verbose]] zu Verfügung. Darüber hinaus gibt es die Attribute ''hmProtocolEvents'' und ''logIDs''. Siehe auch [[Homematic Nachrichten sniffen]].<br />
<br />
== Vorbereitung ==<br />
{{Randnotiz|RNText='''"Usersoftware"/Firmware'''<br />
* V1.520 / 10.12.2015 / [https://www.eq-3.de/downloads/software/konfigurationsadapter/Konfigurationsadapter_LAN/hm-cfg-lan_usersoftware_v1_520_eq-3_151207.zip Download]<br />
'''Firmware Update Tool / Firmware / Datum'''<br />
* V1.2 / 0.965 / 11.02.2016 / [https://www.eq-3.de/downloads/software/firmware_update_tool/hm-firmware-update-tool_v1_2_eq-3_160211.zip Download]<br />
<br />
}}<br />
[[Datei:HMLAN_CONFIG_IP_AES.png|300px|thumb|right|HomeMatic Lan-Interface Configurator]][[Datei:HMLAN_CONFIG_AES.png|300px|thumb|right|HomeMatic Konfigurator]]<br />
Bevor man den HMLAN mit FHEM nutzen kann, müssen noch Einstellungen vorgenommen werden. Dazu braucht man die Konfigurationsadapter-LAN-Usersoftware, die bei [http://www.eq-3.de/service/downloads.html HomeMatic] herunter zu laden ist und nach der Installation mit der Verknüpfung "HomeMatic-Lan-Interface konfigurieren" oder "HomeMatic-Komponenten konfigurieren" gestartet wird und unter Windows läuft. Für andere Betriebssysteme (siehe Anhang im Beitrag {{Link2Forum|Topic=11506|Message=67417|LinkText=Anleitung für OS X}}) braucht man eine Windows-Emulation. Dem HMLAN liegen zwei Konfigurationsprogramme bei, bitte darauf achten, das richtige zu verwenden. Wenn das Konfigurationsprogramm den HMLAN-Konfigurator nicht findet, sollten alle nicht benutzten Netzwerkinterfaces vorübergehend deaktiviert werden, siehe {{Link2Forum|Topic=10933|Message=62960|LinkText=Beitrag im FHEM Forum}} und [[HM-CFG-LAN_LAN_Konfigurations-Adapter#Bekannte_Probleme|bekannte Probleme]].<br />
<br />
Sollte das Firmwarepdate abbrechen, ist die LAN Verbindung des PC's zu prüfen: ordentliche LAN Verbindung verwenden! Wlan ausschalten!<br />
<br />
=== Firmware ===<br />
Die aktuelle Firmware Version des HMLAN Konfigurators ist 0.965 (Stand Februar 2016). Ein Update ist mit dem ''"Firmware Update Tool"'' möglich, die aktuelle Firmware ist Bestandteil des Tools.<br />
<br />
'''Achtung''': Das zum download angebotene '''Firmware Update Tool''' installiert drei Tools:<br />
* Home Matic Firmware Updater Tool - das ist zum Firmware Update von Komponenten mittels CFG-USB!<br />
* '''HomeMatic-Lan-Interface konfigurieren''' - damit kann man auch die '''Firmware des CFG-LAN aktualisieren''' (Rechts im Bild)<br />
* HomeMatic-CFG-USB aktualiseren -- damit kann man auch die Firmware des CFG-USB aktualisieren<br />
Um einen mit FHEM benutzten HM-LAN zu aktualisieren, reicht es,<br />
# im HMLAN-Device mit <code>attr <myHMLAN> dummy 1</code> den Adapter vorübergehend zu deaktivieren,<br />
# mit dem (Windows) Firmware Update Tool die Firmware auf den HM-LAN aufzuspielen<br />
# nach dem Stoppen des Update Tools mit <code>deleteattr <myHMLAN> dummy</code> das Device in FHEM wieder zu aktivieren.<br />
<br />
Version 1.2 des Firmware Update Tools läuft auch unter Windows 10. <br />
<br />
Allerdings kann es unter Umständen passieren, dass sich das Programm mit folgender Fehlermeldung nicht starten lässt:<br />
"Die Anwendung konnte nicht gestartet werden, da die Side-by-Side Konfiguration ungültig ist."<br />
<br />
Dann fehlt die Microsoft Visual C++ 2008 SP1 Redistributable Package (x86). Diese kann dann unter dieser Adresse heruntergeladen und anschließend installiert werden: https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe<br />
<br />
=== IP Adresse ===<br />
Der HMLAN Konfigurator ist ähnlich wie der CUN(O) ein Netzwerkgerät. Er beherrscht DHCP und bezieht bei einem im Netzwerk erreichbaren DHCP Server von diesem eine IP-Adresse. Da FHEM zwecks Kommunikation die IP-Adresse wissen muss, ist es sinnvoll, dem HMLAN Konfigurator eine statische (feste) Adresse zuzuweisen. <br />
* mit der auf der CD mitgelieferten ''"HomeMatic Lan-Interface Configurator"'' Software unter ''"Change IP Settings"'' oder<br />
* im DHCP-Server (sofern dies vom gegebenen DHCP Server als Konfigurationsoption unterstützt wird).<br />
<br />
=== AES Encrypted LAN Communication ===<br />
Wichtig ist, dass vor Verwendung die "AES Encrypted LAN Communication" abgeschaltet wird, da diese von FHEM nicht unterstützt wird. Dies ist unter ''"Change IP Settings"'' der ''"HomeMatic Lan-Interface Configurator"'' Software möglich. AES auf dem LAN ist zu unterscheiden von HMLAN auf der Funkschnittstelle. siehe [[AES Encryption]].<br />
<br />
== Einbindung in FHEM ==<br />
Der HMLAN-Konfigurator muss in FHEM [[Konfiguration|konfiguriert]] werden. Das erfolgt mit diesen Befehlen:<br />
:<code>define HMLAN1 HMLAN <IP Adresse>:1000</code><br />
Der Name (im obigen Beispiel ''HMLAN1'') kann frei vergeben werden. Standard IP-Port des HMLAN-Konfigurators ist 1000.<br />
<br />
HMLAN kennt mehrere Attribute ({{Link2CmdRef|Anker=HMLAN}}). <br />
Äußerst wichtig ('''''Sicherheit!!''''') ist es außerdem, die '''hmId''' zu vergeben, siehe [[HomeMatic_Devices_pairen#hmId]]. <br />
<br />
Ein '''gleichzeitiger''' Zugriff von FHEM und der HomeMatic-Software auf den HMLAN-Konfigurator ist nicht möglich, da letzterer nur eine einzige Verbindung zulässt. Wollen Sie temporär z.B. mit der Windows-Software von HomeMatic zugreifen, ist FHEM zu deaktivieren.<br />
Sinnvoll ist es, die hmId mit der hmId der PC-Software gleichzusetzen. Dann kann man von beiden Zentralen alternativ zugreifen ohne pairen zu müssen.<br />
<br />
=== Nutzung mehrere IOs ===<br />
==== Empfangen ====<br />
Man kann an einem FHEM mehrere IOs (HMLAN/USB, CUL/CUNO) betreiben. Generell empfangen alle IOs von allen Geräten in ihrem Empfangsbereich - unabhängig von der hmId. <br />
<br />
==== Senden ====<br />
An ein Gerät wird nur über das IO gesendet, das in Internals->IODev angezeigt wird. Nutzt man mehrere IOs sollte man im HM Device das Attribut IODev auf das gewünschte IO setzen. Ansonsten sucht FHEM zufällig ein IO aus.<br />
<br />
==== hmId bei mehreren IOs ====<br />
Man kann allen IOs die gleiche hmId setzen. Das erlaubt die wahlfreie Umschaltung des Sende-IOs für das Device. Sollte man unterschiedliche hmIds wählen, simuliert dies mehrere Zentralen. Das Device, an das man sendet, muss über ein IO angesprochen werden, mit einer hmId, auf die das Device gepairt ist. <br />
<br />
<br />
=== Virtueller Controller VCCU ===<br />
Speziell wenn mehrere IOs verwendet werden sollen, empfiehlt sich die Verwendung einer [[Virtueller Controller VCCU|VCCU]], da eine redundante Nutzung mehrerer Schnittstellen dann wesentlich einfacher einzurichten ist. Das Einrichten einer VCCU lohnt sich aber schon bei der Benutzung nur eines HomeMatic I/O, also wenn man z.B. nur einen HMLAN Konfigurator einsetzen will. Zum Einen ist es wesentlich einfacher ggf. später weitere Schnittstellen dazu zu konfigurieren, zum Anderen adressiert die VCCU die auch bereits bei einer Schnittstelle auftauchenden Probleme wie die "<code>Unknown code</code>" Meldungen im Log.<br />
<br />
Die Einrichtung einer VCCU ist nicht sehr aufwändig und wird dringend empfohlen.<br />
<br />
=== Attribute ===<br />
* '''hmId''': Adresse, die das IO auf der Funkstrecke nutzt. Siehe [[HomeMatic_Devices_pairen#hmId]].<br />
* '''hmKey, hmKey2..3''': bis zu 3 AES keys, die auf der Funkstrecke genutzt werden. Siehe [[AES Encryption]]<br />
* '''hmLanQlen''' legt fest, wie viele Nachrichten parallel gesendet werden dürfen, also auf wie viele Antworten die Zentrale parallel warten darf. Ein Wert von 1 ist max defensiv, erzeugt aber eine höhere Verzögerung. Wählt man einen höheren Wert kann es zu Nachrichten-Wiederholungen kommen. <br />
* '''hmProtocolEvents''': alle Nachrichten werden dekodiert ausgegeben. Diese Einstellung benötigt einige Performance insbesondere bei höherem Level. Man sollte es vorsichtig nutzen. <br />
* '''logIDs''': zeichnet Rohmessages auf und bietet die genaueste Methode bei der Fehlersuche. Da Nachrichten undekodiert ausgegeben werden, ist es im Wesentlichen für Spezialisten von Bedeutung. Man gibt eine Komma-getrennte Liste von IDs an, die geloggt werden sollen. Mit '''all''' werden alle IDs aufgezeichnet. '''sys''' zeichnet zusätzlich Systemmessages auf. '''sys,all''' somit alles.<br />
* '''respTime''': Antwortzeit des HMLAN auf ein keep-alive kann hier eingestellt werden. Normalerweise sollte das HMLAN innerhalb einer Sekunde der Zentrale antworten. Sollte dies nicht passieren, wird die Message wiederholt. Der Wert sollte nur in Ausnahmefällen verändert werden.<br />
<br />
=== Readings ===<br />
* '''Xmit-Events''': Anzahl der Ereignisse <br />
* '''cond''': aktueller Zustand des IO. <br />
** ok<br />
** Warning-HighLoad: 90% der 1h Sendekapazität sind erreicht<br />
** ERROR-Overload: 100% der Sendekapazität sind erreicht, '''das IO sendet nicht mehr'''<br />
** timeout<br />
** disconnected: die Verbindung FHEM / IO ist unterbrochen<br />
** Overload-released: das IO ist aus ERROR-Overload zurück im Sendebetrieb<br />
** init: Das IO wurde neu initialisiert. <br />
* '''prot_ERROR-Overload''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_Warning-HighLoad''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_disconnected''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_init''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_ok''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
* '''prot_timeout''': Anzahl des Events, Zeitstempel des letzten Auftretens<br />
<br />
=== Internals ===<br />
* '''XmitOpen''': 1 = HMLAN ist sendebereit<br />
* '''assignedIDs''': hmIds der HM Devices, die über dieses IO bedient werden<br />
* '''assignedIDsCnt''': Anzahl der zugewiesenen hmIds von FHEM<br />
* '''assignedIDsReport''': Anzahl der hmIds, die das HMLAN angibt zu bedienen. Die Zahl sollte identisch sein mit assignedIDsCnt<br />
* '''msgKeepAlive''': dlyMax: maximale Verzögerung, die ein keep-alive hatte. bufferMin: der minimale Zeitpuffer, der übrig blieb, bis das keep-alive zu spät gekommen wäre. Der Puffer sollte 2 oder größer sein, sonst könnte man gelegentlich disconnects bekommen. <br />
* '''msgLoadEst''': Funkbelastung des HMLAN. Der Wert wird über 1 Stunde akkumuliert. Sollten 100% erreicht sein, wird das HMLAN den Sendebetrieb einstellen. Der Wert ist eine Hochrechnung in FHEM. Es ist möglich, dass das HMLAN mehr belastet ist. Die 10 min Werte zeigen die Belastung in den letzten 10min Perioden an.<br />
* '''msgParseDly''': Verzögerung der Message Verarbeitung vom Empfang im IO bis zur Verarbeitung in FHEM, gemessen in Millisekunden. Eine Verzögerung kann durch Prozesse an LAN, durch FHEM Prozesse oder sonstige Prozesse/Applikationen der CPU hervorgerufen werden.<br />
<br />
== Pairen von Geräten ==<br />
Jedes HM Gerät muss vor Verwendung mit der HM-Zentrale [[Pairing (HomeMatic)|gepairt]] werden. Hierfür ist Wahl einer hmId nötig (alle Details siehe [[HomeMatic_Devices_pairen#hmId]]).<br />
Alle Geräte haben eine eigene Seriennummer, die nicht änderbar ist. Details zum Pairen auf der Seite [[HomeMatic Devices pairen]].<br />
<br />
== Bekannte Probleme ==<br />
=== Verbindung wird abgelehnt ===<br />
Selten lehnt der HMLAN-Adapter ohne erkennbaren Grund nach monatelangem störungsfreiem Betrieb die Verbindung ab:<br />
<pre style="width:400px;"><br />
Opening HMLAN1 device 192.168.168.60:1000<br />
192.168.168.60:1000 connection refused<br />
</pre><br />
Der HMLAN-Adapter kann aber über die mitgelieferte Konfigurationssoftware problemlos erreicht werden. Der Zustand lässt sich auch durch einen Reboot des HMLAN-Adapters (oder FHEM) nicht beheben, wohl aber durch eine Aktualisierung der Firmware des HMLAN-Adapters, '''selbst wenn die installierte Version aktuell ist'''.<br />
<br />
=== Homematic-Geräte-Konfigurationsprogramm verbindet sich nicht mit LAN-Adapter ===<br />
Damit das Konfigurationsprogramm auf den LAN-Adapter zugreifen kann, muss das FHEM-Modul deaktiviert werden. (Attribute dummy=1 oder FHEM herunterfahren) Hat das Konfigurationsprogramm trotzdem Probleme, den LAN-Adapter zu finden, sollten vorübergehend alle bis auf das aktuell genutze Netzwerkinterfaces deaktiviert werden. Unter Windows 7 reicht es eventuell nicht, die Netzwerkverbindungen im "Netzwerk- und Freigabecenter" zu deaktivieren, sondern die Netzwerkadapter müssen auch im Gerätemanager deaktiviert werden.<br />
<br />
Unter Windows 10 scheint das Programm nicht mehr zu funktionieren. Der Konfigurationsadapter wird nicht gefunden. Auch nicht bei deaktivierten Netzwerkverbindungen.<br />
<br />
=== Häufiger automatischer Neustart ("Reboot") ===<br />
Der HMLAN Adapter startet ohne erkennbaren äußeren Anlass häufig neu. Das Problem ist auch im Forum unter der Überschrift {{Link2Forum|Topic=20776|LinkText=HMLAN Adapter wechselt permanent zwischen disconnected / connected}} beschrieben. Im FHEM Log erscheinen in diesem Fall folgende Meldungen:<br />
<pre style="width:600px;"><br />
... HMLAN_Parse: myHMLAN new condition timeout (je nach Timing, manchmal)<br />
... HMLanHostname:1000 disconnected, waiting to reappear (myHMLAN)<br />
... HMLAN_Parse: myHMLAN new condition disconnected<br />
... HMLanHostname:1000 reappeared (myHMLAN)<br />
... HMLAN_Parse: myHMLAN new condition init<br />
... HMLAN_Parse: myHMLAN new condition ok<br />
</pre><br />
Dieses Problem ist bei ELV [http://www.elv.de/topic/hm-lan-reboots.html bekannt] und soll mit der [http://www.eq-3.de/Downloads/Software/Konfigurationsadapter/Konfigurationsadapter_LAN/HM-CFG-LAN_Usersoftware_V1_520_eQ-3_151207.zip Konfigurationsadapter LAN Usersoftware V1.520 (10.12.2015)], bzw. der darin enthaltenen Firmware Version, behoben sein. Stand 05.08.2016 12:32 Auch mit der aktuellen Firmware (v0.965 - Link siehe oben) und der aktuellen Version von HMLAN (Rev 11645 vom 2016-06-11) tritt der Fehler noch auf.<br />
<br />
=== Kompletter und/oder sporadischer Totalausfall ===<br />
Sollten die oben genannten softwareseitigen Problemlösungen zu keinem erwünschten Ergebnis führen, kann gegebenenfalls ein Austausch der verbauten Elektrolytkondensatoren (Elkos) Abhilfe schaffen.<BR><br />
Zumindest ist dies eine Alternative zur Verschrottung. <BR><br />
Siehe Forumsbeitrag https://forum.fhem.de/index.php/topic,62442.msg538982.html#msg538982<BR><br />
<br />
<br />
=== Pairing von Geräten in räumlich dichter Nähe zum HMLAN endet bei den neuen Geräten im "Missing Ack" ===<br />
Sollte bei einem Pairing-Versuch die Geräte dies mit einer dauerhaft blinkenden LED quittieren und somit den Pairing-Prozess nicht abschließen, sollte die Distanz zum HMLAN überprüft werden.<br />
Es ist im Forum mehrfach darüber berichtet worden, das diese Pairing-Vorhaben gescheitert sind weil die Geräte schlichtweg zu dicht am HMLAN gelegen haben.<br />
Insbesondere beim ersten Testaufbau passiert dies immer mal wieder gerne.<br />
Hierzu einfach eine räumlich größere Entfernung herstellen und erneut versuchen.<br />
<br />
== Verbesserung der Antennenleistung ==<br />
Die Sende- und Empfangsleistung kann man verbessern. <br />
<br />
Ein relativ einfache Methode ist, die Antenne aus dem Gehäuse herauszuführen. Dies bringt in der Regel bereits einen spürbar verbesserten RSSI und eine verminderte Einstrahlung der Elektronik in die Antenne. Als Kosten fallen der Kaufpreis des 5er TORX an, der üblicherweise nicht vorhanden ist und ca. 6 € kostet (es ist u.U. empfehlenswert, gleich ein ganzes Kombi-Set für Handy-Reparatur etc. zu kaufen).<br />
<br />
* HM-CFG-LAN aufschrauben. Innen sieht er so aus:<br />
<br />
[[Datei:HM-CFG-LAN Innen.jpeg]]<br />
<br />
Der schwarze Draht im oberen Bereich unter den Lichtleitern ist die Antenne.<br />
<br />
* Lichtleiter entfernen (Bleibt machmal auch im Deckel hängen)<br />
<br />
[[Datei:HMLAN Antenne.JPG]]<br />
<br />
Rechts ist das Funkmodull zu erkennen, der schwarze Draht ist die Antenne. Es ist gut zu sehen, dass die Antenne sehr nahe an der Elektronik ist, die HF-Signale in die Antenne einstrahlt und die Empfangsleistung dadurch vermindert.<br />
<br />
* Das Gehäuse an passender Stelle mit einer kleinen Feile oder einem Drehmel oder ähnlich einkerben.<br />
<br />
[[Datei:HMLAN schlitz.JPG]]<br />
<br />
<br />
<br />
* Die Antenne einfach nach aussen biegen. Der Winkel ist egal, und kann später durch die Positionierung des HM-CFG-LAN optimal eingestellt werden. Der Draht sollte aber gerade sein, also keinen Knick oder keine Krümmung haben.<br />
<br />
[[Datei:Antenne nach aussen.JPG]]<br />
<br />
Man kann die Antenne auch verlängern, sinnvoll ist aber nur eine Verdopplung (von L/4 auf L/2). Geringere Verlängerungen verschlechtern die Leistung.<br />
<br />
<br />
* Gehäuse wieder zusammenbauen und zuschrauben, fertig.<br />
<br />
[[Datei:HMLANAntenneextern.JPG]]<br />
<br />
<br />
Dieser Umbau (ohne Antennenverlängerung) bringt in der Regel einen um 4-5 Zähler verbesserten RSSI und verringert die Einstrahlung der Elektronik. Dies ist nur der einfachste Schritt eines Antennenumbaus. Mit nur wenig mehr Aufwand lassen sich wesentlich bessere Ergebnisse erzielen.<br />
<br />
Links zu weitergehenden Maßnahmen [[Trick_der_Woche#HM_LAN_Konfig-Adapter_Antenne_verbessern|hier]].<br />
<br />
== Wechsel von CUL zu HMLAN ==<br />
{{Randnotiz|RNTyp=y|RNText=Der hier beschriebene Wechsel sollte mittlerweile einfacher über die [[Virtueller Controller VCCU|VCCU]] realisierbar sein, indem erst ein weiteres IO-Device hinzugefügt und anschließend das zu ersetzende entfernt wird.}}<br />
Sollten ein [[CUL]] als IO für HomeMatic-Geräte dienen und ein Wechsel auf den HMLAN Konfigurator geplant sein, kann die folgende Vorgehensweise gewählt werden:<br />
<br />
* deaktivieren Sie das CUL in der ''fhem.cfg''.<br />
* konfigurieren Sie den HMLAN Konfigurator '''von Hand''' <br />
* Ändern Sie das Attribut IODev aller HM-Devices vom Namen der CUL auf den Namen des HMLAN<br />
* sollten Sie das Attribut IODev nicht nutzen (nicht empfohlen), achten Sie darauf, dass im fhem.cfg das IO vor allen HM-devices definiert wird. Eine automatischen Zuweisung des IO zu den Devices ist sonst nicht möglich. <br />
** der HMLAN '''muss''' die gleiche ''hmId'' wie das bisherige CUL erhalten. Ansonsten müssen alle Geräte neu gepairt / angelernt werden.<br />
** AES muss im HMLAN abgeschaltet werden.<br />
* verbinden Sie den HMLAN Konfigurator mit ihrem Netzwerk und ziehen das CUL aus der USB-Buchse.<br />
* geben Sie in der FHEM-Befehlszeile ''shutdown restart'' gefolgt von &lt;Enter&gt; (nicht "save") ein (evtl. reicht auch ein ''rereadcfg'').<br />
* kontrollieren Sie im Event-Monitor und in den HM-Device-Logs von FHEM die Kommunikation.<br />
<br />
Bitte beachten: Falls dem CUL keine explizite hmId per Attribut zugewiesen wurde, wird diese ID aus "F1&lt;FHT-ID&gt;" zusammengebaut. Die hmId muss auf dem HMLAN explizit gesetzt werden.<br />
<br />
== Deregistrierung (Unpair) von Geräten ==<br />
Manche HomeMatic Geräte lassen sich nur dann am neuen Gateway anlernen, wenn sie zuerst vom alten abgelernt wurden. Dies wird zum Beispiel beim Umzug auf ccu3 erforderlich und insbesondere durch nicht immer funktionierende Konfigurationssoftware erschwert.<br />
<br />
Vorgehensweise:<br />
* FHEM GUI in zwei Browser-Tabs öffnen - eines für das abzulernende Gerät, ein zweites für HMLAN.<br />
* ein <code>set unpair</code> an das Gerät absetzen und warten, bis der Status von CMD_pending wechselt, dabei beginnt üblicherweise die orangefarbene LED zu blinken wie bei "Factory Reset" (das Abholen der Befehle kann durch das Drücken der Knöpfe am Gerät meistens beschleunigt werden)<br />
* sobald das Unpair und Reset am Gerät angelaufen ist, muss der HMLAN auf <code>set close</code> auf "close" gesetzt werden; damit wird verhindert, dass das Gerät neu gepaired wird<br />
* jetzt kann das Gerät an ein anderes Gateway neu angelernt werden.<br />
<br />
== Links ==<br />
<!-- Produkt derzeit nicht im Sortiment - * [http://www.elv.de/homematic-lan-konfigurations-adapter.html Produktseite] bei ELV --><br />
* [http://www.eq-3.de/service/downloads.html Software] für den Konfigurationsadapter von der eQ-3 Site<br />
* [https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe Download] für das Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)<br />
* [[Trick_der_Woche#HM_LAN_Konfig-Adapter_Antenne_verbessern|HM LAN Konfig-Adapter Antenne verbessern]]<br />
<br />
[[Kategorie:HomeMatic Components]]<br />
[[Kategorie:Interfaces]]<br />
[[Kategorie:868MHz]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=Buderus_Web_Gateway&diff=35632Buderus Web Gateway2021-04-28T12:56:03Z<p>Sailor: /* Vorbereitungen in Linux */ Typo corrected</p>
<hr />
<div>{{Infobox Modul<br />
|Name=km200<br />
|ModPurpose= Anbindung eines Buderus Web-Gateway<br />
|ModType=d<br />
<!-- |ModCategory= (noch?) nicht verwendet --><br />
|ModCmdRef=km200<br />
|ModForumArea=Heizungssteuerung/Raumklima<br />
|ModTechName=73_km200.pm<br />
|ModOwner=[http://forum.fhem.de/index.php?action=profile;u=4705 Sailor]<br />
}}<br />
<br />
== Allgemein ==<br />
[[Datei:KM200.png|1024px|thumb|left |Buderus Kommunikationsmodul KM200<BR>Quelle: "Bosch Thermotechnik GmbH, Buderus Deutschland" <BR> &copy; Buderus]]<br />
[[Datei:KM300.png|1024px|thumb|right|Buderus Kommunikationsmodul KM300<BR>Quelle: "Bosch Thermotechnik GmbH, Buderus Deutschland" <BR> &copy; Buderus]]<br />
<br />
Das Modul 73_km200.pm ermöglicht die Anbindung eines Buderus Web-Gateway an einen FHEM Server (Raspberry-Pi, Fritzbox, NAS) zur Steuerung/Regelung der Heizungsanlage in der FHEM Umgebung zur Erweiterung der Hausautomatisierung.<br />
<br />
Übersicht der steuerbaren Funktionen und abrufbaren Werte (Services) können unter folgendem Link http://www.ip-symcon.de/wiki/Buderus_KM200 eingesehen werden. Diese können aber in Abhängigkeit der Kombination KM/RC sowie der aktuell installierten Firmware auf dem KM unterschiedlich ausfallen. Weitere Details werden nach und nach ergänzt.<br />
<div style="clear:both;"></div><br />
<br />
<br />
== Vorbereitungen ==<br />
=== Vorbereitungen der Hardware ===<br />
<br />
==== Installation der Hardware ====<br />
Allein aus Gründen der Garantieansprüche, sollte das KMxxx Gerät heizungsseitig nur von Heizungsfachmann installiert werden.<br />
Netzwerkseitig sollte das KMxxx Gerät mit einem Netzwerkkabel besser Cat5 direkt an den Router angeschlossen werden.<br />
<br />
<br />
==== Update der Firmware ====<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem KMxxx Gerät aufbauen zu können, muss die entsprechende Firmware installiert werden.<br />
Die Firmware ändert sich paradoxerweise in Abhängigkeit der angeschlossenen Geräte. Aus diesem Grund muss das KMxxx Gerät vor Betrieb mit FHEM in jedem Fall zunächst ins Internet. Sobald die LED des KMxxx Geräts auf grün wechselt, ist die Internetverbindung erfolgreich hergestellt. Ab jetzt kann es unter extremen Umständen bis über Nacht dauern, ehe sich die korrekte Firmware automatisch installiert hat.<br />
<br />
<br />
==== Persönliches Passwort ====<br />
Das persönliche Passwort muss zunächst noch erstellt werden, da die KMxxx Geräte ohne persönliches Passwort ausgeliefert werden. <br />
<br />
Aus diesem Grunde ist es notwendig sich einmalig die Buderus APP [http://www.buderus.de/Online_Anwendungen/Apps/fuer_den_Endverbraucher/EasyControl-4848514.html EasyControl] auf einem SmartPhone zu installieren und das Passwort zu setzen. Hierzu muss einfach den Anweisungen Folge geleistet werden.<br />
<pre style="color: red">ACHTUNG: Keine deutschen Umlaute Verwenden!</pre><br />
<br />
<br />
==== Sperrung des Internetzugangs ====<br />
Ohne, dass der Umstand in den Unterlagen der KMxxx Geräte aus datenschutzrechtlicher Sicht auch nur erwähnt ist, baut das KMxxx-Gerät nach jedem Polling seitens des FHEM-Moduls von sich aus eine Verbindung zum Server von Buderus bzw. BOSH Thermotechnik auf. Über den Inhalt der Datenübertragung kann nur spekuliert werden.<br />
Um diese Datenübertragung zu unterbinden, muss man in dem jeweiligen Internet-Router das KMxxx Gerät bzw. dessen entsprechende IP-Adresse für den Internetzugang gesperrt werden. <br />
In der Fritz!Box bzw. unter Fritz!OS funktioniert dies am Besten mit der [http://avm.de/nc/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/8_Internetnutzung-mit-Kindersicherung-einschraenken Kindersicherung]<br />
Bei andewren Routern muss die entsprechende Bedienungsanleitung konsultiert werden.<br />
<br />
Eine erfolgreiche Sperrung des Internet-Zugangs quittiert das KMxxx Gerät mit dem Wechsel der Betriebs-LED auf die orange Farbe.<br />
<br />
<br />
=== Vorbereitungen in Linux ===<br />
<br />
<br />
Damit das Modul unter FHEM und Linux funktioniert müssen zusätzliche Perl-Module installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben.<br />
<br />
Code: <br />
:<Code>sudo bash</Code><br />
<br />
Um die folgenden Perl-Module installieren zu können benötigen wir CPANMINUS, dazu bitte folgenden Befehl zur Installation in die Kommandozeile eingeben.<br />
<br />
:<Code>curl -L https://cpanmin.us | perl - --sudo App::cpanminus</Code><br />
<br />
Kommt es dabei zu einer Fehlermeldung bitte mit folgenden Befehl beginnen.<br />
<br />
Code:<br />
:<Code>sudo apt-get install cpanminus</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>cpanm JSON</Code><br />
<br />
:<Code>cpanm List::MoreUtils</Code><br />
<br />
:<Code>cpanm Crypt::Rijndael</Code><br />
<br />
:<Code>cpanm LWP::UserAgent</Code><br />
<br />
:<Code>cpanm MIME::Base64</Code><br />
<br />
:<Code>cpanm Time::HiRes</Code><br />
<br />
:<Code>cpanm Digest::MD5</Code><br />
<br />
:<Code>cpanm base</Code><br />
<br />
:<Code>apt-get install libltdl*</Code><br />
<br />
<br />
Zur Vermeidung bekannter Fehler aufgrund Versionsunterschiede, sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
<br />
:<Code>apt-get update</Code><br />
<br />
:<Code>apt-get upgrade</Code><br />
<br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe des Code:<br />
:<Code>exit</Code> <br />
<br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
<br />
==== Passwörter ====<br />
<br />
Es werden für das FHEM Modul "km200" 2 Passwörter benötigt:<br />
<br />
a) Gateway Passwort<br />
<br />
Das Gateway Passwort ist fix auf das Gateway programmiert und befindet sich auf dem Typenschild des jeweiligen KM-Moduls.<br />
Es hat das Format aaaa-bbbb-cccc-dddd<br />
<br />
<br />
b) Persoenliches Passwort<br />
<br />
Das persönliche Passwort muss zunächst noch erstellt werden, da die KMxxx Module ohne persoenliches Passwort ausgeliefert werden. <br />
Siehe vorheriges Kapitel [[#Persönliches_Passwort|Persönliches Passwort]]<br />
<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
In der [[Konfiguration|fhem.cfg]] das Modul definieren mit:<br />
<br />
:<Code>define <devicename> km200 <IPAdresse des KM200> <Gateway Passwort> <persönliches Passwort></Code><br />
<br />
Hierbei können die Passwörter wahlweise als direkter Text (bareword) oder als Base64 codierter text eigegeben werden, sofern man keine direkten Passwörter in der fhem.cfg stehen haben möchte.<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das km200-Modul individuelle Attribute in der fhem.cfg ergänzt werden.<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> IntervalDynVal <time in sec><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> ConsoleMessage <1 or 0><br />
attr <devicename> DoNotPoll <Service_1> <Service_2> <Service_3> ... <Service_n><br />
attr <devicename> ReadBackDelay <time in ms><br />
</pre><br />
<br />
<br />
;IntervalDynVal<br />
:Ein gültiges Interval für die Abfrage der Werte welche über die KM-Module eingelesen werden. Der Wert muss >= 20s sein um dem Modul zu erlauben einen kompletten Poll abzuwarten. Der Default Wert ist 90s.<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des KM200/KM50 Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden. Der Default-Wert ist 5s.<br />
<br />
;ConsoleMessage<br />
:Sollte es aus Gründen der Fehlersuche erwünscht sein, dem Modul beim Pollen der einzelnen Werte life zuzusehen, so kann man die Ausgabe im Konsolenfenster (STD-OUT) aktivieren. Hierzu muss der Wert auf "1" gesetzt werden.<br />
:Bitte daran denken, dass dies nicht automatisch in dem Telnet Fenster (e.g. PUTTY) angezeigt wird. Man muss zur Anzeige dort das FHEM-System stoppen und wieder starten.<br />
:Der Default-Wert is "0" = deaktiviert.<br />
<br />
;DoNotPoll<br />
:Eine durch Leerzeichen getrennte Liste von Services die nicht gepollt werden sollen. Dies kann bei wiederholten Abstürzen durch Abfrage bestimmter Services angewendet werden sowie für das gezielte Ausblenden von irrelevanten Werten (Z.B.: Rücklauftemperatur = -32768°C, etc.). <br />
:Der Default Wert ist "" somit werden alle Werte abgefragt.<br />
:Nach dem Setzen des "DoNotPoll"-Attributs kann man die ungewünschten Readings mittels "deletereading" einzeln oder komplett löschen: Beispiel: <pre style="width:650px;">deletereading myKm200 .*</pre><br />
<br />
;ReadBackDelay<br />
:Zeitraum in Millisekunden in dem das Modul mit einem Zurücklesen der Werte nach einem Schreibvorgang warten soll, da es sonst zu keinem erfolgreichen Schreibvorgang kommt. Die Größe des Wertes hängt sehr stark von der Geschwindigkeit des FHEM-Host-Systems sowie der angeschlossenen Netzwerkverbindung ab und kann daher mehr oder minder stark schwanken. Der Default-Wert ist 100ms.<br />
<br />
== Beispiel für Menüführung ==<br />
<br />
=== Anzeige der Liste für Fehlermeldungen ===<br />
<pre style="color: red">Mit freundlicher Einladung an DLindner :-) </pre><br />
<br />
=== Steuerungsmenü eines Heizkreises ===<br />
<pre style="color: red">Mit freundlicher Einladung an DLindner :-) </pre><br />
<br />
=== Steuerungsmenü der Warmwasserbereitstellung ===<br />
<pre style="color: red">Mit freundlicher Einladung an DLindner :-) </pre><br />
<br />
== Beispiel für readingsGroup ==<br />
[[Datei:Buderus_RoomHeizung.png|200px|thumb|right|readingsGroup "Heizung" und "Temperaturen" mit 73_km200 - Werten]]<br />
In diesem Beispiel werden im Raum "Heizung" zwei Gruppen namens "Heizung" und "Temperaturen" angelegt und die Services mit entsprechenden Symbolen versehen. <br />
<br />
fhem.cfg<br />
<br />
<code>define Temperaturen readingsGroup myKm200:<%temp_temperature>,<AussenTemp.>,/system/sensors/temperatures/outdoor_t1 myKm200:<%sani_solar_temp><SonnenkollektorTemp.>,/solarCircuits/sc1/collectorTemperature myKm200:<%sani_buffer_temp_all>,<HeißwasserTemp.>,/system/sensors/temperatures/hotWater_t2</code><BR><br />
<code>attr Temperaturen room Heizung</code><BR><br />
<code>attr Temperaturen valueStyle style="text-align:right"</code><br />
<br />
<code>define Heizung readingsGroup myKm200:<%sani_domestic_waterworks>,<Heizungsdruck>,/system/appliance/systemPressure myKm200:<%sani_supply_temp>,<Vorlauftemp>,/system/sensors/temperatures/supply_t1 myKm200:<%sani_return_temp>,<Rücklauftemp>,/heatSources/returnTemperature<BR><br />
attr Heizung room Heizung<BR><br />
attr Heizung valueStyle style="text-align:right"</code><br />
<br />
== Beispiel für Plot ==<br />
<br />
=== Mit dBLog ===<br />
<br />
[[Datei:DbLog-plot.png|1024px|thumb|none|plot mit Werten aus 73_km200]]<br />
<br />
Um einen obigen Plot anzuzeigen geht man wie folgt vor:<br />
<br />
==== [[Konfiguration|fhem.cfg]] ====<br />
<br />
Folgende Einträge müssen in der [[Konfiguration|fhem.cfg]] vorgenommen werden:<br />
<br />
define SVG_CH_Values SVG myDbLog:CentralHeating_CH:HISTORY<br />
attr SVG_CH_Values plotsize 1600,400<br />
attr SVG_CH_Values room Plots<br />
attr SVG_CH_Values title "Central Heating"<br />
<br />
==== gplot ====<br />
<br />
Die entsprechende plot-Datei namens "<code>CentralHeating_CH.gplot</code>" sieht dann wie folgt aus:<br />
<br />
# Created by FHEM/98_SVG.pm, 2015-01-12 22:57:42<br />
set terminal png transparent size <SIZE> crop<br />
set output '<OUT>.png'<br />
set xdata time<br />
set timefmt "%Y-%m-%d_%H:%M:%S"<br />
set xlabel " "<br />
set title '<TL>'<br />
set ytics <br />
set y2tics <br />
set grid y2tics<br />
set ylabel "Temperature in °C / Modulation in %"<br />
set y2label "Power in kW"<br />
set yrange [0:105]<br />
set y2range [0:21]<br />
#DbLog myKm200:/heatSources/actualPower<br />
#DbLog myKm200:/system/sensors/temperatures/supply_t1<br />
#DbLog myKm200:/heatingCircuits/hc1/pumpModulation<br />
#DbLog myKm200:/system/sensors/temperatures/hotWater_t2<br />
plot "<IN>" using 1:2 axes x1y2 title 'Power' ls l3 lw 1 with lines,\<br />
"<IN>" using 1:2 axes x1y1 title 'Vorlauftemperatur' ls l0 lw 1 with lines,\<br />
"<IN>" using 1:2 axes x1y1 title 'Ladepumpe' ls l1 lw 1 with lines,\<br />
"<IN>" using 1:2 axes x1y1 title 'Warmwasser' ls l2 lw 1 with lines<br />
<br />
Diese Plotdatei kann auch mit Hilfe des [[Plots_erzeugen#.gplot-Editor|Ploteditors]] generiert werden. Die Vorgehensweise entspricht -bis auf die Plot-Source dBLog- dem im Folgenden beschriebenen Ablauf mit FileLog.<br />
<br />
=== Mit FileLog ===<br />
[[Datei:Buderus_Temperaturen_MitFileLog.png|1024px|thumb|none|typischer Temperatur plot]]<br />
<br />
Obiger Plot wurde mit Hilfe des Ploteditors erstellt.<br />
<br />
==== [[Konfiguration|fhem.cfg]] ====<br />
<br />
Die Ploterstellung erfolgt anhand der nachfolgenden Beispiel-Konfiguration:<br />
<br />
# Buderus Gateway aktivieren und Parameter setzen<br />
# ===============================================<br />
define heizung km200 <IP ADR> <SYS PW> <User PW><br />
attr heizung IntervalDynVal 90<br />
attr heizung IntervalStatVal 3600 <br />
attr heizung PollingTimeout 200 <br />
attr heizung ConsoleMessage 0 <br />
attr heizung room Heizung <br />
<br />
# Loggen aller Daten aktivieren, Pfad/Dateiname ./log/Heizung-<Jahr>-<Monat>.log; Bsp.: "Heizung-2015-01.log"<br />
# ===========================================================================================================<br />
define FileLog_heizung FileLog ./log/Heizung-%Y-%m.log heizung<br />
attr FileLog_heizung logtype text<br />
attr FileLog_heizung room LogFiles<br />
attr FileLog_heizung group Heizung<br />
<br />
{{Anker|SelektivLoggen}} <br />
# Loggen einer Auswahl von Daten aktivieren, Pfad/Dateiname ./log/Heizung-<Jahr>-<Monat>.log; Bsp.: "Heizung-2015-01.log"<br />
# =======================================================================================================================<br />
define FileLog_heizung FileLog ./log/Heizung-%Y-%m.log heizung:(/system/sensors/temperatures/hotWater_t2|/system/sensors/temperatures/outdoor_t1).*<br />
attr FileLog_heizung logtype text<br />
attr FileLog_heizung room LogFiles<br />
attr FileLog_heizung group Heizung<br />
<br />
==== Plot Anlegen ==== <br />
[[Datei:Logfiles_FileLog_heizung.png|512px|thumb|right|Logfiles_FileLog_heizung.png]]<br />
Nach Fertigstellung und Abspeichern der ''"[[Konfiguration|fhem.cfg]]"'' Datei ist als erster Schritt der Plot anzulegen. Dazu:<br />
* im Raum ''"LogFiles"'' auf den Link ''"FileLog_heizung"'' klicken.<br />
* Im neuen Fenster auf den Link ''"Create SVG Plot"'' klicken<br />
jetzt kann die eigentliche Konfiguration der darzustellenden Daten beginnen.<br />
<div style="clear:both;"></div><br />
==== Plot Inhalte via Plot Editor konfigurieren ====<br />
[[Datei:Buderus_Heiztemperaturen_Ploteditor.png|1024px|thumb|right|Buderus_Heiztemperaturen_Ploteditor.png]]<br />
Nun ist der Plot noch mit Leben zu füllen. <br />
Dazu müssen dem Plot noch mit Hilfe des [[Plots_erzeugen#.gplot-Editor|Ploteditors]] die eigentlichen Messwerte des Buderus Gateways zugeordnet werden:<br />
<br />
* Link ''"Heiztemperaturen"'' unten links anklicken (siehe oben, Temperatur Plot)<br />''Es erscheint der Ploteditor (Buderus_Heiztemperaturen_Ploteditor.png)''<BR />''Der Plot selbst (oben) erscheint beim ersten Mal noch nicht, da bisher keine Meßgrößen selektiert wurden''<br><br />
*Die Beschriftung von ''Titel, Achsen'' etc. sollte selbst erklärend sein (1)<br />
*In den Zeilen unter ''"Diagram Label, Source..."'' legt man die eigentlichen Meßwerte für den Plot fest<br />
*''"Diagram Label"'' (2) = beliebige Bezeichnung des Meßwertes<br />
*''"Source"'' (3) = in diesem Auswahlfenster legt man die Logdatei fest, aus der die Daten extrahiert werden sollen, hier "FileLog_heizung"<br />
*''"Input:Column"'' (4) = Spalte innerhalb der Logdatei in der die Meßwerte stehen, bei uns immer ''"4"'' (Spalte 1 = Zeitstempel)<br />
*''"Regexp"'' (5) = hier legt wählt man die eigentliche Meßgröße aus<br />
*''"DefaultValue"'' (6) = Defaultwert, wird angezeigt wenn es keine echten Meßdaten gibt (Man sieht dann den Default Wert, ist eher schlecht deshalb bei mir leer)<BR><br />
*''"Function"'' (7) = hier kann eine Umrechnungsformel angegeben werden<br />
*''"Y-Axis"'' (8) = hier kann die Referenzachse (Rechte oder Linke) ausgewählt werden<br />
*''"Plot-Type"'' (9) = hier wird festgelegt ob die Darstellung als "Linie" oder "Punkte" etc. erfolgt<br />
*''"Style"'' (10) = Farbe/Struktur der Linie....<br />
*''"Width"'' (11) = Stärke der Linie....<br />
<br />
Sind alle diese Parameter für einen Meßwert definiert ist noch der Button ''"Write .gplot file"'' (12) zu drücken, danach wird die erste Kurve dargestellt.<br />
'''Aber aufpassen:''' angezeigt werden in obiger Konfiguration immer nur die Meßwerte '''eines Tages'''. Erstellt man diese Konfiguration z.B. um 0:01 Uhr Nachts<br />
sieht man '''nichts''', weil es u.U. noch keine Meßwerte für diesen Tag gibt.<br />
Für weitere Messwerte wird obiger Vorgang wiederholt.<BR><br />
<br />
Danach kann bei Bedarf noch via ''"attr FileLog_heizung Room"'' ein gewünschter "Raum" festgelegt werden. Am Ende noch auf ''"Save config"'' klicken damit das Werk auch abgespeichert wird. <br />
<br />
<br />
<big>'''Hinweis:'''</big><BR><br />
<br />
Das Laden der Plots dauert eventuell sehr lang. Das liegt daran, dass alle Daten der Logdatei geladen werden m&uuml;ssen und unter Umst&auml;nden sehr viele Daten durch ein sehr kurzes Poll-Intervall gespeichert werden. Ein schwaches Rechensystem z.B. Raspberry PI kann diesen Umstand noch verst&auml;rken.<br />
Als Abhilfe kann z.B. nur ein Teil der Daten geloggt werden, s.o. unter: [[Buderus Web Gateway#SelektivLoggen|Loggen einer Auswahl von Daten aktivieren,....]]. Geloggt werden im obigen Beispiel die Daten in der runden Klammer (.hotWater_t2 und ..outdoor_t1).<br />
<br />
== Bekannte Probleme ==<br />
<br />
=== Fehlermeldung: "Use of uninitialized value in concatenation (.) or string at ./FHEM/73_km200.pm" ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk auf. <br />
Hierbei antwortet das KM300/KM200/KM50 nicht rechtzeitig bevor das 73_km200.pm - Modul aufgibt und die unten genannte Fehlermeldung ausgibt.<br />
<br />
<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "PollingTimeout" entsprechend höher setzen. Ein guter Erfahrungswert wäre zum Beispiel 20, was den 4-fachen des Default-Werts entspricht.<br />
Besser wäre es jedoch einen qualitativ höherwertigen Netzwerk-Switch statt beispielsweise Netzwerk-Hub oder gar billigen Router einzusetzen.<br />
<BR><br />
<BR><br />
<BR><br />
<br />
=== Sporadischer Absturz von FHEM ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Aus noch ungeklärter Ursache kann es bei einzelnen Buderus KMxxx Geräten in Verbindung mit verschiedenen Buderus RCs bei Abfrage bestimmter Services zum Komplett-Absturz des FHEM - Systems kommen.<br />
Es ist dem Developer des Moduls bisher nicht gelungen diese Abstürze nachzustellen um den Fehler entsprechend abzufangen.<br />
Bisher treten diese Abstuerze insbesondere bei Abfrage der folgenden Services auf:<br />
<br />
:<Code>/heatSources/flameCurrent</Code><br />
:<Code>/heatSources/flameStatus</Code><br />
:<Code>/system/appliance/flameCurrent</Code><br />
:<Code>/system/appliance/flameStatus</Code><br />
Aber auch andere Services könnten dieses Problem auslösen. Sind dem Developer aber zur Zeit nicht bekannt.<br />
<br />
<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Zu diesem Zweck muss man zunächst das Attribut ConsoleMessage aktivieren (Siehe Attribute) und sehen, ab welcher Ausgabe sich das FHEM-System aufhängt.<br />
<br />
Der Wert der Probleme bereitet ist der nächste Wert, der eben gerade nicht angezeigt wird.<br />
<br />
Die bekannten Problem-Services hinter das Attribut DoNotPoll hängen. Sie werden anschließend nicht mehr abgefragt und können somit keinen Absturz mehr verursachen.<br />
<BR><br />
<BR><br />
<BR><br />
=== Keine Services lesbar / Keine Readings im FHEM ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Es kann sein das das FHEM System nach eine Weile abstürzt ohne vorher Readings in das device geschrieben zu haben.<br />
Wenn man zum debuggen dann das Attribut "ConsoleMessage" aktiviert hat (Siehe Attribute) dann taucht folgende Liste in der Konsole auf:<br />
<br />
<br />
:<Code>Sounding and importing of services started</Code><br />
:<Code>The following Service CANNOT be read &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/DateTime</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/instAccess</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/instWriteAccess</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/uuid</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/versionFirmware</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /gateway/versionHardware</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /heatingCircuits</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /heatingCircuits/hc1</Code><br />
:<Code>The following Service CANNOT be parsed by JSON : /heatingCircuits/hc1/activeSwitchProgram</Code><br />
:<Code>The following Service CANNOT be read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /heatingCircuits/hc1/actualSupplyTemperature</Code><br />
:<Code>The following Service CANNOT be read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /heatingCircuits/hc1/controlType</Code><br />
:<Code>The following Service CANNOT be read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /heatingCircuits/hc1/currentOpModeInfo</Code><br />
:<Code>The following Service CANNOT be read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /heatingCircuits/hc1/currentRoomSetpoint</Code><br />
:<Code>The following Service CANNOT be read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /heatingCircuits/hc1/designTemp</Code><br />
(Gekürzt)<br />
<br />
<br />
<br />
<u>'''Lösung:'''</u><br />
Bisher tauchen diese Symptome nur in Verbindung mit einem falschen Passwort auf.<br />
Zu diesem Zwecke beide Passwörter überprüfen und ggf. das private Passwort mit der App erneut setzen.<br />
<pre style="color: red">ACHTUNG: Keine deutschen Umlaute Verwenden!</pre><br />
<BR><br />
=== Fehlermeldung: "encrypt: datasize not multiple of blocksize (16 bytes) at ./FHEM/73_km200.pm line xxx" ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Während der Initialisierung des Geräts taucht die Fehlermeldung <br />
<br />
<Code>encrypt: datasize not multiple of blocksize (16 bytes) at ./FHEM/73_km200.pm line xxx</Code> <br />
<br />
in der Konsole auf und stürzt ab. Offensichtlich kann es aus noch ungeklärter Ursache dazu kommen, dass das KM Gerät 2 Byte zuviel sendet.<br />
<br />
<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Ursache konnte noch nicht gefunden werden. Bei dem einzigen bekannten Fall hat der User nur mit einem kompletten Hardware-RESET des KM - Gerätes die Funktion, bzw. den Kontakt zum KM-Gerät wiederherstellen können.<br />
<BR><br />
<BR><br />
=== FlameStatus "OFF" wird erkannt, FlameStatus "ON" wird aufgrund falscher Codierung verworfen ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Readings <br />
:<code>/heatSources/flameStatus</code><br />
:<code>/system/appliance/flameStatus</code> <br />
<br />
werden zwar eingelesen, jedoch verweilt der Status in "OFF". Da das Gerät einen undefinierten aber nicht reproduzierbaren JSON-Wert für "ON" zurückgibt, wird dieser vom 73_km200 Modul verworfen.<br />
<BR><br />
<BR><br />
<u>'''Lösung:'''</u><br />
<br />
Die Ursache kann vom 73_km200 Modul nicht behoben, bzw. abgefangen werden, da sich die fehlerhaften Stringmeldungen von Gerät zu Gerät in Abhängigkeit von Hardware, Linux-Version, Applikations-Version unterscheiden können.<br />
<br />
Der Fehler liegt nach bisheriger Einschätzung im Gerät bzw. dessen Firmware.<br />
<BR><br />
<BR><br />
Aus diesem Grunde wird empfohlen eine Abfrage auf<br />
:<Code>/heatSources/flameCurrent > 0uA </Code><br />
oder<br />
:<Code>/system/appliance/flameCurrent > 0uA</Code><br />
zu programmieren. Sobald der Ionisierungsstrom >0 ist, läuft der Brenner ganz sicher. <br />
<br />
Die interne Logik der Zentralheizung macht im Grunde nichts Anderes.<br />
<br />
=== Trotz des Ausschluss ausgesuchter Services durch das "DoNotPoll" - Attribut, listet FHEM diese noch auf ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nachdem man die nicht mehr erwünschten Services durch das "DoNotPoll" - Attribut geblockt hat, werden diese immer noch aufgelistet<BR><br />
<BR><br />
<u>'''Lösung:'''</u><br />
<br />
FHEM speichert alle Readings in der fhem.save Datei. Um diese zu löschen kann mittels des FHEM - Befehls "deletereading" das entsprchende Reading gelöscht werden.<br />
Es dürfen aber auch alle Readings gelöscht werden, da diese beim nächsten geplanten Polling wieder neu geschrieben werden:<BR><br />
<BR><br />
:<Code>deletereading myKm200 .*</Code><br />
<BR><br />
Update: Seit Version 0052 sollte dieser Fehler behoben sein. Bei Veränderung der "DoNotPoll"-Parameter werden zunächst alle Readings gelöscht und neu eingelesen.<br />
<BR><br />
<BR><br />
=== km200 - Device bleibt auf State "Sounding..." hängen ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die genaue Ursache dieses Fehlers ist noch unbekannt und kann nicht zuverlässig reproduziert werden, was die Fehlersuche erschwert.<BR><br />
Es ist zu vermuten, dass die Kommunikation bzw. die Antwortzeiten eine Rolle spielen.<BR><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Zur Zeit gibt es nur die Möglichkeit nach einem FHEM Neustart einmalig zu kontrollieren, ob die Werte eingelesen werden (Farbwechsel der LastUpdate-Zeiten) bzw. ob der State nach einer gewissen Zeit auf "Standby" geht.<BR><br />
Sollte dies nicht der Fall sein, hat sich die Kommunikation aufgehängt und ein FHEM-Neustart mit "shutdown restart" sollte durchgeführt werden.<BR><br />
Bisher tauchen nach einem erfolgreichen Sounding keine Probleme im normalen Dienst auf.<BR><br />
<BR><br />
Update: Seit Version 0054 ist dieses Problem behoben.<BR><br />
Das Modul wartet nach erfolglosem Erstkontakt zunächst 10s und gibt eine ERROR - Fehlermeldung im STATE aus.<br />
Dann startet es nach Ablauf der 10s einen neuen Versuch.<br />
Sollte der Versuch erfolgreich sein, wechselt der STATE in "Sounding"´ansonsten wartet es wieder 10s.<BR><br />
<BR><br />
<BR><br />
=== km200 - Device bleibt scheinbar auf State "Sounding...", "ERROR -" oder "Polling" hängen ===<br />
<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Obwohl das Modul scheinbar seine Arbeit aufgenommen hat und funktioniert, ändert sich das STATE Reading in der FHEMWeb - Oberfläche nicht.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Dies ist kein km200 oder FHEM Problem Dieses Problem liegt hierbei im Browser.<BR><br />
Die Lösung ist, einen Seiten-Refresh mittels Taste "F5" zu machen.<BR><br />
<BR><br />
<BR><br />
<br />
== Anhang A - Liste bekannter Root Services ==<br />
<br />
Die folgenden Werte sind dem Developer bekannt und können durch das Modul abgefragt werden, sofern eine Antwort seitens des KMxxx kommt oder sich nicht hinter dem DoNotPoll Attribut befinden.<br />
Alle untergeordneten Services werden seit Version 0045 automatisch geladen und können von User zu User variieren.<br />
<br />
<span style="font-family:Courier New"><br />
/<BR><br />
/dhwCircuits<BR><br />
/gateway<BR><br />
/heatingCircuits<BR><br />
/heatSources<BR><br />
/notifications<BR><br />
/recordings<BR><br />
/solarCircuits<BR><br />
/system<BR><br />
<BR><br />
</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=25540}} zur Entwicklung und Support des Moduls<br />
* {{Link2Forum|Topic=25540|Message=230504}}, der auf einem Raspbery Pi schrittweise -ausgehend von der Betriebssysteminstallation über die FHEM-Installation- die Modulnutzung beschreibt<br />
* [http://www.buderus.de Buderus Internetseite]<br />
* [http://de.documents.buderus.com/download/pdf/file/6720807675.pdf Logamatic web KM50 &nbsp; - Installations- und Bedienungsanleitung]<br />
* [http://documents.buderus.com/download/pdf/file/6720647836.pdf Logamatic web KM200 - Installationsanleitung für den Fachmann]<br />
* [http://heizungsfachshop.de/media/pdf/technische-unterlagen-buderus-logamatic-web-km300.pdf Logamatic web KM300 - Installationsanleitung für den Fachmann]<br />
<br />
[[Kategorie:Heizungssteuerung]]<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34627DoorBird2021-01-16T18:02:46Z<p>Sailor: /* Vorbereitungen in Linux */ Umfangreiche Installation</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev && sudo apt-get install -y gstreamer1.0-tools</Code><br />
:<Code> wget http://ftp.us.debian.org/debian/pool/main/libs/libsodium/libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo dpkg -i ./libsodium18_1.0.11-2_armhf.deb</Code><br />
:<Code> sudo apt-get install libyaml-appconfig-perl</Code><br />
<br />
:<Code> sudo nano /etc/ssh/sshd_config</Code><br />
Uncomment<br />
:<Code> #PermitRootLogin without-password</Code><br />
into<br />
:<Code> PermitRootLogin yes</Code><br />
<br />
:<Code> sudo passwd</Code><br />
Choose Root password which is different than pi password and really save!<br />
Close ssh session and reenter as root<br />
<br />
:<Code> cd /root/.cpan/build/Alien-Sodium-2.000-1</Code><br />
<br />
:<Code> make uninstall</Code><br />
Copy all the unlink entries shown in the screen above at once and paste (execute) them in the command line below<br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
:<Code> rm -r Alien-Sodium-*</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> install AJGB/Alien-Sodium-1.0.8.0.tar.gz</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> find /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0* -name Makefile</Code><br />
:<Code> /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code> <br />
:<Code> cd /root/.cpan/build/Crypt-NaCl-Sodium-1.0.8.0-1/Makefile</Code><br />
:<Code> make uninstall</Code><br />
<br />
:<Code> cd /root/.cpan/build/</Code><br />
<br />
:<Code> rm -r Crypt-NaCl-Sodium-1.0.8.0*</Code><br />
<br />
:<Code> cd /usr/local/lib/aarch64-linux-gnu/perl/5.28.1/auto/share/dist</Code><br />
<br />
:<Code> rm -fr Alien-Sodium</Code><br />
<br />
:<Code> ln -s /usr/local/share/perl/5.28.1/auto/share/dist/Alien-Sodium Alien-Sodium</Code><br />
<br />
:<Code> sudo cpan</Code><br />
:<Code> force install Crypt::NaCl::Sodium</Code><br />
:<Code> install IO:String</Code><br />
:<Code> install Crypt::Argon2</Code><br />
:<Code> install Alien::Base::ModuleBuild</Code><br />
:<Code> exit</Code><br />
<br />
:<Code> nano /etc/ssh/sshd_config</Code><br />
:<Code> Swap PermitRootLogin yes</Code><br />
:<Code> into #PermitRootLogin yes</Code><br />
<br />
:<Code> /etc/init.d/ssh restart</Code><br />
<br />
:<Code> Close ssh session and reenter as pi</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34349DoorBird2020-12-10T19:34:22Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
<br />
:<Code>sudo cpan</Code><br />
:<Code>install AJGB/Alien-Sodium-1.0.8.0.tar.gz</Code><br />
:<Code>force install Crypt::NaCl::Sodium</Code><br />
:<Code>install IO:String</Code><br />
:<Code>install Crypt::Argon2</Code><br />
:<Code>install Alien::Base::ModuleBuild</Code><br />
:<Code>install MIME::Base64 </Code><br />
:<Code>exit</Code><br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34348DoorBird2020-12-10T19:22:16Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
<br />
:<Code>sudo cpan</Code><br />
:<Code>install AJGB/Alien-Sodium-1.0.8.0.tar.gz</Code><br />
:<Code>force install Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
:<Code>exit</Code><br />
<br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34347DoorBird2020-12-10T19:19:27Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>sudo cpan<br />
install AJGB/Alien-Sodium-1.0.8.0.tar.gz<br />
force install Crypt::NaCl::Sodium<br />
cpan IO:String<br />
exit</Code><br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34346DoorBird2020-12-10T19:18:59Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
sudo cpan<br />
install AJGB/Alien-Sodium-1.0.8.0.tar.gz<br />
force install Crypt::NaCl::Sodium<br />
cpan IO:String<br />
exit<br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=34251DoorBird2020-11-17T14:40:06Z<p>Sailor: /* Keine Reaktion bei Events */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
:<Code>cpan Alien::Sodium</Code><br />
:<Code>cpan Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
Bei der Verwendung von fhem im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR><br />
https://docs.docker.com/network/macvlan/<br />
<BR><br />
<BR><br />
<br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=33934DoorBird2020-09-15T06:08:18Z<p>Sailor: /* Bibliothek "Crypt::NaCL::Sodium"-Installation fehlgeschlagen */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
:<Code>cpan Alien::Sodium</Code><br />
:<Code>cpan Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
<BR><br />
<BR><br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
a) Erstmal versuchen die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
b) Wenn das fehl schlägt, hat man bereits die neue Version von Alien-Sodium-2.000 installiert. Diese ist zur Zeit noch inkompatibel mit der derzeiten Version von Crypt:NaCl.<BR><br />
Der Fehler ist bereits bekannt und wird hoffentlich bald behoben sein: https://github.com/ajgb/crypt-nacl-sodium/issues/8<br />
<br />
<BR><br />
<br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=33933DoorBird2020-09-15T06:02:03Z<p>Sailor: /* Bekannte Probleme */ Neues Problem</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
:<Code>cpan Alien::Sodium</Code><br />
:<Code>cpan Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
<BR><br />
<BR><br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
<BR><br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Keine Ausgabe von Mp3-Dateien'''</u><br />
<br />
Der DoorBird gibt mittels der Befehls "Transmit_Audio" keine Audio-Dateien aus. Stattdessen wird eine Fehlermeldung "WARNING: erroneous pipeline: no element "wavparse"" im Log erzeugt.<br />
<br />
<u>'''Lösung:'''</u><BR><br />
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.<br />
<br />
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<BR><br />
<Code>apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-pulseaudio</Code><br />
<br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=33359DoorBird2020-06-07T11:20:44Z<p>Sailor: /* Vorbereitungen in Linux */</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>cpan Crypt::Argon2</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
:<Code>cpan Alien::Sodium</Code><br />
:<Code>cpan Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
<BR><br />
<BR><br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
<BR><br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=Datei:DoorBird_Control.png&diff=33187Datei:DoorBird Control.png2020-05-04T07:28:01Z<p>Sailor: Beispiel der Control Page fuer die Einbindung ins ftui</p>
<hr />
<div>== Beschreibung ==<br />
Beispiel der Control Page fuer die Einbindung ins ftui</div>Sailorhttp://wiki.fhem.de/w/index.php?title=DoorBird&diff=33186DoorBird2020-05-04T07:24:23Z<p>Sailor: /* Einbindung im fhem Tablet UI - ftui */ Gallerie eingebunden.</p>
<hr />
<div>{{Infobox Modul<br />
|Name=DoorBird<br />
|ModPurpose= Anbindung eines DoorBird Interkommunikations-Systems<br />
|ModType=d<br />
|ModCmdRef=DoorBird<br />
|ModForumArea=Sonstiges<br />
|ModTechName=73_DoorBird.pm<br />
|ModOwner={{Link2FU|4705|Sailor}}<br />
}}<br />
<br />
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.<br />
<br />
== Vorbereitungen ==<br />
[[Bild:DoorStation_D2101V_100.png|mini|200px|rechts|DoorBird D2101V<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
=== Vorbereitungen der Hardware ===<br />
==== Installation der Hardware ====<br />
Die DoorBird Geräte müssen entsprechend der Installationsanleitung hardwareseitig installiert werden. Insbesondere bei Verwendung von Wireless LAN (WLAN) Sollte man auf eine stabile Verbindung bzw. ausreichend Feldstärke achten. Sollte die DoorBird Anlage mittels LAN-Kabel angeschlossen werden, muss man die Entfernungseinschränkungen insbesondere bei der Verwendung der Power over Ethernet(PoE)-Injektion beachten.<br />
<br />
==== Update der Firmware ====<br />
[[Bild:DoorStation_D2101KV_100.png|mini|200px|rechts|DoorBird D2101KV<BR>Quelle: "Bird Home Automation GmbH" <BR> &copy; Bird Home Automation]]<br />
Um eine funktionsfähige Kommunikation zwischen dem FHEM-Modul und dem DoorBird Gerät aufbauen zu können, muss ein entsprechender Firmwarestand installiert werden. Die Firmware hängt vom angeschlossenen Gerät ab. Aus diesem Grund muss ggf. vor der Definition in FHEM die Firmware auf den letzten Stand gebracht werden.<br />
<br />
Die Kommunikation wird erst ab den unten aufgefährten Firmware-Versionen funktionieren:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Device !! Hardware Version !! Firmware version<br />
|-<br />
| DoorBird Video Door Station D10x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D20x || 1.00+ || 000099+<br />
|-<br />
| DoorBird Video Door Station D21x || 1.00+ || 000108+<br />
|-<br />
| BirdGuard B10x || 1.00+ || 000099+<br />
|-<br />
|}<br />
<br />
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline<br />
<br />
==== Einrichtung des DoorBird Anlage ====<br />
Neben der individuellen Einrichtung der DoorBird-Anlage, müssen noch zusätzlich die Einstellungen für die SIP Telefonverbindungen vorgenommen werden. Je nachdem welches System man verwendet, kommen verschiedene Anleitungen in Frage. Die entsprechenden individuellen Anleitungen zur Einrichtung der SIP-Verbindungen sind hier zu finden: https://www.doorbird.com/de/sip<br />
<br />
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung] ist insbesondere unter 2.5 „Eingehende Anrufe erlauben“ darauf zu achten, dass eine individuell für den DoorBird in der Fritz!Box vergebene SIP Telefonnummer angegeben wird.<br />
<br />
=== Vorbereitungen in Linux ===<br />
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.<br />
<br />
Damit die ständige Eingabe des „sudo“ Befehls zur Installation der einzelnen Module „muss mit Root-Rechten erfolgen“ umgangen werden kann, bitte folgenden Befehl eingeben und mit Password freigeben:<br />
:<Code>sudo bash</Code><br />
<br />
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:<br />
:<Code>apt-get update</Code><br />
:<Code>apt-get upgrade</Code><br />
<br />
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren.<br />
<br />
Code:<br />
:<Code>apt-get install sox</Code><br />
:<Code>apt-get install libsox-fmt-all</Code><br />
:<Code>apt-get install libsodium-dev</Code><br />
:<Code>apt-get install gstreamer1.0-tools</Code><br />
:<Code>cpan MIME::Base64</Code><br />
:<Code>cpan Alien::Base::ModuleBuild</Code><br />
:<Code>cpan Alien::Sodium</Code><br />
:<Code>cpan Crypt::NaCl::Sodium</Code><br />
:<Code>cpan IO:String</Code><br />
<br />
Zum Abschluss nach erfolgter Installation der Module noch mit Eingabe von<br />
:<Code>exit</Code> <br />
wieder in den User-Mode wechseln.<br />
<br />
=== Vorbereitung in FHEM ===<br />
==== SIP und Text2Speech ====<br />
<s>Es werden für die Ausgabe von Sprachmeldungen am Doorbird System zwei zusätzliche FHEM Devices benötigt. Zur Installation bitte den Anweisungen im FHEM Wiki folgen:<br />
<br />
# [[SIP-Client]] <br />
# Text2Spech (Anleitung im Wiki für den SIP-Client enthalten)<br />
<br />
Darüber hinaus muss ggf. noch die entsprechende Einrichtung der Telefonnummer für den FHEM SIP-Client im Heim-Router (z.B. FritzBox) erfolgen.</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
==== Aktivierung und Definition in FHEM ====<br />
Das DoorBird - Device wird definiert mittels:<br />
<br />
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code><br />
<br />
Hierbei werden die ''barewords'' Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit <Code>Crypt:</Code> voran in der Definition stehen (Browser Refresh ({{Taste|F5}}) durchführen).<br />
<br />
==== Einstellungen über Attribute ====<br />
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> PollingTimeout <time in sec><br />
attr <devicename> MaxHistory <1 or 0><br />
attr <devicename> KeepAliveTimeout <time in sec><br />
attr <devicename> UdpPort <6524 oder 35344><br />
</pre><br />
<br />
<br />
;PollingTimeout<br />
:Zeitraum in dem das auf eine Antwort seitens des DoorBird Moduls warten soll. Sollte ein sehr langsames Heimnetz vorhanden sein, so muss der Wert entsprechend hochgesetzt werden.<br />
:Der Default-Wert ist 10s.<br />
<br />
;MaxHistory<br />
:Die maximale Anzahl angezeigter und heruntergeladener Bilder für die Event-Historie.<br />
:Der Default-Wert is 50 = maximale Anzahl.<br />
<br />
;KeepAliveTimeout<br />
:Zeitraum in Sekunden nach dem das Gaerät als "disconnected" definiert wird. Der DoorBird sendet in der Regel alle 7 Sekunden ein "Still-Alive" Datagramm aus, auf welches dieses Modul reagiert<br />
:Der Default-Wert ist 30s.<br />
<br />
;UdpPort<br />
:Port Nummer auf welcher das DoorBird-Modul nach den UDP Datagrammen der DoorBird-Anlage hören soll. Die Ports sind von der Firmware vorgegeben.<br />
:Der Default Port ist 6524<br />
<br />
<s><br />
;SipDevice<br />
:Name des FHEM SIP Device dessen Nummer in der DoorBird-Anlage hinterlegt wurde, welche die DoorBird-Anlage anrufen dürfen.<br />
:Der Default Wert ist das erste SIP device welches in FHEM zu finden ist.<br />
<br />
;SipNumber<br />
:Die Telefonnummer unter der die DoorBird / Anlage registriert wurde und erreicht werden kann.<br />
:Die Default Nummer ist **620</s><BR><br />
Dies ist seit der Version 20995 vom 16.01.2020 nicht mehr notwendig.<BR><br />
Das Modul kann das jetzt ohne Zuhilfenahme eines weiteren SIP Device.<br />
<br />
;SessionIdSec <br />
:Zeit in Sekunden nach welcher die Session Id erneuert werden soll. Diese ist für die sichere Übertragung der Video und Audio Verbindungsdaten notwendig. Die DoorBird-Unit devalidiert die Session Id automatisch nach 10min. Für den Fall, dass die DoorBird Kamera an ein Überwachungssystem angebunden werden soll, muss diese Funktion ausser Betrieb genommen werden indem man den Wert auf 0 setzt 0.<br />
:Der Default Wert ist 540s = 9min.<br />
<br />
;AudioFileDir<br />
:Der relative (z.B. "audio") oder absolute (z.B. "/mnt/NAS/audio") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Audio-Dateien abgelegt sind.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;ImageFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Bild-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileDir<br />
:Der relative (z.B. "images") oder absolute (z.B. "/mnt/NAS/images") Verzeichnispfad mit oder ohne nachfolgendem Pfadzeichen "/" in welchen die Video-Dateien gespeichert werden sollen.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoFileFormat<br />
:Das Dateiformat für die Videodatei.<br />
:Der Default Wert ist "mpeg"<br />
<br />
;VideoDurationDoorbell<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;VideoDurationMotion<br />
:Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.<br />
:Der Default Wert ist 0 = deaktiviert<br />
<br />
;EventReset<br />
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.<br />
:Der Default Wert ist 5s<br />
<br />
;WaitForHistory<br />
:Zeit in Sekunden die das Modul auf das Bereitstellen eines korrespondierenden History Bildes zu einem Event warten soll. Muss ggf. adjustiert werden, sobald deutliche Unterschiede in der Systemzeit zwischen FHEM-Server und DoorBird Station vorliegen.<br />
:Der Default Wert ist 7s<br />
<br />
;OpsModeList<br />
:Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.<br />
:Der Default Wert ist "" = deaktiviert<br />
<br />
== Event gesteuerte Aktionen ==<br />
Das DoorBird Modul ist in der Lage, auf in Abhängigkeit von Operationsmoden individuelle Aktionen hinsichtlich der Relays und Audioausgaben am DoorBird durchzuführen. Im Augenblick reagiert das Modul dabei nur auf Events der Türklingel (Doorbell) und des Bewegungssensors (Motion). Sobald die Herstellerfirma ein entsprechendes Firmwareupdate herausgebracht hat, so hoffe ich auch die Events bei Zahlencode-Eingabe mit einbinden zu können.<br />
Hierbei kann man im sogenannten Normalmodus bei Betätigen der Türklingel einen automatischen Audio-Stream abspielen "''Willkommen bei Familie fhem. Ich versuche jemanden kontaktieren. Bitte warten sie''". <br />
Im Partymodus kann man beispielsweise nach der Ansage "''Willkommen auf unserer Party. Die Tür wird geöffnet. Bitte tretet ein!''" automatisch eines der installierten Relays auslösen.<br />
<br />
=== Vorbereitung der Audiodateien ===<br />
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer.<br />
Dann legt man sich für jeden Fall eine Audiodatei an. Dies kann man selbst besprechen, oder man lässt dies auf einen der Internetseiten zur Sprachsynthetisierung erstellen. Mein Favorit ist https://ttsmp3.com/ wo man bei Bedarf auch deutsche Texte mit englischem oder französischem Akzent erstellen kann. Die ist besonder lustig, wenn man das französische Dienstmädchen sowie den englischen Butler aus dem DoorBird erklingen lassen will.<br />
Hierbei sollte man bedenken, das die ersten 2 Sekunden von den klingelden Personen an der Tür nicht erfasst werden, bevor diese verstehen, dass dort eine Nachricht für sie erscheint. Daher empfehle ich aus psychologischer Sicht mit etwas Belanglosem anzufangen wie "''Willkommen bei Familie fhem.''".<br />
<br />
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:<br />
# Normal-Bell.mp3 "''Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!''"<br />
# Party-Bell.mp3 "''Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!''"<br />
# Feuer-Bell.mp3 "''Im Hause der Familie fhem ist ein Rauchmelder ausgelöst worden. Der nächste Feuerlöscher ist unter der Treppe. Die Tür wird für sie geöffnet. Bitte treten sie ein! ''"<br />
<br />
Jetzt muss ein Verzeichnis eingerichtet werden, in denen man die gesamten Audio-Dateien ablegen will (z.B.: /opt/fhem/audio). Dieses Verzeichnis samt Inhalt muss man mit den entsprechenden Rechten versehen.<br />
<br />
=== Einrichten des DoorBird Device in FHEM ===<br />
Im FHEM-Device setzen wir zunächst die Attribute <code>AudioFileDir</code> und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.<br />
<br />
Anschliessend setzen wir das eigentliche Attribut <code>OpsModeList</code> indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.<br />
<br />
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.<br />
<br />
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:<br />
<br />
# OpsMode<br />
# OpsModeFireDoorbellAudio<br />
# OpsModeFireDoorbellRelay<br />
# OpsModeFireMotionAudio<br />
# OpsModeFireMotionRelay<br />
# OpsModeNormalDoorbellAudio<br />
# OpsModeNormalDoorbellRelay<br />
# OpsModeNormalMotionAudio<br />
# OpsModeNormalMotionRelay<br />
# OpsModePartyDoorbellAudio<br />
# OpsModePartyDoorbellRelay<br />
# OpsModePartyMotionAudio<br />
# OpsModePartyMotionRelay<br />
<br />
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.<br />
<br />
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.<br />
<br />
Ein Löschen des Attributs <code>OpsModeList</code> löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs <code>OpsModeList</code> insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.<br />
<br />
=== Anmerkung ===<br />
Ich empfehle, alle Readings zumindest auf <code>Off</code> zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.<br />
<br />
== Event gesteuerte Videoaufnahmen ==<br />
Seit der Version 20383 unterstützt das Modul auch Event gesteuerte Videoaufnahmen in definierbarer Länge. Zur Zeit werden nur die Events Türklingel und Bewegungssensor getriggert. Ich hoffe, mit zukünftigem Firmwareupdate seitens der DoorBird Geräte auch die Keypads abfangen zu können.<br />
<br />
=== Vorbereitung ===<br />
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!<br />
<br />
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen.<br />
Die Attribute "VideoDurationDoorbell", "VideoDurationMotion" und später auch "VideoDurationKeypad" legen fest, wieviele Sekunden Videosequenz gespeichert werden soll. Der Wert "0" bzw. das Löschen des Attributs deaktiviert die Aufnahme für dieses Event.<br />
<br />
=== Hinweis ===<br />
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.<br />
<br />
== Einbindung im fhem Tablet UI - ftui ==<br />
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui.<br />
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.<br />
<br />
<gallery><br />
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui<br />
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui<br />
</gallery><br />
<br />
=== Vorbereitung im DoorBird Device ===<br />
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:<br />
<br />
<pre style="width:650px;"><br />
attr <devicename> HistoryFilePath 1<br />
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> <br />
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen><br />
attr <devicename> MaxHistory <minimum 5><br />
attr <devicename> VideoFileFormat mp4<br />
</pre><br />
<br />
Zu beachten ist:<br />
#Die Pfade zu den Bild- und Videodateien muessen zwingend unter dem www-Pfad liegen muessen, da ansonsten die Bilder / Videos aus dem ftui heraus nicht erreicht werden können. Beispiel: "/opt/fhem/www/doorbird".<br />
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.<br />
#Das Video-Format auf mp4 liegen muss.<br />
<br />
=== Beispiel - Code fuer das ftui ===<br />
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.<br />
<br />
Es geht bestimmt auch schöner, umfangreicher und haptischer. <br />
"Challenge accepted!"<br />
<br />
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden<br />
<br />
<source lang=html4strict><br />
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"><br />
<header><div data-type="label" class="large">Doorbird</div></header><br />
<br />
<table width="100%"><br />
<tr><br />
<td colspan="3"><br />
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"><br />
</td><br />
<td><br />
<div class=""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "state"<br />
data-background-icon = "fa-circle"<br />
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' <br />
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'<br />
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'><br />
</div><br />
<br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "state"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td colspan ="3"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "200" <br />
data-height = "150" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
<div class="dialog"><br />
<header>Front Door</header><br />
<div class="inline cell"><br />
<div data-type = "image" <br />
data-device = "UI_Url_FrontDoor" <br />
data-get = "state"<br />
data-width = "1024" <br />
data-height = "768" <br />
data-refresh = "900" <br />
data-opacity = "1"<br />
class = "centered top-space"><br />
</div><br />
</div><br />
</div><br />
</div><br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-light_light_dim_100" <br />
data-cmd = "set myDoorBird Light_On"<br />
data-countdown = "180"<br />
data-on-color = "#0088CC"><br />
</div><br />
IR-Light ON<br />
</td><br />
</tr><br />
</table><br />
<table width="100%"><br />
<tr height="100"><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "fa-key" <br />
data-cmd = "set myDoorBird Open_Door 1"<br />
data-on-color = "#0088CC"><br />
</div><br />
Open Door<br />
</td><br />
<td width="25%"><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-fts_garage" <br />
data-cmd = "set myDoorBird Open_Door 2"<br />
data-on-color = "#0088CC"><br />
</div><br />
Toggle Carport<br />
</td><br />
<td colspan="2"><br />
<div data-type = "select"<br />
data-device = "myDoorBird"<br />
data-list = "OpsModeList"<br />
data-delimiter = " "<br />
data-get = "OpsMode"<br />
data-set = "OpsMode"<br />
class = "wider w2x"><br />
</div><br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "oa-control_reboot" <br />
data-cmd = "set myDoorBird Restart"<br />
data-on-color = "#0088CC"><br />
</div><br />
Restart DoorBird<br />
</td><br />
<td><br />
<br />
<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-add_a_photo"<br />
data-cmd = "get myDoorBird Image_Request"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take a Photo<br />
</td><br />
<td><br />
<div data-type = "push" <br />
data-device = "myDoorBird"<br />
data-icon = "mi-video_call"<br />
data-cmd = "get myDoorBird Video_Request 10"<br />
data-on-color = "#0088CC"><br />
</div><br />
Take 10s-Video<br />
</td><br />
</tr><br />
<tr><br />
<td><br />
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"><br />
<div data-type="push"<br />
data-icon="fa-archive"><br />
</div><br />
<div class="dialog large"><br />
<header>Front Door</header><br />
<br />
<table width="100%"><br />
<tr><br />
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<BR><br />
History of Activities - Images and Videos<BR><br />
<BR><br />
</th><br />
</tr><br />
<tr><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Doorbell<br />
</th><br />
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Motionsensor<br />
</th><br />
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Snapshots<br />
</th><br />
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Manual Videos<br />
</th><br />
</tr><br />
<tr><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td><br />
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Image<br />
</td><br />
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
Video<br />
</td> <br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_00"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_00_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_01"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_01_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_02"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_02_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_03"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_03_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
<tr><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Doorbell Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_doorbell_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"<br />
data-substitution = "s/(^$)/Not available/g"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Image</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Motionsensor Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_motionsensor_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"><br />
</div><br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "180" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
<div class="dialog"><br />
<header>Nanual Snapshot</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "image" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_snapshot_Image_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device= "myDoorBird"<br />
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"><br />
</div> <br />
</td><br />
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"><br />
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"><br />
<div class = ""<br />
data-type = "symbol" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-states = '["",".*"]' <br />
data-icons = '["fa-video-slash","fa-video-camera"]'><br />
</div><br />
<div class="dialog"><br />
<header>Manual Video</header><br />
<BR><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div><br />
<BR><br />
<div data-type = "video" <br />
data-device = "myDoorBird" <br />
data-get = "HistoryFilePath_manual_Video_04"<br />
data-width = "1024" <br />
data-opacity = "1"<br />
class = "nocache"><br />
</div><br />
</div><br />
</div><br />
<div data-type = "label"<br />
data-device = "myDoorBird"<br />
data-get = "HistoryFilePath_manual_Video_04_Timestamp"><br />
</div> <br />
</td><br />
</tr><br />
</table><br />
</div><br />
</div><br />
History<br />
</td><br />
<td><br />
</td> <br />
<td><br />
</td><br />
<td><br />
</td><br />
</tr><br />
</table><br />
</li><br />
</source><br />
<br />
== Bekannte Probleme ==<br />
=== Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. <br />
Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. <br />
Besser wäre es jedoch sowohl auf dem FHEM-Server als auch auf der DoorBird-Unit den NTP-Server auf die gleiche Adresse zu setzen.<br />
<br />
Achtung: Auch muss die richtige Zeitzone gewählt werden.<br />
<BR><br />
<BR><br />
=== Keine Reaktion bei Events ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Das FHEM Modul reagiert nicht auf die Events wie Klingeln, Bewegungssensor oder die automatischen StillAlive-Meldung welche per UDP Datagramme in das Netzwerk gesendet werden.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Es ist sicherzustellen, das sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.<br />
Weiterhin muss sichergestellt werden, dass weder seitens der Hardware (Active Switch, Router, etc.) noch seitens des Servers (Docker Container etc.) die UDP Datagramme herausgefiltert werden.<br />
<BR><br />
<BR><br />
=== Bibliothek "<Code>Crypt::NaCL::Sodium</Code>"-Installation fehlgeschlagen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Bei der Installation der Bibliothek "Crypt::NaCL::Sodium" mittels des Befehls "<Code>cpan Crypt::NaCl::Sodium</Code>" erscheint am Ende die Fehlermeldung<br />
<br />
<Code><br />
make: *** [Makefile:1087: test_dynamic] Fehler 255<BR><br />
AJGB/Crypt-NaCl-Sodium-1.0.8.0.tar.gz<BR><br />
/usr/bin/make test -- NOT OK<br />
</Code><br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Bibliothek mittels dem Befehl "<Code>cpan Crypt::NaCl::Sodium --force</Code>" installieren.<br />
<BR><br />
<BR><br />
=== Es werden keine Sprachmeldungen mehr an den DoorBird überragen ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Die Sprachübertragung hat bereits tadelos an den DoorBird funktioniert und auf einmal nicht mehr.<br />
<br />
Auch das SIP-Device unter FHEM schafft keinen Kontakt mehr per Anwahl an den DoorBird herzustellen.<br />
<br />
Das SIP Gateway ist auf einer FritzBox realisiert.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Die Firma AVM hat mit einem bestimmten Update (Versionssprung unbekannt) die SIP Gateway-Einstellungen geändert.<br />
<br />
Seitdem identifiziert sie anrufende Nutzer nicht mehr mit <Code>**623@192.168.178.1</Code> sondern mit <Code>**623@fritz.box</Code><br />
<br />
Daher müssen alle erlaubten SIP Benutzter im Administrationsteil der DoorBird-App auf dieses neue Format umgestellt werden.<br />
<br />
PS: Dass man die alten SIP-Nutzer in der APP nicht löschen kann, ist ein bekannter Bug.<br />
<BR><br />
<BR><br />
=== Neu erstellte OpsModeList erzeugt keine entsprechenden Readings ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Nach einem Neustart des fhem Systems erscheint nach dem Anlegen der Operation Mode List mittels des Attributes "OpsModeList" keine entsprechend zu erwartenden neue Readings basiernd auf dieser Liste.<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems.<br />
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.<br />
<BR><br />
<BR><br />
=== Neues Problem ===<br />
<u>'''Beschreibung / Ursache:'''</u><br />
<br />
Problembeschreibung<br />
<br />
<u>'''Lösung:'''</u><br />
<br />
Lösungsbeschreibung<br />
<br />
== Zukünftige Entwicklungen ==<br />
=== Eventgesteuerte Videoaufnahmen ===<br />
<u>'''Beschreibung:'''</u><br />
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20383'''</span><br />
<br />
=== Statusregler zur Triggerung von individuellen Notifys ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Ein Regler welchen Status der DoorBird haben soll (Normal, Party, Feueralarm, etc.). Dieses Reading kann dann entweder mit einem Notify ausgelesen werden oder das Modul steuert direkt Aktionen (Party: Bei Betätigung der Klingel Ansage "Willkommen auf meiner Party, die Tür ist offen" und Türöffner betätigen. Feueralarm: Ansage "Der Rauchmelder im Kinderzimmer hat ausgelöst, der nächste Feuerlöscher hängt unter der Treppe" und Türöffner betätigen.<br />
<br />
<span style="color: red">'''Implementiert seit Version 20321'''</span><br />
<br />
=== Widget für FHEM TabletUI===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Eigenes Widget zur Anzeige der Events als Popup. Hierzu braucht der Modul-Autor Sailor Hilfe (von User "setstate"?), da keine Erfahrung in diesem Bereich vorliegt.<br />
<br />
=== DoorBird-Typ gesteuertes Frontend ===<br />
<u>'''Beschreibung:'''</u><br />
<br />
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe {{Link2Forum|Topic=100758|Message=966573|LinkText=diesen Forenbeitrag}}).<br />
<br />
<span style="color: red">'''Implementiert seit Version 20246'''</span><br />
<br />
== Links ==<br />
* {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls<br />
* [[SIP-Client]]<br />
* [https://www.doorbird.com/downloads/cnt_avm.pdf Anleitung zur SIP Registrierung des DoorBirds in der Fritz!Box]<br />
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation]<br />
<br />
[[Kategorie:Other Components]]</div>Sailorhttp://wiki.fhem.de/w/index.php?title=Datei:Dorbird_Control.png&diff=33185Datei:Dorbird Control.png2020-05-04T07:21:40Z<p>Sailor: Beispiel der Conrol Page fuer die Einbindung ins ftui</p>
<hr />
<div>== Beschreibung ==<br />
Beispiel der Conrol Page fuer die Einbindung ins ftui</div>Sailorhttp://wiki.fhem.de/w/index.php?title=Datei:DoorBird_History.png&diff=33184Datei:DoorBird History.png2020-05-04T07:21:19Z<p>Sailor: Beispiel der History Page fuer die Einbindung ins ftui</p>
<hr />
<div>== Beschreibung ==<br />
Beispiel der History Page fuer die Einbindung ins ftui</div>Sailor