DoorBird: Unterschied zwischen den Versionen
K (Umstellung Forenlinks auf Wiki-Vorlage, Typographie, Ersatz/Entfernung unnötiger HTML Tags, sonstige Korrekturen) |
Sailor (Diskussion | Beiträge) |
||
(51 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 8: | Zeile 8: | ||
|ModOwner={{Link2FU|4705|Sailor}} | |ModOwner={{Link2FU|4705|Sailor}} | ||
}} | }} | ||
Das [[DoorBird]] Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation. | |||
{{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.}} | |||
== Vorbereitungen == | == Vorbereitungen == | ||
Zeile 21: | Zeile 23: | ||
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. | 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. | ||
Die Kommunikation wird erst ab den unten | Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren: | ||
{| class="wikitable" | {| class="wikitable" | ||
Zeile 42: | Zeile 44: | ||
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 | 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 | ||
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. | 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. | ||
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. | |||
=== Vorbereitungen in Linux === | === Vorbereitungen in Linux === | ||
Zeile 48: | Zeile 52: | ||
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: | 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: | ||
:<Code>sudo bash</ | :<Code>sudo bash</Code> | ||
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen: | Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen: | ||
:<Code>apt-get update</ | :<Code>apt-get update</Code> | ||
:<Code>apt-get upgrade</ | :<Code>apt-get upgrade</Code> | ||
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren. | Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per {{Taste|Enter}} installieren. | ||
Code: | Code: | ||
:<Code>apt-get install sox | :<Code> sudo apt-get install -y sox && sudo apt-get install -y libsox-fmt-all && sudo apt-get install -y libsodium-dev</Code> | ||
:<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> | |||
:<Code>apt-get install | :<Code> sudo cpan install Crypt::Argon2</Code> | ||
:<Code>cpan | :<Code> sudo cpan install Sodium::FFI</Code> | ||
:<Code>cpan | :<Code> sudo cpan install IO::String module</Code> | ||
:<Code>cpan | :<Code> sudo cpan install IO::Socket</Code> | ||
:<Code>cpan | |||
=== Vorbereitung in FHEM === | |||
==== Aktivierung und Definition in FHEM ==== | |||
Das DoorBird - Device wird definiert mittels: | |||
:<Code>define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort></Code> | |||
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). | |||
==== Einstellungen über Attribute ==== | |||
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden: | |||
;disable | |||
:Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird - Anlage ausgesendeten UDP - Datageramme | |||
:Der Default Wert ist 0 = aktiviert | |||
: | ;AudioFileDir | ||
: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. | |||
:Der Default Wert ist "" = deaktiviert | |||
;AudioFileDirMaxSize | |||
: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. | |||
:Der Default Wert ist 50 = 50MB | |||
;EventReset | |||
:Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen. | |||
:Der Default Wert ist 5s | |||
;HistoryFilePath | |||
:Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image") | |||
:Der Default Wert ist "0" = disabled | |||
;ImageFileDir | |||
: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. | |||
:Der Default Wert ist "" = deaktiviert | |||
; | ;ImageFileDirMaxSize | ||
: | :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. | ||
:Der Default | :Der Default Wert ist 50 = 50MB | ||
;KeepAliveTimeout | ;KeepAliveTimeout | ||
: | :Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird. | ||
:Der Default | :Der Default Wert ist 30s | ||
; | ;MaxHistory | ||
: | :Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor. | ||
:Der Default | :Der Default Wert ist "50" = Maximum. | ||
; | ;OpsModeList | ||
: | :Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert. | ||
:Der Default Wert ist | :Der Default Wert ist "" = deaktiviert | ||
; | ;PollingTimeout | ||
: | :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. | ||
: | :Der Default-Wert ist 10s. | ||
;SessionIdSec | ;SessionIdSec | ||
Zeile 126: | Zeile 127: | ||
:Der Default Wert ist 540s = 9min. | :Der Default Wert ist 540s = 9min. | ||
; | ;UdpPort | ||
: | :Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben. | ||
:Der Default | :Der Default Port ist 6524 | ||
; | ;VideoFileDir | ||
: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. | :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. | ||
:Der Default Wert ist "" = deaktiviert | |||
;VideoFileDirMaxSize | |||
: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. | |||
:Der Default Wert ist 50 = 50MB | |||
;VideoFileFormat | |||
:Das Dateiformat für die Videodatei | |||
:Der Default Wert ist "mpeg" | |||
;VideoDurationDoorbell | |||
:Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll. | |||
:Der Default Wert ist 0 = deaktiviert | :Der Default Wert ist 0 = deaktiviert | ||
; | ;VideoDurationMotion | ||
:Zeit in Sekunden | :Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll. | ||
:Der Default Wert ist | :Der Default Wert ist 0 = deaktiviert | ||
;WaitForHistory | ;WaitForHistory | ||
: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 | :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. | ||
:Der Default Wert ist 7s | :Der Default Wert ist 7s | ||
== Event gesteuerte Aktionen == | == Event gesteuerte Aktionen == | ||
Zeile 196: | Zeile 205: | ||
== Event gesteuerte Videoaufnahmen == | == Event gesteuerte Videoaufnahmen == | ||
Seit der Version | 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. | ||
=== Vorbereitung === | === Vorbereitung === | ||
Zeile 206: | Zeile 215: | ||
=== Hinweis === | === Hinweis === | ||
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen. | Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen. | ||
== Einbindung im fhem Tablet UI - ftui == | |||
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui. | |||
Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt. | |||
<gallery> | |||
DoorBird_Control.png|Beispiel der Control Page fuer die Einbindung ins ftui | |||
DoorBird_History.png|Beispiel der History Page fuer die Einbindung ins ftui | |||
</gallery> | |||
=== Vorbereitung im DoorBird Device === | |||
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein: | |||
<pre style="width:650px;"> | |||
attr <devicename> HistoryFilePath 1 | |||
attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> | |||
attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen> | |||
attr <devicename> MaxHistory <minimum 5> | |||
attr <devicename> VideoFileFormat mp4 | |||
</pre> | |||
Zu beachten ist: | |||
#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". | |||
#Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss. | |||
#Das Video-Format auf mp4 liegen muss. | |||
=== Beispiel - Code fuer das ftui === | |||
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht. | |||
Es geht bestimmt auch schöner, umfangreicher und haptischer. | |||
"Challenge accepted!" | |||
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden | |||
<syntaxhighlight lang="html4strict"> | |||
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent"> | |||
<header><div data-type="label" class="large">Doorbird</div></header> | |||
<table width="100%"> | |||
<tr> | |||
<td colspan="3"> | |||
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42"> | |||
</td> | |||
<td> | |||
<div class="" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "state" | |||
data-background-icon = "fa-circle" | |||
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]' | |||
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]' | |||
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "state"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td colspan ="3"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "UI_Url_FrontDoor" | |||
data-get = "state" | |||
data-width = "200" | |||
data-height = "150" | |||
data-refresh = "900" | |||
data-opacity = "1" | |||
class = "centered top-space"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Front Door</header> | |||
<div class="inline cell"> | |||
<div data-type = "image" | |||
data-device = "UI_Url_FrontDoor" | |||
data-get = "state" | |||
data-width = "1024" | |||
data-height = "768" | |||
data-refresh = "900" | |||
data-opacity = "1" | |||
class = "centered top-space"> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</td> | |||
<td width="25%"> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "oa-light_light_dim_100" | |||
data-cmd = "set myDoorBird Light_On" | |||
data-countdown = "180" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
IR-Light ON | |||
</td> | |||
</tr> | |||
</table> | |||
<table width="100%"> | |||
<tr height="100"> | |||
<td width="25%"> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "fa-key" | |||
data-cmd = "set myDoorBird Open_Door 1" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
Open Door | |||
</td> | |||
<td width="25%"> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "oa-fts_garage" | |||
data-cmd = "set myDoorBird Open_Door 2" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
Toggle Carport | |||
</td> | |||
<td colspan="2"> | |||
<div data-type = "select" | |||
data-device = "myDoorBird" | |||
data-list = "OpsModeList" | |||
data-delimiter = " " | |||
data-get = "OpsMode" | |||
data-set = "OpsMode" | |||
class = "wider w2x"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "oa-control_reboot" | |||
data-cmd = "set myDoorBird Restart" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
Restart DoorBird | |||
</td> | |||
<td> | |||
</td> | |||
<td> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "mi-add_a_photo" | |||
data-cmd = "get myDoorBird Image_Request" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
Take a Photo | |||
</td> | |||
<td> | |||
<div data-type = "push" | |||
data-device = "myDoorBird" | |||
data-icon = "mi-video_call" | |||
data-cmd = "get myDoorBird Video_Request 10" | |||
data-on-color = "#0088CC"> | |||
</div> | |||
Take 10s-Video | |||
</td> | |||
</tr> | |||
<tr> | |||
<td> | |||
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline"> | |||
<div data-type="push" | |||
data-icon="fa-archive"> | |||
</div> | |||
<div class="dialog large"> | |||
<header>Front Door</header> | |||
<table width="100%"> | |||
<tr> | |||
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<BR> | |||
History of Activities - Images and Videos<BR> | |||
<BR> | |||
</th> | |||
</tr> | |||
<tr> | |||
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Doorbell | |||
</th> | |||
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Motionsensor | |||
</th> | |||
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Manual Snapshots | |||
</th> | |||
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Manual Videos | |||
</th> | |||
</tr> | |||
<tr> | |||
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Image | |||
</td> | |||
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Video | |||
</td> | |||
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Image | |||
</td> | |||
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
Video | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_00" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_00" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp" | |||
data-substitution = "s/(^$)/Not available/g"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_00" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_00" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_00" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Nanual Snapshot</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_00" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Manual Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_00_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_00" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_00_Timestamp"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_01" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_01" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp" | |||
data-substitution = "s/(^$)/Not available/g"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_01" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_01" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_01" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Nanual Snapshot</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_01" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Manual Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_01_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_01" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_01_Timestamp"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_02" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_02" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp" | |||
data-substitution = "s/(^$)/Not available/g"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_02" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_02" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_02" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Nanual Snapshot</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_02" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Manual Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_02_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_02" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_02_Timestamp"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_03" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_03" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp" | |||
data-substitution = "s/(^$)/Not available/g"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_03" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_03" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_03" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Nanual Snapshot</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_03" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Manual Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_03_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_03" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_03_Timestamp"> | |||
</div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_04" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_04" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Doorbell Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp" | |||
data-substitution = "s/(^$)/Not available/g"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_04" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Image</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_04" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Motionsensor Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_04" | |||
data-width = "180" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
<div class="dialog"> | |||
<header>Nanual Snapshot</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "image" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device= "myDoorBird" | |||
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp"> | |||
</div> | |||
</td> | |||
<td style="padding:1px; border:1px solid white; border-collapse:collapse;"> | |||
<div data-type="popup" data-width="1200px" data-height="850px" class="inline"> | |||
<div class = "" | |||
data-type = "symbol" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_04" | |||
data-states = '["",".*"]' | |||
data-icons = '["fa-video-slash","fa-video-camera"]'> | |||
</div> | |||
<div class="dialog"> | |||
<header>Manual Video</header> | |||
<BR> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_04_Timestamp"> | |||
</div> | |||
<BR> | |||
<div data-type = "video" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_04" | |||
data-width = "1024" | |||
data-opacity = "1" | |||
class = "nocache"> | |||
</div> | |||
</div> | |||
</div> | |||
<div data-type = "label" | |||
data-device = "myDoorBird" | |||
data-get = "HistoryFilePath_manual_Video_04_Timestamp"> | |||
</div> | |||
</td> | |||
</tr> | |||
</table> | |||
</div> | |||
</div> | |||
History | |||
</td> | |||
<td> | |||
</td> | |||
<td> | |||
</td> | |||
<td> | |||
</td> | |||
</tr> | |||
</table> | |||
</li> | |||
</syntaxhighlight> | |||
== Bekannte Probleme == | == Bekannte Probleme == | ||
Zeile 220: | Zeile 1.398: | ||
Achtung: Auch muss die richtige Zeitzone gewählt werden. | Achtung: Auch muss die richtige Zeitzone gewählt werden. | ||
=== Keine Reaktion bei Events === | === Keine Reaktion bei Events === | ||
Zeile 228: | Zeile 1.407: | ||
<u>'''Lösung:'''</u> | <u>'''Lösung:'''</u> | ||
Es ist sicherzustellen, | Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden. | ||
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. | 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. | ||
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.<BR> | |||
https://docs.docker.com/network/macvlan/ | |||
=== | === Neu erstellte OpsModeList erzeugt keine entsprechenden Readings === | ||
<u>'''Beschreibung / Ursache:'''</u> | <u>'''Beschreibung / Ursache:'''</u> | ||
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. | |||
<u>'''Lösung:'''</u><BR> | |||
<u>'''Lösung:'''</u> | |||
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems. | |||
Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden. | |||
=== Keine Ausgabe von Mp3-Dateien === | |||
<u>'''Beschreibung / Ursache:'''</u> | |||
<u>''' | |||
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. | |||
<u>'''Lösung:'''</u><BR> | |||
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse. | |||
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:<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> | |||
=== Neues Problem === | === Neues Problem === | ||
Zeile 278: | Zeile 1.449: | ||
<u>'''Beschreibung:'''</u> | <u>'''Beschreibung:'''</u> | ||
Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}. | Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt {{Link2Forum|Topic=100758|Message=961098|LinkText=siehe Forenbeitrag}}. | ||
<span style="color: red">'''Implementiert seit Version 20383'''</span> | |||
=== Statusregler zur Triggerung von individuellen Notifys === | === Statusregler zur Triggerung von individuellen Notifys === | ||
Zeile 285: | Zeile 1.458: | ||
<span style="color: red">'''Implementiert seit Version 20321'''</span> | <span style="color: red">'''Implementiert seit Version 20321'''</span> | ||
=== DoorBird-Typ gesteuertes Frontend === | === DoorBird-Typ gesteuertes Frontend === | ||
Zeile 297: | Zeile 1.465: | ||
<span style="color: red">'''Implementiert seit Version 20246'''</span> | <span style="color: red">'''Implementiert seit Version 20246'''</span> | ||
=== Widget für FHEM TabletUI=== | |||
<u>'''Beschreibung:'''</u> | |||
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. | |||
== Links == | == Links == | ||
* {{Link2Forum|Topic= | * {{Link2Forum|Topic=100758}} zur Entwicklung und Support des Moduls | ||
* [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation] | * [https://www.doorbird.com/ Hauptseite des Herstellers: Bird Home Automation] | ||
[[Kategorie:Other Components]] | [[Kategorie:Other Components]] |
Aktuelle Version vom 20. März 2024, 10:38 Uhr
DoorBird | |
---|---|
Zweck / Funktion | |
Anbindung eines DoorBird Interkommunikations-Systems | |
Allgemein | |
Typ | Gerätemodul |
Details | |
Dokumentation | EN / DE |
Support (Forum) | Sonstiges |
Modulname | 73_DoorBird.pm |
Ersteller | Sailor |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das DoorBird Modul ermöglicht die Anbindung einer DoorBird Tür-Interkommunikationseinheit an einen FHEM-Server zur Konfiguration und Kommunikation.
Vorbereitungen
Vorbereitungen der Hardware
Installation der Hardware
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.
Update der Firmware
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.
Die Kommunikation wird erst ab den unten aufgeführten Firmware-Versionen funktionieren:
Device | Hardware Version | Firmware version |
---|---|---|
DoorBird Video Door Station D10x | 1.00+ | 000099+ |
DoorBird Video Door Station D20x | 1.00+ | 000099+ |
DoorBird Video Door Station D21x | 1.00+ | 000108+ |
BirdGuard B10x | 1.00+ | 000099+ |
Es ist jederzeit möglich, den Firmware-Stand seines DoorBird-Gerätes unter diesem Link zu überprüfen: https://www.doorbird.com/de/checkonline
Einrichtung des DoorBird Anlage
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
Die große Masse der User dürfte allerdings eine FritzBox ihr Eigen nennen. In der entsprechenden 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.
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.
Vorbereitungen in Linux
Damit das Modul unter FHEM und Linux funktioniert, müssen zusätzliche Perl-Bibliotheken installiert werden.
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:
sudo bash
Zur Vermeidung bekannter Fehler aufgrund von Versionsunterschieden sollte man seine bereits installierten Pakete auf den neusten Stand bringen:
apt-get update
apt-get upgrade
Dann nacheinander die u.g. Module per (Copy/Paste) und Bestätigung per Enter installieren.
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 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
sudo cpan install Crypt::Argon2
sudo cpan install Sodium::FFI
sudo cpan install IO::String module
sudo cpan install IO::Socket
Vorbereitung in FHEM
Aktivierung und Definition in FHEM
Das DoorBird - Device wird definiert mittels:
define <devicename> DoorBird <IPAdresse des DoorBird> <Username> <persönliches Passwort>
Hierbei werden die barewords Username und Passwort verschlüsselt abgelegt. Nach erfolgreicher Definition sollten diese mit Crypt:
voran in der Definition stehen (Browser Refresh (F5) durchführen).
Einstellungen über Attribute
Es können neben den Standard Attributen wie "room" oder "verbose" noch folgende für das DoorBird-Modul individuelle Attribute ergänzt werden:
- disable
- Stoppt das Gerät von weiteren Reaktionen auf die von der DoorBird - Anlage ausgesendeten UDP - Datageramme
- Der Default Wert ist 0 = aktiviert
- AudioFileDir
- 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.
- Der Default Wert ist "" = deaktiviert
- AudioFileDirMaxSize
- 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.
- Der Default Wert ist 50 = 50MB
- EventReset
- Zeit in Sekunden nach welcher die Readings für die Events (z.B. "doorbell_button", "motions sensor", "keypad")wieder auf "idle" gesetzt werden sollen.
- Der Default Wert ist 5s
- HistoryFilePath
- Erstellt Dateipfade zu den letzten Bildern und Videos um sie in den User Interfaces direkt anzuzeigen (e.g. fhem ftui Widget "Image")
- Der Default Wert ist "0" = disabled
- ImageFileDir
- 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.
- Der Default Wert ist "" = deaktiviert
- ImageFileDirMaxSize
- 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.
- Der Default Wert ist 50 = 50MB
- KeepAliveTimeout
- Timeout in Sekunden ohne "still-alive" - UDP Datagramme bevor der Status des Gerätes auf "disconnected" gesetzt wird.
- Der Default Wert ist 30s
- MaxHistory
- Anzahl der herunterzuladenden Bilder aus dem Historien-Archiv sowohl für Ereignisse seitens der Türklingel als auch für den Bewegungssensor.
- Der Default Wert ist "50" = Maximum.
- OpsModeList
- Eine durch Leerzeichen getrennte Liste von Namen für Operationszustände (e.g. "Normal Party Feuer" auf diese der DoorBird automatisch bei Events reagiert.
- Der Default Wert ist "" = deaktiviert
- PollingTimeout
- 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.
- Der Default-Wert ist 10s.
- SessionIdSec
- 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.
- Der Default Wert ist 540s = 9min.
- UdpPort
- Port Nummer auf welcher das DoorBird - Modul nach den UDP Datagrammen der DoorBird - Anlage hören soll. Die Ports sind von der Firmware vorgegeben.
- Der Default Port ist 6524
- VideoFileDir
- 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.
- Der Default Wert ist "" = deaktiviert
- VideoFileDirMaxSize
- 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.
- Der Default Wert ist 50 = 50MB
- VideoFileFormat
- Das Dateiformat für die Videodatei
- Der Default Wert ist "mpeg"
- VideoDurationDoorbell
- Zeit in Sekunden für wie lange das Video im Falle eines Klingel Events aufgenommen werden soll.
- Der Default Wert ist 0 = deaktiviert
- VideoDurationMotion
- Zeit in Sekunden für wie lange das Video im Falle eines Bewegungssensor Events aufgenommen werden soll.
- Der Default Wert ist 0 = deaktiviert
- WaitForHistory
- 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.
- Der Default Wert ist 7s
Event gesteuerte Aktionen
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. 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". 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.
Vorbereitung der Audiodateien
Zunächst muss man sich überlegen wieviele Moden man braucht. Im folgenden arbeiten wir mit 3 Moden: Normal, Party und Feuer. 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. 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.".
Für unser Beispiel sollen jetzt mal 3 Audiodateien erstellt werden:
- Normal-Bell.mp3 "Willkommen bei Familie fhem. Ich versuche Jemanden der Bewohner zu erreichen. Bitte warten sie!"
- Party-Bell.mp3 "Willkommen auf der Party von Hans fhem. Die Tür wird für sie geöffnet. Bitte treten sie ein!"
- 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! "
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.
Einrichten des DoorBird Device in FHEM
Im FHEM-Device setzen wir zunächst die Attribute AudioFileDir
und setzen einen relativen oder absoluten Pfad auf das Verzeichnis in denen die gesamten Audiodateien zu finden sind.
Anschliessend setzen wir das eigentliche Attribut OpsModeList
indem wir eine durch Space getrennte Liste mit freien Namen der Operationsmodi eingeben.
In unserem Beispiel soll der Wert des Attributs "Normal Party Feuer" sein.
Sobald man das Attribut gesetzt hat, tauchen auch entsprechende Readings auf. In unserem Falle:
- OpsMode
- OpsModeFireDoorbellAudio
- OpsModeFireDoorbellRelay
- OpsModeFireMotionAudio
- OpsModeFireMotionRelay
- OpsModeNormalDoorbellAudio
- OpsModeNormalDoorbellRelay
- OpsModeNormalMotionAudio
- OpsModeNormalMotionRelay
- OpsModePartyDoorbellAudio
- OpsModePartyDoorbellRelay
- OpsModePartyMotionAudio
- OpsModePartyMotionRelay
Die Eigenschaften dürften selbsterklärend sein. Mit dem Set-Befehl kann man die entsprechenden Readings dank der Auswahlliste entsprechend komfortabel setzen.
Von jetzt an reagiert FHEM bzw. das DoorBird Modul mit den entsprechend eingegebenen Aktionen.
Ein Löschen des Attributs OpsModeList
löscht auch alle entsprechenden Readings und deren Inhalt. Ein erneutes Setzen des Attributs OpsModeList
insbesondere mit neuem Namen, überschreibt alle entsprechenden Readings und deren Inhalt wird gelöscht.
Anmerkung
Ich empfehle, alle Readings zumindest auf Off
zu setzen, um sicherzustellen, dass keine falschen Werte durch "Zeilenverrutscher" gespeichert werden.
Event gesteuerte Videoaufnahmen
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.
Vorbereitung
Zunächst muss ein Verzeichnis erstellt werden (z.B.: /opt/fhem/videos/). Nicht vergessen, entsprechend die Rechte auf dieses Verzeichnis zu vergeben!
Das Attribut "VideoFileDir" muss auf den o.g. Ablageort der VideoFiles verweisen. 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.
Hinweis
Beachtet hierbei, dass eine Sekunde Filmsequenz etwa 100kB an Speicherplatz benötigt. Entsprechend wird ein Ablageort direkt im NAS empfohlen.
Einbindung im fhem Tablet UI - ftui
Seit Revision 21857 unterstützt das DoorBird Modul auch die Einbindung in das fhem Tablet UI - ftui. Hierzu werden bei Bedarf die Links zu den lokal gespeicherten Bild- und Video- Dateien inklusive deren Aufnahme - Zeitstempel zur Verfügung gestellt.
Vorbereitung im DoorBird Device
Zunaechst muessen folgende Attribute im device zwingend gesetzt sein:
attr <devicename> HistoryFilePath 1 attr <devicename> ImageFileDir <Muss unter fhem/www/ liegen> attr <devicename> VideoFileDir <Muss unter fhem/www/ liegen> attr <devicename> MaxHistory <minimum 5> attr <devicename> VideoFileFormat mp4
Zu beachten ist:
- 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".
- Die MaxHistory in diesem Beispiel auf mindesten 5 liegen muss.
- Das Video-Format auf mp4 liegen muss.
Beispiel - Code fuer das ftui
Folgender Code ist als Beipiel für die Einbindung in das ftui gedacht.
Es geht bestimmt auch schöner, umfangreicher und haptischer. "Challenge accepted!"
Der folgende Code muss nur noch in die entsprechende html-Datei des ftuis hineinkopiert werden
<li data-row="1" data-col="1" data-sizex="2" data-sizey="3" class="semitransparent">
<header><div data-type="label" class="large">Doorbird</div></header>
<table width="100%">
<tr>
<td colspan="3">
<img src="../images/default/doorbirdicon_small.png" alt="DoorBird" height="42">
</td>
<td>
<div class=""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "state"
data-background-icon = "fa-circle"
data-states = '["connected","disconnected","disabled","Downloading image","Retrieving video"]'
data-icons = '["oa-message_ok","mi-error","mi-sync_disabled","mi-add_a_photo","mi-video_call"]'
data-colors = '["SeaGreen","Crimson","Crimson","Yellow","Yellow"]'>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "state">
</div>
</td>
</tr>
<tr>
<td colspan ="3">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "UI_Url_FrontDoor"
data-get = "state"
data-width = "200"
data-height = "150"
data-refresh = "900"
data-opacity = "1"
class = "centered top-space">
</div>
<div class="dialog">
<header>Front Door</header>
<div class="inline cell">
<div data-type = "image"
data-device = "UI_Url_FrontDoor"
data-get = "state"
data-width = "1024"
data-height = "768"
data-refresh = "900"
data-opacity = "1"
class = "centered top-space">
</div>
</div>
</div>
</div>
</td>
<td width="25%">
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "oa-light_light_dim_100"
data-cmd = "set myDoorBird Light_On"
data-countdown = "180"
data-on-color = "#0088CC">
</div>
IR-Light ON
</td>
</tr>
</table>
<table width="100%">
<tr height="100">
<td width="25%">
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "fa-key"
data-cmd = "set myDoorBird Open_Door 1"
data-on-color = "#0088CC">
</div>
Open Door
</td>
<td width="25%">
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "oa-fts_garage"
data-cmd = "set myDoorBird Open_Door 2"
data-on-color = "#0088CC">
</div>
Toggle Carport
</td>
<td colspan="2">
<div data-type = "select"
data-device = "myDoorBird"
data-list = "OpsModeList"
data-delimiter = " "
data-get = "OpsMode"
data-set = "OpsMode"
class = "wider w2x">
</div>
</td>
</tr>
<tr>
<td>
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "oa-control_reboot"
data-cmd = "set myDoorBird Restart"
data-on-color = "#0088CC">
</div>
Restart DoorBird
</td>
<td>
</td>
<td>
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "mi-add_a_photo"
data-cmd = "get myDoorBird Image_Request"
data-on-color = "#0088CC">
</div>
Take a Photo
</td>
<td>
<div data-type = "push"
data-device = "myDoorBird"
data-icon = "mi-video_call"
data-cmd = "get myDoorBird Video_Request 10"
data-on-color = "#0088CC">
</div>
Take 10s-Video
</td>
</tr>
<tr>
<td>
<div data-type="popup" data-width="1200px" data-height="1000px" class="inline">
<div data-type="push"
data-icon="fa-archive">
</div>
<div class="dialog large">
<header>Front Door</header>
<table width="100%">
<tr>
<th colspan="100%" style="padding:1px; border:1px solid white; border-collapse:collapse;">
<BR>
History of Activities - Images and Videos<BR>
<BR>
</th>
</tr>
<tr>
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Doorbell
</th>
<th colspan="2" width ="33" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Motionsensor
</th>
<th rowspan="2" width ="17" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Manual Snapshots
</th>
<th rowspan="2" width ="16" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Manual Videos
</th>
</tr>
<tr>
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Image
</td>
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Video
</td>
<td width="17" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Image
</td>
<td width="16" style="padding:1px; border:1px solid white; border-collapse:collapse;">
Video
</td>
</tr>
<tr>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_00"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Doorbell Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_00_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_00"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Doorbell Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_00_Timestamp"
data-substitution = "s/(^$)/Not available/g">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_00"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Motionsensor Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_00_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_00"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Motionsensor Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_00_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_00"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Nanual Snapshot</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_00_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_00"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Manual Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_00_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_00"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_00_Timestamp">
</div>
</td>
</tr>
<tr>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_01"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Doorbell Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_01_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_01"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Doorbell Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_01_Timestamp"
data-substitution = "s/(^$)/Not available/g">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_01"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Motionsensor Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_01_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_01"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Motionsensor Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_01_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_01"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Nanual Snapshot</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_01_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_01"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Manual Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_01_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_01"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_01_Timestamp">
</div>
</td>
</tr>
<tr>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_02"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Doorbell Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_02_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_02"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Doorbell Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_02_Timestamp"
data-substitution = "s/(^$)/Not available/g">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_02"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Motionsensor Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_02_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_02"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Motionsensor Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_02_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_02"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Nanual Snapshot</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_02_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_02"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Manual Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_02_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_02"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_02_Timestamp">
</div>
</td>
</tr>
<tr>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_03"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Doorbell Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_03_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_03"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Doorbell Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_03_Timestamp"
data-substitution = "s/(^$)/Not available/g">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_03"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Motionsensor Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_03_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_03"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Motionsensor Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_03_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_03"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Nanual Snapshot</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_03_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_03"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Manual Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_03_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_03"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_03_Timestamp">
</div>
</td>
</tr>
<tr>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_04"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Doorbell Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Image_04_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_04"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Doorbell Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_doorbell_Video_04_Timestamp"
data-substitution = "s/(^$)/Not available/g">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_04"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Motionsensor Image</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Image_04_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_04"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Motionsensor Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_motionsensor_Video_04_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_04"
data-width = "180"
data-opacity = "1"
class = "nocache">
</div>
<div class="dialog">
<header>Nanual Snapshot</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp">
</div>
<BR>
<div data-type = "image"
data-device = "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device= "myDoorBird"
data-get = "HistoryFilePath_snapshot_Image_04_Timestamp">
</div>
</td>
<td style="padding:1px; border:1px solid white; border-collapse:collapse;">
<div data-type="popup" data-width="1200px" data-height="850px" class="inline">
<div class = ""
data-type = "symbol"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_04"
data-states = '["",".*"]'
data-icons = '["fa-video-slash","fa-video-camera"]'>
</div>
<div class="dialog">
<header>Manual Video</header>
<BR>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_04_Timestamp">
</div>
<BR>
<div data-type = "video"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_04"
data-width = "1024"
data-opacity = "1"
class = "nocache">
</div>
</div>
</div>
<div data-type = "label"
data-device = "myDoorBird"
data-get = "HistoryFilePath_manual_Video_04_Timestamp">
</div>
</td>
</tr>
</table>
</div>
</div>
History
</td>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
</table>
</li>
Bekannte Probleme
Es werden zum Zeitpunkt eines Events (Türklingel / Bewegungssensor) keine Bilder heruntergeladen
Beschreibung / Ursache:
Diese Fehlermeldung tritt meistens in Verbindung mit einem sehr langsamen Netzwerk oder mit unsynchronisierten Zeiten zwischen FHEM-Server und DoorBird-Unit auf. Hierbei sind die Zeitstempel für die DoorBird-Unit und FHEM-Server zu weit auseinander.
Lösung:
Um das Modul "geduldiger" zu machen, muß man nur das Attribut "WaitForHistory" entsprechend höher setzen. 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.
Achtung: Auch muss die richtige Zeitzone gewählt werden.
Keine Reaktion bei Events
Beschreibung / Ursache:
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.
Lösung:
Es ist sicherzustellen, dass sich DoorBird und der FHEM-Server im gleichen Netzwerk befinden.
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.
Bei der Verwendung von FHEM im Docker-Container oder VMs, muss sichergestellt werden, dass die UDP-Datagramme nicht blokiert werden.
https://docs.docker.com/network/macvlan/
Neu erstellte OpsModeList erzeugt keine entsprechenden Readings
Beschreibung / Ursache:
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.
Lösung:
Dieser Bug ist bekannt und es gibt noch keine programiertechnische Lösung dieses Henne-Ei Problems. Aus diesem Grund muss das Attribut "OpsModeList" nach dem erstmaligen Setzen wieder komplett gelöscht und anschließend neu gesetzt werden.
Keine Ausgabe von Mp3-Dateien
Beschreibung / Ursache:
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.
Lösung:
In der Basisinstallation von gstreamer auf diversen Distributionen fehlt der wavparse.
Aus diesem Grunde muss man den GStreamer mittels folgendem Befehl neu installieren:
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
Neues Problem
Beschreibung / Ursache:
Problembeschreibung
Lösung:
Lösungsbeschreibung
Zukünftige Entwicklungen
Eventgesteuerte Videoaufnahmen
Beschreibung: Bei Eintreten eines Events, wird eine Videoaufnahme für Xs gestartet und im Verzeichnis abgelegt siehe Forenbeitrag.
Implementiert seit Version 20383
Statusregler zur Triggerung von individuellen Notifys
Beschreibung:
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.
Implementiert seit Version 20321
DoorBird-Typ gesteuertes Frontend
Beschreibung:
Basierend auf der Ausstattung des DoorBird wird die Bild/Videoausgabe im GUI ein- oder ausgeblendet (siehe diesen Forenbeitrag).
Implementiert seit Version 20246
Widget für FHEM TabletUI
Beschreibung:
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.
Links
- Thema zur Entwicklung und Support des Moduls
- Hauptseite des Herstellers: Bird Home Automation